单片机实验(闹钟部分修改版)
注:第一个是利用延时程序做的定时,循环太多定时不够精确;这一个用的是出栈和入栈的算法进行的定时,可以增加定时的精度。
程序目的说明:这是一个闹钟程序,当按下K1的时候,开始计时(说明:为了方便观察,我以10s中作为基本定时进行演示,如果需要其他定时可以通过修改部分程序得到),时间达到后,7段显示器和LED灯同时闪烁,若序号归零,则按下K2计时则停止。然后再按下K1计时又从新开始,以此类推。
电路图:
因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。排阻就是好多电阻连载一起,他们有一个公共端.
因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。排阻就是好多电阻连载一起,他们有一个公共端.由于是上拉电阻,所以1接VCC。
LED6位七段码显示灯,从左到往右两位一组,分别显示HOUR, MINUTE,SECOND.
K1开关和P1.1口相连,K2和P2.2口相连,分别用于控制计时的开启和关闭LED灯,计时到达的时候LED灯闪烁,计时t停止时LED灯熄灭。晶振电路,帮助减小计时过程中产生的误差。
K1开关和P1.1口相连,K2和P2.2口相连,分别用于控制计时的开启和关闭
LED灯,计时到达的时候LED灯闪烁,计时t停止时LED灯熄灭。
晶振电路,帮助减小计时过程中产生的误差。
程序段:
程序说明:1.直接将开关定义为各个接口,可以方便之后程序中利用各个开光的状态进行跳转。2.利用了计数/定时器0作为外部中断,当中断产生,自动跳入计时状态;
程序说明:1.直接将开关定义为各个接口,可以方便之后程序中利用各个开光的状态进行跳转。
2.利用了计数/定时器0作为外部中断,当中断产生,自动跳入计时状态;
6.主程序中要调用闹钟程序timebear检测设定时间是否到达和显示时间的子程序display1.5.此段定义的是BCD码得时间,为了可以在七段显示器上面显示4.此段定义的是需要计时(亮灯)的时间,我设定的10s亮灯,所以s为0ah,其他的均为00h3.此段定义的是而二进制的时间存储单元。
6.主程序中要调用闹钟程序timebear检测设定时间是否到达和显示时间的子程序display1.
5.此段定义的是BCD码得时间,为了可以在七段显示器上面显示
4.此段定义的是需要计时(亮灯)的时间,我设定的10s亮灯,所以s为0ah,其他的均为00h
3.此段定义的是而二进制的时间存储单元。
8.timecome程序段主要控制P3.7口,时间达到的时候,使LED灯和7短码显示器点亮并闪烁,如果要不要灯和七段码显示器闪烁则删除:mov r7,#250t2:mov r6,#124t3:djnz r6,t3djnz r7,t2
8.timecome程序段主要控制P3.7口,时间达到的时候,使LED灯和7短码显示器点亮并闪烁,如果要不要灯和七段码显示器闪烁则删除:
mov r7,#250
t2:mov r6,#124
t3:djnz r6,t3
djnz r7,t2
setb p3.7
这一段程序即可,这一段相当于机器周期,是灯的闪亮延时,就出现了闪烁的状态。
7.timebear程序段用于检测闹铃设定的时间是否达到,依次从second(s),minute(m),hour(h)检测,出现不匹配的就不再向下执行,若时间匹配就跳转至timecome。
9.time 为计算时间的子程序,用的是出栈入站的方式,基本定时是按为5ms,然后循环.从second开始定时,超过60m就归零,minute加1,没有超过60s,就继续向上加;minute,hour都是这样的原理,需要注意的是,因为要出栈入栈,所以需要吧累加器和psw
9.time 为计算时间的子程序,用的是出栈入站的方式,基本定时是按为5ms,然后循环.
从second开始定时,超过60m就归零,minute加1,没有超过60s,就继续向上加;minute,hour都是这样的原理,需要注意的是,因为要出栈入栈,所以需要吧累加器和psw中的值入栈保护。
10.这个是用于判断K2开关是否按下:当K2开关按下的时候,跳入y1程序段,使7段显示器所显示的时间归零,并且使LED灯熄灭。
10.这个是用于判断K2开关是否按下:当K2开关按下的时候,跳入y1程序段,使7段显示器所显示的时间归零,并且使LED灯熄灭。
11.display为时间显示子程序,主要用于实现将二进制的时间转化为BCD码显示的时间,方便在七段显示器上显示。本质就是利用程序末尾列出的转换表进行转换
11.display为时间显示子程序,主要用于实现将二进制的时间转化为BCD码显示的时间,方便在七段显示器上显示。本质就是利用程序末尾列出的转换表进行转换
七段码转换表
七