51单片机中,正在执行定时器中断程序时,定时器是否还在计数?

double_wjl 2016-05-23 02:22:08
就例如下面的一个例子:

T0_init() //扫描频率为100HZ,即需定时1/100=00.01s
{
TMOD=0x01;
TH0=0x3c; //装定时器初值高8位
TL0=0xb0; //装定时器初值低8位
TR0=1; //启动定时器0
ET0=1; //开定时器0中断
EA=1; //开总中断
}

t0() interrupt 1
{
delay(1000); //8位数码管显示按键值
}

如果我让定时器T0,50ms中断一次,但是我在中断函数里面加上了软件延时1000ms,当正在执行中断函数的时候,计数器还会计数吗?在计数满的话,还会申请中断吗?为什么?
...全文
11385 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Peter_GGG 2019-03-07
  • 打赏
  • 举报
回复
还在计数,除非TRx清零 或者gate改变
皮皮涵 2019-01-09
  • 打赏
  • 举报
回复
在的,你要把它关了才会停止
M゜ 2018-12-26
  • 打赏
  • 举报
回复
中断,不在继续计数了
parsons_wu 2018-11-16
  • 打赏
  • 举报
回复
会计数。但是不会进入中断。如果不想计数 只需要把tr0关闭即可
tianqi911 2018-09-19
  • 打赏
  • 举报
回复
计数不停。除非TRx=0.
leo_cuiyiming 2016-12-02
  • 打赏
  • 举报
回复
这看不太懂啊
zhujinqiang 2016-06-08
  • 打赏
  • 举报
回复 1
51定时器方式中断的使用: 1.开全局中断 51是 EA = 1 2.对应中断使能 比如定时器1 ET1 = 1、定时器0 ET0 = 1 3.定时器工作方式配置: 有三种方式 双8位定时 16位定时 还有捕捉方式 定时器2有4种 ,具体不介绍了 TMOD 是定时器0和定时器1方式配置的寄存器 TMOD = 0x01,定时器0工作在方式1(16位计数) 4.打开定时器 TR0 = 1;定时器1打开是 TR1 = 1; 5.中断服务程序:就是定时时间到,你要处理的事务。

//50ms定时
void main(void)
{
      TMOD = 0x01;    //配置方式
      TH0 = 0x3C;       //计数时间
      TL0 =  0xB0;
      TR0 = 1;             //开启定时器
      EA = 1;               //全局中断打开
    ET0 = 1;             //定时器0中断打开
    for(;;)
}

void Timer0_ISR(void) intterupt  1      //中断服务程序
{
      TH0 = 0x3C;       //计数时间
    TL0 =  0xB0;
       
       P1 = 0x11;       //定时到,要执行的动作
}
问题1 定时器是否工作 是看启动位 TR0 TR1,所以在主程序main里面打开的话 ,定时器溢出后是会继续计数的 而是否允许定时溢出中断的输出 是看中断允许位有没有开放。 所以定时器打开和允许中断是2个概念 不能因为在中断处理程序里 就以为定时器停了 问题2 定时器溢出后是会继续计数,从哪个值开始呢: 如果是自动重装初值的,中断处理的时间,基本不影响定时器准确计时 如在中断里手动重装的,因为有转到中断处理的时间,,所以要考虑计时误差
侦探蜡笔小新 2016-06-08
  • 打赏
  • 举报
回复 1
引用 4 楼 ms_catcher 的回复:
执行中断函数时定时器不会计数,这时候只会处理中断服务程序,主函数的世界相当于时间静止了,等中断函数处理完后会回到主函数这时由于你之前已经把定时器打开,并没有关闭,因此定时器会继续计数,但在你程序中使用的是 定时器0中断,方式是“16位定时器”,如果你不在中断服务程序中给定时器重装初值的话,定时器此时会从零开始计数,如要保证每次都是50毫秒,你应在中断程序中给定时器重装初值 {TH0=(65535-45872)/256; TL0=(65535-45872)%256; delay(1000);}
误人子弟
csdnzjjia 2016-05-25
  • 打赏
  • 举报
回复
还在计数,与定时器工作模式无关
of123 2016-05-25
  • 打赏
  • 举报
回复
产生定时器中断时,定时器已经溢出,结束了计数。当你在定时器的中断服务例程中延时的时候,定时器是等待状态。
图灵转世 2016-05-24
  • 打赏
  • 举报
回复
学习了,我觉的中断延时了,定时器还是会计数的。这个要做实验的。
fly 100% 2016-05-24
  • 打赏
  • 举报
回复
应该不在计数,
侦探蜡笔小新 2016-05-24
  • 打赏
  • 举报
回复
引用 2 楼 zhujinqiang 的回复:
这个要看定时器工作模式 如果是自动重装初值的,中断处理的时间,不会影响定时器工作的, 但是有个问题是中断处理时间超过定时时间的话,处理结束后,单片机又马上进入新一轮定时器中断处理函数,主函数中的语句可能会没有机会运行下去。
定时器TAR不会管你定时器工作模式的,一旦开启就会循环计数。
小景123 2016-05-23
  • 打赏
  • 举报
回复
执行中断函数时定时器不会计数,这时候只会处理中断服务程序,主函数的世界相当于时间静止了,等中断函数处理完后会回到主函数这时由于你之前已经把定时器打开,并没有关闭,因此定时器会继续计数,但在你程序中使用的是 定时器0中断,方式是“16位定时器”,如果你不在中断服务程序中给定时器重装初值的话,定时器此时会从零开始计数,如要保证每次都是50毫秒,你应在中断程序中给定时器重装初值 {TH0=(65535-45872)/256; TL0=(65535-45872)%256; delay(1000);}
zhujinqiang 2016-05-23
  • 打赏
  • 举报
回复
这个要看定时器工作模式 如果是自动重装初值的,中断处理的时间,不会影响定时器工作的, 但是有个问题是中断处理时间超过定时时间的话,处理结束后,单片机又马上进入新一轮定时器中断处理函数,主函数中的语句可能会没有机会运行下去。
侦探蜡笔小新 2016-05-23
  • 打赏
  • 举报
回复 1
所谓单片机是将处理器和定时器,AD等外设集成到一起的一个东西,外设通过处理器初始化,但是外设可以撇开处理器独立运转,中断服务由处理器处理,定时器的TAR计数器由定时器独立处理,因此定时器计数不会因为中断服务的延时而停止计数。 定时器定时产生中断,但是,中断长生后,会有个中断标志置位,你需要清除这个标志才会产生新的中断

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧