找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8478|回复: 9
收起左侧

51定时器进入中断是否一直在工作?

[复制链接]
ID:66072 发表于 2014-9-12 01:26 | 显示全部楼层 |阅读模式

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

flag++;

}

if(flag==20)//当定时到1秒时执行花括号里面的语句

falg不是只能加一次吗 这里是怎么实现循环加20次直到满足主函数中的if语句,想了几天没想明白,求解!!!


回复

使用道具 举报

ID:63997 发表于 2014-9-12 08:36 | 显示全部楼层
你可以把定时器理解成一个闹钟 每五十毫秒闹一次(flag++;) 这个闹钟只要你给他上电 他就会一直走下去(启用中断 开启定时器) 所以不管你主函数在干吗 或者其他函数在干吗 只要没有中断优先级搞得中断抢占它  那么他会一直每隔50毫秒 就让 flag 加一 一次

评分

参与人数 2威望 +43 黑币 +43 收起 理由
admin + 40 + 40 回帖助人的积分奖励!!!!
constancy + 3 + 3 很给力!

查看全部评分

回复

使用道具 举报

ID:64817 发表于 2014-9-12 22:32 | 显示全部楼层
TH0=(65536-50000)/256;TL0=(65536-50000)%256这是你给定时器定的时间值,时间一到定时器值溢出
进入中断一次,进入中断一次同时flag++;定时器值溢出后,单片机检测到中断后TF0自动清0,下一次定时器中断开始,重复直到flag==20满足主函数中的if语句

评分

参与人数 2威望 +43 黑币 +38 收起 理由
admin + 40 + 35 回帖助人的积分奖励!!!!
constancy + 3 + 3 很给力!

查看全部评分

回复

使用道具 举报

ID:66072 发表于 2014-9-12 23:11 | 显示全部楼层
xueyunmicheng 发表于 2014-9-12 08:36
你可以把定时器理解成一个闹钟 每五十毫秒闹一次(flag++;) 这个闹钟只要你给他上电 他就会一直走下去(启用 ...

那是不是满足if语句的条件就停止呢
回复

使用道具 举报

ID:63656 发表于 2014-9-12 23:17 | 显示全部楼层
本帖最后由 2842687945 于 2014-9-12 23:19 编辑

void timer0() interrupt 1 {
       TH0=(65536-50000)/256;
       TL0=(65536-50000)%256;
       flag++;
       if(flag==20)//当flag==20时,就进入if语句中
      {
             flag=0;
      }
}

评分

参与人数 1威望 +45 黑币 +40 收起 理由
admin + 45 + 40 回帖助人的积分奖励!!!!

查看全部评分

回复

使用道具 举报

ID:66072 发表于 2014-9-12 23:37 | 显示全部楼层
定时器到底是在没有其他更高优先级的情况下一直走下去还是满足主函数if条件就跳出呢?求大神们解答下
回复

使用道具 举报

ID:63656 发表于 2014-9-13 01:13 | 显示全部楼层
constancy 发表于 2014-9-12 23:37
定时器到底是在没有其他更高优先级的情况下一直走下去还是满足主函数if条件就跳出呢?求大神们解答下

比如你定时1S,定时器每隔1S它就会中断一次(除非你把定时器中断关闭)

评分

参与人数 1威望 +3 黑币 +3 收起 理由
constancy + 3 + 3 很给力!

查看全部评分

回复

使用道具 举报

ID:64817 发表于 2014-9-13 01:23 | 显示全部楼层
constancy 发表于 2014-9-12 23:37
定时器到底是在没有其他更高优先级的情况下一直走下去还是满足主函数if条件就跳出呢?求大神们解答下

定时器只有 一次,但你用了定时器中断就会一直走下的。满足主函数if条件时指行IF命令,但同时定时器中断还在计数工作,,。。。呵呵,,也就是说刚开始指行主函数main,往下就是TH0=(65536-50000)/256;
TL0=(65536-50000)%256;(可能是你给定时器定的值),当数值走完,也就是时间到了,定时器溢出标志置1,单片机进入中断也就是你的void timer0() interrupt 1 中断函数中,单片机进入中断后会清除去定时器溢出的标志,迎接下一次中断,这里有一点就是单片机进入中断后会清除去定时器溢出的标志,迎接下一次中断,会指行void timer0() interrupt 1 中{ TH0=(65536-50000)/256;TL0=(65536-50000)%256}数值走完再进入中断,中断清0,再指行 中断函数中的数值,数值走完溢出再进入,反复操作,。flag++;就是进一次中断加1一次,加到满足IF条件时,指行if.。。单片机的定期器和中断是单片机另外一系统,他不占用单片机的计算资源。   我是这么理解的,可能也不是很正确。




评分

参与人数 1威望 +5 黑币 +5 收起 理由
constancy + 5 + 5 谢谢你那么详细的解答!

查看全部评分

回复

使用道具 举报

ID:248394 发表于 2017-11-17 22:40 | 显示全部楼层
每次进入中断,flag都会加一吧
回复

使用道具 举报

ID:250589 发表于 2017-11-17 23:17 | 显示全部楼层
每次进入中断,flag都+1
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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