『壹』 单片机中断程序

结构很规矩,这个程序。

首先单片机上电复位,运行死循环前面的程序(专,你这里就是属init_timer(); // 应该叫初始化定时器,才合适,让定时器按照你需要的定时长度工作,或叫产生中断 )
接下来单片机主程序就是一直在死循环了。我们的主要任务一般在这里处理。
中断,就是在处理一些特殊任务,比如按键,或定时处理的程序,或外部一个不知道什么时间发生的任务,或通信任务等等。你在主循环的时候,无论在什么时候,中断请求来了(可以理解为需要处理比较紧急任务,优先处理的任务),就会暂停主循环,进入对应中断服务程序。运行完,在回主循环的暂停地方,继续执行死循环的任务。
定时器中断,就是每过一定时间,运行一下中断服务程序。常用来计时和产生脉冲信号

初始化定时器,就是给定时器的寄存器,设置工作模式,时钟源,溢出的计数值。设置好了,定时器就能根据每个时钟源的频率,进行计数,直至溢出,然后产生一个中断请求。如果不饿能自动加载计数初值的定时器,在中断处理函数(服务函数)必须手动加载初值。

『贰』 51单片机定时器中断程序

我来帮你写一个,程序太简单了,下面是我帮你写的程序我测试过能满足你的要求,希望我的回答对你有帮助!
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**/
#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秒灭
}
}
}