天天看點

用16位定時器中斷控制LED亮滅

在單片機中控制LED的亮滅通常可以通過控制IO口的電平來實作,51單片機中有2個4種模式的定時/計數器,我們可以利用中斷在相應的中斷服務函數中寫IO口電平翻轉的代碼來實作對LED的控制,下面用的是定時器T0在16位計數的模式下實作LED亮1s、滅1s不斷循環的功能。代碼注釋詳細,直接上代碼

//晶振:11.0592MHZ
#include <reg52.h>	  //包含89C52相關的頭檔案 

#define   uchar unsigned char 
/
uchar count ;  //定義全局變量count記錄溢出次數

//定時器0的初始化函數
void Timer0_Init()
{
	TMOD=0x01;      //模式為16位計數器
  TH0=0x4c;
  TL0=0x00;        //50ms計時(2^16-0x4c00)*12/11.0592=50ms
  TR0=1;          //打開定時器0
  ET0=1;          //允許定時器0中斷
	EA=1;           //打開總中斷
}	
//主函數
void main()
{
	Timer0_Init();   //定時器0初始化函數聲明
	while(1);             //進入死循環,LED一直亮-滅-亮循環
	
}

//定時器0的中斷服務函數
void Timer0ser() interrupt 1
{ 
	TH0=0x4c;
	TL0=0x00;     //重新裝載計數器的初值
	count++;     //每中斷1次,count值加1
	if(count==20)   //中斷20次說明定時了1S
	{
		P1=~P1;      //P1端口電平翻轉
		count=0;     //計數歸零重新開始計數
	}
	
}
           

繼續閱讀