void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时器0初值,定时50ms 定时多少MS就多少*1000
EA=1;//开启总中断
ET0=1;//定时器0中断允许
TR0=1;//开启定时器0
while(1)
{
}
}
void timer0() interrrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
赋值的原理是什么?
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
这两步要怎么理解成50MS?
怎么一个算法方法?
首先弄明白“/”、“%”是什么意思:
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256 算出来是 60 转换为二进制是
计数器计数到65536之后就会溢出,如果初始时没有放任何数值在计数器里的话就会在计到65536之后溢出,也就是65.536ms后溢出,要让计数器在50ms的时候溢出,就应该先在计数器里预先放要计数15.536ms的数值,也就是15536,那么15536是怎么来的呢?就是(65536-50000)~~TH0、TL0的那两步只是给计数器的高8位和低8位分配计数值而已,按照这个模式弄就可以了·~
当比65536大时即产生一次中断,因为51单片机是8位所以需分成低八位和高八位
从数值上
TH0=(65536-50000)/256 算出来是 60 转换为二进制是 计算公式仔细看书,网上有很多。请记住,12M晶振时TH0=(65536-X)/256;
TL0=(65536-X)%256;,X是需要递增的数字,当从15536开始增长到65536后,会溢出,申请中断,而每加一个数需要1uS,所以50000个数需要50000uS,也就是50mS,,由于每加一个数需要的时间由晶振决定,所以,12M时是1uS,6M时是2uS,初值也要调整。
单片机计时器的原理是
一个n位的(在这里是16位的)2进制加法计数器在时钟脉冲的控制下,从计数初值开始逐一累加,到FFFF的时候再+1就清零了,这个时候触发一个计时器中断。
所以,你要计时50000的话就要用FFFF(16)+1-50000(10)所以在代码中使用65536-50000来确定计数器的初值的,并不是给计数器初值直接用50000
然后256(就是FF+1)是用来取低两位和高两位的
而50000这个值是根据计数时钟的频率算出来的,在这里单片机提供的时钟周期应该是1μs(12MHZ的晶振)所以要用50ms*1000来确定计数器要数的个数。
明白了么?