基于单片机的多功能数字钟设计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机的多功能数字钟设计
引言
自古以来时间对于人们而言就显得十分重要,在钟表出现之前,人们已采用各种各样的方法来获取尽量精确的时间。

早期的表功能较为单一,只能看时间不能看日期,也不能调整时间,更是不具备闹铃功能。

随着科技发展,电子技术也去的突飞猛进的进步。

针对钟表这一问题,电子产业部为此研制开发了多功能电子数字钟。

数字中具有显示年、月、日、时、分、秒及整点报时、闹铃功能。

而且秒、分、时、日、月、年可自动关联进位,秒具备清零功能,分、时、日、月、年可自动修改、手动设置校正等。

与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到广泛的使用。

数字钟的设计方法有许多种,例如,可用中小规模集成电路组成电子钟;也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟;还可以利用单片机来实现电子钟等等。

这些方法都各有各的特点,其中利用单片机实现的电子钟具有编程灵活,而且便于功能的扩展。

这是由于近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统。

单片机越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心主控部件来使用,在根据具体硬件结构,以及针对具体应用对象特点及具体设计要求的软件相结合,以作完善,实现设计功能。

智能数字钟在日常生活中带来很多好处。

其结构较简单,因而便于操作使用。

智能数字钟对大众而言是一个很好的选择。

它具有高度的智能化和集成化,是现代
人们办公、生活、学习的好帮手,具有广阔的市场前景。

其整点报时、闹铃音乐播放的功能也深受任人亲睐。

如今智能数字钟已越来越受社会各界人士的欢迎。

本次做的数字钟是以单片机(AT89S51)为核心,结合相关的元器件,再配以相应的软件,达到制作简易多功能数字钟的目的。

总共包括了以下六个功能模块:时分秒自动计时(可由按键设置调整)、整点报时、闹钟功能、显示生日、显示年月日(可由按键设置调整)、生日当天音乐播放。

主要用到的硬件设施除了单片机,还有可编程并行I/O芯片82C55,用于扩展I/O口;按钮开关、拨动开关用于调整时分秒年月日及个功能的转换返回、控制闹铃和音乐播放;发光二极管用于闹铃光报警;数码管用于显示。

其由此介绍了单片机的输入输出的工作原理和操作方法,中断的工作原理和操作方法、闹铃、音乐的工作原理及操作方法、电路设计及调试过程。

关键字:数字钟、单片机、时分秒、年月日、时间调整、日期调整、显示生日、
整点报时、闹钟功能、音乐播放
一、实训目的......................................................1 二、实训背景......................................................1 三、实训内容要求.. (1)
1、内容 (1)
2、要求............................................................1 四、功能说明 (1)
1、整体功能 (1)
2、各模块功能....................................................2 五、系统设计 (2)
1、硬件电路 (4)
2、软件设计................................. .......................6 六、系统调试.. (11)
1、时钟显示 (11)
2、日期显示 (11)
3、生日显示.......................................................11 七、设计总结.....................................................12 八、实训心得.....................................................13 九、附录.. (14)
一、实训目的
1、在初步学习单片机接口技术的基础上,进一步认识单片机技术的实例应
用。

2、学习用汇编语言的配合C51单片机实现实训课题中基本功能要求。

3、了解简易多功能数字钟的硬件电路及掌握其软件设计方法。

4、掌握数码管显示电路、发光二极管、拨动开关、按钮、键盘、计数定时
器综合应用程序的设计与分析方法。

5、掌握运用开发系统下载调试各功能模块的应用程序的方法。

6、培养独立思考问题、发现问题、解决问题的思想。

7、在实践中挖掘创新精神,灵活运用理论知识,增强实际操作能力。

二、实训背景
随着科学技术的发展,单片机以其具有功能强,体积小,功耗低,价格
便宜,工作可靠,使用方便等优势不断深入应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,具有广阔的开发前景。

这次实训内容就是基于单片机的应用实例设计,一方面是对一个学期对单片机接口技术这门课程的理解及应用的成果检验,另一方面在于培养同学们的
设计创新思维,增强实际操作能力,切合市场对专业运用性人才的要求。

三、实训内容要求
1、内容:以单片机为主控部件,结合相关的元器件(数码显示管、发光二
极管、按键、计数定时器等)及相应的应用软件实现多功能数字钟的设
计。

2、要求:(1)、显示时分秒(可自动计时、可由按键调整)
(2)、显示日期(可由按键调整)
(3)、显示生日(个人拓展部分)
(4)、整点报时(蜂鸣器鸣响、光报警)
(5)、闹钟报警(蜂鸣器鸣响,可由拨钮控制起止)
(6)、生日当天音乐播放(个人拓展部分,可由拨钮控制起止)
(7)、由按键、拨钮控制各功能模块的切换。

四、功能说明
1、整体功能
运行程序,发光二极管灯亮同时数码显示管开始显示时间,从初始值23:59:50开始,每隔一秒秒加1,遇60进位并自动清零,分与秒相同。

时遇24自动清零,也就是说分秒为60进制,时为24进制。

可由8255PB口的前三个按钮S1~S3分别设置秒分时。

整点报时,蜂鸣器鸣响同时8255PA口八盏发光二极管闪亮并左移,持续时间为1S。

闹铃功能:当显示时间与设定闹钟时间相同,蜂鸣器鸣响报警,持续时间1分钟,但可由8255PC口拨钮K8控制起止。

按钮S8切换至显示本人生日,由S1返回。

按钮S7切换至显示日期,此时可由按钮S1~S8调整日期,当月日与生日相同时,拨钮开关K7可控制“生日快乐歌”的起止,由K1返回到显示时间,继续自动计时。

2、各模块功能
(1)、时分秒显示
实现时分秒自动计时。

是采用24进制,分秒采用60进制。

可由按钮
S1~S3分别设置秒分时。

时分秒可自动进位并清零。

(2)、年月日显示
显示年月日。

可由按钮S1~S8分八位设置日期。

(3)、生日显示
显示预设定的生日,只有月日。

(4)、整点报时
每逢整点蜂鸣器鸣响同时发光二极管闪亮左移,持续时间为1S。

(5)、闹铃报警
每逢所设闹铃时间,蜂鸣器鸣响,鸣响时间为1分钟,可由K8关闭。

(6)、音乐播放
每逢日期的月日与生日相同,播放“生日快乐歌”,可由K7关闭。

五、系统设计
1、硬件电路
上图为主机板电路,AT89C51P0口驱动74HC373,P1口驱动八盏发光二极管,P2口与8255相连,P3.2控制蜂鸣器。

数码管显示电路,用于显示时分秒、年月日、生日
上图为发光二极管、拨钮开关、按钮开关电路,用于用于光报警、功能切换、控制闹铃、音乐,调整时间日期。

由按钮S7实现时间显示切换到日期显示,由拨钮K1返回;由按钮S7实现显示时间切换到显示生日,由按钮S1返回;显示时间时由按钮S1~S3实现时间调整;显示日期时由按钮S1~S8实现日期调整;由拨钮K7控制音乐播放;由K8控制闹铃。

上图为蜂鸣器电路,用于整点报时、闹铃、音乐播放P3.2置0蜂鸣器鸣响,置1停止鸣响。

2、软件设计
(1)、内部寄存器RAM资源分配
地址分配用途初始化值
存放音符码、发音码高低字节 20H~22H 00H
时分秒显示缓冲 30H~32H 00H
年月日显示缓冲 30H~37H 03600102
生日显示缓冲 30H~37H 91200000
中断定时秒所用 38H~39H 00H
时分秒单元 23H、59H、50H 3AH~3CH
闹钟时分秒单元 00H、02H、01H 40H~42H
存放简谱码指针,取到休止符为止 43H~ 00H
堆栈区 70H~7FH (2)、程序流程图
,、主程序: b、功能扫描:
开始 1
设置二极管发光效果
N N S7按下, S8按下,
8255初始化 , ,
功能2(调整日期、音乐播放) 功能3(显示生日) 时分秒赋初值
闹钟时分秒赋初值 N , K1按下, S1按下,
计数定时器T0、T1初始化 Y Y
功能1(自动计时调整、闹铃、整点报时)
开中断、启动T0
1 1
C、中断定时 e、闹铃报警
现场保护
N 实时时分与闹N 铃时分相同, 计时满1秒,
Y
Y
秒加1(按BCD码) N
K8按下, N Y
计时满60秒,
Y 启动蜂鸣器
秒清0,分加1(按BCD码)
关闭蜂鸣器 N
计时满60分, 返回
Y f、显示 :
分清0,时加1(按BCD码) R0指向显示缓冲区首地址 N 计时满24时,R3 存放字位码初始值
时,
Y
取字段码时请0
送字位码至8255PB口恢复现场送字段码至8255PA口
中断返回
延时1S d、整点报时
N
分、秒均为0,
R0增1、字位码左移一位 Y
启动蜂鸣器,二极管点亮左移 N
一轮显示完,
关蜂鸣器,熄灭二极管
Y
返回返回
g、时间调整
读入8255PB口初始值
Y 秒加1 S1按下,
N 秒满60,
Y
秒清0,分加1
Y 分加1 S2按下,
分满60, N
Y
分清0,时加1
Y 时加1 S1按下,
N
时满24,
Y
时清0
读入8255PB口
h、日期调整
读入8255PB口初始值
Y 日的个位、十位分别加1 S1、S2按下, N N
个位大于9,
十位大于3,
Y
清0
Y S3、S4按下,
月个位、十位分别加1
N
N 个位大于2,
十位大于1,
Y
清0
Y S5、S6、S7、S8年份各位分别加1 按下, N
N 各位分别大于 9,
Y
清0
返回
i、音乐播放音乐子程序:
开中断、启动T1 读入8255PC口
取简谱码指针
K7置位,
取简谱码
Y 当前日期与生简谱码为休止 N 日相等, 符, Y N
调用音乐播放子程序取节拍码、音符码
Y 返回音符码为休止符,
T1中断 :
N 启动蜂鸣器现场保护
简谱码指针加1
P3.2取反
T1重装计数值关蜂鸣器
恢复现场返回
中断返回
(3)、源程序(见附录)
六、系统调试
1、时钟显示:
A、调试结果:
(1)、接通电源后,数码管显示23-59-50,此时当秒记满60后,显示00-00-00,
此时时蜂鸣器响鸣1s,同时二极管从左到右依次点亮。

(2)、当PB1按下,秒单元加1,PB2按下则分单元加1,PB3按下则时单元加
,通过此三个键进行时间的调整。

调整时间时,时分秒依然有进位和清1 零功能。

(3)、当时间调整到01-20-00时,即与设定的闹钟时间相同。

则蜂鸣器会响鸣,
若PC8开关未拨动,则一直响鸣1分钟,当拨下开关,则响鸣停止,实
现闹钟整铃的功能。

B、结果分析:
(1)、程序中采用程序中采用定时/计数器0的方式2进行计时,定时时间定为8-6-6200us,(2-X)*10=200*10,所以X=56=38H,即初始值为38H。

并采用中断方式进行溢出次数的累计,计满500(使用38H和39H),即得到秒计时。

当秒单元记到60时,分单元加1,秒单元清0。

同理,分单元记到60时,秒、分单元清0,时单元加1,同时进行整点报时。

(2)、S1、S2、S3是用来调整时钟的显示,通过对按键的控制实现秒分时单元
的加1,完成时间的调整。

)、当时间调整到所设定的闹钟时间时,则调用闹钟整铃子程序,实现蜂鸣(3 器的响鸣。

2、日期的显示:
A、调试结果:
(1)、当S7按下后,数码管显示日期,此时可通过PB口的8个键进行日期的调整。

波动K1返回显示时间。

(2)、当日期的月份和日调到0219时,即当前日期与设定生日值相同。

拨动K7开关,则会播出生日快乐歌。

B、结果分析:
要显示的日期初值以BCD码的形式存放在表中,当调用显示日期子程序
时,通过查表将值逐一放入显示缓冲区单元30H~37H,再通过显示子程
序将其内容显示在数码管上。

程序中通过对S7按键的控制实现数码管的
不同显示,当按下此键时,数码管显示日期,同时查询此时PB口的8个
键,若有按键,则进行日期的调整。

当调整到所设定的日期时,拨动PC7 开关,则调用音乐播放程序,播放生日快乐歌。

当歌唱完后,则自动跳
出界面进行时钟的显示。

3、生日显示
A、调式结果:
在显示时间时,按下S8,切换成显示生日(00000219),按下S1返回显
示时间。

B、调试分析:
要显示的生日值以BCD码的形式存放在表中,当调用显示生日子程序时,
通过查表将值逐一放入显示缓冲区单元30H~37H,再通过显示子程序将其
内容显示在数码管上。

七、设计总结
这次的实训课题是基于《单片机原理及接口技术》这门课程的,总共有八个可选课题:a、数字时钟(软件延时、硬件延时各1组)b、音乐播放c、按键串行通讯(带显示,查询与中断控制各1组)e、温度测量控制(带显示)d、
(带显示)f、I2C总线访问(带显示)g、A/D转换(带显示)h、D/A转换(带显示)。

本人选的是数字钟与音乐播放结合。

1、合理安排时间。

实训第一天选择设计课题(多功能数字钟)、查阅资料。

第二天,确定所实现功能的方案(显示调整时间、日期,整点报时,闹钟,音乐播放,显示生日)。

第三、第四、第五天粗略绘制流程图并编写编译调式程序。

第六、第七、第八天重点下载调试,整合修改程序,完善其功能。

第九、第十天完成实训报告。

2、数字钟的基本功能有:显示时间、日期,自动计数、进位,手动设置时间、日期,整点报时,闹铃等。

本人在基本要求的基础上增加了一些个人拓展内容,如整点报时光报警,显示生日,当前日期与生日相同,可播放音乐《生日快乐歌》。

3、时间、日期、生日三者的显示可由按钮或拨钮进行切换控制。

时间与日期的设置也可由按键完成。

本人的设计是,用S1~S3设置时间的秒分时,且秒分满六
十会自动清零、进位,时满24自动进位;用S1~S8分八位设置日期,这种方法虽然不是很好,但是比较容易实现无需考虑彼此间的进位关系。

闹铃和音乐也可由拨钮控制。

4、由于数字钟的程序比较大,且各模块功能比较独立,所以在完成原程序设计的过程中,尽可能的采用子程序,这样便于程序额的读写、修改和调试。

另外清晰的程序流程图也有助于我们编写和检查程序。

5、在8255初始化时要调用1S延时子程序,使其复位准备就绪。

使用按键时也要调用延时子程序来消除抖动。

6、源程序代码要排列整齐、重要的地方写上注释,便于读写。

编译时要生成HEX文件,下载测试时,可分模块进行,在进行整合,这样比较容易排查解决问题。

7、在调试的过程遇到的和应注意一些问题:
调整时按键按一下,计数不止增一下,原因在于抖动,在判断按键时加延时来消除抖动。

由于在程序中3AH、3BH、3CH单元内容是以BCD码的形式加1的,调整时间时,程序中应对其做十进制调整(采用DA指令)。

若不进行十进制调整,则加到9后再加则会显示A到F。

且在判断时分秒是否计满时,用到的比较数值是#24H、
#60H、#60H,而不是#24、#60、#60。

在拆字子程序中,将显示缓冲区的首地址存入R1,但在指向下一个个位单元时,须自增1两次,因为时与分、分与秒之间有个横杆。

音乐播放单独可正常运行,但整合到整个程序中,无法实现。

反复排查,发现原因在于,T1未进行中断初始化,且在音乐播放子程序中未开启中断未启动T1。

对应解决后,可正常实现该功能。

8、经过十天的不屑努力,终于圆满完成包括选题、编程测试、写报告的实训任务。

其中所作数字钟的显示效果基本符合设计要求并包含个人创新成果。

八、实习心得
在这次实习过程中,发现自己对单片机接口技术的相关知识还不是很了解,存在很多问题还不能独立解决。

一方面是由于没有充分掌握课本上的相关专业知识,另一方面是没有了解课本以外的有关知识。

从而实践起来有点困难。

虽然在自己的努力和同学的帮助下,最终顺利达到预期目标,但在报告中的论述可能存在一部分的错误或不足,还望老师指点。

同时这也提醒了我以后要更加中主专业知识的学习。

不仅要学好课本知识,还要自学课外相关的知识。

融会贯通,灵活应用。

1、学好基础知识。

一个人要屹立在人群之上,当然也离不开有力的基础。

只有现在好好学习知识,基础牢固了,自身的发展才能得到保障。

在工作中,也需要用理论基础来指导实际操作。

所以目前我们的任务就是好好学习,为将来打下结实的基础。

2、不断学习新知识、新技术。

所谓学海无涯,活到老学到老,学习也要与时俱进。

我们要不断学习新的知识、新的技术来武装自己,虚心向他人请教。

只有不断的充实头脑,面对工作才会有更多的选择空间,和更好的发展机会,使自己能够脱颖而出。

3、广泛阅读资料,并学会灵活运用,把别人的东西消化,成为自己的知识储备。

遇到问题先独立思考,实在解决不了在寻求资料或者同学老师的帮助。

感谢学校为我们安排了这个学习和实践的机会。

感谢老师的细心指导。

九、附录
源程序代码:
ORG 0000H LJMP MAIN
ORG 000BH
LJMP ITP ORG 001BH
LJMP TIME1
ORG 0030H
/******************************************************************* ***********************
定时、中断、8255初始化
************************************************************************ ******************/
MAIN: MOV SP,#70H LCALL DELAY1S
MOV P1,#00100100B ;P1口LED灯亮1秒
LCALL DELAY1S ;延时1S MOV P1,#0FFH ;熄L0-7灯
MOV A,#89H ;数码管显示与矩阵键盘接口8255初始化
MOV DPTR,#0FE03H MOVX @DPTR,A
MOV A,#8BH ;LED显示、开关、按键接口8255初始化
MOV DPTR,#0FD03H MOVX @DPTR,A
MOV DPTR,#0FE01H
MOV A,#00H MOVX @DPTR,A ;关显示
MOV 38H,#00H ;38H-39H为定时中断秒计时所用 MOV 39H,#00H
MOV 3AH,#50H ;秒初始值为50
MOV 3BH,#59H ;分初始值为59 MOV 3CH,#23H ;时初始值为23
MOV 40H,#0 ;闹钟初始"秒"单元为0
MOV 41H,#02 ;闹钟初始"分"单元为2 MOV 42H,#01 ;闹钟初始"时"单元为1 MOV TMOD,#12H ;计数器T0,T1初始化
MOV TL0,#48H MOV TH0,#48H
MOV TL1,#00H
MOV TH1,#00H SETB EA
SETB ET0 ;开中断
SETB TR0 ;启动T0定时工作 LM: MOV 32H,#10H
MOV 35H,#10H
/******************************************************************* ***********************
功能键扫描
******************************************************************** **********************/
LOOP: MOV DPTR,#0FD01H
MOVX A, @DPTR JB ACC.6,CHK_7 ;PB6键是否按下,
LCALL DELAY12MS ;消除抖动
CHK_00: MOVX A, @DPTR JNB ACC.6,CHK_00 ;按下则执行功能2(调整日期、音乐播放)
LJMP FUN_2
CHK_7: JB ACC.7,F1 ;PB7键按下则执行功能3(显示生日) LJMP FUN_3
F1: LJMP FUN_1 ;两键都未按下则执行功能1
;(调整时间、整点报时、闹铃报警)
/*********************************************************************** *******************
功能模块程序
******************************************************************** **********************/
/********************功能1实现数字钟显示****************/
FUN_1: LCALL SKEY ;调用按键扫描调整时间子程序
CALL CZ ;调用拆字子程序
LCALL DISP ;调用显示子程序 LCALL CLOCKPS ;调用闹钟报警子程序
LCALL BAOSHI ;调用整点报时程序
SJMP LOOP ;反复循环主流程 /*****************功能2显示日期并音乐播放*****************/
FUN_2: LCALL XH2 ;调用显示缓冲区2(年月日初始值) FUN_22: LCALL DISP ;调用显示子程序
LCALL SKEY1 ;调用日期按键扫描程序
LCALL BIR ;调用音乐播放判断程序 MOV DPTR,#0FD02H ;8255PC口
MOVX A,@DPTR
JB ACC.0,F2 ;判断PC0键是否按下, LJMP LM ;按下则返回显示数字钟 F2: SJMP FUN_22 ;未按则循环实现功能2(调整日期音乐播放)
/********************功能3显示生日***********************/
FUN_3: LCALL XH3 ;调用显示缓冲区3(生日日期) LCALL DISP ;调用显示子程序
MOV DPTR,#0FD01H
MOVX A,@DPTR JB ACC.0,F3 ;PB0是否按下,
LJMP LM
F3: SJMP FUN_3 ;未按下则执行功能3(显示生日)
/******************************************************************* ***********************
显示子程序
************************************************************************ ******************/
DISP: MOV R0,#30H ;显示缓冲单元首地址 MOV R3,#01H ;字位码初值(从最右位起)
MOV A,R3
DISP1: MOV DPTR,#0FE01H ;8255B口(字位码输出口) MOVX @DPTR,A ;输出字位码
MOV A,@R0 ;取显示数据码
MOV DPTR,#TAB MOVC A,@A+DPTR ;查表得相应字段码 NEXTPC: MOV
DPTR,#0FE00H
MOVX @DPTR,A ;输出字段码 LCALL D1MS ;保持显示1毫秒
INC R0 ;指向下一显示缓冲单元
MOV A,R3 ;取出字位码 JB ACC.7,DISP2 ;判已显示到最左位否
RL A ;未完,字位码左移1位
MOV R3,A ;回存新字位码 LJMP DISP1 ;转下一位显示
DISP2: RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;"0"~"9" 显示字段码表 DB
92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H
DB 8EH,0BFH,00H ;"A"-"F","-",全亮, D1MS: MOV R7,#250 ;延时1毫秒子程序 D1MS1: NOP
NOP NOP
NOP
DJNZ R7,D1MS1 RET
/******************************************************************* *********************** 显示缓冲区1(拆字)
******************************************************************** **********************/
CZ: MOV R0,#3AH ;秒、分、时单元首地址
MOV R1,#30H ;显示缓冲单元首地址 CZ1: MOV A,@R0 ;取当前BCD码 ANL
A,#0FH ;保留低4位(个位)
MOV @R1,A ;送显缓当前个位单元
INC R1 ;指向显缓十位单元 MOV A,@R0 ;再取当前BCD码
ANL A,#0F0H ;保留高4位(十位)
SWAP A ;交换到低4位 MOV @R1,A ;送显缓当前十位单元
INC R1
INC R1 ;指向显缓下一个个位单元 INC R0 ;指向下一个时间BCD码单元
CJNE R0,#3DH,CZ1 ;未完继续
RET ;子程序返回
/******************************************************************* ***********************
显示缓冲区2
************************************************************************ ******************/
XH2: MOV R0,#30H ;将内容存入30H---37H单元 MOV R2,#8
MOV A,#0
MOV R7,#0 MOV DPTR ,#TAB1
SAVE: MOVC A,@A+DPTR
MOV @R0,A ;查表把当前值送显示缓冲区 INC R0 ;指向显缓下一个个位单元INC R7 ;指向下一个日期BCD码单元
MOV A,R7 DJNZ R2,SAVE ;未完继续
RET
TAB1:DB 0,3,6,0,0,1,0,2 ;日期初始值
/******************************************************************* ***********************
显示缓冲区3
************************************************************************ ******************/
XH3: MOV R0,#30H ;将内容存入30H---37H单元 MOV R2,#8
MOV A,#0
MOV R7,#0 MOV DPTR ,#TAB2
SAVE2: MOVC A,@A+DPTR
MOV @R0,A ;查表把当前值送显示缓冲区 INC R0 ;指向显缓下一个个位单元INC R7 ;指向下一个日期BCD码单元
MOV A,R7 DJNZ R2,SAVE2 ;未完继续
RET
TAB2:DB 9,1,2,0,0,0,0,0 ;生日
/******************************************************************* *********************
定时中断
************************************************************************ ****************/
ITP: PUSH ACC ;保护现场 PUSH PSW
INC 38H ;每200微秒加1
MOV A,38H CJNE A,#250,DONE ;满0.05秒,
MOV 38H,#0
INC 39H ;每0.05秒加1 MOV A,39H
CJNE A,#20,DONE ;满1秒,
MOV 39H,#0 MOV A,3AH ;秒单元(按BCD码)加1
ADD A,#1
DA A MOV 3AH,A
CJNE A,#60H,DONE ;满1分钟,
MOV 3AH,#0 ;秒单元清零 MOV A,3BH ;分钟单元(按BCD码)加1
ADD A,#1
DA A MOV 3BH,A
CJNE A,#60H,DONE ;满1小时,
分钟单元清零 MOV 3BH,#0 ; MOV A,3CH ;小时单元(按BCD码)加1
ADD A,#1
DA A MOV 3CH,A
CJNE A,#24H,DONE ;满24小时,
MOV 3CH,#0 ;小时单元清零 DONE: POP PSW ;恢复现场
POP ACC
RETI ;中断返回
/******************************************************************* ***********************
调整时间按键扫描
************************************************************************ ******************/
SKEY: MOV DPTR,#0FD01H ;PB口 MOVX A,@DPTR
CPL A
JZ KD LCALL DELAY12MS ;消除抖动
CPL A
JZ KD MOVX A,@DPTR
MOV B,A
KW: MOVX A,@DPTR CPL A
JNZ KW
MOV A,B ;PB口无按键按下,B值存入A JNB ACC.0,KEY0 ;判断1---3键哪个按下
JNB ACC.1,KEY1
JNB ACC.2,KEY2 KD: RET
KEY0: MOV A,3AH ;1键按下实现秒加1 ADD A,#1
DA A ;十进制调整
CJNE A,#60H,JUDGE ;是否为60, JMP J1
JUDGE: JC CHK_OUT0
J1: CLR A ;大于等于60清0 CHK_OUT0: MOV 3AH,A ;小于60存入3AH
RET
KEY1: MOV A,3BH ;2键按下实现分加1 ADD A,#1
DA A ;十进制调整
CJNE A,#60H,JUDGE1 ;是否为60, JMP J2
JUDGE1: JC CHK_OUT1
J2: CLR A ;大于等于60清0 CHK_OUT1: MOV 3BH,A ;小于60存入3BH
RET
KEY2: MOV A,3CH ;2键按下实现时加1 ADD A,#1
DA A ;十进制调整
CJNE A,#24H,JUDGE2 ;是否为24, JMP J3
JUDGE2: JC CHK_OUT2
J3: CLR A ;大于等于24清0 CHK_OUT2: MOV 3CH,A ;小于24存入3CH OUT: RET
/******************************************************************* ***********************
整点报时
************************************************************************ ******************/
BAOSHI: MOV A,3AH ;秒的实时值存入A
JZ NEXT1 ;秒为0则转至比较分 LJMP OUT1
NEXT1: MOV A,3BH ;分的实时值存入A
JZ NEXT2 ;分为0则跳转至NEXT2 LJMP OUT1
NEXT2:
CLR P3.2 ;启动蜂鸣器报警 LCALL DISP
SETB P3.2 ;关蜂鸣器
LCALL DISPLAY ;调用LED点亮子程序 OUT1: RET
/******************************************************************* *********************** 二极管显示
************************************************************************ ******************/
DISPLAY: MOV A,#01H ;实现二极管左移点亮
MOV R7,#8
XUN: MOV P1,A CALL DELAY200MS
RL A
DJNZ R7,XUN MOV P1,#0FFH
RET
/******************************************************************* ***********************
延时程序
************************************************************************ ******************/
DELAY1S: MOV R7,#4 ;延时1秒 D1S2: MOV R6,#200 D1S1: MOV R5,#200 D1S0: NOP
DJNZ R5,D1S0 DJNZ R6,D1S1
DJNZ R7,D1S2
RET DELAY200MS: MOV R6,#100 ;延时200ms D1: MOV R5,#100
D2: NOP DJNZ R5,D2
DJNZ R6,D1
RET DELAY12MS: MOV R6,#24 ;延时12ms D12MS1: MOV R5,#200
D12MS0: NOP DJNZ R5,D12MS0
DJNZ R6,D12MS1
RET
/******************************************************************* ***********************
调整日期按键扫描
************************************************************************ ******************/
SKEY1: MOV DPTR,#0FD01H ;PB口 MOVX A,@DPTR
CPL A
JZ KD1 LCALL DELAY12MS
CPL A
JZ KD1 MOVX A,@DPTR
MOV B,A
KW1: MOVX A,@DPTR CPL A
JNZ KW1
MOV A,B JNB ACC.0,KEY00 ;通过PB口八个键调整日期
JNB ACC.1,KEY11
JNB ACC.2,KEY22 JNB ACC.3,KEY33
JNB ACC.4,KEY44
JNB ACC.5,KEY55 JNB ACC.6,KEY66
JNB ACC.7,KEY77 KD1: RET KEY00: MOV A,30H ;PB0键实现日的个位的调整ADD A,#1
DA A ANL A,#0FH
MOV 30H,A
SJMP KD1 KEY11: MOV A,31H ;PB1键实现日的十位的调整ADD A,#1
CJNE A,#3,L11 JMP L33
L11: JC L33
CLR A DA A
ANL A,#0FH L33: MOV 31H,A SJMP KD1
KEY22: MOV A,32H ;PB2键实现月的个位调整
ADD A,#1 CJNE A,#2,H11
JMP H22
H11: JC H22 CLR A
H22: DA A
ANL A,#0FH MOV 32H,A
SJMP KD1
KEY33: MOV A,33H ;PB3键实现月十位调整 ADD A,#1 CJNE A,#2,G11 G22: CLR A SJMP G33 G11: JNC G22 DA A ANL A,#0FH G33: MOV 33H,A
SJMP KD1
KEY44: MOV A,34H ;PB4键调整年份
ADD A,#1 DA A
ANL A,#0FH
MOV 34H,A SJMP KD1
KEY55: MOV A,35H ;PB5键调整年份 ADD A,#1
DA A
ANL A,#0FH MOV 35H,A
SJMP KD1
KEY66: MOV A,36H ;PB6键调整年份
ADD A,#1 DA A
ANL A,#0FH
MOV 36H,A SJMP KD1
KEY77: MOV A,37H ;PB7键调整年份
ADD A,#1 DA A
ANL A,#0FH
MOV 37H,A RET
/******************************************************************* *********************** 音乐播放的判断程序
******************************************************************** **********************/
BIR: PUSH PSW ;音乐播放判断程序,保护现场
PUSH Acc
存器地址送DPTR MOV DPTR,#0FD02H ;82C55控制寄 MOVX A,@DPTR ;从PC口读入数据
JNB ACC.6,DSN1 ;PA6是否置1, JUDGE22: MOV A,30H CJNE A,#09H,DSN1 MOV A,31H
CJNE A,#01H,DSN1 MOV A,32H
CJNE A,#02H,DSN1
MOV A,33H CJNE A,#00H,DSN1 ;分别比较日期与设定生日日期
LCALL START ;相等,则调用音乐播放程序 DSN1: POP Acc ;恢复现场 POP PSW
RET ;子程序返回
/*********************************************************************** ******************* 闹钟警报
******************************************************************** **********************/
CLOCKPS: PUSH PSW ;闹钟警报子程序,保护现场
PUSH Acc
MOV DPTR,#0FD02H ;82C55控制寄存器地址送DPTR MOVX A,@DPTR ;从PC口读入数据
JNB ACC.7,DSN ;PC7开关是否置1 JUDGE11: MOV A,3BH ;将时钟"分"单元送A CJNE A,41H,DSN ;"分"与闹钟"分"单元,不等则返回
MOV A,3CH ;将时钟"时"单元送A
CJNE A,42H,DSN ;"分"与闹钟"分"单元,不等则返回 LCALL MUSIC ;相等,则使蜂鸣器响 DSN: POP Acc ;恢复现场
POP PSW RET ;子程序返回
MUSIC: CLR P3.2
LCALL DISP SETB P3.2
RET
/******************************************************************* *********************** 音乐播放
******************************************************************** **********************/
START: SETB TR1 SETB ET1
MOV 43H,#00H ;取简谱码指针
NEXT: MOV A,43H MOV DPTR,#TABLE ;查表取简谱码
MOVC A, @A+DPTR
CJNE A,#00H,PLAY ;取到的不是休止符跳至PLAY LJMP STOP
PLAY: MOV R1,A ;取到的简谱码暂放于R1
ANL A,#0FH ;取简谱码的低四位(节拍码) MOV R2,A
MOV A,R1
ANL A,#0F0H ;取简谱码高四位(音符码) CJNE A,#00H,MUSIC1 ;不是休止符,跳至MUSIC1
CLR TR1
LJMP DEL MUSIC1: SWAP A ;交换高低四位
DEC A ;取到的音符码减1
MOV 22H,A ADD A,22H
MOV R3,A
MOV DPTR,#TABLE1 ;查表取发音符 MOVC A,@A+DPTR
MOV TH1,A ;取到的高字节存TH1
MOV 21H,A MOV A,R3
INC A ;加1
MOVC A,@A+DPTR MOV TL1,A ;取到的低字节存TL1
MOV 20H,A
SETB TR1 ;启动T1 DEL: LCALL DELAY
INC 43H ;取简谱码指针加1
LJMP NEXT ;去下一个码 STOP: CLR TR1
SETB P3.2 ;关蜂鸣器
RET
/*********************************************************************** *******************
定时T1中断
************************************************************************ ******************/ TIME1: PUSH Acc ;T1中断现场保护
PUSH PSW
CPL P3.2 MOV TL1,20H
MOV TH1,21H ;重设计数值
POP PSW POP Acc ;出栈
RETI ;中断返回
DELAY: MOV R7,#02H ;延时125毫秒 DELA1: MOV R6,#125
DELA2: MOV R5,#248 DJNZ R5,$
DJNZ R6,DELA2
DJNZ R7,DELA1 DJNZ R2,DELAY
RET
TABLE1: DW 64260,64400,64524,64580 ;简谱码 DW
64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217 TABLE: ;1 ;发音符
DB 82H,01H,81H,94H,84H
DB 0B4H,0A4H,94H DB 82H,01H,81H,94H,84H
DB 0C4H,0B4H,04H
;2 DB 82H,01H,81H,0F4H,0D4H
DB 0B4H,0A4H,04H
DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H ;3
DB 82H,01H,81H,94H,84H DB 0B4H,0A4H,04H
DB 82H,01H,81H,94H,84H
DB 0C4H,0B4H,04H ;4
DB 82H,01H,81H,0F4H,0D4H
DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H
DB 00 RET
END。

相关文档
最新文档