本帖最后由 进无止境 于 2016-1-27 14:51 编辑
void UartRxMonitor(unsigned char ms)
{
sta
tic 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}部分到底想干嘛?
你可以试试用定时器产生一定频率的波形,用示波器看看,
在定时中断里面处理的东西越多,定时越不精确。
具体为什么是34 我也不清楚,
我猜是
1、根据实际测量出来的结果进行调整吧。
2、根据代码运行的延时而修正的吧,比如运行一个_nop_()就是1uS之类的。 最佳答案
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怎么来的?
一周热门 更多>