在單片機中控制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; //計數歸零重新開始計數
}
}