找回密码
 立即注册
查看: 191|回复: 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 | 显示全部楼层
有没有人帮忙解决一下吗。
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 09:59
  • 签到天数: 113 天

    [LV.6]常住居民II

    43

    主题

    1039

    回帖

    7153

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    27

    主题

    1439

    回帖

    4482

    积分

    论坛元老

    积分
    4482
    发表于 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 寄存器读取的值。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 166 天

    [LV.7]常住居民III

    21

    主题

    1246

    回帖

    3025

    积分

    论坛元老

    积分
    3025
    发表于 2024-3-8 11:39:34 | 显示全部楼层
    一岁玩DOTA 发表于 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 编辑
    电子DIY小家 发表于 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, 2024-6-13 17:43 , Processed in 0.073456 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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