AT89C51单片机LED数字倒计时器课程设计论文.docx
《AT89C51单片机LED数字倒计时器课程设计论文.docx》由会员分享,可在线阅读,更多相关《AT89C51单片机LED数字倒计时器课程设计论文.docx(20页珍藏版)》请在冰豆网上搜索。
AT89C51单片机LED数字倒计时器课程设计论文
单片机原理及其应用课程设计
课题:
AT89C51单片机LED数字倒计时器
专业:
班级:
学号:
姓名:
指导教师:
设计日期:
成绩:
重庆大学城市科技学院电气学院
LED数字倒计时器设计报告
一、设计目的作用
1、掌握51单片机最小系统的设计;
2、掌握按键电路设计、LED数码管的使用;
3、掌握C51的编程方式。
二、设计要求
基于AT89C51单片机的LED数字倒计时器主要具有如下功能,具体要求如下:
1、LED数码管显示倒计时时间。
2、倒计时过程中能设置多个闹钟,当倒计时值倒计到设定值时会发出2s的报警声音。
(K1设置小时,K2设置分钟,K3设置秒钟,K4完成退出)
3、通过按键可以对倒计时设定处置。
倒计时初值范围在24:
00:
00~00:
00:
60之间,设置成功后复位初始值为成功设定值。
三、设计的具体实现
1、设计原理
(1)系统设计方案:
基于AT89C51单片机的数码管显示模块显示的倒计时器。
主要是以单片机来控制,用按键来设定倒计时初始时刻的值,数码管作为显示模块来显示剩余的时间。
此电路对于倒计时器中的LED数码管示器来说,采用以软件为主的接口方法,即不使用专门的硬件译码器,而采用软件程序进行译码。
图1LED数字倒计时器设计框图
(2)功能模块:
倒计时器的总体包括显示电路,按键电路,复位电路,晶振电路和报警电路等五个模块。
显示模块显示计数与灭灯,复位模块控制电路完成计数的直接清零,暂停/连续技术,用按键模块来设定倒计时初始时刻的值,报警模块实现定时时间到报警等功能。
(3)工作原理:
以AT89C51单片机为核心控制器,P0口接LED数码显示模块,P1口接按键,通过按键输入来控制显示器的显示。
在上电时LED显示器开始显示时间,在按键电路中设置了七个按键,通过检测第5个按键开始倒计时,通过检测第1,2,3个按键按下的次数来实现小时,分和秒的调时的加减,检测第4个按键实现闹钟的定时,检测6,7个按键按下的次数来实现闹钟的小时和分钟的调时的加减,再由LED显示器显示时,分,秒的改变。
2、系统设计
(1)显示模块
显示电路采用了3个二为一体的LED数码管,单片机I/O的应用最典型的是通过I/O口与7段LED数码管构成显示电路。
图2数码管显示电路
(2)晶振模块
单片机的晶振电路,即时钟电路。
单片机的工作流程,就是在系统时钟的作用下,一条一条地执行存储器中的程序。
单片机的时钟电路由外接的一只晶振和两只起振电容,以及单片机内部的时钟电路组成,晶振的频率越高,单片机处理数据的速度越快,系统功耗也会相应增加,稳定性也会下降。
采用11.0592MHz 晶振,电容选22pF或30pF均可。
图3晶振模块原理图
(3)复位电路:
系统上电时提供复位信号,直至系统电源稳定后撤销复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分,合工程中引起的抖动而影响复位。
如图所示,复位键接于AT89C51芯片的人RST接口,用于控制倒数计时器的复位操作。
计时器运行时按下复位键,计时器停止计数,或计数完成后按复位键进入下一轮计数工作。
图4复位电路图
(4)按键模块:
在上电时LED显示器开始显示时间,在按键电路中设置了七个按键,通过检测第5个按键开始倒计时,通过检测第1,2,3个按键按下的次数来实现小时,分和秒的调时的加减,检测第4个按键实现闹钟的定时,检测6,7个按键按下的次数来实现闹钟的小时和分钟的调时的加减,再由LED显示器显示时,分,秒的改变。
图5按键模块原理图
(5)报警模块:
报警模块实现定时时间到报警等功能。
图6复位及报警模块原理图
3、系统实现
(1)实物图
(2)分析
设计结果为:
三个LED显示器以小时、分钟、秒数逐一递减,即呈现倒计时现象,最终设计成功。
在整个实物焊接及接线过程中,必然出现众多问题,如:
焊接错误导致元件无法使用、接线错误导致最终结果不出现、排线错误导致LED显示不完全等等,这需要我们不断的检测和实验,需要我们耐心的寻找问题所在,从而解决问题,整个过程中,忙碌但快乐,繁琐却充实。
四、总结
在做本次课程设计的过程中,我们充分掌握了各模块电路的工作原理。
从课题入手到中间过程的修改设置、到使用Proteus8Professional电路仿真测试,再到最后的实物电路焊接。
每个过程都是小组的三个成员共同完成的,,并使用KeiluVision4编写了全部的驱动程序,在编写程序的过程中我们遇到很多的问题,翻阅了很多资料,也向老师请教了很多,最终写出了程序,画出了电路图,完成了本次课程设计。
在整个仿真过程中,免不了各种问题的频频出现,比如:
程序编写出现错误导致电路仿真错误、保存程序的路径方式错误导致电路无法导入程序、导入程序之后却又无法进行加载仿真等等。
在实物电路焊接时,由于操作不熟悉,导致焊锡融化与电路板相连。
这次课程设计让我受益匪浅,无论从知识上还是其他的各个方面。
上理论课时从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味的书面知识,但在实践过程中真真切切的尝试了单片机及其系统的仿真和应用,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。
除此之外,我还体会团结的重要性及力量之强大,设计过程让我们处理事情更加有条理,思路更清晰明了,发现、提出、分析、解决问题和实践能力的提高都将受益于我以后的工作、学习和生活中。
五、附录
附录1:
元件清单
元件名称
型号
数量
单片机最小开发板
STC89C52
1
电阻
10K
1
按键
5
数码管2位一体
共阳
3
集成块
74LS245
三极管
9015
1
蜂鸣器
1
电阻
1K
2
电阻
100Ω
1
电阻
4
电阻
330Ω
8
集成块
74LS07
1
AC/DC(5V/1A)电源
1
单排插针40
2
双排插针40
2
9X15cm万用板(3连孔)
1
杜邦线
30
附录2:
完整的连接图
附录3:
程序编程
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/*七段共阴和显示定义*/
//此表为LDE的字模,共阳数码管0-9
ucharcodedispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码控制
/*定义并初始化变量*/
ucharseconde=15;//秒
ucharminite=0;//分
ucharhour=0;//时
ucharmstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1
ucharshi=0;//闹铃功能
ucharfen=0;
ucharbjcs;//报警次数
ucharc;
sbitP10=P1^0;//second调整定义
sbitP11=P1^1;//minite调整定义
sbitP12=P1^2;//hour调整定义
sbitP15=P1^5;//整点报时
sbitP13=P1^3;//闹铃功能,调整时间
sbitP16=P1^6;//调整时
sbitP17=P1^7;//调整分
sbitP14=P1^4;//关闭闹铃
/*延时子程序*/
voiddelay(uintk)
{
ucharj;
while((k--)!
=0)
{
for(j=0;j<200;j++)
{;}
}
}
/*时间处理子程序*/
voidtime(void)
{
if(seconde==59)
{
seconde=0;
minite++;
if(minite==59)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
/*显示子程序*/
voiddisplay(void)
{
if(P13==1)
{
P2=0x04;
P0=dispcode[seconde%10];//秒个位
delay
(1);
P2=0x08;
P0=dispcode[seconde/10];//秒十位
delay
(1);
//P2=0XFB;
//P0=dispcode[10];//间隔符
//delay
(1);
//
P2=0X10;
P0=dispcode[minite%10];//分个位
delay
(1);
P2=0X20;
P0=dispcode[minite/10];//分十位
delay
(1);
//
//P2=0Xdf;
//P0=dispcode[10];//间隔符
//delay
(1);
P2=0X40;
P0=dispcode[hour%10];//时个位
delay
(1);
P2=0X80;
P0=dispcode[hour/10];//时十位
delay
(1);
}
}
/*键盘扫描子程序*///设置倒计时时间
voidkeyscan(void)
{
if(P10==0)//秒位的调整
{
delay(30);
if(P10==0)
{
seconde++;
if(seconde==59)
{
seconde=0;
}
}
delay(250);
}
if(P11==0)//分位的调整
{
delay(30);
if(P11==0)
{
minite++;
if(minite==59)
{
minite=0;
}
}
delay(250);
}
if(P12==0)//时位的调整
{
delay(30);
if(P12==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
delay(250);
}
}
/*倒计时*/
voidjian(void)
{
if(P14==0)
{
P14=0;
{
if(c==20)
{
c=0;
seconde--;
if(seconde>59)
{
seconde=59;
minite--;
if(minite>59)
{
minite=59;
hour--;
if(hour>23)
{
hour=0;
minite=0;
seconde=0;
}}}}}}}
/*定时闹钟*/
voiddingshi(void)
{
if(P13==0)//按信P13不松,显示闹铃设置界面,分别按住P16、P17设置闹铃时间
{
P2=0Xfb;
P0=dispcode[seconde%10];//秒个位
delay
(1);
P2=0Xf7;
P0=dispcode[seconde/10];//秒十位
delay
(1);
P2=0Xef;
P0=dispcode[fen%10];//分个位
delay
(1);
P2=0Xdf;
P0=dispcode[fen/10];//分个位
delay
(1);
P2=0Xbf;
P0=dispcode[shi%10];//时个位
delay
(1);
P2=0Xd7f;
P0=dispcode[shi/10];//时十位
delay
(1);
}
if(P16==0)//设定时
{
delay(30);
if(P16==0)
{
shi++;
if(shi==24)
{
shi=0;
}
}
delay(250);
}
if(P17==0)//设定分
{
delay(30);
if(P17==0)
{
fen++;
if(fen==60)
{
fen=0;
}
}
delay(250);
}
if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警十次
{
for(bjcs=0;bjcs<2;bjcs++)
{
P15=0;
delay(10);
jian();
P15=1;
//delay(500);
}
}
}
/*整点报警*/
voidzhengdian(void)
{
if((seconde==0)&(minite==0))//整点报时
{
P15=0;
delay(10);
jian();
P15=1;
}
}
/*主函数*/
voidmain(void)
{
P0=0xff;
TMOD=0X11;//time0为定时器,方式1
TH0=0X3C;//预置计数初值,50ms
TL0=0XB0;
EA=1;//总中断开
ET0=1;//允许定时器0中断
TR0=1;//开启定时器0
while
(1)
{
keyscan();//按键扫描
dingshi();//定时闹钟
zhengdian();//整点报时
jian();
display();//显示时间
}
}
voidtimer0(void)interrupt1//定时器0方式1,50ms中断一次
{
TH0=0X3C;//手动加载计数脉冲次数
TL0=0XB0;
c++;
//mstcnt++;//用于计算时间,每隔50ms加1
//if(mstcnt==20)//mstcnt满20即为一秒
//{
//seconde++;//秒加1
//time();//时间处理
//mstcnt=0;//对计数单元的清零,重新开始计数
//}}
六、参考文献
[1]·李群芳,肖看,张士军·单片微型计算机与接口技术·电子工业出版社·第四版
[2]·钟富昭等·8051单片机典型模块设计与应用[M]·人民邮电出版社·2007
[3]·陈海宴·51单片机原理及应用[M]·北京航空航天大学出版社·2010