单片机课程设计数字电子钟的设计Word格式文档下载.docx
《单片机课程设计数字电子钟的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数字电子钟的设计Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
(一)设计题目:
数字电子钟
(二)设计目的与任务:
学生通过理论设计和实物制作解决相应的实际问题,巩固和运用在《单片机技术》中所学的理论知识和实验技能,掌握单片机应用系统的一般设计方法,提高设计能力和实践动手能力,为以后从事电子电路设计、研发电子产品打下良好的基础。
1.2功能要求说明
设计一个具有特定功能的电子钟。
该电子钟按键复位后能自动显示设计者的学号;
第一次按电子钟启动/调整键,电子钟从0时0分0秒开始运行计时,进入时钟运行状态;
再次按电子钟启动/调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,当按下键2,秒钟加一,按下键3分钟加一,按下键四时钟加一,调整结束后可按启动/调整键再次进入时钟运行状态。
1.3设计课题总体方案及工作原理说明
设计中采用AT89S52芯片及LED显示器,独立式按键构成一个简单的数字电子钟。
设计中是采用单片机的内部定时器进行定时,程序框图如图1-1所示
整个电子钟的工作原理是:
在正常的供电状态下,首先利用单片机定时,到了相应的时间由单片机将所需要显示的数据送到LED显示器的输入口,当有键按下时则进入相应的按键显示和调整状态,进行按键调整。
图1-1总的设计的框图
第二章数字电子钟的硬件系统的设计
2.1硬件系统各模块功能设计
该数字电子钟以单片机最小系统为核心,其他主要电路有键盘电路、LED数码管显示电路、USB接口电路模块、蜂鸣电路。
主要模块的功能:
(1)单片机最小系统的组成以及功能介绍
由AT89S52单片机、时钟电路和复位电路构成。
AT89S52是一种带8K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
时钟电路由一个12MHZ的石英晶体振荡器和两个33pF的的电容组成振荡电路和分频电路,为单片机提供内部时钟。
复位电路采用上电复位和按键复位结合的方式对电路进行复位,主要是通过RST引脚送入单片机。
(2)键盘模块
采用独立式键盘接法,共有八个按键来对电路进行控制。
分别接在单片机的P1.0-P1.7口线上。
电子钟只使用其中的4个按键,一个控制启动与调整,其余三个分别为调时、调分、调秒。
(3)LED显示电路
采用2个八位一体的共阳数码管显示器进行显示,由于单片机可以直接驱动数码管,所以不必设置数码管的驱动电路,16个470Ω的电阻起限流的作用。
将段控口接在P0口上,位控口接在P2口上,实现对显示的控制(设计为动态显示)。
(4)USB接口电路
接上一个可以连接电脑的USB电源接口,该电源电压很稳定,为单片机工作供电。
2.2设计课题电路原理图、PCB图、元器件布局图
采用Protel软件,Protel99SE是Protel公司近10年来致力于Windows平台开发的最新结晶,能实现从电学概念设计到输出物理生产数据,能够和形象的画出我们所要设计的产品。
电路原理图和PCB图及元器件布局见附录A。
2.3元器件清单
见附录B。
第三章数字电子钟的软件系统的设计
3.1使用的单片机资源的情况
该数字电子钟用到了单片机的定时器的功能,此外用到了单片机的中断功能,在数据的显示时所采用的是直接送段控码和位控码的方法,因此需要将数据存到单片机的程序存储器中去。
由于电子钟要求可以进行调节,因此,需要在单片机的P1口上加上按键,本设计采用独立式键盘,直接接在P1口上且按键的结果存贮在单片机的内部数据存储器里面。
用到的LED数码管接到了单片机的P0口线上和P2口线上,以实现动态显示。
3.2各模块功能简要介绍
该数字电子钟所用的软件模块有定时器模块、按键模块、LED显示模块。
(1)定时器模块
选择定时器1,设置定时方式为方式1,设置定时时间为50mS。
选择定时器0,设置定时方式为方式1,设置定时时间为1mS。
(2)按键模块
采用独立式键盘,共用四个按键对电路进行控制和操作,分别为K0、K1、K2、K3来控制电子钟的启动和调整。
(3)LED显示模块
该电子钟一通电即让它显示“Z0903--46”,按开启键(K1)即可显示时分秒(0-0-0-)并开始计时,再按开始/暂停键就可以对电子钟进行调整:
调时(K4)、调分(K3)、调秒(K2)。
3.3程序的流程图
(1)整体设计流程图
图3-1整体功能流程图
(2)延时1毫秒程序设计流程图
图3-2延时1毫秒程序流程
(3)检查按键程序设计流程图
图3-3调时检查按键程序流程
(4)检查按键程序设计流程图
图3-4调时检查按键程序流程
3.4程序清单
见附录C。
第四章系统仿真与分析
4.1设计结论和使用说明
(1)设计结论
通过对单片机进行外接按键和LED数码管的操作以及加上硬件电路和软件的结合,实现了该数字电钟显示“Z0903--46”以及时、分、秒,同时还可实现对该电子钟进行调整的功能。
通过测试、仿真以及修改,该电子钟最终能正常的工作。
(2)使用说明
该数字电子钟采用两个四位一体数码管能实现时分秒的显示。
当电子钟一上电即可显示“Z0903—46”,设置数字钟的初始时间为00时00分00秒,用四个按键实现电子钟的显示和调整的功能,分别为K0,K1,K2,K3,其中K0键为开启/调整键,开启之后再按K0键可实现暂进入调整状态,进入调整状态后按K1、K2、K3可分别对秒、分、时的调整,每按一下对应的按键可以对当前显示的位进行调整,其进制都为60进制,即时、分、秒的变化范围是0—59,每按下一次,相应的时钟位加一,在调整到需要的时刻后,再按一下开始/暂停键即可从该时刻起运行电子钟。
在正常运行时,只有暂停/开始键起作用,其他按键不影响电子钟的工作状态。
4.2仿真结果
在仿真时用到了两个软件,第一个是Keil,第二个是Protues,本次仿真是将两个软件结合起来进行的。
Proteus软件所提供了30多个元件库,数千种元件。
元件涉及到数字和模拟、交流和直流等。
在Proteus软件包中,不存在同类仪表使用数量的问题。
Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似但功能更多。
用Protues软件进行仿真,其仿真的电路图如图4.1所示
图4-1Protues仿真电路图
当按下开始/暂停键时,数字电子钟进入工作状态,当按下调整键时,数字电子钟进入调整界面,此时LED数码管显示器的显示如图4-3所示。
图4-2数字电子钟显示时分秒的显示
4.3误差分析
本数字电子钟在跟标准的电子钟比较时,时间稍微慢一点,产生此种情况的原因有:
其一是在执行程序指令时,由于需要耗费一定的时间,因此会比标准的电子钟要慢一点。
其二是晶振不够标准,使得定时器定时时不够精准。
4.4设计难点和体会
(1)设计难点
从选题到硬件电路的设计,再到软件电路的设计,整个过程当中我学到了很多的东西,在老师的细心指导,耐心分析下,我把整个思路理清,并开始了设计的规划,在原理图的绘制时我查找了相关软件的使用方法,并悉心向老师和同学请教,学会对PROTEL和PROTEUS的使用。
在软件系统的设计当中,我遇到了很多的问题,不能把一些小模块系统的联系起来,但通过不断的学习,最终花了四天的时间把整个程序完整的编出来了,并能进行仿真使用。
到最后做板子的时候,因为是第一次做板子,很多细节的地方都没注意,比如封装元器件时,要看清楚所买元器件的引脚、尺寸和功能以及质量,我做的第一块板子不怎么的好,结果在用熨斗熨的时候出现暴起的现象,只能再重新做一块,而且买的数码管跟实际所画的PCB板尺寸大小不一样,而且引脚搞错了,只能另想办法,很影响实验进度,所以在封装元器件时一定要做好充分的准备。
在做板子的时候因为熨的时候没把握好,结果出现了很多的断点,只能一个一个查,一个一个补,麻烦很大,工作量也很大,而且很容易疏忽,所以将图纸熨到板子上时一定要熨的均匀,把握好时间和力度。
打孔时一定要对准,不要太急,慢慢来。
插元器件的时候一定要把每个元器件的引脚搞清楚,插之前要用万用表测好每个引脚是该接地还是该接电源,千万不能插反了。
焊接的时候要标准不能产生虚焊,也不要遗漏,要均匀,焊锡不能太多也不能太少。
到最后就是检查电路的连接了,搞清楚整个电路的连接是怎么样的,当显示器不亮的时候可以采用软件检查法或者硬件检查对板子进行测试,这个过程中一定要细心且要有耐心,不要灰心,相信自己一定能找出原因,只要自己持之以恒肯定能把错误找出来并纠正。
在对板子进行测试的时候出现了很多的错误,花了好几个晚上的时间来查找电路的错误,首先是电源指示灯不亮,灯座接反了,然后是显示器不亮,最后通过用万用表对电路进行测试,最终让电子钟正常的工作了,导另外是熨的时候出现了太多的断点没补好,以及在焊接的时候出现了很多的虚焊,导致某些段控口和位控口的不可用,因为是第一次做板子,所以之前很多该注意的地方都没有注意,最后留下一大堆的问题,使得整个制版的过程耗费很多的精力和时间。
从中我学会了很多,包括原理图的绘制,程序的设计,PCB的绘制,还有板子的制作,更重要的是我懂得了,要做好一个东西,准备工作必不可少,这样才能减少后面的不必要的麻烦,而且遇到困难和麻烦一定要有耐心和信心去把它攻破。
(2)设计体会
吴老师的教学方式我挺赞同,你能够让我们把实际和理论结合起来,我觉得这很好,而且对现在的我们来说很重要,大学三年来,学的东西可以说很多,但是我们一直都不知道,手中的这些知识到底有什么作用,而且很多的老师都只顾着讲自己的课程,就像是完成一项别人交给他的任务一样,从不关心学生学的到底是怎么样,所以我觉得适当的给学生一些将理论联系实际的作业和任务,能够让我们更明白和理解自己学的东西,也让我们学的不再那么迷茫和渺茫了。
其次老师和同学的关系我觉得对同学能否学习好这门课程很重要,课堂上老师应该要严肃认真,下课后老师可以多和同学们接触和聊天,培养和同学们的关系,和同学们做朋友,对同学们提出的问题要认真对待。
还有就是,老师的责任不仅仅是传授知识,更重要的是给我们传授学习经验和方法,培养学生的发散思考方式,以及多传授点社会经验和教训,教我们不要走不必要的弯路以及在社会上你所必备的生存工具。
参考文献
[1]李朝青.单片机原理及接口技术[M].北京:
北京航空航天大学出版社,1998.
[2]王幸之等.单片机应用系统抗干扰技术[M].北京:
北京航空航天大学出版社,1999.
[3]何为民.低功耗单片微机系统设计[M].北京:
北京航空航天大学出版社,1994.
[4]李华.MCS-51系列单片机实用接口技术[M].北京:
北京航空航天大学出版社,1996.
[5]何立民.单片机高级教程[M].北京:
北京航空航天大学出版社,2000.
[6]马忠梅.单片机应用程序设计(第四版)[M].北京:
北京航空航天大学出版社,2006.
附录A系统原理图与PCB图
(原理图)
(PCB图)
附录B元器件清单
附录C程序清单
ORG0000H
MOV70H,#0C0H;
70H到7AH存放的是0到9、一的段控码
MOVR2,#70H;
R2和R3控制秒钟的段控码
MOVR3,#70H
MOVR4,#70H;
R4和R5控制分钟的段控码
MOVR5,#70H
MOVR6,#70H;
R6和R7控制时钟的段控码
MOVR7,#70H
MOV71H,#0F9H
MOV72H,#0A4H
MOV73H,#0B0H
MOV74H,#99H
MOV75H,#92H
MOV76H,#82H
MOV77H,#0F8H
MOV78H,#80H
MOV79H,#90H
MOV7AH,#0BFH
MOV6FH,#00H;
6FH存放1秒钟由50ms循环20次的次数
MOV6EH,#00H;
6EH存放控制定时器循环的次数
MOVSP,#30H
;
以上程序为:
1、将段控码存放到70H到7AH中。
2、开辟堆栈
以下程序为显示显示和判断开始计时键是否按下JC0:
LCALLXSXH;
调两次用显示学号的子程序
LCALLXSXH
LCALLJCAJ;
检查开启案件有没有按下,如果按下,则在A中的相应为会置一
JBACC.0,JC0;
对A中的ACC.0进行判断,如果为为高电平,则没有按下
ZL1:
判断按键是否松开
JBACC.0,JSKS;
如果松开则跳转到JSKS的程序中,
LCALLXSXH;
如果没有松开则2次显示学号(同时也起延时6秒的作用)
LCALLXSXH
SJMPZL1JSKS:
MOVIE,#00H;
时钟开始运行,让定时计数器1,以工作方式1工作,并置初值
MOVTMOD,#11H;
定时计数器1以工作方式1计时50ms,循环20次MOVTH1,#3CH;
定时时间是50MS
MOVTL1,#0B0H
SETBTR1
;
以查询方式判断计时是否已到,如果没有到则进行跳转到LOOP5
KS:
JBCTF1,LOOPS
SJMPLOOP5;
如果到达则进行电子时钟的进位操作
此段程序为电子时钟的各个数码管的段控码的进位判断LOOPS:
MOVTH1,#3CH
MOVR0,#6FH;
6F控制循环20次,当达到一秒钟,控制各个数码管的段控码的改变
INC@R0
CJNE@R0,#14H,LOOP5;
达到一秒钟则执行下面的程序
MOV@R0,#00H
INCR2
CJNER2,#7AH,LOOP
MOVR2,#70H
INCR3
LOOP:
CJNER3,#76H,LOOP1
MOVR3,#70H
INCR4
LOOP1:
CJNER4,#7AH,LOOP2
MOVR4,#70H
INCR5
LOOP2:
CJNER5,#76H,LOOP3
MOVR5,#70H
INCR6
LOOP3:
CJNER6,#7AH,LOOP4
MOVR6,#70H
INCR7
LOOP4:
CJNER7,#72H,LOOP5
CJNER6,#74H,LOOP5
MOVR7,#70H
此段程序为显示数码管的值,并判断调整开关是否按下
LOOP5:
LCALLXSSMG
LCALLXSSMG
LCALLJCAJ;
检查开启按键有没有按下
JBACC.0,KS;
没有按下就继续计时,按下就跳转到调时状态
LCALLXSSMG;
次语句既可以显示数码管,又可以达到延时的效果
ZCJC:
检查开关有没有松开,如果松开就跳转到调时程序
JBACC.0,TIAOSHI
SJMPZCJC;
如果没有松开就继续,就继续显示数码管并检查
此段程序是将调整按键的变化的值放到数码管显示,并判断调时结束按键是否按下
TIAOSHI:
LCALLXSSMG
LCALLTSJCAJ;
判断调时的哪个键按下,并就其控制的值加一
LCALLXSSMG
检查结束调整按键有没有按下
JBACC.0,TIAOSHI;
没有按下就继续调时,
LCALLXSSMG
JXJC2:
LCALLJCAJ
判断调时键是否松开松开,则跳转到计时状态
LJMPJXJC2
此段程序为定时器0,工作方式1,定时1msDELAY1MS:
MOVTH0,#0FCH;
延时1MS的程序
MOVTL0,#18H
SETBTR0
LOOOP:
JBCTF0,TCDS1MS
SJMPLOOOP
TCDS1MS:
RET
此段程序为判断有没有按键按下,按下就置一,并将其值放在A中
JCAJ:
MOVA,P1;
检查开启案件有没有按下
JBACC.0,JCAJJS;
ACC.0=1,没有键按下
MOVA,P1;
如果有键按下,则ACC.0为0JCAJJS:
RET
此段程序是判断调时按键是否按下,按下就使相应的段控码加一
TSJCAJ:
调时检查按键(首写字母:
TSXSAJ)
JBACC.1,JC2;
ACC.1控制秒钟的调时,ACC.1为低电平表示按下
TSJC1:
MOVA,P1
JBACC.1,ZX1;
ACC.1的键是否松开
SJMPTSJC1
ZX1:
INCR2;
松开则加一
CJNER2,#7AH,JC2;
判断有没有进位
CJNER3,#76H,JC2
LJMPJC2
JC2:
MOVA,P1;
判断分钟的调整按键有没有按下
JBACC.2,JC3;
ACC.2控制分钟的调时,ACC.2为低电平表示按下
TSJC2:
MOVA,P1;
判断分钟调整键有没有松开
JBACC.2,ZX2
SJMPTSJC2
ZX2:
INCR4;
CJNER4,#7AH,JC3;
CJNER5,#76H,JC3
LJMPJC3
JC3:
判断时钟的调整按键有没有按下
JBACC.3,JSTS;
ACC.3控制分钟的调时,ACC.3为低电平表示按下
TSJC3:
判断时钟的调整按键有没有松开
JBACC.3,ZX3
SJMPTSJC3
ZX3:
INCR6;
CJNER7,#72H,JXZX;
CJNER6,#74H,JXZX
SJMPJSTS
JXZX:
CJNER6,#7AH,JSTS
INCR7
JSTS:
RET
显示各个数码管中的值,每显示一个延时1秒
XSSMG:
MOVA,#0FEH;
显示数码管各个的值,每显示显示一个数码管延时1秒,然后控制为左移
MOV7DH,R2;
7DH是为将R2的地址放到R0中
MOVR0,7DH
MOVP0,@R0;
将R2的段控码送到P0口
MOVP2,A
LCALLDELAY1MS
MOV7DH,R3;
RLA
MOVP0,@R0
LCALLDELAY1MS
MOVP0,#0BFH;
0BFH为一的共阳段控码
MOV7DH,R4
MOV7DH,R5
MOV7DH,R6
MOV7DH,R7
RET
以上这段程序是将R2到R7中控制的段控码分别送到秒、分、时的数码管中显示并延时每个数码管显示后延时1秒
XSXH:
MOVA,#0FEH;
显示学号(首写字母)的的子程序
MOVP0,#82H
LCALLDELAY1MS;
显示6并延时1ms
MOVP0,#99H
显示4并延时1ms
MOVP0,#0BFH
显示一并延时1ms
MOVP0,#0B0H
LCALLDELAY1