51系列单片机
集成了两个
可编程的定时器/计数器,即定时/计数器0和1,简称T0
和T1
,有4种
工作方式可供选择。单片机内部通过专用寄存器TMOD
、TCON
来设置定时/计数器工作的参数,例如方式选择、定时计数选择、运行控制、溢出标志、触发方式等控制字。本章介绍如何使用C51语言来进行定时器/计数器程序设计。
16位的定时器/计数器T0由两个8位计数器TH0和TL0构成,16位的定时器/计数器T1由两个8位计数器TH1和TL1构成。另外,寄存器TMOD
主要用于指定各定时器/计数器的功能和工作模式
;寄存器TCON
用于控制定时器/计数器的启动和停止计数
,同时也设置定时器/计数器的状态。
定时器/计数器模式0的程序设计可以按照前面介绍的初始化步骤来实现。假定8051
单片机(或者其他兼容型号单片机)外接6MHz
晶振,需要在P1.2
端口输出频率为500Hz
的方波,即周期为2ms
。此时可以采用定时器T0
工作于模式0
,使定时器产生1ms
的定时,通过定时中断来产生P1.2
端口的方波信号输出。
由于采用了6MHz
的晶振,因此单片机的机器周期为12÷6MHz=2×10-6s=2µs
。根据前面介绍的定时初值的计数方法,定时时间=1ms=1×10-3=(213-X)×2×10-6
,因此定时器初值X=7692=1E0CH
。则根据工作模式0的特点,其为13位定时器
,定时器T0
的初值应该设置为TH0=0F0H,TL0=0CH
。
提示 1E0C
的二进制为1 1110 0000 1100
,根据工作模式0的特点,其TL0
中保存低5位,高8位保存在TH0
,因此,TL0
保存的低5位于01100
,转为16进制则为0C
,而高8位1111 0000
保存到TH0
中,转换为16进制为0F0
。
如果采用C51
语言进行程序设计,在程序中每隔1ms
产生一次定时中断,然后在中断服务例程中取反P1.2
引脚。因此,其C51程序示例如下。
#include<reg51.h>//头文件
sbit Wave=P1^2;//位定义
void T0ISR(void)interrupt 1
//定时器T0中断响应函数
{
Wave=~Wave;//反向
TL0=0x0C;//重置计数初值
TH0=0x0F0;
}
void main(void)//主函数
{
Wave=0;//初始化P1^2=0
TMOD=0x00;//设置定时器T0为模式0
TL0=0x0C;//初始化
TH0=0x0F0;
TR0=1;
ET0=1;
EA=1;//开中断
while(1)//主循环
{
}
}
该程序可以在KeilµVision3集成开发环境中运行。在程序中,将P1.2
引脚定义为位变量Wave
。在main主函数中首先将P1.2
引脚赋为0,并初始化定时器T0
,接着打开相应的中断。在while
主循环中不进行任何操作,而是等待定时器的中断。当定时器溢出时将触发中断,程序进入中断服务例程T0ISR
,此时首先取反P1.2
引脚,然后重置
计数初值进入下一次
定时。