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