你的问题是没理解中断的含义。
中断,字面上意思就是(当有更紧急的事情出现的时候)终止现在手头上的事情去忙更紧急的事情。在程序里,就相当于当某个条件成立时,停止正在运行的代码(手头上的事情),去执行另一段代码(更紧急的事情),只是这个过程是硬件自动完成的,而不是像你平时调用函数那样显式的去调用它。
你的程序里用到了定时器0(自己去看定时器的工作原理),那你只要将定时器0初始化,并且在函数void exter() interrupt 1里写下你希望当定时器0中断的时候执行的代码就行了。当你启动定时器0的时候,它有点像后台运行的一个程序,当它归0的时候,就会置相应的中断标志为1,而CPU会不时的检测这些中断标志位,当发现某个标志位为1的时候,表明有中断请求,CPU会自动转到相应的中断服务程序中去。
51单片机中断分外部中断和内部定时器中断,外部中断是指在接收到外部中断触发信号(中断管脚电平发生变化)后程序跑到对应的中断服务程序处执行,执行完毕后返回之前正在执行的地方继续;内部中断指由内部定时器触发的中断,比如定时器0设置为10ms定时,则每10ms进入中断服务程序一次。
开启中断后程序在中断产生后会自动的跳转到相应的中断函数里,所以你的灯闪了,
main里while(1){}中是常规任务,中断是意外事件或者未知又会产生的事件。
你比如你正在睡觉,有人打你的电话这时候你会醒来去接电话,接玩电话继续睡觉。
程序也就这么回事,只不过你是大脑在控制,而程序是MCU在控制。
死循环不是单片机死机了,而是一直在这个循环里工作。它的定时器也一直在工作过程中,从你的程序看,你的显示虽然闪,但是数字是不变的,你少了一个{}应为
if(t==20)
{ num++;t=0;
if(num==16)
{num=0;
dula=1;
P0=table[num];
dula=0;
}
}
其实是中断返回,当第一次中断完成,数码管就由原先的0变为1,然后程序就回到了while那里,也就是断点,然后等待下一次的中断请求,也就是50毫秒,50毫秒一到,执行第二次中断,,