找回密码
 立即注册
查看: 290|回复: 3

计时器问题

[复制链接]

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 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秒一次),
请教一下各位问题出在哪里.
谢谢!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:426
  • 最近打卡:2025-05-04 08:10:23
已绑定手机

77

主题

4851

回帖

8444

积分

超级版主

DebugLab

积分
8444
发表于 2024-9-6 11:17:36 | 显示全部楼层

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

截图202409061114246188.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 2024-9-6 11:23:01 | 显示全部楼层
懂了,在定时器到点后忘记了重新加载TL1和TH1.非常感谢!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-04 00:16:27
已绑定手机

19

主题

3191

回帖

4930

积分

论坛元老

积分
4930
发表于 2024-9-6 12:34:04 | 显示全部楼层
wnag*** 发表于 2024-9-6 12:31
手动重置不如自动加载,如果有自动加载初值的功能还是尽量用上,更准确,更省事 ...

早期的是没有自动重装载功能的。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 09:52 , Processed in 0.139755 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表