找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6343|回复: 0
打印 上一主题 下一主题
收起左侧

困惑,,51单片机定时器中断的问题请教大家

[复制链接]
跳转到指定楼层
楼主
ID:66137 发表于 2015-4-19 18:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在重新认识中断的时候遇到这样一个问题,。我在仔细看了郭天祥老师的《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的值重新清零,控制发光管继续运行,。。。在线等待大家解答,谢谢。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表