51单片机(十九)—— 定时器1实例测试

        在本文中,我们对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秒闪一次。

 

发布了97 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104415077