请教关于51定时器的小问题
请教大师们关于51定时器的小问题。当使用定时器时(不是自动重装模式的),定时溢出中断,进入中断函数,重新装配定时值。定时器是马上重新计数,还是等到中断函数结束后才重新计数的?
先谢谢了 马上重新开始 定时器计数是不会间断的,除非你关掉了定时器 马上,尽量不要在中断中太多事...好习惯... 重装马上计时,我是这样理解的 要看你的程序怎麼寫,如果進入中斷後你將TR關了,重新賦值後也不會計數,需等你重新打開TR才會計數。如果沒有關TR,裝入就會計數。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
举个例子说吧:
#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点重装的时间)
还是理解错了?
请各位大师指教…… ourdev850725 发表于 2012-5-15 08:56 static/image/common/back.gif
定时器计数是不会间断的,除非你关掉了定时器
请问,那我上一楼的理解是怎么样的呢?
不是自动重载的话,要等你重载后才计数。我记得回过你另外一个帖子,那个说错了。 morewhite 发表于 2012-5-15 14:13 static/image/common/back.gif
请问,那我上一楼的理解是怎么样的呢?
1,2,3的理解没错,是这样的,定时器是一直在不停的运行的,TH0,TL0是一直在计时的,当手动重载TH0,TL0以后,就会从重载以后的数值开始计时的,默认是(0->65535->0->65535-......)这样循环的
ourdev850725 发表于 2012-5-15 17:07 static/image/common/back.gif
1,2,3的理解没错,是这样的,定时器是一直在不停的运行的,TH0,TL0是一直在计时的,当手动重载TH0,TL0以后,就 ...
真好,谢谢大师。 不过我还有疑问:
如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函数无限循环呢?
还有
在51里做一个16位的乘除法运算 和 取大表格的一个8位数据(如:table 这样的二维数组) 哪个的执行效率高呢?
记得在哪本手册上见过,要定时准点(可能是STC的),在出中断时再设一次初值。 morewhite 发表于 2012-5-15 17:47 static/image/common/back.gif
真好,谢谢大师。 不过我还有疑问:
如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函 ...
中断时间太长,系统就容易出错,乘除法和查表就要看你编译器编译出来代码和程序处理的数据的复杂程度了,视情况而定 morewhite 发表于 2012-5-15 17:47 static/image/common/back.gif
真好,谢谢大师。 不过我还有疑问:
如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函 ...
如果定时器的定时时间 比中断函数的运行时间短,可以说是 中断函数无限循环呢?
是的,会一直在中断里循环,出不去了
在51里做一个16位的乘除法运算 和 取大表格的一个8位数据(如:table 这样的二维数组) 哪个的执行效率高呢?
这个就没研究过,你可以写段代码试一下,比较下哪个效率更高了 好的,谢谢大师们热情解答
页:
[1]