51定时器初值计算有什么简便算法吗?
51单片机定时器初值计算:
void main(void)
{
s1=1;
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-46083)/256; //定时器T0的高8位设置初值
TL0=(65536-46083)%256; //定时器T0的低8位设置初值
函数功能:定时器T0的中断服务函数
void Time0(void ) interrupt 1 using 0 //定时器T0的中断编号为1,使用第1组工作寄存器
{
count++; //每产生1次中断,中断累计次数加1
if(count==20) //如果中断次数计满20次
count=0; //中断累计次数清0
s++; //秒加1
定时器初值 46083 是怎么计算出来的? 一般我们如用 AT892051的话 定时50MS 就是 TH0=(65536-50000)/256。使用的12M晶体 ,20次为1S。
扩展资料:
使用说明
以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。
开发的时候可能会根据需要更换不同频率的晶振(比如c51单片机,用11.0592M的晶振,很适合产生串口时钟,而12M晶振很方便计算定时器的时间),使用插接式比较方便。
对12MHz 1个机器周期 1us 12/fosc = 1us,方式0 13位定时器最大时间间隔 = 2^13 = 8.192ms,方式1 16位定时器最大时间间隔 = 2^16 = 65.536ms,方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us。
定时5ms,计算计时器初值 M = 2^K-X*Fosc/12 12MHz。方式0: K=13,X=5ms,Fosc=12MHz 则 M = 2^13 - 5*10^(-3)*12*10^6/12= 3192 = 0x0C78。
THx = 0CH,TLx = 78H,方式1: K=16,X=5ms,Fosc=12MHz 则 M = 2^16 - 5*10^(-3)*12*10^6/12= 60536 = 0xEC78。
THx = ECH,TLx = 78H,50ms 12MHz THx = 3CH,TLx = B0H,10ms THx = D8H,TLx = F0H。
例如:12M晶振 50ms: TH1 = (65536 - 50000) / 256;TL1 = (65536 - 50000) % 256;
11.0592M晶振 50ms: TH1 = (65536 - (11.0592/12)*50000) / 256;
TL1 = (65536 - (11.0592/12)*50000) % 256;
请问大侠这个式子是怎么来的啊?我刚开始学习单片机,自学呢,看起来比较困难,但是还想搞清楚原委。谢谢大侠赐教,比如11.0592M的晶振想延时26毫秒该怎么设置呢?
定时器启动后,会从你的初值开始加数,一个机器周期加一次,加到65535(工作方式一)之后,溢出。12M晶振的51单片机一个机器周期是1微妙。而11.0592M晶振相应的就是(12/11.0592)微秒。想让定时器26ms溢出,需要加多少个数呢?答案是:
n = 26ms/(12/11.0592us); 65535 - n 得到的数为它的初值,定时器启动后,从该初值开始加,加到65535溢出,正好26ms.
具体的设置就是TH1 = (65536 - (11.0592/12)*26000) / 256;
TL1 = (65536 - (11.0592/12)*26000) % 256;
或者你自己用VC写一个。