单片机电子时钟课程设计报告Word格式.docx
《单片机电子时钟课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟课程设计报告Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
根据《单片机原理与应用》课程设计教学大纲、《单片机原理与应用》课程设计指导书,开展课程设计环节。
有三个设计项目供选择:
电子密码锁、电子琴或电子时钟。
设计内容与要求:
(1)选择其中一个设计项目,进行设计方案的比较和论证,确定设计思路和方案;
(2)进行硬件设计,画出硬件结构框图,完成电路原理图的设计和元器件选型,必要时应给出重要电路参数的设计和计算过程,以及元器件参数的选型依据;
(3)编写单片机的软件程序,先理清程序设计思路并绘制程序流程图,再编写具体的汇编语言或C语言程序语句,并注释说明。
成绩评定依据:
(分值百分比)
(1)确定设计思路和方案——20%;
(2)画出硬件结构框图、原理图的设计、元器件选型,给出电路参数的设计依据——30%;
(3)绘制程序流程图,再编写程序语句,并注释说明——30%;
(4)设计成果的功能完善程度、创新点、演示效果,撰写设计报告的规范性——20%。
三、设计方案
根据定时中断的原理,数码管显示和键盘扫描电路,以及和MCS-51单片机的接口方式,通过软件编程,实现时间初值设置,时钟运行和显示。
1、可供使用的硬件电路:
1)显示电路可选用数码管显示电路或LCD1602;
2)P2驱动七段显示器,P3为七段显示器的扫描模块;
3)扬声器和按钮可接至P1口
2、七段数码管的字型代码表如下表:
2、数码管动态扫描时间
数码管动态扫描显示的时间要根据数码管的数量来定的。
一般来说,每一位数码管需要一定的显示时间,也就是说,你输出一位数码管的数据点亮这个数码管之后,需要一定的时间才能熄灭它并点亮下一个数码管,而不能一输出就马上熄灭它,否则亮度会非常低。
全部数码管全部扫描一遍的总时间最好不要超过25mS,否则闪烁会比较严重,通常总的扫描频率要在60Hz以上,才看不到闪烁。
比如说要扫描8位数码管,那么可以让每一位数码管点亮1mS,这样全部显示一遍就大约是8mS或稍微多一点点(算上显示处理的指令执行时间),此时的总扫描频率就是125Hz左右,这样的话,即能保证亮度,又看不到闪烁。
3、LCD1602的基本操作时序:
写指令输入:
RS=L,
=L,D0~D7=指令码,E=正脉冲输出:
D0~D7=数据;
写数据输入:
RS=H,
=L,D0~D7=数据,E=正脉冲输出:
无
(1)LCD1602内部带有80B的RAM缓冲区,对应的地址为第一行地址:
00H~27H,第二行地址为为:
40H~67H,当我们向00H~0FH和40H~4FH写入显示的数据时,液晶可以立即显示出来,当写入到10H~27H和50H~67H时,必须通过移屏指令将它们移入可现实区域方可正常显示。
(2)数据指针设置
指令码:
0x80+地址码(00H~27H,40H~67H)
四、硬件和软件设计
4.1硬件设计思想
主要用到这些元件:
AT89C51单片机与单片机的最小系统,八位显示数字管,74LS245锁存器。
用12MHZ的晶振和两个较小的22pF的电容组成振荡器电路,用一个按键,一个电解电容,一个10K电阻组成具有上电自动复位和手动复位两种操作的复位电路。
用P0口作为输出需接上拉电阻,即需RESPACK-8排阻,74LS245锁存器保存要开通的位码。
通过控制P0,P2,P3口来控制时间的计时。
P0口送入要显示的字段,P2口送入要显示的位码,P3口低三位即为查询是否需要调整时分秒数。
开通计时器中断0来查表得到要显示的数字。
4.2软件设计思想
整个程序先给数码管送初值120000,然后进行初始化工作。
程序由一个主函数,一个定时器中断程序,一个延时子程序,三个判断子程序,一个显示子程序构成。
程序通过按键扫描程序来确定是否调用中断程序来对时间进行调整。
用一子程序完成时分秒的调整,通过循环扫描三个按键的电平变化来判断对应按键是否按下,并带有去抖动功能,当某个按键按下时,则对应的进行增一操作。
若分秒增一到达60次或者时增一到达24次,将对其清零,各个操作均实时的通过数码管显示。
4.3流程图
(1)软件系统框图
图4.1软件系统框图
(2)系统流程图:
如图4.2所示整个程序先给数码管送初值120000,然后进行初始化工作,包括定时器及其初值设置、开中断等。
程序通过按键扫描程序来确定是否调用中断程序来对时间进行调整,整个程序较为简短,但是时间误差很小。
图4.2系统流程图
(3)按键子函数流程图:
如图4.3所示加一子程序完成时分秒的调整,通过循环扫描三个按键的电平变化来判断对应按键是否按下,并带有去抖动功能,当某个按键按下时,则对应的进行增一操作。
若分秒增一到底60次或者时增一到达24次,将对其清零,各个操作均实时的通过数码管显示。
图4.3按键子函数流程图
五、设计总结
1.当按下K1键一次即进入时间秒秒钟设定状态,然后再按一次K1键即进入时间分钟设定状态。
最后再按一次K1进入时间小时设定状态。
设定完成后如图5-1所示。
图5-1
2.按K1键进入时间秒钟设定状态后,然后按一下K2键进行加时。
设定完成后如图5-2所示。
图5-2
3.按K1键进入时间秒钟设定状态后,然后按一下K3键进行减时。
设定完成后如图5-3所示。
图5-3
4.按K1键两次进入时间分钟设定状态后,然后按一下K2键进行加时。
设定完成后如图5-4所示。
图5-4
5.按K1键两次进入时间分钟设定状态后,然后按一下K3键进行减时。
时间设定完成后如图5-5所示。
图5-5
6.按K1键三次进入时间小时设定状态后,然后按一下K2进行加时。
时间设定完成后如图5-6所示。
图5-6
7.按K1键三次进入时间小时设定状态后,然后按一下K3进行减时。
时间设定完成后如图5-7所示。
图5-7
经过这次电子钟的设计,让我巩固和运用了在“模拟电子技术”、“数字电子技术”及“电路分析”等课程中所学的理论知识和实验技能,基本掌握了常用电子电路的一般设计方法,提高了设计能力和实验技能。
本次的电子钟实验中,我学会了很多,平时的学习只是理论的学习,课程设计使得我对理论知识有了更加深刻的认识,通过实验的调试,我也初步学会了如何排解错误,解决问题。
还有这次的课程设计告诉我,只有将理论和实践相结合才是真正的学到了知识。
碰到不懂的问题要学会多自行查阅相关资料,提高自学能力。
同时做事需要耐心,不能碰到一点困难就退缩。
本次设计使我对已学过的基础知识有了更深入的理解,独立思考、独立工作以及应用所学基本理化分析和解决实际问题的能力有了很大的提高。
另外,本次设计使我们的实际操作技能得到了训练,同时也培养了我们严谨的态度。
六、参考文献
[1].单片机原理及接口技术(第二版),李全利,北京:
高等教育出版社,2009年。
[2].单片机原理及应用(第二版),李建忠,西安:
西安电子科技大学出版社,2008。
[3].单片机原理及应用,冯文旭等,北京:
机械工业出版社,2008。
[4].单片机基础(第3版),李广弟等,北京:
北京航空航天大学出版社,2007。
[5].单片机高级教程:
应用与设计(第2版),何立民,北京:
七、指导老师评阅依据和分数
评阅依据
满分
得分
进行设计方案的比较和论证,描述所采用的设计思路和方案,设计思路和方案正确。
20分
画出硬件结构框图,完成电路原理图的设计和元器件选型,有关键电路参数的设计和计算过程,以及元器件参数的选型依据。
30分
绘制了程序设计流程图,有详细的汇编语言或C语言程序语句,并注释说明。
设计成果的功能完善,创新点突出,答辩表现良好;
设计报告分析、总结了设计项目的实验结果、设计过程中出现的问题和相应的解决措施或技巧,以及设计经验、收获和体会。
课程设计报告格式规范。
综合评定成绩:
评阅人:
八、附录
#include<
reg51.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitk1=P3^5;
sbitk2=P3^6;
sbitk3=P3^7;
ucharcodeduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
ucharhc[8];
ucharjishu,jishu1=0,k,set,shan,a,b,c,time;
charshi,fen,miao;
voiddelay(uintt)
{uchari;
while(t--)
for(i=110;
i>
0;
i--);
}
voidkey()
{if(k1==0)
{delay(5);
while(k1==0);
if(++set==4)
set=0;
}
if(k2==0)
while(k2==0);
if(set==1)
{if(++miao==60)
miao=0;
if(set==2)
{
if(++fen==60)fen=0;
}
if(set==3)
{if(++shi==24)
shi=0;
if(k3==0)
while(k3==0);
if(--miao<
0)
miao=59;
if(--fen<
fen=59;
if(set==3)
if(--shi<
shi=23;
a=0xff*shan;
else{a=0;
}
b=0xff*shan;
else{b=0;
c=0xff*shan;
else{c=0;
}
voidinit()
TMOD=0x01;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
EA=1;
ET0=1;
TR0=1;
voidtint(void)interrupt1
{TH0=(65535-5000)/256;
if(set!
=0)
{if((k1==0)||(k2==0)||(k3==0))
time=0;
if(time>
=10)
{set=0;
time=0;
jishu++;
if(jishu==40)
{jishu=0;
shan=!
shan;
if(++k==4)
{k=0;
time++;
if(++miao==60)
{miao=0;
if(++fen==60)
{fen=0;
if(++shi==24)
shi=0;
}
hc[0]=c|shi/10;
hc[1]=c|shi%10;
hc[2]=10;
hc[3]=b|fen/10;
hc[4]=b|fen%10;
hc[5]=10;
hc[6]=a|miao/10;
hc[7]=a|miao%10;
jishu1++;
if(jishu1==8)
jishu1=0;
P2=(P2+1)%8;
P0=duan[hc[jishu1]];
voidmain()
{init();
P2=0x00;
while
(1)
key();