宁波技师学院
课程设计报告
论文题目 基于AT89S51控制的数字时钟
专业班级
学生姓名 ___
学 号 ___
指导教师 _____________ _
宁波技师学院电气技术系
二零一三 年 九 月
摘 要
本系统采用MSC-51系列单片机以AT89S51为中心器件来设计多功能数字时钟。文中详细介绍了51单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理。该时钟系统能实现时钟日历的功能:能进行时、分、秒的显示;也具有日历计算、显示和时钟,日历的校准、定时时间的设定,实现秒表,整点报时等功能
关键词:AT89S51;74LS245 ;原理;时钟 ;单片机
目录
1 引言.................................................................................................................................... 4
2 总体设计方案..................................................................................................................... 5
2.1 系统总体结构框图.......................................................................................................... 5
3 硬件设计............................................................................................................................. 6
3.1 复位电路........................................................................................................................ 6
3.2 晶振电路........................................................................................................................ 6
3.3 数码管原理图.................................................................................................................. 7
3.3.1 AT89S51的管脚说明.......................................................................................... 8
4 软件设计............................................................................................................................. 9
4.1 主程序流程图................................................................................................................. 9
5 制作和调试中遇到的问题和解决方法............................................................................. 9
6 结论................................................................................................................................... 10
7 致谢................................................................................................................................... 10
8 参考文献........................................................................................................................... 10
附录1 C语言程序............................................................................................................ 11
附录2 硬件接线图......................................................................................................... 24
附录3 系统仿真图......................................................................................................... 25
1 引言
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新.在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善.
本文通过用对一个能实现定时,日历显示功能的时间系统的设计学习,详细介绍了51单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理、从而达到学习,了解单片机相关指令在各方面的应用。
2 总体设计方案
系统AT89S51、LED数码管、按键、电容,电阻,晶震等部分构成,能实现的功能有:时间显示、日期显示、定时。
左键:切换更改项目,按一下选择更改时钟秒位,再按为分位、小时位。小时位置在按则跳出编辑时间功能。
中键:给当前项进行加1的控制,使当前项在个位加1。
右键:给当前项进行减1的控制,使当前项在个位减1。
2.1 系统总体结构框图
针对于设计思想,做系统的结构框图如下图2-1所示:
图2-1总体方案方框图
3 硬件设计
本数字时钟系统的硬件电路主要包括晶振电路、数码显示电路及其它外围电路等。
3.1复位电路【2】[9]
复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。下图所示的RC复位电路可以实现上述基本功能,Sm为手动复位开关。
图3-0 复位电路图
3.2晶振电路[1]
AT89S51中有一个构成内部震荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是放大器的输入端和输出端,这个放大器与作为反馈元件的石英晶体构成自激震荡电路。外接石英晶体及电容C1,C2接在放大器的反馈回路中构成并联震荡电路。
图3-1晶体震荡电路
3.3数码管原理图[4][8][10]
。
图3-2 数码管管脚图
3.3.1 AT89S51的管脚说明[2]
图3-3 AT89S51管脚图
VCC 电源电压.
GND 接地.
RST 复位输入.当RST变为高电平并保持2个机器周期时,将使单片机复位.WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRTO位(地址8EH)可打开或关闭该功能.DISKRTO位缺省为RESET输出高电平打开状态.
XTAL1 反向振荡放大器的输入及内部时钟工作电路的输入.
XTAL2 来自反向振荡放大器的输出.
P0口 一组8位漏极开路型双向I/O口.也即地址/数据总线复用口.作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写"1"可作为高阻抗输入端用.在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻.在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻.
P1口 一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).Flash编程和程序校验期间,P1接收低8位地址.
P2口 一个带内部上拉电阻的8位双向I/O口.P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据.在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变.Flash编程和程序校验期间,P2亦接收低8位地址.
P3口 一个带内部上拉电阻的8位双向I/O口.P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对P3口写"1"时,它们被内部的上拉电阻把拉到高电并可作输入端口.作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流(IIL).P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下图所示.P3口还接收一些用于Flash闪速存储器编程和程序校验期间的控制信号.
PSEN/ 程序储存允许输出是外部程序存储器的读先通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN/有效,即输出两个脉冲.当访问外部数据存储器,没有两次有效的PSEN/信号.
EA/VPP 外部访问允许.欲使CPU仅访问外部程序存储器,EA端必须保持低电平,需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态.Flash存储器编程时,该引脚加上+12V的编程电压VPP.
4 软件设计
4.1 主程序流程图
5 制作和调试中的一些问题和解决办法
数字时钟设计刚完成时,我经过检查,发现了一些问题[1][4][7]:
1. 刚弄好电路板并烧写程序进去后发现数码管不能正确显示时间,每个数码管中显示的数字几乎一样。经过询问老师,自己查阅资料,终于找出问题的原因:由于我在电路中采用的是动态数码管显示,需准确地调整延时子程序DEL1MS。我在程序中采取的延时时间为1毫秒。
2.复位电路中的开关不能使电路复位到初始状态即12:00:00,经过认真检查电路后我发现我是开关的管脚没接对。测试后重新接下开关的管脚就可以了。
6 结论
经过调试之后,我发现我做的基于AT89S51设计的数字时钟,经过调试,一天的时间里面,差不多在1秒,计时是相对准确。而且该设计的成本不高,硬件电路简单,可以用在对时间精度要求不高的场合. 由于时钟电路的重要性,时钟电路在很多应用系统中必不可少,用软件方法可以实现,但误差很大。在对时间精度要求很高的情况下,通常采用时钟芯片来实现。典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足精度要求。
致谢辞
在论文完成之际,谨向关心我、支持我的师长、朋友和亲人表示最衷心的感谢。首先要感谢我尊敬的指导老师陈弢和唐幼君,本论文的工作得到了陈老师悉心的指导和启发,从论文的选题和具体实现都给予极大的帮助。唐老师平易近人,我非常感两位老师。
本设计的完成,当然也少不了同学的帮助,感谢他们对我的帮助,没有他们的帮助,设计的任务是不可能这么快顺利完成的。同时,也要感谢我的爸爸妈妈,感谢他们这么多年来默默地支持着我的学业,我会再接再厉,以更加饱满的热情投入到今后的学习和工作中去。
参考文献:
[1] 曹巧媛 单片机原理与应用[M].京:电子工业出版社, 2002
[2] 何立民 MCS-51系列单片机应用系统设计.北京航空航天大学出版社,2000
[3] 丁元杰 单片微机原理及应用第2版[M].北京机械工业出版社,2001
[4] 郁凯平 MCS-51单片机串口一口两用在LED显示屏的一例应用 《电子与电脑》20##年第1期
[5] 陈忠平 P89LPC935驱动数码管显示时钟的设计 《湖南工业职业技术学院学报》2007 年第 02 期
[6] 林成武等 MCS-51单片机PO口扩展技术研究.《电子元器件应用》2007 年第 4 期
[7] 谢自美 《电子线路设计、实验、测试 》.华中理工大学出版社,2000
[8] 李正浩等 51单片机在LED数码管显示中的应用.《实验科学与技术》 20## 年第z1 期
[9] 包国宾、张建民 单片机复位电路的设计与分析.《光电技术应用》 20## 年第 03 期
[10] 唐光明 基于中断技术的开关软件消抖算法《现代机械》 20## 年第 03 期
[11] N. Ambramson, Editor, Multiple Acess Communication-Foundation of Emerging Tecnologies, IEEE Press,1992
附录1 C语言程序
附录
ORG 0000H
LJMP MAIN ;跳到主程序
ORG 0003H
LJMP INT0 ;跳到外部中断0
ORG 000BH
LJMP T0 ;跳到定时器0
ORG 0013H
LJMP INT1 ;跳到外部中断1
ORG 001BH
LJMP T1 ;跳到定时器1
ORG 0100H
MAIN: ;主函数
CLR P3.0 ;关蜂鸣器
ACALL INITIAL ;调用初始化函数
DONE:
JNB 00H,DONE1 ;是否显示时间
MOV R0,#73H ;显示时间
ACALL CONVERT ;把时间存储器转化到显示存储器
AJMP TEST ;是否处于调整状态
DONE1:
JNB 01H,DONE2 ;是否显示日期
MOV R0,#70H ;显示日期
ACALL CONVERT ;转化
AJMP TEST ;是否处于调整状态
DONE2:
JNB 02H,DONE3 ;是否显示定时时间
MOV R0,#63H ;显示定时时间
ACALL CONVERT ;转化
AJMP TEST ;
DONE3:
MOV R0,#60H ;显示秒表
ACALL CONVERT ;转化
LJMP DISP ;跳到显示函数
TEST: ;判断是否处于调整状态
JNB 18H,TEST10 ;是否按键已经按下
JNB P3.5,TEST7 ;按键是否已经释放
AJMP TEST11
TEST10:
JB 16H,TEST8 ;判断是否有按键按下
JB P3.5,TEST7
SETB 16H
AJMP TEST7
TEST8:
JB P3.5,TEST9
SETB 18H
AJMP TEST7
TEST11:CLR 18H
CPL 17H
MOV C,17H
MOV P0.0,C
CLR 16H
CLR 12H ;定时结束
CLR TR1 ;关定时器1
CLR P3.0 ;关蜂鸣器
CLR 13H ;
MOV 59H,#00H ;
MOV 58H,#01H
AJMP TEST7
TEST9:CLR 16H
TEST7:JNB 12H,TEST6
JB P3.4,TEST6
CLR 12H ;定时结束
CLR TR1 ;关定时器1
CLR P3.0 ;关蜂鸣器
CLR 13H ;
MOV 59H,#00H ;
MOV 58H,#01H ;
TEST6:JNB 01H,TEST5 ;是否处于日期状态
JB P3.4,TEST4 ;案键3是否按下
MOV 20H,#01H ; 返回时间状态
MOV 21H,#00H
LJMP DISP
TEST5:JNB 02H,TEST4 ;是否处于定时时间状态
JB P3.4,TEST4 ;按键3是否按下
MOV 20H,#01H ;返回时间状态
MOV 21H,#00H
LJMP DISP
TEST4:JNB 15H,DO ;闪烁标志是否有效
LJMP DISP ;无效则进入显示函数
DO:
MOV A,21H ;
CJNE A,#00H,TEST2 ;是否在调整状态
LJMP DISP ;不处于调整状态则进入显示函数
TEST2: JB P3.4,TEST3
MOV 20H,#01H
MOV 21H,#00H
LJMP DISP
TEST3:JNB 08H,DONE4 ;是否秒位置处于调整状态
MOV 78H,#11 ;不显示
MOV 79H,#11 ;不显示
LJMP DISP ;进入显示函数
DONE4:JNB 09H,DONE5 ;是否分位置处于调整状态
MOV 7BH,#11 ;不显示
MOV 7CH,#11 ;不显示
LJMP DISP ;进入显示函数
DONE5:MOV 7EH,#11 ;时位置不显示
MOV 7FH,#11 ;时位置不显示
LJMP DISP ;进入主函数
CONVERT: ;转化成数码管显示所对应的存储器
MOV A,@R0 ;把R0存储的地址所对应的存储器的内容转化到秒位置的存储器
MOV B,#10 ;
DIV AB ;
MOV 79H,A ;高位存储?
MOV 78H,B ;地位存储
INC R0 ;地址加一
MOV A,@R0 ;取数据
MOV B,#10 ;
DIV AB ;
MOV 7CH,A ;高位存储
MOV 7BH,B ;低位存储
INC R0 ;地址加一
MOV A,@R0 ;取数据
MOV B,#10 ;
DIV AB ;
MOV 7FH,A ;高位存储
MOV 7EH,B ;低位存储
RET
INITIAL:
MOV 7FH,#1 ;数码管显示12:00:00
MOV 7EH,#2
MOV 7DH,#10
MOV 7CH,#0
MOV 7BH,#0
MOV 7AH,#10
MOV 79H,#0
MOV 78H,#0
MOV 75H,#12 ;初始化时间 12:00:00
MOV 74H,#0
MOV 73H,#0
MOV 72H,#08 ;初始化日期 08.3.20
MOV 71H,#3
MOV 70H,#20
MOV 65H,#12 ;初始化定时时间 12:00:20
MOV 64H,#0
MOV 63H,#20
MOV 62H,#00 ;初始化秒表00:00.00
MOV 61H,#00
MOV 60H,#00
MOV 50H,#100 ;1s定时100*10ms
MOV 51H,#20 ;200ms闪烁计时
MOV 52H,#10 ;秒表计数器
MOV 53H,#5 ;每放一个音时延时5ms
MOV 58H,#1 ;存放音乐表的指针
MOV TH0,#0D8H ;T0定义为10ms中断
MOV TL0,#0F0H
MOV TMOD,#11H ;定时器工作在方式1
MOV IP,#2 ;定时器0高优先级
MOV IE,#8FH ;开中断
SETB IT0 ;外部中断为边缘触发
SETB IT1 ;外部中断为边缘触发
SETB TR0 ;开定时器0
MOV 20H,#0 ;
SETB 00H ;设置成处在时间显示状态 00H为时间显示标志,01h为日期显示标志,02h为定时时间显示标志,03h秒表显示标志 ;08h为秒位置选择标志,09h为分位置选者标志,0ah为时位置选择标志 ;10h为秒表开始或暂停标志,11h为,12h为是否正在放音乐标志,13h为是否延时标志,15h为闪烁标志,16h,17h为判断定时按键标志
MOV 21H,#0 ;位存储器初始化
MOV 22H,#0 ;
SETB 17H ; 开定时器
SETB P0.0 ;开定时器指示灯
RET
DISP: ;显示函数
MOV R0,#78H ;显示第一 个位置
MOV DPTR,#TAB ;
MOV R7,#0FEH ;第一位有效
NEXT:
MOV A,@R0 ;
MOVC A,@A+DPTR ;把十进制数转化成数码管对应的数据
MOV P1,A ;数据送出端口
MOV P2,R7 ;地址送出端口
ACALL DEL1MS ;延时一毫秒
MOV A,R7 ;
RL A ;地址位左移到下一位
MOV R7,A ;
INC R0 ;数据地址加1
CJNE R0,#80H,NEXT ;是否已经显示完
LJMP DONE
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H
;0 1 2 3 4 5 6 7 8 9 - 空
DEL1MS: ;延时1毫秒函数
MOV R6,#2
DEL1:MOV R5,#250
DJNZ R5,$
DJNZ R6,DEL1
RET
T0: ;定时器0函数
PUSH DPH
PUSH DPL
PUSH PSW
PUSH ACC
MOV TH0,#0D8H ;定时时间设置为10毫秒
MOV TL0,#0F0H
DJNZ 50H,MIAO1 ;是否已经延时1秒
AJMP NEXT5 ;
MIAO1:LJMP MIAOBIAO ;一秒还没到,进入秒表
NEXT5:MOV 50H,#100 ; 重新循环100次,即一秒
INC 73H ;秒加一
MOV A,73H ;
CJNE A,#60,MIAO2 ;是否已经加到60
AJMP NEXT6 ;
MIAO2:LJMP MIAOBIAO ;没到60,进入秒表
NEXT6:MOV 73H,#0 ;已经加到60,秒清0
INC 74H ;分加一
MOV A,74H ;
CJNE A,#60,MIAO3 ;分是否已经加到60
AJMP NEXT7 ;
MIAO3:LJMP MIAOBIAO ;没到60,进入秒表
NEXT7:MOV 74H,#0 ;已经到60,分清0
INC 75H ;时加1
MOV A,75H ;
CJNE A,#24,MIAO4 ;是否已加到24
AJMP NEXT8 ;
MIAO4:LJMP MIAOBIAO ;没到24则进入秒表
NEXT8:MOV 75H,#0 ;时清0
INC 70H ;日加1
MOV A,70H ;
CJNE A,#29,MONTH ;是否是29
MOV A,71H ;
CJNE A,#2,MIAO5 ;是否是2月
AJMP NEXT9 ;
MIAO5:LJMP MIAOBIAO ;不是2月,进入秒表
NEXT9:MOV 71H,#3 ;月份为3
MOV 70H,#1 ;日为1
LJMP MIAOBIAO ;
MONTH: MOV A,70H ;
CJNE A,#31,MONTH1 ;是否是日是31
MOV A,71H ;
CJNE A,#4,MONTH6 ;是否是4月
MOV 71H,#5 ;;月份为5
MOV 70H,#1 ;日为1
AJMP MIAOBIAO ;
MONTH6:MOV A,71H ;
CJNE A,#6,MONTH9 ;是否是6月
MOV 71H,#7 ;月份为7
MOV 70H,#1 ;日为1
AJMP MIAOBIAO ;
MONTH9:MOV A,71H ;
CJNE A,#9,MONTH11 ;是否是 9月
MOV 71H,#10 ;月分为10
MOV 70H,#1 ;;日为1
AJMP MIAOBIAO ;;
MONTH11:MOV A,71H ;
CJNE A,#11,MIAOBIAO ;是否是11月
MOV 71H,#12 ;月份为12
MOV 70H,#1 ; 日为1
AJMP MIAOBIAO ;
MONTH1: MOV A,70H ;
CJNE A,#32,MIAOBIAO ;是否日是32
MOV A,71H ;
CJNE A,#12,MONTH0 ;是否是 12月
INC 73H ;年加1
MOV 70H,#1 ;月为1
MOV 71H,#1 ;日为1
AJMP MIAOBIAO ;
MONTH0:INC 71H ;不是12月,月加1
MOV 70H,#1 ;日为
AJMP MIAOBIAO ;
MIAOBIAO: ;秒表函数
JNB 03H,DINGSHI ;是否进入计时
JNB 10H,DINGSHI ;是否开始计时
DJNZ 52H,DINGSHI ;是否100毫秒已到
MOV 52H,#10 ;
JNB P3.4,CLEAR ;按键按下时清0
INC 60H ;0.1秒位加1
MOV A,60H ;
CJNE A,#10,DINGSHI ;是否已加到10
MOV 60H,#0 ;0.1秒位清0
INC 61H ;秒位加1
MOV A,61H ;
CJNE A,#60,DINGSHI ;秒是否已经加到60
MOV 61H,#0 ;秒位清0
INC 62H ;分加1
MOV A,62H ;
CJNE A,#60,DINGSHI ;是否是60分
MOV 62H,#0 ;分为清0
AJMP DINGSHI ;
CLEAR:MOV 60H,#0 ;清0
MOV 61H,#0 ;
MOV 62H,#0 ;
CLR 10H ;停止计数
AJMP DINGSHI ;
DINGSHI: ;定时函数
JB 17H,YSTART ;定时器有效
LJMP BAOSHI ;定时器无效
YSTART:JB 12H,START ;是否已经在放音乐
MOV A,63H ;
CJNE A,73H,BAO1 ;是否时已到
AJMP NEXT10 ;
BAO1:LJMP BAOSHI ;
NEXT10:MOV A,64H ;
CJNE A,74H,BAO2 ;是否分已到
AJMP NEXT11 ;
BAO2:LJMP BAOSHI ;
NEXT11:MOV A,65H ;
CJNE A,75H,BAO3 ;是否秒已到
AJMP NEXT12 ;
BAO3:LJMP BAOSHI ;
NEXT12:SETB 12H ;设置定时已到
MOV 55H,#10H ;第一个节拍
MOV 57H,#0FBH ;第一个音调高位
MOV 56H,#8BH ;第一个音调低位
SETB TR1 ;启动定时器1
START:DJNZ 55H,BAO4 ;节拍是否已结束
AJMP NEXT13 ;
BAO4: LJMP BAOSHI ;
NEXT13: CPL 13H ;
JB 13H,DELAY50MS ;进入延时50毫秒
MOV A,58H ;
INC A ;表地址加1
MOV 58H,A ;
GETNEXT:MOV DPTR,#DAT ;
MOVC A,@A+DPTR ;取音调
CJNE A,#00H,DSQ1 ;是否已经结束
CLR 12H ;定时结束
CLR TR1 ;关定时器1
CLR P3.0 ;关蜂鸣器
CLR 13H ;
MOV 59H,#00H ;
MOV 58H,#01H ;
AJMP BAOSHI ;
DSQ1:CJNE A,#01H,DSQ2 ;
MOV A,55H ;
INC A ;
INC A ;
MOV 55H,A ;
AJMP GETNEXT ;
DSQ2:CJNE A,#0FFH,DSQ3 ;是否播放空音调
CLR TR1 ;关定时器1
CLR P3.0 ;关蜂鸣器
AJMP DSQ4 ;
DSQ3:MOV B,#20 ;把音调转化成定时器1所对应定时存储器
MUL AB ;
MOV 59H,A ;
MOV A,#0FFH ;
SUBB A,59H ;
MOV 56H,A ;
MOV 59H,B ;
MOV A,#0FFH ;
SUBB A,59H ;
MOV 57H,A ;
SETB TR1 ;
DSQ4:MOV A,58H ;
INC A ;表地址加1
MOV 58H,A ;
MOV DPTR,#DAT ;
MOVC A,@A+DPTR ;取节拍进行延时
MOV 55H,A ;
JB P3.4,BAOSHI ;是否停止放
CLR 12H ;清标志位
CLR TR1 ;关定时器1
CLR P3.0 ;关蜂鸣器
CLR 13H ;
MOV 59H,#00H ;
MOV 58H,#01H ;
AJMP BAOSHI ;
DELAY50MS:CLR TR1 ;延时50毫秒
CLR P3.0 ;关蜂鸣器
MOV 55H,#5 ;
BAOSHI: ;整点报时函数
JB 12H,FLASHCTRL ;如果正在定时放音乐则不整点报时
MOV A,74H ;
CJNE A,#0,BAO ;是否是0分
MOV A,73H ;
CJNE A,#0,FLASHCTRL ;是否是0秒
;JNB TR1,FLASHCTRL ;是否已经关定时器1
CLR TR1 ;关定时器0
CLR P3.0 ;关蜂鸣器
AJMP FLASHCTRL ;
BAO:MOV A,74H ;
CJNE A,#59,FLASHCTRL ;是否是59分
MOV A,73H ;
CJNE A,#55,EQU56S ;是否是55秒
JB TR1,FLASHCTRL ;是否已经在报时
MOV 56H,#8BH ;启动定时器1报时
MOV 57H,#0FBH ;;
SETB TR1 ;
AJMP FLASHCTRL ;
EQU56S: ;
CJNE A,#56,EQU57S ;是否是56秒
JNB TR1,FLASHCTRL ;是否已经关定时器1
CLR TR1 ;关定时器1
CLR P3.0 ;关蜂鸣器
AJMP FLASHCTRL ;
EQU57S: ;
CJNE A,#57,EQU58S ;是否是57秒
JB TR1,FLASHCTRL ;是否正在报时
MOV 56H,#8BH ;启动定时器1报时
MOV 57H,#0FBH ;
SETB TR1 ;
AJMP FLASHCTRL ;
EQU58S: ;
CJNE A,#58,EQU59S ;是否是58秒
JNB TR1,FLASHCTRL ;是否已经关定时器1
CLR TR1 ;关定时器1
CLR P3.0 ;关蜂鸣器
AJMP FLASHCTRL ;
EQU59S: ;
CJNE A,#59,FLASHCTRL ;是否是59秒
JB TR1,FLASHCTRL ;是否开定时器1
MOV 56H,#8BH ;
MOV 57H,#0FEH ;
SETB TR1 ;
AJMP FLASHCTRL ;
FLASHCTRL: ;闪烁标志控制函数
DJNZ 51H,T0OUT ;是否已经延时200豪秒
MOV 51H,#20 ;
CPL 15H ;标志位取反
AJMP T0OUT ;
T0OUT:POP ACC ;
POP PSW ;
POP DPL ;
POP DPH ;
RETI
T1: ;定时器1,产生音调所对应频率的方波
PUSH ACC ;
PUSH PSW ;
MOV A,56H ;
ORL TL1,A ;存入音调所对应的定时时间
MOV A,57H ;
MOV TH1,A ;
CPL P3.0 ;蜂鸣器位取反
POP PSW
POP ACC
RETI
;外部中断0
INT0:
PUSH PSW
PUSH ACC
MOV 6FH,#30 ;延时15毫秒
DEL2:MOV 6EH,#250 ;
DJNZ 6EH,$ ;
DJNZ 6FH,DEL2 ;
JB P3.2,INT5 ;是否已出低电平
AJMP NEXT20 ;
INT5:LJMP INT0OUT ;
NEXT20:MOV A,21H ;
CJNE A,#0,TIAO ;是否出在调整状态
MOV A,20H ;
RL A ;时间、日期、定时时间、秒表间的状态切换
MOV 20H,A ;
JNB 04H,INT6 ;秒表状态返回时间状态
AJMP NEXT21 ;
INT6:LJMP INT0OUT ;
NEXT21:MOV 20H,#01H ;
MOV 60H,#0 ;回到时间状态,秒表清0
MOV 61H,#0 ;
MOV 62H,#0 ;
CLR 10H ;秒表停止计时
LJMP INT0OUT ;
TIAO:JNB 00H,DAY ;是否出在时间状态
JNB 08H,MIN ;是否调整秒
MOV 73H,#0 ;秒清0
LJMP INT0OUT ;
MIN:JNB 09H,HOUR ;是否调整分
INC 74H ;分加1
MOV A,74H ;
CJNE A,#60,INT7 ;分是否60
AJMP NEXT22 ;
INT7:LJMP INT0OUT ;
NEXT22:MOV 74H,#0 ;分清0
LJMP INT0OUT ;
HOUR:INC 75H ;时加1
MOV A,75H ;
CJNE A,#24,INT8 ;时是否24
AJMP NEXT23 ;
INT8:LJMP INT0OUT ;
NEXT23:MOV 75H,#0 ;时清0
LJMP INT0OUT ;
DAY:JNB 01H,TIMER ;是否处在日期状态
JNB 08H,MON ;是否调整日
INC 70H ;日加1
MOV A,70H ;
CJNE A,#29,MON2 ;是否29
MOV A,71H ;
CJNE A,#2,INT0OUT ;是否2月
MOV 70H,#1 ;调为1日
AJMP INT0OUT ;
MON2: MOV A,70H ;
CJNE A,#31,MON1 ;是否31
MOV A,71H ;
CJNE A,#4,MON6 ;是否四月
MOV 70H,#1 ;调为1
MON6:MOV A,71H ;
CJNE A,#6,MON9 ; 是否6月
MOV 70H,#1 ;
MON9:MOV A,71H ;
CJNE A,#9,MON11 ;是否9月
MOV 70H,#1 ;
MON11:MOV A,71H ;
CJNE A,#11,INT0OUT ;是否11月
MOV 70H,#1 ;
AJMP INT0OUT ;
MON1: MOV A,70H ;
CJNE A,#32,INT0OUT ;日是否32
MOV 70H,#1 ;调为1
AJMP INT0OUT ;
MON:JNB 09H,YEAR ;是否调整月
INC 71H ;月加1
MOV A,71H ;
CJNE A,#13,INT0OUT ;是否为13
MOV 71H,#1 ;调为1
AJMP INT0OUT ;
YEAR:INC 72H ;
MOV A,72H ;
CJNE A,#99,INT0OUT ;年是否99
MOV 72H,#0 ;清0
AJMP INT0OUT ;
TIMER:JNB 08H,TIMERMIN ;是否调整定时时间秒
INC 63H ;秒加1
MOV A,63H ;
CJNE A,#60,INT0OUT ;是否是60
MOV 63H,#0 ;清0
AJMP INT0OUT ;
TIMERMIN:JNB 09H,TIMERHOUR ; 是否调整定时时间分
INC 64H ;分加1
MOV A,64H ;
CJNE A,#60,INT0OUT ;是否是60
MOV 64H,#0 ;分清0
AJMP INT0OUT ;
TIMERHOUR:INC 65H ;时加1
MOV A,65H ;
CJNE A,#24,INT0OUT ;是否是24
MOV 65H,#0 ;时清0
AJMP INT0OUT ;
INT0OUT:POP ACC
POP PSW
RETI
INT1: ;外部中断1
PUSH PSW
PUSH ACC
MOV 6FH,#30 ;延时15毫秒
DEL3:MOV 6EH,#250 ;
DJNZ 6EH,$ ;
DJNZ 6FH,DEL3 ;
JB P3.3,INT0OUT ;是否稳定处于底电平
JNB 03H,TIAO1 ;是否处于秒表状态
CPL 10H ;秒表 ;开始或暂停
AJMP INT1OUT ;
TIAO1: MOV A,21H ;
CJNE A,#0,TIAO2 ;是否处于调整状态
SETB 08H ;
AJMP INT1OUT ;
TIAO2:MOV A,21H ;
RL A ;
MOV 21H,A ;
JNB 0BH,INT1OUT ;
MOV 21H,#0 ;
MOV A,20H ;
RL A ;选择其他调整位
MOV 20H,A ;
AJMP INT1OUT ;
INT1OUT:POP ACC
POP PSW
RETI
DAT:DB 39H,20H,26H,20H,26H,20H,26H,20H,26H,60H
DB 2BH,20H,30H,30H,2BH,10H,30H,20H,33H,20H
DB 39H,80H,1CH,20H,1CH,20H,1CH,20H,1CH,20H
DB 1CH,60H,20H,20H,26H,20H,20H,20H,20H,20H
DB 48H,20H,26H,80H,26H,20H,1CH,20H,1CH,20H
DB 20H,20H,26H,60H,2BH,20H,30H,30H,2BH,10H
DB 30H,20H,33H,20H,39H,40H,4CH,40H,4CH,20H
DB 30H,20H,30H,20H,33H,20H,39H,60H,26H,20H
DB 2BH,30H,30H,10H,33H,20H,40H,20H,39H,80H
DB 4CH,20H,30H,20H,30H,20H,33H,20H,39H,60H
DB 26H,20H,2BH,20H,2BH,20H,40H,20H,33H,20H
DB 39H,80H,00H,00H,00H