liuyu8087 发表于 2024-9-6 10:34:52

计时器问题

各位大咖,遇到一个很奇怪的问题.请各位指点一下.

我需要使用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秒一次),
请教一下各位问题出在哪里.
谢谢!

DebugLab 发表于 2024-9-6 11:17:36


定时器不支持自动重载,中断函数内要重新设置TL1、TH1,如不设置,会跑到65535,按你程序是6.5535秒,按你程序,外接12M晶振,注意不要使用内部时钟


liuyu8087 发表于 2024-9-6 11:23:01

懂了,在定时器到点后忘记了重新加载TL1和TH1.非常感谢!

soma 发表于 2024-9-6 12:34:04

wnagming 发表于 2024-9-6 12:31
手动重置不如自动加载,如果有自动加载初值的功能还是尽量用上,更准确,更省事 ...

早期的是没有自动重装载功能的。
页: [1]
查看完整版本: 计时器问题