《基于单片机的智能电子钟系统设计大学本科毕业论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的智能电子钟系统设计大学本科毕业论文.doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于单片机的智能电子钟系统设计姓 名:李永健、王海、吕军梅、巩珍珍 课题组的分工或贡献:每人完成的百分比或者每人负责的内容课 程 名 称: MCS-51单片机应用设计指 导 教 师:李林2014年12月基于单片机的智能电子钟系统设计李永健、王海、吕军梅、巩珍珍(信息科学与工程学院)摘要:电子钟是一种利用数字电路来显示时间的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。 本设计通过以单片机芯片STC89C51为核心,通过软件编程完成时钟及定时的基本功能,温度芯片DS18B20完成温度测量功能。采用了六位数码管动态显示时、分、秒,两个LED灯分别
2、指示上下午,同时还有两个LED灯每半秒分别闪烁一次。通过4个外部按键可以控制小时和分钟的定时和定闹以及报警。此电子钟具有性能优越,操作简单等优点。关键词:智能电子钟、STC89C51、LED数码管、DS18B20目录一、 项目目的二、 项目要求三、 基本原理四、 设计方案 (一)系统整体设计思想(二) 电子钟计时(三) 数码管显示(四) 调时(五) 定闹、报警(六) 温度采集五、结论六、参考文献七、附录一 附录二一、 项目目的 1. 掌握单片机各个功能模块(并行I/O口、中断系统、定时器/计数器)的工作原理、性能和特点;2、掌握单片机外围电路的设计方法和仿真方法;3、掌握单片机外围电路的调试方
3、法;4、掌握单片机外围电路设计报告的撰写方法;5、培养团队合作精神、项目组织与管理、交流表达能力;6、培养责任感和职业道德。二、项目要求本课程三级项目要求学生使用MCS-51系列单片机设计并制作一个具有时间显示、按键调时、闹钟报警、温度测量、遥控和自动调时等功能的软硬件系统,可实现六项基本功能分别如下:1) 时间显示:采用六个数码管显示当前时间:小时、分钟、秒。2) 温度显示:采用两个数码管显示当前环境温度。3) 上下午指示:采用两个发光二极管来指示上下午。4) 半秒提示:采用两个发光二极管,每隔半秒闪烁。5) 调时功能:采用三个按键(K1-K3)来调整时间,步骤如下:a)按下K1键,开始调小
4、时,同时2个小时数码管闪烁。b)按下K2键,小时加;按下K3键,小时减。c)小时调整好后,再按下K1键,开始调分钟,同时分钟数码管闪烁。d)按下K2键,分钟加;按下K3键,分钟减。e)调整好分钟后,再按下K1键,调时结束。6) 闹钟功能:采用三个按键(K2-K4)来调整闹钟,步骤如下:a)按下K4键,开始调小时,同时2个小时数码管闪烁。b)按下K2键,小时加;按下K3键,小时减。c)小时调整好后,再按下K4键,开始调分钟,同时分钟数码管闪烁。d)按下K2键,分钟加;按下K3键,分钟减。e)调整好分钟后,再按下K4键,定闹结束。闹钟定时的时间到后,蜂鸣器/扬声器发出提示音;用户需按K2-k4键来
5、取消闹钟警告。三、 基本原理 利用软件编程借助于定时器/计数器0实现间隔为1s的定时功能,格式为秒,分,时,在其中断服务程序中实现对小时、分钟、秒单元数值的调整。主程序通过不断循环调用调时子程序,实现整个功能。利用嵌套在调时子程序中的显示子程序实现上下午指示和半秒闪烁。利用温度芯片DS18B20来测量温度。四、 设计方案 (一)系统整体设计思想 总体设计框图:按键(k1k4)DS18B20温度芯片STC89C52单片机 电源8片数码管显示LED灯指示(上下午、半秒)报警 通过定时器/计数器0实现1s的计时,将它设计成内部中断,即每计满1s产生中断信号,主程序转去执行定时器0的中断服务程序,按照
6、时间规则改变相应RAM存储单元的数值。在主程序里首先不断检测是否有按键按下,如果没有,则不断调用显示子程序,否则,根据按下的是哪个键可以转去执行相应的程序段,分别实现小时和分钟的加和减以及闹钟定时,而每次执行结束都会调用显示子程序,保证数码管的稳定显示,同时也可以实时根据存储单元数值的不同显示。而闹钟的倒计时则利用定时器/计数器1的计时来实现,同样为1s计时,只不过是在中断服务程序中实现对存储单元的按规则递减,同样的即使显示就可以实现倒计时功能,到达00:00:00时就可以调用报警子程序,实现报警。(1) RAM单元分配(21H).0指示即将显示的是十位还是个位20H #0AH,定时器/计数器
7、0或1计满10次为1s19H#05H,定时器/计数器0或1计满5次为0.5s18H#05H,显示子程序内部执行次数29H #01010101B 30H 小时的BCD码31H 分钟的BCD码 32H 秒的BCD码TH0#3CH,T0计数初值,可计时100msTL0#0B0HTH1 #3CH,T1计数初值,可计时100msTL1 #0B0H(2) 循环执行部分:HERE:LCALLADJUSTAJMPHERE;反复调用ADJUST程序可以实现所有功能(3)主程序的初始化部分: MAIN:SETBP3.0 CLRP3.1 MOVTMOD,#01H;设T0方式1,定时 CLRA;A清零 MOV30H,
8、A;“时”单元清零 MOV31H,A;“分”单元清零 MOV32H,A;“秒”单元清零 SETBET0;允许中断 SETBET1SETBEA;CPU开中断MOVTH0,#3CH;给T0装入计数初值,可计时100msMOVTL0,#0B0H;MOVTH1,#3CH;给T1装入计数初值MOVTL1,#0B0HSETBTR0;启动计数 (二)时间显示模块(1) 物理连接P0.0P0.7接数码管的adp(片选码)P2.0P2.5接数码管的16(段选码)时间显示:采用六个数码管显示两位的小时,分钟,秒 (2) 流程图: (3) 动态显示的核心在于依次选中一块数码管,并在此之前将相应数码管要显示的数字的段
9、码送到端口,进行相应的延时后关闭数码管选通信号。不断执行上述过程就可以实现较为稳定的动态显示。每次进入主程序都首先判断是否到了1s,到了则继续执行,否则,返回中断。为了在显示完秒之后还能继续显示小时的十位,必须有一个用来计数的单元,用以区分当前显示的是小时还是分钟,还是秒,并以此作为仅次于显示次数N的循环。对每一个单元(30H32H)的两位BCD码的显示,用一位(21H).0来指示即将显示的是十位还是各位,据此控制刚才所说的单元指示数值是否用该加一或者重新初始化。由此在DISPLAY子程序中有3重循环。调用入口参数为30H32H单元的数值。(4) 半秒提示:采用两个发光二极管,每隔半秒闪烁。中
10、断5次就是半秒,并在相应的分支里设置P3.6和P3.7,保证二者同时取反即可。这可以放在显示子程序内部,保证时间显示和半秒闪烁的同步,同时可以节约计数器。(5) 上下午指示:采用两个发光二极管来指示上下午。只要判断30H单元的内容与11H相比较就可以知道是上午还是下午了,在分支语句里控制相应的灯亮了就行。如上所述,将它放置在显示子程序里较为方便。时分秒时间显示模块的仿真结果半秒提示上午(三) 按键模块ADJUST的主体部分就是检测是否有按键按下,如果没有只是调用显示子程序,而有的话转去执行相应的分支语句。为了防止干扰,我们便写了一个延时5ms左右的子程序,若是经过延时后,按键信号依然有效,则认
11、定是有效信号,否则为干扰,返回程序起始点重新检测。K1可以控制实现定时,所以定时器计数器依然是0在起作用,在其分支语句里根据按键次数使指针指向不同的单元(小时、分钟),然后检测K2K3的信号到来。在K2K3的分支语句里实现指针所指向单元的加一或者减一,但是注意要按照时间规则来,对加一或者减一结果进行调整,否则可能出错。对单元的加一或者减一直接反映到显示子程序和定时器计数器0或者1的16位计数单元里,所以,每次更改后的值就相当于对时间确定调节,并从该处继续计时,这样就实现了调时功能。K4的分支语句要求实现定闹,它与K1分支语句的不同之处是更改当前计数器为1,关闭0,在计数器1的中断服务程序里可以
12、实现倒计时功能。元器件:按钮开关K1:控制调时K3:对应单元减一K2:对应单元加一K4:控制定闹(四)闹钟模块(1)计时器T1的倒计时同样是1s的倒计时,只是在中断程序里实现对计时单元的减一,但在减一之前检测是否为0,如果是就调用报警子程序,如果不是则按照规则减一,注意的同样是数值的调整。调整结束后返回ADJUST程序,继续检测,这样就可以实现连续调节。(五) 报警模块连线P1.7引脚连接到三极管元器件:蜂鸣器、三极管2N2907原理:由单片机芯片中引脚输出的信号来控制蜂鸣器的开和关在报警子程序里要求不断调用显示子程序,这样数码管可以在时间到达之后稳定显示00:00:00.(六)温度测量模块元
13、器件:数字温度传感器DS18B20(测温范围-55度125度)原理:利用温度传感器测量到温度值通过引脚传递到芯片中 利用DS18B20温度芯片来实现温度测量的功能,并将其显示在数码管上。测量的温度范围是零下55至零上125摄氏度。 DS18B20的六条控制命令如下表:指 令约定代码操 作 说 明温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9个字节内容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节读电源供电方式B4H启动DS18B20发送电源供
14、电方式的信号给主CPU五、 结论 本次项目利用单片机STC89C52控制串行口与时钟芯片DS1302构成数字时钟电路,实现计时功能,同时具有定时闹钟的功能,并且可以显示温度,定时和调时的功能仅用四个键控制,更加方便。本设计没有实现上下午提示和半秒提示的功能,但是智能电子钟的基本功能已经实现,所以算是比较成功的。六、 不足和改进(1) 当定闹结束之后不能够通过按键来重新启动,这个可以通过在报警子程序里跳转到主程序重新开始执行来实现。(2) 在调时和定闹的过程中,相应模块不能闪烁,这个可以通过调用一个新的显示子程序,实现相应数码管间歇性亮灭。(3) 时间紧迫,没有对减或者加的单元设定上限和下限值,
15、所以只能实现一天内的功能。这个可以通过在相应程序段中与限值比较来实现。(4) 温度显示模块是一大遗憾,没有足够的时间来做。(5) 在设计过程中另外有一个关于按键的想法,没有能够编程实现。它是利用两级中断来实现。加一或者减一是通过外部中断的中断服务程序实现。这里可能与按键延时有关,同时这样的设计可能会涉及到从引脚读入信号,这在实际设计中不可取。此处不再赘述。七、感想 经历过这么多不间断的讨论课和三级项目,我们有挺多感触的,从最基本上来说我们看到了,也意识到了自己的不足,对于不断克服的各种阻碍也让我们体会到了讨论课、三级项目的意义所在。对于只接触课本只动笔杆的我们,面临实际的设计,让我们很是尴尬,
16、都说理论联系实际,真正到联系的时候才发现挺困难的,不过正是理论知识的各种补充才让我们能最终完成任务,然后深深地体会到理论对现实的指导作用。我们现在最缺乏的就是实践动手的经验,而理论联系实践并不像我们想象的那么简单,它需要坚实的理论基础和实际工作经验。坚实的理论基础决定了我必须坚持学习新的知识新的理论,完善了自己的知识结构,才能在以后的实际中轻松面对。在这个一边忙着复习忙着考试又要准备讨论课三级项目的日子里,真真正正的体会到了时间的宝贵,有点像高中忙忙碌碌的生活,不过能按时完成三级项目对我们来说也是一个莫大的安慰。严谨和细心是做项目的必要态度,要想做好一件事,就必须一丝不苟、态度认真。俗话说:“
17、失之毫厘,谬之千里。”在设计上尤其应该注意。再者就是设计中要严谨和细心,任何的微小误差都达不到预计的结果,当然对于我们来说就是设计中要走一些弯路,而且在这个严重缺少时间又惦记回家问题的我们来说也是一个很严重的打击。不过,困难虽是难免的,但我们有信心就能并且已经战胜了困难,完成了这个无比揪心的三级项目。因为时间等各种关系设计中难免有些不足还请老师助教给予批评和帮助。程序:ORG0000HLJMPMAINORG000BHLJMPIT0PORG001BHLJMPIT1PORG0100HDB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0-9的共阳极显示段码
18、ORG1000HMAIN:SETBP3.0;6亮,绿灯CLRP3.1MOVTMOD,#01H;设T0方式1,定时,T1为方式1,计数;SETBIT0;外部中断0为跳沿方式有效;SETBIT1;外部中断1为跳沿方式有效;SETBPX0;外部中断0为高优先级中断;SETBPX1;外部中断1为高优先级中断;CLRPT0;定时器0为低优先级中断;CLRPT1;计数器1为低优先级中断MOV20H,#0AH;中断10次为1s,中断计数单元为20HMOV19H,#05HMOV29H,#55H;01010101B,不断左移位,相当于最高两位的0和1转换MOV18H,#05H;DISPLAY子程序执行这么多次后
19、结束CLRA;A清零MOV30H,A;“时”单元清零MOV31H,A;“分”单元清零MOV32H,A;“秒”单元清零SETBET0;允许中断SETBET1;SETBEX0;SETBEX1SETBEA;CPU开中断MOVTH0,#3CH;给T0装入计数初值,可计时100msMOVTL0,#0B0H;MOVTH1,#3CH;给T1装入计数初值MOVTL1,#0B0HSETBTR0;启动计数;SETBTR1MOVR1,#31HHERE:NOP;允许被中断LCALLADJUSTAJMPHERE;反复调用显示子程序ADJUST:MOVR3,#00HA1:LCALLDISPLAYMOVP1,#0FFHJN
20、BP1.2,K3JNBP1.1,K2JNBP1.0,K1JNBP1.3,K4LJMPA1;如果没有键按下重新检测;等待按键抬起来J3:JBP1.2,A1LCALLDISPLAYLJMPJ3J2:JBP1.1,A1LCALLDISPLAYLJMPJ2J1:JBP1.0,A1LCALLDISPLAYLJMPJ1J4:JBP1.3,A1LCALLDISPLAYLJMPJ4K3:LCALLDELAYJBP1.2,A1;确实有键按下,进入下面处理,否则严重干扰,重测MOVA,R1ANLA,#0FHCJNEA,#09H,M1MOVA,R1ADDA,#10HANLA,#0F0HMOVR1,AJMPM2M1:
21、INCR1M2:LCALLDISPLAYLJMPJ3;等按键弹起来,按一次,只加一次K2:LCALLDELAYJBP1.1,A1MOVA,R1ANLA,#0FHJNZNONBOUNDMOVA,R1CLRCSUBBA,#06HMOVR1,ANONBOUND:DECR1LCALLDISPLAYLJMPJ2K1:LCALLDELAYJBP1.0,A1INCR3CJNER3,#01H,TWICE1MOVR1,#30HJMPS1TWICE1:CJNER3,#02H,DONE;完了MOVR1,#31HS1:LCALLDISPLAYLJMPJ1K4:LCALLDELAYJBP1.3,N1JMPN2N1:LJ
22、MPA1N2:CLRTR0SETBTR1INCR3CJNER3,#01H,TWICE2MOVR1,#30HJMPS2TWICE2:CJNER3,#02H,DONE;完了MOVR1,#31HS2:LCALLDISPLAYLJMPJ4DONE:NOPRETIT0P:PUSHAcc;保护现场PUSHPSWCLREAMOVTH0,#3CH;重新装入计数初值MOVTL0,#0B0HDJNZ19H,HALF;半秒MOV19H,#05HMOVA,29HRLAMOV29H,AHALF:DJNZ20H,RETURN;1s还没有到,那么就返回继续计数100sMOV20H,#0AH;否则,重新装入中断次数计数值MO
23、VA,#01H;ADDA,32H;秒单元增1DAA;将二进制的秒数转换成BCD码,以便显示MOV32H,A;返回到秒单元保存CJNEA,#60H,RETURN;如果不满60s,继续下一个1s的计时MOV32H,#00H;否则,秒单元就要清零MOVA,#01HADDA,31H;针对分单元加1DAAMOV31H,ACJNEA,#60H,RETURN;如果不满60分钟,则继续下一个1s的计数MOV31H,#00H;否则分单元清零MOVA,#02HADDA,30H;针对时单元加1DAAMOV30H,ACJNEA,#24H,RETURN;如果不满24小时,则继续计数,否则,全部清零MOV30H,#00H
24、;时单元清零RETURN:SETBEAPOPPSWPOPAccRETIDISPLAY:;CLREAPUSHAccPUSHPSWPUSH01HLOOP0:DJNZ18H,STARTLJMPFINISHSTART:MOVDPTR,#0100HMOVC,(29H).7;29H的最高两位每隔半秒互调一次,只要不断调用显示程序,输出就会每隔半秒变化一次MOVP3.7,CMOVC,(29H).6MOVP3.6,CMOVA,#11HCJNEA,30H,NEXT1;若是12小于小时数,则Cy被置位,否则清零NEXT1:JCNIGHT;C为0,是早上SETBP3.0;6亮,绿灯CLRP3.1JMPMOONNIG
25、HT:SETBP3.1;C为1,是晚上CLRP3.0;7亮,黄灯MOON:NOPNOPMOV10H,#01H;存放片选码MOVR0,#30H;寄存器间接寻址SETB(21H).0;指示将要显示的是十位还是个位,1表示十位,0表示个位LOOP1:MOVA,R0;A中是待显示的两位数BCD码JNB(21H).0,NEXT;若将要显示个位则直接相与取位SWAPA;否则,十位与个位交换再取位NEXT:CPL(21H).0;指示位取反,为下次显示做准备ANLA,#0FH;取得待显示的一位BCD码MOVCA,A+DPTR;取得待显示段码MOVP0,A;准备显示MOVP2,10H;片选,亮了NOPNOPNO
26、PMOVP0,#0FFH;关闭数码管MOVA,10HRLA;为下次显示做准备MOV10H,AJNB(21H).0,LOOP1;若将显示个位,则R0不变INCR0;否则,加一CJNER0,#33H,LOOP1;若刚才显示的是秒并且是个位,也就是显示结束,那么重新置数AJMPLOOP0;否则,继续显示FINISH:MOV18H,#05HPOP01HPOPPSWPOPAcc;SETBEARET;INT0中断服务程序EINT0:PUSHPSW;它本来就是高优先级中断,所以不会再被打断PUSHAccINCR1MOVA,R1DAAMOVR1,APOPAccPOPPSWRETI;INT1中断服务程序EINT
27、1:PUSHPSWPUSHAccDECR1MOVA,R1DAACLRCSUBBA,#0CHMOVR1,APOPAccPOPPSWRETI;T1中断服务程序;K4按钮第一次按下,转到T1的中断程序这里IT1P:NOPPUSHAcc;保护现场PUSHPSWCLREAMOVTH1,#3CH;给T1装入计数初值MOVTL1,#0B0HDJNZ19H,HALF1;半秒MOV19H,#2AHMOVA,29HRLAMOV29H,AHALF1:DJNZ20H,RETURN1;1s还没有到,那么就返回继续计数100sMOV20H,#4AH;否则,重新装入中断次数计数值MOVA,30H;CJNEA,#00H,B0
28、MOVA,31HCJNEA,#00H,B0MOVA,32HCJNEA,#00H,B0LJMPSPEAKERB0:MOVA,32HCJNEA,#00H,W0LJMPY0W0:;DECA;MOV32H,AANLA,#0FHJNZQ0MOVA,32HCLRCSUBBA,#06HMOV32H,AQ0:DEC32HLJMPRETURN1Y0:MOV32H,#59HMOVA,31HCJNEA,#00H,W1LJMPY1W1:;DECA;MOV31H,AANLA,#0FHJNZQ1MOVA,31HCLRCSUBBA,#06HMOV31H,AQ1:DEC31HLJMPRETURN1Y1:MOV31H,#59HMOVA,30HCJNEA,#00H,W2LJMPY2W2:;DECA;MOV30H,AANLA,#0FHJNZQ2MOVA,30HCLRCSUBBA,#06HMOV30H,AQ2:DEC30HLJMPRETURN1Y2:LJMPRETURN1RETURN1:SETBEAPOPPSWPOPAccRETISPEAKER:NOPNOPSS:CPLP1.7LCALLDISPLAYNOPNOPNOPNOPJMPSSRET;延时子程序5msDELAY:MOVR6,#5D1:MOVR7,#250D0:NOPNOPDJNZR7,D0DJNZR6,D1RETEND