51微控制器定時器中斷程式
阿新 • • 發佈:2019-01-08
程式執行開始,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秒滅 } } }