找回密码
 立即注册
查看: 725|回复: 9

求助:STC15F104W T0定时器TH0 TL0寄存器无法读取问题

[复制链接]

1

主题

6

回帖

17

积分

新手上路

积分
17
发表于 2024-3-8 09:08:13 | 显示全部楼层 |阅读模式
本帖最后由 一岁玩DOTA 于 2024-3-8 14:23 编辑

截图202403080905488098.jpg
截图202403081422467830.jpg

以上代码可以准确的生成1ms 的高电平脉冲。
改成以下就只能产生65ms的脉冲。所以怀疑定时器读取值异常问题。求助。
截图202403080907488424.jpg
截图202403081423077042.jpg





截图202403080905003698.jpg
回复

使用道具 举报 送花

1

主题

6

回帖

17

积分

新手上路

积分
17
发表于 2024-3-8 09:53:23 | 显示全部楼层

void Delay1000us()                //@12.000MHz
{
        unsigned char i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}


void main(void)
{
//        int j = 0 ;
//        int i = 0 ;
        unsigned char Tstart = 1;
        Ctr_IOInit_P32();
        PWM_IN_Init();
        high_duty_time = 1;
        while(1)
        {
                Delay1000us();
                //while(!P33);
                TL0 = 1000;      //T1MS     
                TH0 = 1000 >> 8;
                TF0=0; //计数器0溢出标志置0
                //TR0 = 1;                //定时器0开启  
                //while(P33);

                high_duty_time= TH0<<8+TL0;//取出计数器寄存器中的值,用于计算高电平的时间
               
                TR0 = 0;                //定时器0关闭
               
                high_duty_time =  65536 - high_duty_time;
               
                TL0 = high_duty_time;                     //初始化计时值
    TH0 = high_duty_time >> 8;
                P32 = 1;
    TR0 = 1;                        //定时器0开始计时
    ET0 = 1;                        //使能定时器0中断

                while(!TF0);
                P32 = 0;
                TR0 = 0;                //定时器0关闭
                ET0 = 0;
                TF0 = 0;
        }
}
回复 支持 反对

使用道具 举报 送花

1

主题

6

回帖

17

积分

新手上路

积分
17
发表于 2024-3-8 09:54:23 | 显示全部楼层
sbit led_valid = P3 ^ 2;

void Ctr_IOInit_P32(void)
{
//    P3M1&=~0x04;
//                P3M0|=0x04;
        led_valid = 0;  //设置为双向IO
}

void Timer_0_initial()
{
//                AUXR &= 0x7F;                //定时器时钟12T模式
//                TMOD &= 0xF0;                //设置定时器模式
//                TMOD |= 0x01;                //设置定时器模式
//                TL0 = 0;                //设置定时初值
//                TH0 = 0;                //设置定时初值
//                TF0 = 0;                //清除TF0标志
//                TR0 = 0;                //定时器0关闭
       
                AUXR &= 0x7f;                   //定时器0为12T模式

    TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL0 = 0;                     //初始化计时值
    TH0 = 0;
    TR0 = 0;                        //定时器0开始计时
   // ET0 = 1;                        //使能定时器0中断
}

void PWM_PortInit()
{
    P3M1|=0x08;   //设置P3.3为高阻输入
    P3M0&=~0x08;  //设置P3.3为高阻输入
  //  IT1 = 1;                    //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
//   EX1 = 1;                    //使能INT1中断
  //  EA = 1;
}

void PWM_IN_Init()
{
    Timer_0_initial();
    PWM_PortInit();   
}
回复 支持 反对

使用道具 举报 送花

1

主题

6

回帖

17

积分

新手上路

积分
17
发表于 2024-3-8 10:17:23 | 显示全部楼层
有没有人帮忙解决一下吗。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-3-8 10:51:15 | 显示全部楼层
截图202403081050419095.jpg
TH0先存到16位的变量里,在移位,在加上TL0
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-3-8 10:53:44 | 显示全部楼层
如果是用定时器做PWM输出的话,可以参考这个例子
截图202403081053345368.jpg
回复 支持 反对

使用道具 举报 送花

1

主题

6

回帖

17

积分

新手上路

积分
17
发表于 2024-3-8 11:36:41 | 显示全部楼层
乘风*** 发表于 2024-3-8 10:53
如果是用定时器做PWM输出的话,可以参考这个例子

是做测量脉宽。目前测不准,用这个方法来检查TH0 TL0 寄存器读取的值。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-3-8 11:39:34 | 显示全部楼层
一岁*** 发表于 2024-3-8 11:36
是做测量脉宽。目前测不准,用这个方法来检查TH0 TL0 寄存器读取的值。

如果是做输入捕获的东西  可以看看PCA 或者PWM 我记得STC15的单片机 是有PCA来做输入捕获的 挺准的
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

1

主题

6

回帖

17

积分

新手上路

积分
17
发表于 2024-3-8 11:48:42 | 显示全部楼层
_奶*** 发表于 2024-3-8 11:39
如果是做输入捕获的东西  可以看看PCA 或者PWM 我记得STC15的单片机 是有PCA来做输入捕获的 挺准的 ...

目前硬件已经定型和量产了,只能用这个来做了
回复 支持 反对

使用道具 举报 送花

1

主题

6

回帖

17

积分

新手上路

积分
17
发表于 2024-3-8 14:19:08 | 显示全部楼层
本帖最后由 一岁玩DOTA 于 2024-3-8 14:24 编辑
电子DI*** 发表于 2024-3-8 10:51
TH0先存到16位的变量里,在移位,在加上TL0

这样还是不行:
-----------------------------------------------------------------------------------------------------------
                high_duty_time = TH0;
                high_duty_time = high_duty_time<<8+TL0;//取出计数器寄存器中的值,用于计算高电平的时间
               
                //high_duty_time = 1500;
-----------------------------------------------------------------------------------------------------------
截图202403081424148234.jpg
这样就可以:
-----------------------------------------------------------------------------------------------------------
                //high_duty_time = TH0;
                //high_duty_time = high_duty_time<<8+TL0;//取出计数器寄存器中的值,用于计算高电平的时间
               
                high_duty_time = 1500;
-----------------------------------------------------------------------------------------------------------        


截图202403081424362795.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 09:01 , Processed in 0.134011 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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