单片机Word文档格式.docx
《单片机Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机Word文档格式.docx(21页珍藏版)》请在冰点文库上搜索。
附录1:
8
附录2:
9
附录3:
六、参考文献16
LED数字倒计时器设计报告
一、设计目的作用
1、掌握51单片机最小系统的设计;
2、掌握按键电路设计、LED数码管的使用;
3、掌握C51的编程方式。
二、设计要求
基于AT89C51单片机的LED数字倒计时器主要具有如下功能,具体要求如下:
1、LED数码管显示倒计时时间。
2、倒计时过程中能设置多个闹钟,当倒计时值倒计到设定值时会发出2s的报警声音。
(K1设置小时,K2设置分钟,K3设置秒钟,K4完成退出)
3、通过按键可以对倒计时设定处置。
倒计时初值范围在24:
00:
00~00:
60之间,设置成功后复位初始值为成功设定值。
三、设计的具体实现
1、设计原理
(1)系统设计方案:
基于AT89C51单片机的数码管显示模块显示的倒计时器。
主要是以单片机来控制,用按键来设定倒计时初始时刻的值,数码管作为显示模块来显示剩余的时间。
此电路对于倒计时器中的LED数码管示器来说,采用以软件为主的接口方法,即不使用专门的硬件译码器,而采用软件程序进行译码。
图1LED数字倒计时器设计框图
(2)功能模块:
倒计时器的总体包括显示电路,按键电路,复位电路,晶振电路和报警电路等五个模块。
显示模块显示计数与灭灯,复位模块控制电路完成计数的直接清零,暂停/连续技术,用按键模块来设定倒计时初始时刻的值,报警模块实现定时时间到报警等功能。
以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)按键模块:
图5按键模块原理图
报警模块实现定时时间到报警等功能。
图6复位及报警模块原理图
3、系统实现
(1)实物图
(2)分析
设计结果为:
三个LED显示器以小时、分钟、秒数逐一递减,即呈现倒计时现象,最终设计成功。
在整个实物焊接及接线过程中,必然出现众多问题,如:
焊接错误导致元件无法使用、接线错误导致最终结果不出现、排线错误导致LED显示不完全等等,这需要我们不断的检测和实验,需要我们耐心的寻找问题所在,从而解决问题,整个过程中,忙碌但快乐,繁琐却充实。
四、总结
在做本次课程设计的过程中,我们充分掌握了各模块电路的工作原理。
从课题入手到中间过程的修改设置、到使用Proteus8Professional电路仿真测试,再到最后的实物电路焊接。
每个过程都是小组的三个成员共同完成的,,并使用KeiluVision4编写了全部的驱动程序,在编写程序的过程中我们遇到很多的问题,翻阅了很多资料,也向老师请教了很多,最终写出了程序,画出了电路图,完成了本次课程设计。
在整个仿真过程中,免不了各种问题的频频出现,比如:
程序编写出现错误导致电路仿真错误、保存程序的路径方式错误导致电路无法导入程序、导入程序之后却又无法进行加载仿真等等。
在实物电路焊接时,由于操作不熟悉,导致焊锡融化与电路板相连。
这次课程设计让我受益匪浅,无论从知识上还是其他的各个方面。
上理论课时从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味的书面知识,但在实践过程中真真切切的尝试了单片机及其系统的仿真和应用,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。
除此之外,我还体会团结的重要性及力量之强大,设计过程让我们处理事情更加有条理,思路更清晰明了,发现、提出、分析、解决问题和实践能力的提高都将受益于我以后的工作、学习和生活中。
五、附录
附录1:
元件清单
元件名称
型号
数量
单片机最小开发板
STC89C52
1
电阻
10K
按键
5
数码管2位一体
共阳
3
集成块
74LS245
三极管
9015
蜂鸣器
1K
2
100Ω
2.7K
4
330Ω
8
74LS07
AC/DC(5V/1A)电源
单排插针40
双排插针40
9X15cm万用板(3连孔)
杜邦线
30
完整的连接图
程序编程
#include<
reg51.h>
absacc.h>
#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];
//秒十位
//P2=0XFB;
//P0=dispcode[10];
//间隔符
//delay
(1);
//
P2=0X10;
P0=dispcode[minite%10];
//分个位
P2=0X20;
P0=dispcode[minite/10];
//分十位
//
//P2=0Xdf;
P2=0X40;
P0=dispcode[hour%10];
//时个位
P2=0X80;
P0=dispcode[hour/10];
//时十位
/*键盘扫描子程序*///设置倒计时时间
voidkeyscan(void)
if(P10==0)//秒位的调整
{
delay(30);
if(P10==0)
seconde++;
seconde=0;
}
delay(250);
if(P11==0)//分位的调整
if(P11==0)
minite++;
if(minite==59)
{
minite=0;
}
if(P12==0)//时位的调整
if(P12==0)
hour++;
if(hour==24)
hour=0;
/*倒计时*/
voidjian(void)
if(P14==0)
P14=0;
if(c==20)
c=0;
seconde--;
if(seconde>
59)
{
seconde=59;
minite--;
if(minite>
minite=59;
hour--;
if(hour>
23)
{
hour=0;
minite=0;
seconde=0;
}}}}}}}
/*定时闹钟*/
voiddingshi(void)
if(P13==0)//按信P13不松,显示闹铃设置界面,分别按住P16、P17设置闹铃时间
P2=0Xfb;
//秒个位
delay
(1);
P2=0Xf7;
//秒十位
P2=0Xef;
P0=dispcode[fen%10];
P2=0Xdf;
P0=dispcode[fen/10];
P2=0Xbf;
P0=dispcode[shi%10];
P2=0Xd7f;
P0=dispcode[shi/10];
if(P16==0)//设定时
if(P16==0)
shi++;
if(shi==24)
shi=0;
if(P17==0)//设定分
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))//整点报时
jian();
/*主函数*/
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();
//整点报时
display();
//显示时间
voidtimer0(void)interrupt1//定时器0方式1,50ms中断一次
//手动加载计数脉冲次数
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