51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,为什么这么写

2019-07-15 15:03发布

本帖最后由 进无止境 于 2016-1-27 14:51 编辑

void UartRxMonitor(unsigned char ms)
{
    static unsigned char cntbkp=0;
    static unsigned char idletmr=0;
  if(cntRxd>0) //接收计数器大于零时,监控总线空闲时间
{
    if (cntbkp!=cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时
   {
    cntbkp=cntRxd;
    idletmr=0;
   }
    else
   {
    if(idletmr<30) //接收计数器未改变,即总线空闲时,累积空闲时间
   {
    idletmr+=ms;
      if(idletmr>=30) //空闲时间超过 30ms 即认为一帧命令接收完毕
     {
      cmdarrived=1; //设置命令到达标志
     }
   }
  }
}
   else
  {
    cntbkp=0;
   }
}

void ConfigTimer0(unsigned int ms) //T0 配置函数
{
   unsigned long tmp;
  tmp = 12000000/12; //定时器计数频率
   tmp = (tmp*ms)/1000; //计算所需的计数值
   tmp = 65536-tmp; //计算定时器重载值
   tmp = tmp+34; //修正中断响应延时造成的误差
   T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
   T0RL = (unsigned char)tmp;

   TMOD &= 0xF0; //清零 T0 的控制位
   TMOD |= 0x01; //配置 T0 为模式 1
   TH0 = T0RH; //加载 T0 重载值
   TL0 = T0RL;
   ET0 = 1; //使能 T0 中断
   TR0 = 1; //启动 T0
}
void InterruptTimer0() interrupt 1 //T0 中断服务函数
{
   TH0 = T0RH; //定时器重新加载重载值
   TL0 = T0RL;
   UartRxMonitor(1); //串口接收监控
}
STC89C52RC 单片机,定时器 1 作为波特率发生器,方式 1 下的波特率发生器必须使用定时器 1 的模
式 2,红 {MOD}部分到底想干嘛?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
ahliar
2019-07-15 23:18
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。

tmp = 12000000/12; //定时器计数频率------跟你的单片机(1T/12T),晶振有关
tmp = (tmp*ms)/1000; //计算所需的计数值-----1s=1000ms
   
以下就是计算定时的值了=
tmp = 65536-tmp; //计算定时器重载值-
   tmp = tmp+34; //修正中断响应延时造成的误差
[color=Red]   T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
   T0RL = (unsigned char)tmp;

一周热门 更多>