1、电子钟课程设计35资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。 毕业设计任务书一 题目 电子钟二 基本要求 利用单片机内部的定时器设计一个电子时钟, 在LED 上显示时、 分、 秒 毕业设计报告写作要求 一、 封面 二、 内容提要 三、 目录 四、 正文 1、 概述所作题目的意义、 本人所做的工作及系统的主要功能2、 硬件电路设计及描述; 3、 软件设计流程及描述; 4、 源程序代码。五 设计体会 六、 参考文献 单片微型计算机应用技术徐仁贵 机械工业出版社单片机控制技术及应用韩全立 电子工业出版社自动打铃器械摘要文章介绍了一种以8051单片机为核心片带有数码LED显示时.分.
2、秒和以指示灯做标志的按键校时自动打铃器。关键词单片机存储器 数码管 按键 电铃一、 绪论用单片机控制的自动打铃器, 充分发挥单片机体积小, 价格便宜, 功耗低可靠性好等特点。可用于学校作息, 方便了广大师生。同时也可作为电子手表的设计方案, 两者在原理及实现的功能上是一样的效果, 也可作为各种时钟控制电路的报警装置使用, 具有用途范围广, 原理简单便于操作和维护的优点总体上单片机设计方案在现实中应用非常广泛 而且在现实生活中也比较容易实现设计的实施二、 总体设计方案.设计思路利用单片机及定时器设计的一个时钟, 在每次秒加1的计时过程中, 都与规定的时间作比较, 如果相等就进行开关电铃, 不等则
3、返回。同时时时的时间显示功能为我们提供了方便 2 总体电路方框图三、 设计原理分析1.校时模式按下K1( 模式选择键) , 将模式选择为校时模式( 模式指示灯黄灯亮) , K2, K3, K4分别为时钟加1键, 分钟加1键, 秒钟加1键, K5无用。2.定时模式按下K1( 模式选择键) , 将模式选择为定时模式( 模式指示灯绿灯亮) , K2为定时器组选择( 本装置有24组定时器) 键, K3, K4分别为定时器时钟加1键和定时器分钟加1键, K5为定时器状态选择键, 每按K5一次, 此组的定时器状态改变一次, 并将此组数据存入片内数据存储器中按下K1( 模式选择键) , 将模式选择为工作模式
4、( 模式指示灯红灯亮) , K2, K3, K4, K5无用。此模式为正常工作模式3 自动打零器电路图四、 程序部分1.程序分为五部分1.初始化程序, 2.键值处理程序, 3.中断程序, 4.显示程序, 5显示驱动程序2.部分寄存器及按键说明28H: 扫描指针寄存器20H-25H: 显示缓存寄存器R6: 时钟寄存器R5: 分钟寄存器R4: 秒钟寄存器K1: 模式选择键K2: 时加1( 定时器组加1) 键K3: 分加1( 定时器时加1) 键K4: 秒加1( 定时器分加1) 键K5: 定时器状态改变既存储键3.程序流程图4 总体软件流程图的解释总体流程图的定时器首先设定一个时间, 执行程序时及进入
5、计时程序。经过加一比较程序与设定的计时程序进行比较, 如果不到计时时间执行中断返回指令。在此时如果校时键启动时可进行校时作用。而LED显示器也经过8051控制程序实时传来的数据进行显示工作。LED也是动态的显示方式。5 校时程序流程图首先进入校时显示模式, 此时K1如果有按下, 校时程序即可执行。此时如果K2手工操作下被按下则计时加一, 达到与想要的结果一致即可停止K2的操作, 如果计时结果在现在时间之前则可一直按下直到到达24小时一个循环时候, 然后再次按下达到想要的计时结果。而24时也是校时循环终点。此时指示灯也有所变化。能够作为执行程序效果的参考。而校分流程图也对整体软件流程产生影响,
6、最终达到时间的精确。小时和分钟的实时显示是定时的基础。6 校分及显示流程图解释首先进入校分模式时看K1是否按下, 如果按键则K3是否有按键, 如果有则分钟加一, 如此便起到修改分钟的作用, 如果分钟修改到达60分钟则分钟全部清零, 分钟计时重新开始。如果K1键没有按下, 则小时和分钟数据进入显示缓存器, 然后进入显示器显示, 此时看K1键是否还在断开状态, 如果没有按下则时间还是显示而不做变化如果K1键按下则此时进入定时器进入工作状态, 因此K1键是程序运行的关键所在, 在K1键进入工作状态的同时修改小时和分钟及定时器的工作程序才能进行7 程序清单1.初始化程序: READ EQU 0 ; 读
7、RAMWRITE EQU 2 ; 写入RAMEWEN EQU 4 ; RAM写入使能EWDS EQU 6 ; RAM写入禁止ADR46 EQU 21H ; RAM地址显示显示启动定时器进入工作状态时分值送显示缓存区K1 有按键吗?清分单元显示分值加1置校分标志K3 有按键吗?K1 有按键吗?是60 分吗?THIGH EQU 0F8HTLOW EQU 5FHTIMENEQU 30 ; 打铃持续时间( 30秒) CS BIT P3.7 ; RAMCSCLK BIT P3.6 ; RAMCLKDI BIT P3.5 ; RAMDIDO BIT P3.4 ; RAMDOORG 0000H ; 主程序起
8、始地址AJMP START ; 跳至主程序ORG 000BH ; TIMER0中断起始地址AJMP TIM0 ; 跳至TIMER0中断子程序START:MOV SP,#60H ; 设置堆栈在60HMOV 28H,#00 ; 显示寄存器初值为00MOV R6,#12H ; 时寄存器值为12HMOV R5,#00H ; ”分”寄存器值为00HMOV R4,#00H ; ”秒”寄存器值为00H2.键值处理程序: LOOP: SETB P0.5 ; 工作模式CLR P0.6CLR P0.7JB P0.0,N1 ; K1( 模式选择键) 按了? 不是则跳至N1ACALL DELAY ; 消除抖动JNB
9、P0.0,$ ; K1( 模式选择键) 放开了? ACALL DELAY ; 消除抖动AJMP SET ; 转到定时模式SETN1: MOV 2FH,R6 ; 将时钟数据载入2FH中MOV 2EH,R5 ; 将分钟数据载入2EH中MOV RAM,#00 ; 把93C46地址置0SETB RS0 ; 将工作寄存器组选择1区LOOP1: MOV A,#READ ; 读RAMACALL RAMMOV A,R3 ; 取出定时器的状态ANL A,#01HCJNE A,#01H,N2 ; 定时器为关闭, 则跳转至N2MOV A,R4 ; 取出定时器分钟数据CJNE A,2FH,N2 ; 定时器分钟数据与时
10、钟分钟不同则转至N2MOV A,R5 ; 取出定时器时钟数据CJNE A,2EH,N2 ; 定时器时钟数据与时钟时钟不同则转至N2MOV TMOD,#01H;MOV TH0,#THIGH;MOV TL0,#TLOWH;SETB TR0SETB P2.1 ; 定时器时间到, 打铃MOV R7,#9678H;中断查询7500次让时间达到30秒SJMP $TISE:DJNE R7CPL P2.1 终止打铃MOV A,RAM ; 将RAM地址载入A中N2: CJNE A,#1EH,N3 ; 到定时器数据表表尾? 没到转至N3MOV ADR46,#00 ; 到表尾, 置RAM地址为表头AJMP LOOP
11、1 ; 转至LOOP1N3: INC RAM ; RAM地址加2INC RAMAJMP LOOP1 ; 转至LOOP1SET: CLR P0.5 ; 校时模式SETB p0.6 高电平CLR P0.7 低电平LOOPS: JB P0.0,N11 ; K1( 模式选择键) 按了? 不是则跳至N11ACALL DELAY ; 消除抖动JNBP0.0,$ ; K1( 模式选择键) 放开了? ACALL DELAY ; 消除抖动AJMP SETTIME ; 转至SETTIMEN11: JB P0.1,N13 ; K2( 时钟加1键) 按了? 不是则跳至N13ACALL DELAY ; 消除抖动MOV
12、A,R6 ; 将时寄存器的值载入AADD A,#01H ; A内容加1DA A ; 做十进制调整MOV R6,A ; 将A的值存入时寄存器CJNE A,#24H,N12 ; 是否超过24时? 不是则跳至N12MOV R6,#00H ; 是则清除时寄存器的值为00N12: JNB P0.1,$ ; K2( 时钟加1键) 放开了? ACALL DELAY ; 消除抖动N13: JB P0.2,N15 ; K3( 分钟加1键) 按了? 不是则跳至N15ACALL DELAY ; 消除抖动MOV A,R5 ; 将分寄存器的值载入AADD A,#01 ; A内容加1DA A ; 做十进制调整MOV R5
13、,A ; 将A的值存入分寄存器CJNE A,#60H,N14 ; 是否超过60分? 不是则跳至N14MOV R5,#00H ; 是则清除分寄存器的值为00N14: JNB P0.2,$ ; K3( 分钟加1键) 放开了? ACALL DELAY ; 消除抖动N15: JB P0.3,N17 ; K4( 秒钟加1键) 按了? 不是则跳至N17ACALL DELAY ; 消除抖动MOV A,R4 ; 将秒寄存器的值载入AADD A,#01 ; A内容加1DA A ; 做十进制调整MOV R4,A ; 将A的值存入秒寄存器CJNE A,#60H,N16 ; 是否超过60秒? 不是则跳至N16MOV
14、R4,#00 ; 是则清除分寄存器的值为00N16: JNB P0.3,$ ; K4( 秒钟加1键) 放开了? ACALL DELAY ; 消除抖动N17: AJMP LOOPS ; 转至LOOPSSETTIME:CLR P0.5 ; 定时模式CLR P0.6SETB P0.7MOV RAM,#00HMOV A,#READ ; 将数据存储器的地址为RAM中的数据ACALL TO RAMLOOPB:ACALL DISP ; 调用DISPJB P0.0,N21 ; K1( 模式选择键) 按了? 不是则跳至N21ACALL DELAY ; 消除抖动JNB P0.0,$ ; K1( 模式选择键) 放开
15、了? ACALL DELAY ; 消除抖动AJMP LOOP ; 转至LOOPN21: JB P0.1,N22 ; K2( 定时器组加1键) 按了? 不是则跳至N22ACALL DELAY ; 消除抖动MOV A,RAM ; 将地址载入ACLR C ; 清除进位位RRC A ; A右移1位ADD A,#01H ; 地址加1MOV R6,A ; 将A存入R6CLR C ; 清除进位位RLC A ; A左移1位MOV RAM,A ; 将A中地址存入RAMMOV A,#READ ; 读RAM地址为ADR46中的数据ACALL TORAMJNB P0.1,$ ; K2( 定时器组加1键) 放开了? A
16、CALLDELAY ; 消除抖动N22: JB P0.2,N24 ; K3( 定时器分钟加1键) 按了? 不是则跳至N24ACALLDELAY ; 消除抖动MOV A,R4 ; 将定时器分寄存器的值载入AADD A,#01 ; A内容加1DA A ; 做十进制调整MOV R4,A ; 将A的值存入定时器分寄存器CJNE A,#60H,N23 ; 是否超过60分? 不是则跳至N16MOV R4,#00H ; 是则清除分寄存器的值为00N23: JNB P0.2,$ ; K3( 定时器分钟加1键) 放开了? ACALL DELAY ; 消除抖动N24: JB P0.3,N26 ; K4( 定时器时
17、钟加1键) 按了? 不是则跳至N26ACALL DELAY ; 消除抖动MOV A,R5 ; 将定时器时寄存器的值载入AADD A,#01H ; A内容加1DA A ; 做十进制调整MOV R5,A ; 将A的值存入定时器时寄存器CJNE A,#24H,N25 ; 是否超过24时? 不是则跳至N25MOV R5,#00 ; 是则清除分寄存器的值为00N25:JNB P0.3,$ ; K4( 定时器时钟加1键) 放开了? ACALL DELAY ; 消除抖动N26:JB P0.4,N27 ; K5( 改变定时器状态存储键) 按了? 不是则跳至N27ACALL DELAY ; 消除抖动INC R3
18、 ; 改变R3最低位的值( 表示定时器的状态, 1表示开, 0表示关) MOV A,#WRITE ; 将A的值写入RAM地址为ADR46中ACALL TORAMJNB P0.4,$ ; K5( 改变定时器状态存储键) 放开了? ACALL DELAY ; 消除抖动N27:AJMP LOOPB ; 转至LOOPB3.中断程序: TIM0:MOV TH0,#THIGH ; 重设计时4000微秒MOV TL0,#TLOWPUSH ACC ; 将A的值存入堆栈PUSH PSW ; 将PSW的值存入堆栈CLR RS0 ; 设置工作寄存器为0区DJNZ R2,X2 ; 计时1秒MOV R2,#250ACA
19、LL CLOCK ; 调用计时子程序CLOCKACALL DISP ; 调用显示子程序X2:ACALL SCAN ; 调用扫描子程序POP PSWPOP ACCRETI4.显示器驱动程序: SCAN:MOV R0,#28H ; ( 28H) 为扫描指针INC R0 ; 扫描指针加1CJNE R0,#6,X3 ; 扫描完6个显示器? 不是跳至X3MOV R0,#00 ; 是则扫描指针为0X3:MOV A,R0 ; 扫描指针载入AADD A,#20 ; A加常数20H( 显示寄存器地址) =各时间显示区地址; 存入R1=各时间显示地址MOV R1,A ; 扫描指针存入AMOV A,R0 ; 将A高
20、低4位交换( P1高4位为扫描值, SWAP A ; 低4位为显示数据值) ORL A,R1 ; 扫描值+显示值MOV R1,A ; 输出至P1RET计时程序: CLOCK:MOV A,R4 ; R4为秒寄存器ADD A,#01 ; 加1DA A ; 做十进制调整MOV R4,A ; 存入秒寄存器CJNE A,#TIMEN,X4 ; 是否超过打零连续时间? 不是则跳至X4CLR P2.0 ; 关铃X4:CJNE A,#60H,X5 ; 是否超过60秒? 不是则跳至X5MOV R4,#00 ; 是则清除为0MOV A,R5 ; R5为分寄存器ADD A,#01 ; 加1DA A ; 做十进制调整
21、MOV R5,A ; 存入分寄存器CJNE A,#60H,X5 ; 是否超过60分? 不是则跳至X5MOV R5,#00 ; 是则清除为0MOV A,R6 ; R6为时寄存器ADD A,#01 ; 加1DA A ; 做十进制调整MOV R6,A ; 存入时寄存器CJNEA,#60H,X5 ; 是否超过24时? 不是则跳至X5MOV R6,#00 ; 是则清除为0X5:RET5.显示程序: DISP:MOVR1,#20 ; ( 20H) 为显示寄存器, R1=20HMOV A,R6 ; 将时寄存器的内容存入AMOV B,#01H ; 设B累加器的值为10HDIV AB ; A/B, 商( 十位数
22、) 存入A, 余数( 个位数) 存入BMOV R1,B ; 将B的内容存入( 20H) INC R1 ; R1=21HMOV R1,A ; 将A的内容存入( 21H) INC R1 ; R1=22HMOV A,R5 ; 将分寄存器的内容存入AMOV B,#01H ; 设B累加器的值为10HDIV AB ; A/B, 商( 十位数) 存入A, 余数( 个位数) 存入BMOV R1,B ; 将B的内容存入( 22H) INC R1 ; R1=23HMOV R1,A ; 将A的内容存入( 23H) INC R1 ; R1=24HMOV A,R4 ; 将秒寄存器的内容存入AMOV B,#01H ; 设
23、B累加器的值为10HDIV AB ; A/B, 商( 十位数) 存入A, 余数( 个位数) 存入BMOV R1,B ; 将B的内容存入( 24H) INC R1 ; R1=25HMOV R1,A ; 将A的内容存入( 25H) RETEND五、 总结说明与体会经过近一个月的努力,在老师和同学的帮助下,我基本上完成了设计任务.经过这次毕业设计,我充分认识到了自学的重要性,以及学以致用的道理.我在图书馆查阅了大量的资料,同时也认识到了图书馆的重要作用.经过两个星期的设计我 又一次回顾了我在大学的所有的知识同时也让我认识到自身的不足, 同时经过单片机的毕业设计我认识到现实中产品开发中的思路同时也加强
24、了自己的自学能力, 无论是单片机程序还是电路图还是排版编辑都对自己的综合能力的提高有所帮助。同时也深刻认识到单片机在现实生活中的巨大作用, 同时也提醒自己要在现实生活中具有创新意识, 能从落后的事物中利用自己所学的专业知识以创新的精神和团队合作的意识开发新的产品, 这个我觉得才是毕业设计给我们最大的收获。同时在这次设计中由于本人水平有限, 开发的程序及整体电路都过于繁琐, 同时也可能出现许多错误, 敬请老师能给出指正的意见。最后感谢老师同学给我的莫大的帮助, 也感谢我母校三年来对我的辛勤栽培, 谢谢! 参考文献1 李朝青.单片机原理及接口技术( 修订版) .北京: 北京航空航天大学出版社, 19982 李广弟.单片机基础.北京: 北京航空航天大学出版社, 19923 何立民.单片机应用技术大全.北京: 北京航空航天大学出版社, 19944 张毅刚.单片机原理及接口技术.哈尔滨: 哈尔滨工业大学出版社, 19905 谭浩强.单片机课程设计.北京: 清华大学出版社, 1989|6 |韩全立, 赵德申, 微机控制技术及应用、 北京: 机械工业出版社,