#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x01, 0x02, 0x04, 0x08};
uchar code ledCode[]= {0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
int t0 = 0;
uchar count = 0;
sbit LED = P0^0;
void delay(int z)
{
int i, j;
for (i=0; i<z; i++)
for (j=0; j<110; j++);
}
int main(void)
{
int i = 0;
LED = 0;
TMOD = 0x01;
TH0 = (65536 - 30)/256;;
TL0 = (65536 - 30)%256;;
EA = 1;
ET0 = 1;
TR0 = 1;
P2 = 0xff; //数码管位控制端
P1 = ledCode[t0]; //数码管段控制
while(1)
{
if (t0 == 20)
{
t0 = 0;
P1 = ledCode[count++];
if (count == 10)
count = 0;
}
}
return 0;
}
void timer0() interrupt 1
{
TH0 = (65536 - 30)/256;
TL0 = (65536 - 30)%256;
delay(1000);
LED = ~LED;
t0++;
}
如果在定时函数中没有延时函数的话,那么程序应该是LED灯50ms闪烁一次,数码管从0-9变化。
在这个程序当中,首先是定时器装入初值,然后计时开始,执行到if不断判断,然后定时器溢出TF0=1,程序检测到TF0 = 1,进入定时函数,装入初值,进入延时函数,延时结束后,回到定时函数,在延时函数中,不会被定时打断,但是在延时中,TF0 = 1,然后执行剩余的定时函数,回到主函数中,检测到TF0 = 1,进入定时函数,不断循环。
总的来说,执行main函数被打断(TF=1),进入timer0,进入delay,TF0 = 1,但是delay不会被打断,然后回到timer0,再回到main,检测到TF0 = 1,再次进入timer0。
有错误,请指正
单片机中断处理时间大于定时器定时时间,在下次中断时间到时,因为中断是同一类型、同一优先级,所以不会马上进入新的中断处理。
而是在本次中断处理结束后,单片机又马上进入新的定时器中断函数,主函数中的语句可能会没有机会运行下去,会影响后面中断的实时性。
如果为了避免中断嵌套(同一优先级不会发生),在中断处理中人为的在进入中断时关中断,处理完中断后开中断,会影响后面中断的实时性。
最安全的处理方式:中断处理时间越短越好,有什么事放外面处理。中断的初衷是为了提高系统实时性,中断处理太长,会影响同级的中断响应,其它中断谈何实时。