#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。

main()timer0()delay()检测到中断信号TF0=1进入延时子函数延时期间TF0=1,但不打断延时程序回到主函数程序检测到TF0 = 1main()timer0()delay()

有错误,请指正
当单片机 定时函数时间大于所定时时间

单片机中断处理时间大于定时器定时时间,在下次中断时间到时,因为中断是同一类型、同一优先级,所以不会马上进入新的中断处理。
而是在本次中断处理结束后,单片机又马上进入新的定时器中断函数,主函数中的语句可能会没有机会运行下去,会影响后面中断的实时性。

如果为了避免中断嵌套(同一优先级不会发生),在中断处理中人为的在进入中断时关中断,处理完中断后开中断,会影响后面中断的实时性。

最安全的处理方式:中断处理时间越短越好,有什么事放外面处理。中断的初衷是为了提高系统实时性,中断处理太长,会影响同级的中断响应,其它中断谈何实时。

相关文章:

  • 2022-12-23
  • 2022-01-06
  • 2022-12-23
  • 2021-12-19
  • 2022-01-25
  • 2021-08-07
  • 2022-12-23
  • 2022-01-22
猜你喜欢
  • 2021-11-22
  • 2021-11-19
  • 2021-12-02
  • 2021-12-14
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案