在本文中,我们对51单片机的定时器1进行测试。用定时器1来定时,并用来控制LED闪烁。定时器1的初始化代码如下所示。
void init_T1(void)
{
TMOD|= 0x10; //使用方式1,16位定时器
TH1=(65536-50000)/256; //给TH1和TL1初初值,计数器由15536开始计数,到65535溢出
TL1=(65536-50000)%256; //外部晶振为12MHz,对应的延时时间为50ms
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
采用中断方式对T1的溢出事件进行处理,中断处理函数如下所示。
void T1_ISR(void) interrupt 3 using 1
{
TH1=(65536-50000)/256; //给TH1和TL1重新赋值
TL1=(65536-50000)%256;
i+=1;
if(i>=10) //计时10次改变一次灯的状态,灯闪的频率为1Hz
{
i=0;
LED=~LED; //LED的值取反,改变灯的状态。
}
}
在这个实验中,采用定时器1的方式1进行定时。在这个实验中计数的初始值不为0,而是由15536开始计时。这是为了使计时时间正好为50ms。要获得需要的定时时间,首先要计算出定时时间对应的机器周期数。单片机的外部晶振使用12MHz,机器周期的时间为1us,则50ms对应的机器周期数为50000。则对应的计数初始值为65536-50000=15536,TH1=(65536-50000)/256;和TL1=(65536-50000)%256;这两句的作用是把15536的值赋给TH1和TL1。
由于定时器溢出一次的时间为50ms,在中断中,用i来计数,每10次改变LED的状态,所以500msLED的状态改变一次。所以LED1秒闪一次。