搜索
bottom↓
回复: 14

请教关于51定时器的小问题

[复制链接]

出0入0汤圆

发表于 2012-5-15 00:24:41 | 显示全部楼层 |阅读模式
    请教大师们关于51定时器的小问题。
  当使用定时器时(不是自动重装模式的),定时溢出中断,进入中断函数,重新装配定时值。定时器是马上重新计数,还是等到中断函数结束后才重新计数的?
  先谢谢了

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-5-15 00:32:36 来自手机 | 显示全部楼层
马上重新开始

出0入0汤圆

发表于 2012-5-15 08:56:31 | 显示全部楼层
定时器计数是不会间断的,除非你关掉了定时器

出0入0汤圆

发表于 2012-5-15 11:44:10 | 显示全部楼层
马上,尽量不要在中断中太多事...好习惯...

出0入0汤圆

发表于 2012-5-15 12:45:11 | 显示全部楼层
重装马上计时,我是这样理解的

出0入4汤圆

发表于 2012-5-15 12:52:23 | 显示全部楼层
要看你的程序怎麼寫,如果進入中斷後你將TR關了,重新賦值後也不會計數,需等你重新打開TR才會計數。如果沒有關TR,裝入就會計數。

出0入0汤圆

 楼主| 发表于 2012-5-15 14:10:46 | 显示全部楼层

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
举个例子说吧:
#include <reg51.h>

void InitTimer0(void)
{
    TMOD = 0x01;      //方式1
    TH0 = 0xfc;       //定时1000us   …………a点
    TL0 = 0x18;
    EA = 1;          //开定时器中断
    ET0 = 1;
    TR0 = 1;         //启动定时器
}


void Timer0Interrupt(void) interrupt 1     
{                                                                           …………b点
        //                                                        ………………c点
    TH0 = 0xfc;        //重新装配    …………d点
    TL0 = 0x18;
    //add your code here!
}

void main(void)
{
InitTimer0();
while(1);
}

???疑问:
1.        当响应定时器中断运行到b点,硬件就清除TF0,然后装配TH0和TL0,之后定时器就继续加1运行,同时继续执行中断函数,是这样吗?

2.        如果我在d点没有重新装配TH0和TL0,是不是可以说定时器0是从0开始加1的呢?(换句话说是TH0=0; TL0=0;的)


3.        如果我在c点增加几句代码,可以说:定时器是从0  加1直到  c点代码执行完的时间   再到TH0=0XFC; THL=0X18;  然后定时器从这d点开始运行的。 然后定时器实际定时是:
T总 =  T(c点时间) + T(d点重装的时间)

还是理解错了?

请各位大师指教……

出0入0汤圆

 楼主| 发表于 2012-5-15 14:13:59 | 显示全部楼层
ourdev850725 发表于 2012-5-15 08:56
定时器计数是不会间断的,除非你关掉了定时器

请问,那我上一楼的理解是怎么样的呢?

出0入0汤圆

发表于 2012-5-15 14:36:05 | 显示全部楼层
不是自动重载的话,要等你重载后才计数。我记得回过你另外一个帖子,那个说错了。

出0入0汤圆

发表于 2012-5-15 17:07:47 | 显示全部楼层
morewhite 发表于 2012-5-15 14:13
请问,那我上一楼的理解是怎么样的呢?

1,2,3的理解没错,是这样的,定时器是一直在不停的运行的,TH0,TL0是一直在计时的,当手动重载TH0,TL0以后,就会从重载以后的数值开始计时的,默认是(0->65535->0->65535-......)这样循环的

出0入0汤圆

 楼主| 发表于 2012-5-15 17:47:43 | 显示全部楼层
ourdev850725 发表于 2012-5-15 17:07
1,2,3的理解没错,是这样的,定时器是一直在不停的运行的,TH0,TL0是一直在计时的,当手动重载TH0,TL0以后,就 ...

真好,谢谢大师。 不过我还有疑问:
    如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函数无限循环呢?
还有
    在51里  做一个16位的乘除法运算   和   取大表格的一个8位数据(如:table[2][256] 这样的二维数组)   哪个的执行效率高呢?

出0入0汤圆

发表于 2012-5-15 17:48:53 | 显示全部楼层
记得在哪本手册上见过,要定时准点(可能是STC的),在出中断时再设一次初值。

出0入0汤圆

发表于 2012-5-15 17:51:23 | 显示全部楼层
morewhite 发表于 2012-5-15 17:47
真好,谢谢大师。 不过我还有疑问:
    如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函 ...

中断时间太长,系统就容易出错,乘除法和查表就要看你编译器编译出来代码和程序处理的数据的复杂程度了,视情况而定

出0入0汤圆

发表于 2012-5-15 17:51:31 | 显示全部楼层
morewhite 发表于 2012-5-15 17:47
真好,谢谢大师。 不过我还有疑问:
    如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函 ...

如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函数无限循环呢?
是的,会一直在中断里循环,出不去了
在51里  做一个16位的乘除法运算   和   取大表格的一个8位数据(如:table[2][256] 这样的二维数组)   哪个的执行效率高呢?
这个就没研究过,你可以写段代码试一下,比较下哪个效率更高了

出0入0汤圆

 楼主| 发表于 2012-5-15 18:16:53 | 显示全部楼层
好的,谢谢大师们热情解答
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 16:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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