5 控制器的软件设计
5.1每秒钟的设定
延时方法可以有两种:一种是利用MCS-51内部定时器产生溢出中断来确定1秒的时间,另一种是采用软延时的方法。考虑到倒计时模块的数码管采用动态扫描模式,所以本系统通过AT89S52内部的定时器/计数器0产生溢出中断来确定1秒的时间。
5.2计数器硬件延时
5.2.1 计数器初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC 可得到如下计算通式:
TC=M-C
式中,M为计数器模值,该值和计数器工作方式有关。
5.2.2 计算公式
T=(M-TC)T计数
或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;TC为定时初值
如单片机的主脉冲频率为TCLK=12MHz,经过12分频
方式0 =213 1微秒=8.192毫秒
方式1 =216 1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.
5.2.3 设置1秒的方法
1秒等于1000000微秒,而每一计时脉冲是1微秒,因此需输入1000000个计数脉冲,方可达到1秒的时间。由于16位计数器初值为0000H,需65536个计数脉冲方可产生溢出,现在需要1000000个脉冲,则溢出次数达15.258次。
即由1000000=65536 15+16960及65536-16960=48576=BDCOH可知计数初值应为:TL0=C0H,TH0=BDH,溢出次数为16次。
相应程序代码:
DEL:MOV TMOD,#01H ;初始化定时器/计数器
MOV TH0,#0BDH ;给定时器/计数器赋初值
MOV TL0,#0C0H
SETB EA ;开中断
SETB ET0 ;定时器/计数器开始工作
MOV 30H,#10H ;设置16次中断
SETB TR0
DEL1:LCALL DISPLAY ;调用数码管显示子程序
MOV A,30H
JNZ DEL1
RET
PIT0:PUSH PSW
PUSH A ;中断服务程序
DJNZ 30H,RET0 ;未达1秒延时,跳到RET0
LCALL SUBB0 ;调用减1子程序
AJMP RET1
RET0:MOV TMOD,#01H
MOV TH0,#0BDH
MOV TL0,#0C0H
SETB EA
SETB ET0
SETB TR0
POP A
POP PSW
RET1:RETI
5.3 软件延时
MCS-51的工作频率为2-12MHz,我们选用的AT89S52单片机的工作频率为12MHz。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12 (1/12M)=1us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定所需秒的时间。
例如:倒计时显示子程序中的0.5ms延时子程序
SCAN:MOV R7,#248
NOP
DJNZ R7,SCAN
RET
由于单片机的运行速度很快其他的指令执行时间可以忽略不计。
5.4 时间及信号灯的显示
5.4.1 AT89S52并行口的扩展
AT89S52虽然有4个8位I/O端口,但真正能提供借用的只有P1口,因为P2和P0口通常用于传送外部传送地址和数据,P3口也有它的第二功能。因此,AT89S52通常需要扩展。且由于系统所采用的数码管达10个多,即使采用动态扫描,AT89S52的端口还是远远不够的,所以需要进行口扩展。
可用来扩展I/O端口的芯片有8255A和8155。它们在口扩展方面所能实现的功能是一样的,考虑到8155用的比较多,且价格便宜,因而采8155扩展AT89S52的并行/O端口。