1. 程式人生 > >51微控制器定時器中斷程式

51微控制器定時器中斷程式

程式執行開始,A燈先亮5秒,然後滅了到B燈亮5秒,B再滅再到C燈亮5秒,C滅,程式結束,不再執行。這程式該怎麼寫?用定時器精確定時……晶振11.092MHZ。

#include "REG52.H"

/*
*
*/
sbit      	LED_A	= P1^0;
sbit      	LED_B	= P1^1;
sbit      	LED_C	= P1^2;

unsigned char TIME_BASE;
unsigned char MACT_ENDB;
unsigned char Rece_Errp;

/*
*    定時器初始化
*/
void SystemInit(void)
{
	TMOD = 0x01;
	TH0 = (65536 - 45872) / 256;	 // 定時50ms  //晶振:11.0592MHZ
	TL0 = (65536 - 45872) % 256;
	ET0 = 1;
	TR0 = 1;
	EA  = 1;
}

int main(void)
{
	SystemInit();

	while(1)
	{
		/* 程式一開始上電Rece_Errp = 0 定時器5秒加一次 */
		if(Rece_Errp == 0)
		{
			LED_A = 0;		// A亮5秒
			LED_B = 1;		// B是滅
			LED_C = 1;		// C是滅
		}
		/* 判斷是否5秒時間到 */
		else if(Rece_Errp ==1)
		{
			LED_A = 1;	 // A是滅
			LED_B = 0;	 // B亮5秒
			LED_C = 1;	 // C是滅	
		}
		else if(Rece_Errp == 2)
		{
			LED_A = 1;	// A是滅
			LED_B = 1;	// B是滅
			LED_C = 0;	// C亮5秒		
		}
		else
		{
			LED_A = 1;	 // A是滅
			LED_B = 1;	 // B是滅
			LED_C = 1;	 // C是滅
			while(1);	 // 程式執行到這裡停止
		}				
	}
}

void Timer0_IRQ(void) interrupt 1
{
	TH0 = (655365 - 45872) / 256;
	TL0 = (655365 - 45872) % 256;
	/* 進入中斷50ms +1次 */
	TIME_BASE++;
	
	if(TIME_BASE == 20)	 //	20ms * 50ms = 剛好等於1000ms 也就是1秒
	{
		TIME_BASE = 0;
		MACT_ENDB++;	// 一秒加一次
		if(MACT_ENDB == 5) // 等於剛好5秒時間到
		{
			MACT_ENDB = 0;
			Rece_Errp++;   // 用來切換LED A、B、C5秒滅
		}
	}	
}