9.5.2 定时器/计数器模式3的程序设计
定时器/计数器模式3中,TH0和TL0分别作为两个独立的8位定时器使用,其程序设计可以按照前面介绍的初始化步骤来实现。假定8051单片机(或者其他兼容型号单片机)外接6MHz晶振,需要在P1.0端口和P1.1端口输出如图9.4所示的波形。从图中可以看出,P1.0引脚的方波周期为400µs,P1.1引脚的方波周期为800µs。程序中可以采用TL0和TH0产生200µs和400µs的定时中断,并在中断服务例程中对P1.0引脚和P1.1引脚取反而得到。
图 9.4 波形图
由于采用了6MHz的晶振,因此单片机的机器周期为12÷6MHz=2×10-6s=2µs。根据前面介绍的定时初值的计数方法,定时时间=200µs=200×10-6=(28-X)×2×10-6,因此定时器TL0的初值为X=156=9CH。同样,定时时间=400µs=400×10-6=(28-X)×2×10-6,因此定时器TL0的初值为X=56=38H。如果采用C51语言进行程序设计,其程序示例如下。
include<reg51.h>//头文件
sbit Wave1=P1^0;//定义位变量
sbit Wave2=P1^1;
void T0ISR(void)interrupt 1//定时器T0中断响应
{
Wave1=~Wave1;
TL0=0x9C;//重置计数初值
}
void T1ISR(void)interrupt 3//定时器T1中断响应
{
Wave2=~Wave2;
TH0=0x38;//重置计数初值
}
void main(void)//主函数
{
Wave2=0;//初始化P1^1=0
TMOD=0x03;//设置定时器T0为模式3
TL0=0x9C;//初始化
TH0=0x38;
TR0=1;
ET0=1;
TR1=1;
ET1=1;
EA=1;//开中断
while(1)//主循环
{
}
}
该程序可以在KeilµVision3集成开发环境中运行。在程序中,将P1.0引脚定义为位变量Wave1,P1.1引脚定义为位变量Wave2。在main主函数中首先将P1.1引脚赋为0,并初始化定时器T0为模式3,接着打开相应的中断。在while主循环中不进行任何操作,而是等待定时器的中断。当定时器TL0和TH0溢出时将触发中断,程序将分别进入中断服务例程T0ISR和T1ISR,此时首先取反P1.0引脚和P1.1引脚,然后重置计数初值进入下一次定时。