51单片机定时器中断程序如何退出
定时器怎么退出,自己写了个程序,这样的,程序开始先执行定时中断服务程序,中断请求响应共100次,之后退出定时器再执行其他程序,自己编写的,EA=0,可是第101次中断,中...
定时器怎么退出,自己写了个程序,这样的,程序开始先执行定时中断服务程序,中断请求响应共100次,之后退出定时器再执行其他程序,自己编写的,EA=0,可是第101次中断,中断程序照样响应,影响了后续的程序,如何在100次时完全退出定时器中断,不影响后面的程序?另外怎么把定时器中断写成一个子程序,想调用就调用,想停止就停止,不影响到其他子程序的运行?
展开
展开全部
我来帮你写一个,程序太简单了,下面是我帮你写的程序我测试过能满足你的要求,希望我的回答对你有帮助! /* * * * * * * * * * * * * * * * **/ #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秒灭 } } }
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询