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怎么来的?
多谢各位帮忙,不胜感激