1. 程式人生 > >51微控制器工作於方式0的定時器模式

51微控制器工作於方式0的定時器模式

51微控制器的   模式0(13位定時器/計數器)

第一步:通過設定TMOD中的M1/M0位設定,即可完成模式選擇

             “00模式0(13位定時/計數模式)

             “01”為模式1(16位定時/計數模式)

             “10”為模式28'自動重灌初'值定時/計數模式)

             “11”為模式3分割為 2個8位計數模式)

第二步:開啟總中斷(EA)、開T0中斷(ET0)、啟動T0(TR0)

             因為暫存器在復位後初始值都為“0”,預設屬於關閉的狀態,所以我們在使用T0中斷功能時,

      需要將這些位置“1”才可啟動定T0。

第三步:根據時鐘計算並裝載合適的初值

             在T0模式中,因為它只使用了TL0的低5位和TH0的8位空間,剩餘3位不使用。

            當TL0的低5位計數滿並溢位後(通俗點說就是超過低5位的計算的能力後就會向高位進位,與

     十進位制加法同理),會向TH0位進位,同樣當TH0也計滿並溢位,TF0置位,此時就會中斷函式就

     會向CPU傳送中斷請求,以發生中斷。

        初值計算:由上面可以T0的最大計算能力為:

                                                                                2的13次方=8192

                          由於最低位只有5位,當5位計數滿(2的5次方=32)後發生溢位並進位,所有裝初值

                  時要對TL0進行求模和餘。

示例程式如下:

#include"reg52.h"
#define uint unsigned int		//巨集定義
#define uchar unsigned char
sbit LED=P2^0;
uchar i=0;
void main()
{
	TMOD=0xf0;	//設定T0為工作方式0
	TH0=(8192-5000)/32;     //5000us延時
	TL0=(8192-5000)%32;		
	/*Timer0工作在模式0下時為13位定時/計數器,
	TL0只使用前5位,故對32進行求餘/模	*/

	EA=1;		//開總中斷
	ET0=1;	   	//開定時器0中斷
	TR0=1;	   	//啟動定時器0
	while(1);	//程式停止,等待中斷請求
		
}

/******T0中斷函式*******/
void Timer0()interrupt 1
{
	TH0=(8192-5000)/32;
	TL0=(8192-5000)%32;
	i++;
	while(i>=200)
	{
	   	i=0;
		LED=~LED;
	}
}

結束。