关于单片机定时器溢出值的设定

来源:百度知道 编辑:UC知道 时间:2024/06/06 12:35:18
本人最近在学习单片机,发现很多程序里面都有关于定时器溢出值的设定
例如,在DS18B20温度测量与控制实验中,有这样的程序
TR1=0; //STOP Timer1
TH1=(-SYSCLK/us)>>8; //set Timer1 to overflow in us
TL1=-SYSCLK/us;
TR1=1; //STAR Timer1
While(TF==0); //wait for overflow
TF1=0; //clear overflow indicator
为什么TH1=(-SYSCLK/us)>>8;
TL1=-SYSCLK/us;
是设定定时器的溢出值呢?为什么还要负的SYSCLK,而且还要右移8位,多谢各位高手了
能说的详细点吗,别说什么看书不仔细的,要是看的仔细了,我还用问吗我,狂晕

有些定时器是递减计数的,有些单片机的定时器则是递增计数的,还有可以设定计数方式的,51单片机的定时器就是递增的,所以它溢出的时间不是你设定的初值本身代表的机器周期数,而是初值与65536的差值,所以程序中使用了负号来对SYSCLK求补。比如你需要的定时时间是4个机器周期(SYSCLK),那么你就必须装入初值65532,也就是16位有符号数的(-4)。
TH和TL寄存器都是8位的,它们需要分别装入定时初值的高8位和低8位,而SYSCLK是个16位变量,“TL1=-SYSCLK/us;”这样的语句会通过类型强制转换将-SYSCLK的低8位传入TL1,同理,装入高8位就要将SYSCLK变量右移8位,使高8位移动到低8位的位置,再通过类型强制转换装入TH1。

看书不仔细