计时器问题
各位大咖,遇到一个很奇怪的问题.请各位指点一下.我需要使用5616AD产生一个精确的1us的计时,简单做了一个测试,步骤大概如下:
1.定时器1产生一个1000us的计时,代码如下:
void Timer1Init(){
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
2.在主程序中使用TF1作为计时计数,用个变量累加,累加到1000时切换发光二极管的发光状态,代码如下:
uint iCount=0;
void main(){
Timer1Init();
P14=0; //led
while(1){
if(TF1){
TF1=0;
iCount++;
if(iCount==1000){
iCount=0;
P14=!P14;
}
}
}
}
我的思路是每1000us进行一次累加,那1000次就是1秒,那就是发光管每1秒切换一次.但实际闪光的频率远远低于1秒一次(感觉是7-8秒一次),
请教一下各位问题出在哪里.
谢谢!
定时器不支持自动重载,中断函数内要重新设置TL1、TH1,如不设置,会跑到65535,按你程序是6.5535秒,按你程序,外接12M晶振,注意不要使用内部时钟
懂了,在定时器到点后忘记了重新加载TL1和TH1.非常感谢! wnagming 发表于 2024-9-6 12:31
手动重置不如自动加载,如果有自动加载初值的功能还是尽量用上,更准确,更省事 ...
早期的是没有自动重装载功能的。
页:
[1]