微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,为什么这么写

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

时间:10-02 整理:3721RD 点击:

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,红色部分到底想干嘛?

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

红色部分的作用是把你需要的中断触发时间(毫秒)配置到定时器T0。
这里使用定时器最大值从T0R的加载值开始计数一直到65535溢出,所以触发的计数时间是65536-tmp

你这是定时器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;

修正误差那34怎么来的?

多谢各位帮忙,不胜感激

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top