闹铃由P2.6端输出,模块如下:
2.3 晶振与复位电路
本实验单片机时钟用内部时钟,模块如下:
复位电路为手动复位构成,模块如下:
各模块拼接组合,电路总体设计图如下
:
B.程序设计 B.1 程序总体设计 本实验用汇编程序完成. 程序总的流程图如下:
T0中定时闹铃按1主程序开始 显示星期,时, 是否有调 秒,分, 时等按2按3按4按5按7闪烁提示 响铃提示 显示日期并调时间调整 闹铃设置 定时设置 铃声测试 秒表模式 按0按7倒计时启动并按07键按8回主程序 按0按0按4回主程序 回主程序 秒表暂停 秒表清零 B.2 程序主要模块 B.2.1 延时模块
数码管显示动态扫描时,用到延时程序,这里使用延迟1ms的程序,此程序需反复调,除数码管动态扫描外,数码管的闪烁提示,以及音乐模块也用到了延时,只是延时的长短不同罢了,在此不再赘述。 B.2.2中断服务程序
本实验中,计数器T0,T1中断都有运用,其中T0中断为时钟定时所用,T1中断用于音乐播放。T0的定时长度为0.01s,工作于方式1,计数1次,时长1us,故计数器计数10000次,进入中断,计数初值为65536-10000=55536=#0D8F0,装满定时器需要0.01s的时间,从而100次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。包括日期显示的功能也是如此。另外,由于要实现倒计时功能,因此在中断程序中还要加入减一的寄存器,需要时将其进行显示。基于以上考虑,以R3为倒计时中的秒,R4为倒计时的分,当秒加1时R3减一,减到0之后,秒赋值为59,分减一,直到分为0。
计数器T1工作于方式1, 当调用响铃程序时,其计数功能开启,为音乐音调不同频率的方波的形成,提供延时。其中断服务程序就是根据音调改变音乐方波输出口电平的高低,用语句 CPL实现。
中断服务程序中日历的实现较为复杂,要考虑平年,闰年,特殊的2月,每月的天数的不尽相同。具体的逻辑判断方法为:首先,要考虑年份是不是闰年,闰年的判断方法是:将年份除以100,若能整除,则将年份除以400,若还能整除,则为闰年,若不能,则为平年;若不能被100整除,则判断是否能被4整除,若能,则为闰年,若不能则为平年。只有2月与平、闰年相关,因此在闰年和平年的子程序中,要判断是不是2月,若是则在相应的年中进行日期的增加,若不是则转入平时的月份。其中1、3、5、7、8、10、12月是每月31天,4、6、9、11月为每月30天。
日历进位判断流程图如下:
年份能否被100整除 年份是否能被4整除 N Y 年份是否能被400整除 Y Y 平年 N N 闰年 Y 是不是2月 是不是2月 日>=28之后返回为1 N N Y 日>=29之后返回为1 若月份为1、3、5、7、8、10、12月则调用31天的程序 若月份为4、6、9、11则调用30天的程序 本实验用8个数码管,刚好能显示年,月,日,扫描显示与时间的扫描显示类似。年比较特殊,由两个寄存器存储,个位,十位为0时,表明年数能被100整除,若此时千位,百位
组成两位数能被4整除,则年数被400整除,为闰年。若十位,个位组成两位数能被4整除,则年数能被4整除,为闰年。 B.2.3主程序
主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用相关程序。 B.2.4 显示子程序
8个数码管轮流进行显示,分别显示1ms,依赖人的视觉 暂留效应,给人以数码管持续高亮的错觉。
日期的显示,秒表的显示,倒计时的显示,调闹铃,调定时的显示,闪烁的显示程序与以上的的扫描相似,有的以子程序的方式出现,通过子程序调用语句ACALL调用;有点直接嵌套在相应的程序里面,顺序执行,或者用调转语句AJMP调用。
C 程序调试及仿真
本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。通