380091044 发表于 2023-11-27 10:53:43

modbus通信超时检测由定时器T0改成定时器T3,通信速度变很慢?问题已解决

本帖最后由 380091044 于 2023-11-28 11:27 编辑

modbus通信超时检测由定时器T0改成定时器T3,通信速度变很慢?


定时器T0初始化如下:

//===============T0初始化函数====================
u8      Timer0_Config(u8 t, u32 reload)      //t=0: reload值是主时钟周期数,t=1: reload值是时间(单位us)
{
      TR0 = 0;      //停止计数

      if(t != 0)      reload = (u32)(((float)MAIN_Fosc * (float)reload)/1000000UL);      //重装的是时间(us), 计算所需要的系统时钟数.
      if(reload >= (65536UL * 12))      return 1;      //值过大, 返回错误
      if(reload < 65536UL)      AUXR |= 0x80;                //1T mode
      else
      {
                AUXR &= ~0x80;      //12T mode
                reload = reload / 12;
      }
      reload = 65536UL - reload;
      TH0 = (u8)(reload >> 8);
      TL0 = (u8)(reload);

      ET0 = 1;      //允许中断
      TMOD &= 0xf0;
      TMOD |= 0;      //工作模式, 0: 16位自动重装,
      TR0 = 1;                        //开始运行
      return 0;
}







定时器T3初始化如下:、




//===============T3初始化函数====================
u8      Timer3_Config(u8 t, u32 reload)      //
{
      //T3为固定16位自动重装;
      T4T3M &= 0xf2;//停止计数, 清除控制位
      if(t != 0)      reload = (u32)(((float)MAIN_Fosc * (float)reload)/1000000UL);      //重装的是时间(us), 计算所需要的系统时钟数.
      if(reload >= (65536UL * 12))      return 1;      //值过大, 返回错误
      if(reload < 65536UL)      T4T3M |= 0x02;//1T mode
      else//reload >= 65536UL)      
      {
               
      T4T3M &= 0xFD;//12T mode;第一位清零是12T模式,其他保持不变;
      reload = reload / 12;
               
      }
      reload = 65536UL - reload;
      TH0 = (u8)(reload >> 8);
      TL0 = (u8)(reload);

T4T3M &= 0xf2;//
      T4T3M |= 0x08;//开始运行
      IE2 |= 0x20;//允许中断
      return 0;
}


定时器计算公式影响的?









JackLaw666 发表于 2023-11-30 11:08:21

向高手学习{:4_196:}

380091044 发表于 2023-11-30 11:17:43

JackLaw666 发表于 2023-11-30 11:08
向高手学习

相互学习

huhuan 发表于 2023-12-3 21:36:33

直接用STC的软件生成就行

380091044 发表于 2023-12-4 09:41:59

huhuan 发表于 2023-12-3 21:36
直接用STC的软件生成就行

哪个也是过了,已经解决了,感谢
页: [1]
查看完整版本: modbus通信超时检测由定时器T0改成定时器T3,通信速度变很慢?问题已解决