西安文理学院机械电子工程系
课程设计任务书
学生姓名 焦银娟 专业班级 电子信息工程 学 号 [1**********] 指导教师 刘 密 歌 职 称 副教授 教研室 电子信息工程 课 程 单片机原理及应用 题目
基于单片机的彩灯设计
任务与要求
1. 用三个按键开关K1,K2,K3组成一个独立式键盘,其中K1控制八个彩灯从左向右依次
循环点亮,K2控制八个彩灯从右向左依次循环点亮,K3控制八个彩灯按一定的时间间隔闪烁点亮。
2. 给出硬件实现电路及软件程序
3. 论文要求思路清晰,结构合理,语言流畅,书写格式符合要求。
开始日期 2011.12.19 完成日期 2011.12.30
2011年 12 月 18 日
一:课程设计题目
基于单片机的彩灯设计
二:课程设计任务与要求:
利用89C51单片机设计彩灯,用三个按键开关K1,K2,K3组成一个独立式键盘,其中K1控制八个彩灯从左向右依次循环点亮,K2控制八个彩灯从右向左依次循环点亮,K3控制八个彩灯按一定的时间间隔闪烁点亮。
三:设计过程:
1.设计原理:
此次课程设计题目是基于单片机的彩灯设计,由课程设计的要求和任务,我采用的C语言编程,系统由AT89C51、LED 发光二极管、按键,可以实现彩灯的不同类型显示切换。其硬件电路主要有主控制器,LED显示电路,复位电路,晶振电路。系统程序的设计包括主程序的设计,中断服务程序等等。此程序直接在Keil软件编译程序,利用Proteus进行仿真调试,方便修改程序。
2.1芯片介绍:
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可 擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多 功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机 为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.2主要特性: ·与MCS-51 兼容
·4K字节可编程闪烁存储器 · 寿命:1000写/擦循环 · 数据保留时间:10年
·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·128*8位内部RAM ·32可编程I/O线 ·两个16位定时器/计数器 ·5个中断源 ·可编程串行通道
·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路
2.3管脚说明
2.3AT89C51引脚路
AT89C51引脚路
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口, P2口:P2口为一个内部上拉电阻的8位双向I/O口,
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL
门电流。P3口也可作为AT89C51的一些特殊功能口,P3
口同时为闪烁编程和编
程校验接收一些控制信号。 RST:复位输入。
PSEN:外部程序存储器的选通信号。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。 3.硬件系统框图与说明:
3.1整体设计
实验总体电路构造方案比较简单,主要包括键盘控制电路(用脉冲按键开关对电路进行控制)和显示电路(单片机控制发光二极管的显示)。
图1.1 实验方案图
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C52单片机是美国ATMEL 公司生产的低电压、高性能CMOS 8 位单片机,具有丰富的内部资源:4kB 闪存、128BRAM、32 根I/O 口线、2 个16 位定时/计数器、5 个向量两级中断结构、2 个全双工的串行口,具有4.25~5.50V 的电压工作范围和0~24MHz工作频率,使用AT89C52单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。 3.2 硬件电路设计
实验电路可划分为两个组成部分,一者为显示电路部分,主要是由8个相同的发光二极管组成,用来显示流水灯的不同显示形态,另一部分即控制电路部分,主要由脉冲按键开关组成,用以控制流水灯的不同显示状态。 3.2.1显示部分电路设计
首先介绍显示电路部分,电路原理图如下图所示: (1)K1控制八个彩灯从左向右依次循环点亮
(2)K2控制八个彩灯从右向左依次循环点亮
(3)K3控制八个彩灯按一定的时间间隔闪烁点亮。
我们所选用的数码管是共阴极的,置1时导通,所以将单片机的P0.0~P0.7连接8个发光二级管,P2.0~P2.2分别连接K1、K2、K3三个按键开关。从上图中可以看出,如果要让接在P0.0口的LED1亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED1熄灭,就要把P0.0口的电平变为高电平;同理,接在P0.1~P0.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。 3.3软件主要模块流程图与说明: 4.C语言源程序代码
#include #define uint unsigned int #define uchar unsigned char
uint m_led; uint a;
uint i; uint led;
void delay(uint z) { uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
void init() { TMOD = 0x01; ET0 = 1; EA = 1; TR0 = 1;
m_led = 0; a = 0; i = 0; led = 0;
}
void main() { init(); P2 = 0xff; while(1) {
switch(P2)
{ case 0xfe: m_led = 1; led = 1;
break;
case 0xfd: m_led = 2; led = 128;
break;
case 0xfb: m_led = 3; led = 0;
break;
}
}
}
void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256;
a++;
if(a == 20) { EA = 0; switch(m_led) {
case 1:
}
}
}
P0 = ~led; led *= 2; if(led > 0x80) led = 1; break;
case 2:
P0 = ~led; led /= 2; if(led
case 3:
led = ~led; P0 = led; break;
default:
led = 0; P0 = ~led;
a = 0; EA = 1;
四:心得体会
通过本次设计实验,使我对这学期学所学51系列的单片机从理论知识到实践硬件的应用以及C语言知识的回顾,更加熟悉了89C51单片机的每一个拐角的输出和各项功能,而且对硬件电路的布线以及焊接能力有了很大的进步。本次的课程设计,使关于51系列单片机的,正是我们刚刚学到的51单片机,在平时
课程的学习中,我们仅限于理论知识的讲解,即使知识是很扎实的,实际应用并不是这样的。开始时我也觉得自己的理论知识已经够了,但当我拿到课题时,在脑海里想的是非常好的,但真正编成和控制时,理论和实际结合不到一起,甚至于51芯片的使用我都感觉很迷茫,还是经过搜集大量资料才将理论与实际结合到一起了。本次课程设计我主要负责编程,这次不仅锻炼了我C语言的知识,更加我们正在学习的51的定时与中断结合在一起,进行了实际的操作,让我的知识掌握得更加牢固。本次的实际经验之后,让我对单片机定时赋初值有了更新的认识,对程序的循环顺序、结构类型都有了非常深刻的认识,对真正硬件的连接也有了认识,不再将自己的知识局限于自己狭隘的空间中。这次课程设计终于圆满的完成了,我从理论和硬件以及实践上懂得了很多,也明白了一个团队的合作精神可以让我们战胜所有的困难。
2:通过这次课程设计——秒表/时钟计时器,使我又重新开始学习C语言,因为C语言是大一学的,至从学完就再也没用过,所以开始很陌生,我又找了有关资料来了解,才有了一点眉目。刚开始以为可以用汇编很容易就写出来,因为我们正在学习汇编语言,以为学的很明白了,但是用汇编时才发现原来都不怎么熟练,编了一会程序发现只有一种感觉——举步维艰啊!还是放弃汇编选择C语言吧!对于单片机,我们课本学习的是80C51,但是这次做课程设计用的是89C51,这样不仅使我们掌握了80C51,而且对89C51也有了一定的了解了,在课堂上学习的都理论的,跟实际永远有一定的差距,不实践就不会发现问题。通过这次课程设计使我把课堂上学习的东西都用到了实践中,例如:定时/计数器的应用与中断。学习的时候不怎么理解,但是在实践中应用了以后就自然了解了。这次课程设计使我受益匪浅,而且都是实际的东西。
3:这次课程设计,我们做的是秒表/时钟计时器,最终我们选择的是用C语言编程,但原来学的也只是能看懂别人写好的程序而已,通过这次课程设计,更加熟练了C语言的程序设计思路。这次课程设计我主要负责焊接电路板,焊接过程中最困难的地方就是数码管的焊接,因为数码管的管脚和89C51的管脚是不对
应的,而且要避免接线的交叉,所以最后确定了布线最合理的方案,如硬件电路图所示。我们这次设计的出现的最大问题是电路当中的复位电路,开始电路在Proteus上仿真时都是可以正常复位的,但实际的电路中复位按键后的电阻的参数不合理,导致了RST上有电压,复位电路无效,所以最后我们去掉了那个电阻,此时复位电路才有效,所以理论和实际永远有差距,不实践永远发现不了问题。在焊接前我们没有想到给数码管用插槽固定,而是直接焊在了电路板上,这造成了后面的很多麻烦,我们方案中用的是共阴极的数码管,焊接第一个数码管时没有注意型号,等焊接到一半时才发现焊上的是共阳极的,所以不得不解焊重新焊接,这也是一个教训,以后焊接器件时能用上插槽的尽量用插槽,这在器件出了问题时很方便更换。最后焊接完成后在试验的过程中,刚一接通电源后的上电电压烧坏了LED显示器显示秒十位的c脚,这也是这次课程设计的遗憾,以后在硬件的实验时还要多小心,避免造成不必要的损失。
4:通过本次秒表/时钟计时器的设计实验,使我对这学期学所学51系列的单片机从理论知识到实践硬件的应用以及C语言知识的回顾,更加熟悉了89C51单片机的每一个拐角的输出和各项功能,而且对硬件电路的布线以及焊接能力有了很大的进步。在这次试验中,我主要负责的是硬件电路的布线和焊接以及硬件测试。由于本次试验电路比较简单,所以我们按照电路图布线后就马上开始焊接。焊好一个数码管检测后才发现我们把共阴极的数码管焊接成共阳级的了,很不容易才解焊下来,有了这次教训后,我们在焊接其他元器件的时候都提前检测好才开始焊接。第一次焊接完成后我们上电后发现实现了基本功能,可是不能复位,经过我们的讨论和反复试验,我们发现软件仿真和硬件实现并不是完全一致的,我们按照课本上焊接后终于完全实现了秒表/时钟计时器的功能。快要验收时我们发现数码管的一个二极管坏了,这才让我们意识到没有焊接插针的缺陷,以后一实验时一定要尽可能让原件可以取下,以便出现问题是更好的更换。这次课程设计终于圆满的完成了,我从理论和硬件以及实践上懂得了很多,也明白了一个团队的合作精神可以让我们战胜所有的困难。
西安文理学院机械电子工程系
课程设计任务书
学生姓名 焦银娟 专业班级 电子信息工程 学 号 [1**********] 指导教师 刘 密 歌 职 称 副教授 教研室 电子信息工程 课 程 单片机原理及应用 题目
基于单片机的彩灯设计
任务与要求
1. 用三个按键开关K1,K2,K3组成一个独立式键盘,其中K1控制八个彩灯从左向右依次
循环点亮,K2控制八个彩灯从右向左依次循环点亮,K3控制八个彩灯按一定的时间间隔闪烁点亮。
2. 给出硬件实现电路及软件程序
3. 论文要求思路清晰,结构合理,语言流畅,书写格式符合要求。
开始日期 2011.12.19 完成日期 2011.12.30
2011年 12 月 18 日
一:课程设计题目
基于单片机的彩灯设计
二:课程设计任务与要求:
利用89C51单片机设计彩灯,用三个按键开关K1,K2,K3组成一个独立式键盘,其中K1控制八个彩灯从左向右依次循环点亮,K2控制八个彩灯从右向左依次循环点亮,K3控制八个彩灯按一定的时间间隔闪烁点亮。
三:设计过程:
1.设计原理:
此次课程设计题目是基于单片机的彩灯设计,由课程设计的要求和任务,我采用的C语言编程,系统由AT89C51、LED 发光二极管、按键,可以实现彩灯的不同类型显示切换。其硬件电路主要有主控制器,LED显示电路,复位电路,晶振电路。系统程序的设计包括主程序的设计,中断服务程序等等。此程序直接在Keil软件编译程序,利用Proteus进行仿真调试,方便修改程序。
2.1芯片介绍:
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可 擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多 功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机 为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.2主要特性: ·与MCS-51 兼容
·4K字节可编程闪烁存储器 · 寿命:1000写/擦循环 · 数据保留时间:10年
·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·128*8位内部RAM ·32可编程I/O线 ·两个16位定时器/计数器 ·5个中断源 ·可编程串行通道
·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路
2.3管脚说明
2.3AT89C51引脚路
AT89C51引脚路
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口, P2口:P2口为一个内部上拉电阻的8位双向I/O口,
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL
门电流。P3口也可作为AT89C51的一些特殊功能口,P3
口同时为闪烁编程和编
程校验接收一些控制信号。 RST:复位输入。
PSEN:外部程序存储器的选通信号。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。 3.硬件系统框图与说明:
3.1整体设计
实验总体电路构造方案比较简单,主要包括键盘控制电路(用脉冲按键开关对电路进行控制)和显示电路(单片机控制发光二极管的显示)。
图1.1 实验方案图
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C52单片机是美国ATMEL 公司生产的低电压、高性能CMOS 8 位单片机,具有丰富的内部资源:4kB 闪存、128BRAM、32 根I/O 口线、2 个16 位定时/计数器、5 个向量两级中断结构、2 个全双工的串行口,具有4.25~5.50V 的电压工作范围和0~24MHz工作频率,使用AT89C52单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。 3.2 硬件电路设计
实验电路可划分为两个组成部分,一者为显示电路部分,主要是由8个相同的发光二极管组成,用来显示流水灯的不同显示形态,另一部分即控制电路部分,主要由脉冲按键开关组成,用以控制流水灯的不同显示状态。 3.2.1显示部分电路设计
首先介绍显示电路部分,电路原理图如下图所示: (1)K1控制八个彩灯从左向右依次循环点亮
(2)K2控制八个彩灯从右向左依次循环点亮
(3)K3控制八个彩灯按一定的时间间隔闪烁点亮。
我们所选用的数码管是共阴极的,置1时导通,所以将单片机的P0.0~P0.7连接8个发光二级管,P2.0~P2.2分别连接K1、K2、K3三个按键开关。从上图中可以看出,如果要让接在P0.0口的LED1亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED1熄灭,就要把P0.0口的电平变为高电平;同理,接在P0.1~P0.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。 3.3软件主要模块流程图与说明: 4.C语言源程序代码
#include #define uint unsigned int #define uchar unsigned char
uint m_led; uint a;
uint i; uint led;
void delay(uint z) { uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
void init() { TMOD = 0x01; ET0 = 1; EA = 1; TR0 = 1;
m_led = 0; a = 0; i = 0; led = 0;
}
void main() { init(); P2 = 0xff; while(1) {
switch(P2)
{ case 0xfe: m_led = 1; led = 1;
break;
case 0xfd: m_led = 2; led = 128;
break;
case 0xfb: m_led = 3; led = 0;
break;
}
}
}
void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256;
a++;
if(a == 20) { EA = 0; switch(m_led) {
case 1:
}
}
}
P0 = ~led; led *= 2; if(led > 0x80) led = 1; break;
case 2:
P0 = ~led; led /= 2; if(led
case 3:
led = ~led; P0 = led; break;
default:
led = 0; P0 = ~led;
a = 0; EA = 1;
四:心得体会
通过本次设计实验,使我对这学期学所学51系列的单片机从理论知识到实践硬件的应用以及C语言知识的回顾,更加熟悉了89C51单片机的每一个拐角的输出和各项功能,而且对硬件电路的布线以及焊接能力有了很大的进步。本次的课程设计,使关于51系列单片机的,正是我们刚刚学到的51单片机,在平时
课程的学习中,我们仅限于理论知识的讲解,即使知识是很扎实的,实际应用并不是这样的。开始时我也觉得自己的理论知识已经够了,但当我拿到课题时,在脑海里想的是非常好的,但真正编成和控制时,理论和实际结合不到一起,甚至于51芯片的使用我都感觉很迷茫,还是经过搜集大量资料才将理论与实际结合到一起了。本次课程设计我主要负责编程,这次不仅锻炼了我C语言的知识,更加我们正在学习的51的定时与中断结合在一起,进行了实际的操作,让我的知识掌握得更加牢固。本次的实际经验之后,让我对单片机定时赋初值有了更新的认识,对程序的循环顺序、结构类型都有了非常深刻的认识,对真正硬件的连接也有了认识,不再将自己的知识局限于自己狭隘的空间中。这次课程设计终于圆满的完成了,我从理论和硬件以及实践上懂得了很多,也明白了一个团队的合作精神可以让我们战胜所有的困难。
2:通过这次课程设计——秒表/时钟计时器,使我又重新开始学习C语言,因为C语言是大一学的,至从学完就再也没用过,所以开始很陌生,我又找了有关资料来了解,才有了一点眉目。刚开始以为可以用汇编很容易就写出来,因为我们正在学习汇编语言,以为学的很明白了,但是用汇编时才发现原来都不怎么熟练,编了一会程序发现只有一种感觉——举步维艰啊!还是放弃汇编选择C语言吧!对于单片机,我们课本学习的是80C51,但是这次做课程设计用的是89C51,这样不仅使我们掌握了80C51,而且对89C51也有了一定的了解了,在课堂上学习的都理论的,跟实际永远有一定的差距,不实践就不会发现问题。通过这次课程设计使我把课堂上学习的东西都用到了实践中,例如:定时/计数器的应用与中断。学习的时候不怎么理解,但是在实践中应用了以后就自然了解了。这次课程设计使我受益匪浅,而且都是实际的东西。
3:这次课程设计,我们做的是秒表/时钟计时器,最终我们选择的是用C语言编程,但原来学的也只是能看懂别人写好的程序而已,通过这次课程设计,更加熟练了C语言的程序设计思路。这次课程设计我主要负责焊接电路板,焊接过程中最困难的地方就是数码管的焊接,因为数码管的管脚和89C51的管脚是不对
应的,而且要避免接线的交叉,所以最后确定了布线最合理的方案,如硬件电路图所示。我们这次设计的出现的最大问题是电路当中的复位电路,开始电路在Proteus上仿真时都是可以正常复位的,但实际的电路中复位按键后的电阻的参数不合理,导致了RST上有电压,复位电路无效,所以最后我们去掉了那个电阻,此时复位电路才有效,所以理论和实际永远有差距,不实践永远发现不了问题。在焊接前我们没有想到给数码管用插槽固定,而是直接焊在了电路板上,这造成了后面的很多麻烦,我们方案中用的是共阴极的数码管,焊接第一个数码管时没有注意型号,等焊接到一半时才发现焊上的是共阳极的,所以不得不解焊重新焊接,这也是一个教训,以后焊接器件时能用上插槽的尽量用插槽,这在器件出了问题时很方便更换。最后焊接完成后在试验的过程中,刚一接通电源后的上电电压烧坏了LED显示器显示秒十位的c脚,这也是这次课程设计的遗憾,以后在硬件的实验时还要多小心,避免造成不必要的损失。
4:通过本次秒表/时钟计时器的设计实验,使我对这学期学所学51系列的单片机从理论知识到实践硬件的应用以及C语言知识的回顾,更加熟悉了89C51单片机的每一个拐角的输出和各项功能,而且对硬件电路的布线以及焊接能力有了很大的进步。在这次试验中,我主要负责的是硬件电路的布线和焊接以及硬件测试。由于本次试验电路比较简单,所以我们按照电路图布线后就马上开始焊接。焊好一个数码管检测后才发现我们把共阴极的数码管焊接成共阳级的了,很不容易才解焊下来,有了这次教训后,我们在焊接其他元器件的时候都提前检测好才开始焊接。第一次焊接完成后我们上电后发现实现了基本功能,可是不能复位,经过我们的讨论和反复试验,我们发现软件仿真和硬件实现并不是完全一致的,我们按照课本上焊接后终于完全实现了秒表/时钟计时器的功能。快要验收时我们发现数码管的一个二极管坏了,这才让我们意识到没有焊接插针的缺陷,以后一实验时一定要尽可能让原件可以取下,以便出现问题是更好的更换。这次课程设计终于圆满的完成了,我从理论和硬件以及实践上懂得了很多,也明白了一个团队的合作精神可以让我们战胜所有的困难。