单片机计数器的疑问,。

如题所述

第1个回答  2019-12-08
先来句题外话:老郭的书思路还是可以的,程序实在不敢恭维,看见dula,wela这两个经典变量就有点起鸡皮。
1,0-255就是256个数,定时器从0数到255,共256个数,没有256,256就是0,就是溢出中断的那一个时间点(针对8位定时器或TH);
2,事实上上面的程序时没有IF(TH0==TH0)这一句,这是你自己理解的,老郭的原程序是
while(1)
{
th1=TH0;
th2=TH0;
tl=TL0;
if(th1==th2)
break;
}
val=th1*256+tl;
return
val;
}
虽然把TH0分别赋给了th1,和th2,然后判断这两个变量(记住这是变量,相对来说你不改变,它的值是死的;而TH0是定时器的寄存器,只要定时器运作,它是时时在改变的)是否相等,但并不等价于你理解的IF(TH0==TH0),当th1=TH0;th2=TH0;这两句中间,TL0是走了一个数的(假设你的单片机对定时器没有分频),也就是说,th1,th2虽然同样是读取TH0这同一个寄存器,但读到的值是有可能不同的,虽然这个机会很小,就是当TL0=255跳到0的那个时间点上。你程序只贴了一部分,我看不懂是用为干什么的,但老郭的这段程序似乎是要排除好个时间点。不明白用意,但你知道程序是用来干什么的,你可以自己思考。
3,第三个问题就是概念性问题了,TH0是定时器的高位,TL0走满256个数它才进1,TH0加1就是表示定时器走了256个数啊。整个表达式VAL的意思是计算定时器从0开始已经走了多少数啊,至于这个用来干什么,我就不知道,它的初始化是多少,上面程序里也没有,你自己思考吧。
相似回答