计数溢出时,执行中断程序,这里是系统跑了45872个机器周期后,开始执行中断程序,而不是你说的1S后执行中断程序,注意,这是你的错误.
不管num等于多少,TR0一直都开着,因备枝为你程序其它地方根本没有关闭,也就是说此时定时器还在计数,
所以,即使在执行if语句的时候定时器还在计数,
如果你的if语句过长的话,大于中断的延时时间45872个机器周期了,那么if语句内容根本还没有执行完,又开始下一次中断了,执行过程就是这样子的.
不过,对于你的程序,你完全没有必要担心,因为:
while(1)
{
if(num==20)
{
led1=~led1
num=0
}
}
这句话,远远的小于45872个机器周期,也就是说,你上面那几个语句执行了好几次,中断还没发生一次.
不过,一个良好宏滚誉的电子工程师,尤其是做工业控制的,他的定时器应该这样写:
void TO_time()interrupt 1
{
TH0=0x4C///(65536-45872)/256
TL0=0xD0/蔽段//(65536-45872)%256//执行了20次中断程序后才会执行IF语句
num++
}
即,直接把数值赋值给TH0和TL0,这样避免在中断中运算,节省时间,因为,对于所有的中断,时间越短越好.
标准c语言没有中断调用机制,但是不同编译器都有相应的中断处理方式,可以使用户实现中断功能。解决方案:
1、采取轮询的方式解决,就是每10毫秒检查一下是否有键盘请求,总的来说,这样基本上可以解决问题,而且简单易行,但每10毫秒都要检查,系统消耗太大。
2、采取中断的方式:
(1)用高级语言调用中断来处理问题。中断是cpu响应一个中断外围设备8259A的一个过程,当键盘敲击,cpu保存断点暂停执行并且跳到相应的中断处理程序继续执行,结束后根据断点再跳回来。通过这种方式可以轻松+愉快地解决这个问题。但是需要用到高级语言调用汇编,根据编译器的不同而有所差别。
(2)自己模拟中断。可以另外建立一个线程专门响应迟清键盘的敲击,如果有敲击则打断主线程。这样做实现起来很复杂,而且涉及到不少复杂的关念睁键技术,比如信号量之类的东西。
3、强大的vc
vc采取了消息映射的机制来处理仔旦岁外部设备的请求,比如时钟中断、键盘中断等等。通过此可以灰常灰常容易的处理外部中断。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)