定时器/计数器方式2的编程和应用
扫描二维码
随时随地手机看文章
方式2是一个可以自动重新装载初值的8位计数器/定时器。这种工作方式可以省去用户程序中重新装入初值的指令。
当AT89S51的某个定时器/计数器不使用时,可为AT89S51扩展一个负跳沿触发的外部中断源。
例1:扩展一个负跳沿触发的外部中断源,把定时器/计数器T0引脚作为外部中断请求输入端,溢出标志TF0作为外部中断请求标志。
基本思想:当某一定时器/计数器被设置为方式2(自动装入常数方式)计数工作模式,计数器TH0、TL0初值均为0FFH,并允许T0中断,总中断开放。当T0引脚电平发生负跳变时,T0计数器溢出,TF0置1,从而向单片机发出中断请求。
初始化程序如下:
程序说明:当连接在P3.4(T0引脚)的外部中断请求输入线上的电平发生负跳变时,TL0加1,产生溢出,TF0置1,向单片机发出中断请求,同时TH0的内容0FFH送TL0,即TL0恢复初值0FFH,这样,P3.4脚相当于一个跳沿触发的外部中断请求源输入端。对P3.5也可做类似处理。
例2:当T0 (P3.4)引脚上发生负跳变时,作为Pl.0引脚产生方波的启动信号。则开始从P1.0引脚上输出一个周期为1 ms的方波,如下图所示(假设系统时钟为6MHz)。
基本思想:T0设置为方式1计数器模式,初值设为FFFFH。当外部计数输入端T0(P3.4)发生一次负跳变时,计数器T0加1且溢出,溢出标志TF0置1,向CPU发出中断请求,此时T0相当于一个负跳沿触发的外部中断源。进入T0中断程序后,把F0标志置1,说明T0引脚上已接收过负跳变信号。T1定义为方式2定时器模式。在T0引脚产生一次负跳变后,启动Tl每500 μs产生一次中断,在中断服务子程序中对P1.0求反,使P1.0产生周期l ms的方波。由于方式2省去了用户程序中重新装入初值的指令,所以可产生精确的定时时间。
(1)计算Tl的初值。设T1的初值为X,则
(2)程序设计。参考程序如下:
程序说明:当单片机复位时,从0000H跳向主程序MAIN处执行程序。其中调用了对T0、T1初始化子程序PT0M2。子程序返回后执行标号LOOP处指令,循环等待T0引脚上负脉冲的到来。由于负脉冲到来的标志位F0的复位初始值为0,所以程序就在标号LOOP处循环等待。当T0(P3.4)引脚上发生负跳变时,由于T0计数溢出,则跳向T0中断服务子程序。此时停止T0计数,并把T0引脚接收过负脉冲的标志F0置1。当中断返回时,由于F0已被置1,则程序跳出LOOP处的循环等待。此时执行指令来允许Tl中断,并启动Tl定时,然后执行“AJMPHERE”指令,循环等待,等待Tl的500 μs定时中断到来。当Tl的500 μs定时中断产生时,则进入Tl的中断服务子程序ITIP,把P1.0脚上的电平取反。由于方式2是初值可以自动重新装载,从而省去对Tl重新装入初值06H的指令。中断返回后,到“AJMP HERE”指令处继续等待Tl的500μs定时中断。如此重复,即可得到上图所示的波形。
例3:利用定时器Tl的方式2对外部信号计数,要求每计满100个数,将P1.0取反。
本例是方式2计数模式的应用举例。
(1)选择工作方式。外部信号由T1(P3.5)引脚输入,每发生一次负跳变计数器便加1,每输入100个脉冲,计数器将产生溢出中断,在中断服务程序中将P1.0取反一次。
Tl工作在方式2的方式控制字为TMOD=60H。不使用T0时,TMOD的低4位可任取,但不能使T0进入方式3,这里取全0。
(2)计算T1的初值
因此,TL1的初值为9CH,重装初值寄存器TH1=9CH。
(3)程序设计。参考程序如下:
程序说明:由于Tl的中断服务子程序只有两条指令,不超过8个字节,所以进入Tl中断服务程序入口后,直接就执行这两条指令,而没有选择再跳转。