标题:
困惑,,51单片机定时器中断的问题请教大家
[打印本页]
作者:
woaidpj
时间:
2015-4-19 18:12
标题:
困惑,,51单片机定时器中断的问题请教大家
最近在重新认识中断的时候遇到这样一个问题,。我在仔细看了郭天祥老师的《51单片机c语言教程》书籍例3.5.1和例3.5.2后有个一直想不明白的问题,,郭老师说,一般我们在中断服务程序中不要写太多的处理语句,如果语句过多,中断服务中的代码还没有执行完毕,而下一次中断又来临,,这样我们就失去这次中断,,这个是不是说,当中断服务中的代码还正在执行,而下一次中断又来临了,那么就失去这次中断,,是不是num就少加了一次值啦,就是说在执行中断服务中的代码时,来不及响应num++,是这样吗,但是联想到例3.5.2的时候我就又不解了,,。。
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
led1=~led1;
}
}
书里指出,不能把判断发光管的时间是否到达的语句写在主程序中,若写在主程序中,有可能发生如下情况,,当在主程序运行在显示数码管语句当中时,此时恰好定时器0进入中断并且num1刚好也加到4,当定时器0中断再次进入时,主程序仍未退出数码管显示语句,那么此时num1的值便成了5,这样的话,,num1=4这个点便永远检测不到了。部分程序如下
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)
{
num1=0;
led1=~led1;
}
}
仔细看了这几个地方,我是这么理解的是不是上面 第一个程序中断服务中的代码还没有执行完毕,而下一次中断又来临时会丢失,而来不及响应来不及响应num++这个语句,,,而第二个程序中在执行,定时器0进入中断并且num1刚好也加到4,数码管的显示语句也还没有执行完,当定时器0中断再次进入时,此时num1的值便成了5了,num1=4这个点便永远检测不到了,,,看起来就没有丢失这次中断,,为什么第一个例子会丢失中断,,而第二个确没有丢失中断啦,,但是我也想了一下,,如果真的num1的值便成了5,,,是不是可以把 if(num1==4)改写成if(num1>=4),即便真的num1的值跑飞了,,大于4了,也可以将num1的值重新清零,控制发光管继续运行,。。。在线等待大家解答,谢谢。。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1