一岁玩DOTA 发表于 2024-3-8 09:08:13

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

本帖最后由 一岁玩DOTA 于 2024-3-8 14:23 编辑




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







一岁玩DOTA 发表于 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;
        }
}

一岁玩DOTA 发表于 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();   
}

一岁玩DOTA 发表于 2024-3-8 10:17:23

有没有人帮忙解决一下吗。

电子DIY小家 发表于 2024-3-8 10:51:15


TH0先存到16位的变量里,在移位,在加上TL0

乘风飞扬 发表于 2024-3-8 10:53:44

如果是用定时器做PWM输出的话,可以参考这个例子

一岁玩DOTA 发表于 2024-3-8 11:36:41

乘风飞扬 发表于 2024-3-8 10:53
如果是用定时器做PWM输出的话,可以参考这个例子

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

_奶咖君_ 发表于 2024-3-8 11:39:34

一岁玩DOTA 发表于 2024-3-8 11:36
是做测量脉宽。目前测不准,用这个方法来检查TH0 TL0 寄存器读取的值。

如果是做输入捕获的东西可以看看PCA 或者PWM 我记得STC15的单片机 是有PCA来做输入捕获的 挺准的

一岁玩DOTA 发表于 2024-3-8 11:48:42

_奶咖君_ 发表于 2024-3-8 11:39
如果是做输入捕获的东西可以看看PCA 或者PWM 我记得STC15的单片机 是有PCA来做输入捕获的 挺准的 ...

目前硬件已经定型和量产了,只能用这个来做了

一岁玩DOTA 发表于 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;
-----------------------------------------------------------------------------------------------------------

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


页: [1]
查看完整版本: 求助:STC15F104W T0定时器TH0 TL0寄存器无法读取问题