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 20:15
本帖最后由 ahliar 于 2016-1-28 19:27 编辑
进无止境 发表于 2016-1-28 09:28
修正误差那34怎么来的?


你可以试试用定时器产生一定频率的波形,用示波器看看,
在定时中断里面处理的东西越多,定时越不精确。
具体为什么是34 我也不清楚,
我猜是
1、根据实际测量出来的结果进行调整吧。
2、根据代码运行的延时而修正的吧,比如运行一个_nop_()就是1uS之类的。 最佳答案

一周热门 更多>