关于单片机定时器周期计算问题

关于单片机定时器周期计算问题,第1张

你的不明白其实就是对于定时器的初值问题,110592是始终的晶振,时钟周期就是1/110592M
而定时器的周期就是12/110592 因为51单片机是12分频

还有很多
如果你写的是C的话建议这样写
TMOD=0X01// 定时器0方式1
TH0=(65535-50000)/256;//因为是16位计数 假设晶振为12MHZ 110592的是4600多吧,自己算算
TL=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
主要的计算就是其中的50000 中断一次所需要的时间就是50000乘以刚才所算的定时器的周期 (这个是50MS)
也就是你说的:就是比如定时器TF0置1的时间 中断的时候TF0 要求CPU中断而引起中断
好了
12倍的时间周期就是机械周期,(刚才说过是12分频的)
好了,还有什么不懂的再说吧

用延时函数就可以实现;
首先,设置定时器工作方式,也就是TMOD,在设置TH0/1,TL0/1的初值,也就是定时时间的设置,然后设置中断允许,并开中断就可以;
参考例子如下:
#include<reg51h>
void main()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void timer0() interrupt 1
{
TH0=0X3F;
TL0=0XB0;
}

分频值是是指你将系统时钟的频率减小,假设时钟频率是72mhz,然后分频值是7199,现在你的定时器值就是10khz,表示每计一个数,然后过了1/(10^4)秒,然后你的重装值就是你的时间了,如果值是9999,就表示定时时间为1s。

这个很好理解啊,假设定时器工作在方式1,也就是最大定时为65536US(假设12M晶振,51单片机)
那么你想定时多小为Xus
就直接拿TL0=(65536-x)/256 TL1=(65536-X)%256就可以了的
就好像一个杯子,他最多能装1L的水,而你只想往杯子里加400ml,那么你就必须先往杯子里装
(1000-400)ml的水, 这样的话,是不是你再往杯子里加400Ml的水,就会溢出呢,定时器也是这样的

12MHz晶振,经典51核是12分频,因此时钟周期为1μs。
50ms = 50000μs,因此定时器累加至溢出需要50000个周期。
因此65536 - 50000 = 15536 = 0x3CB0
因此TH0 = 0x3C,TL0 = 0xB0。
0x4C00这个初值对应的不是12MHz晶振,而是110592MHz晶振。你抄错了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12759789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存