|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,为什么这么写# F. j* c; A ^ b8 [, g
% G$ O( J1 k) V0 D; R
void UartRxMonitor(unsigned char ms)! s" W* d* | i9 y0 n5 A9 ~
{* `* ~, U$ R. f! P
static unsigned char cntbkp=0;1 V3 \ A5 V" ]6 t1 [. }- L! b4 ~
static unsigned char idletmr=0;
d$ B* W' o$ n& V) } if(cntRxd>0) //接收计数器大于零时,监控总线空闲时间( x- B2 h% u) L
{
& a( K2 U1 ]; D* Y0 `/ g if (cntbkp!=cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时, O; e; \. [1 c; K
{" I! [/ z4 k: R( L* t
cntbkp=cntRxd;! I) T: j8 D: u
idletmr=0;- {# i' P* q1 @ T5 s" j$ q
}" {3 y( F% R0 W. i9 t" k
else/ ~- N( ^2 r* ?& G
{
1 ]2 k, C6 L6 f# T! z D if(idletmr<30) //接收计数器未改变,即总线空闲时,累积空闲时间4 A# k- H! I4 l) `' |0 V& w1 D
{( B& B+ h l0 @6 E. \9 V! J
idletmr+=ms;( C. u# `* Q: @- s3 A( i5 i0 E
if(idletmr>=30) //空闲时间超过 30ms 即认为一帧命令接收完毕9 Z9 g( z* n" z$ P; b4 J. [
{4 N1 F+ Q7 c2 b/ u0 _
cmdarrived=1; //设置命令到达标志
. B/ @7 Y0 B+ v3 N/ f0 { }' y0 S9 L4 t4 H2 V% p5 Z
}$ L; n3 A3 G0 H5 t
}
2 b6 m+ W7 ^3 g/ w8 ]: L6 U# v}
H( D' S5 z* \" A else
A2 n/ j2 x' N' J {
1 O& e A8 }5 h$ x1 T cntbkp=0;+ Z$ x* [5 b. H! [' s4 ]
}7 J: r w5 \$ f
}
% U4 y4 s; M1 @1 z, A* D' H1 [
0 R, v4 V, n! k8 {/ n" U& lvoid ConfigTimer0(unsigned int ms) //T0 配置函数
8 Q) @/ I$ A/ A% x& s5 W{+ H7 w9 a+ x+ k) K) i
unsigned long tmp;
3 a; \6 A) o- \7 m. T tmp = 12000000/12; //定时器计数频率# a6 H/ X% X$ }" R) e% l9 F: ?4 k
tmp = (tmp*ms)/1000; //计算所需的计数值
* i i. ?" M& _0 l/ C tmp = 65536-tmp; //计算定时器重载值5 Y% z" ]0 P! t' e2 K, i4 w& O
tmp = tmp+34; //修正中断响应延时造成的误差
8 c8 U) ?) b9 `- H; n7 b T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
: V+ ~; f; _& n5 y( n: }9 k9 y7 s T0RL = (unsigned char)tmp;
( o: F- x, g/ b/ R0 l TMOD &= 0xF0; //清零 T0 的控制位
4 m% h) [9 K* @1 `4 f1 R* T. S, u TMOD |= 0x01; //配置 T0 为模式 18 L" ], G8 w9 P3 s6 P6 O
TH0 = T0RH; //加载 T0 重载值
" w4 h; H; `+ { TL0 = T0RL;
7 m5 B1 w" K9 f% H ET0 = 1; //使能 T0 中断
' d8 j: t( f% U c( `' K$ X TR0 = 1; //启动 T0" g7 k7 V: k1 U0 w2 X* j
}
& r% H$ h( ~5 D5 r0 o' wvoid InterruptTimer0() interrupt 1 //T0 中断服务函数
4 y/ ^/ c% P9 _" w/ ^{- G3 a! X* m: S( x5 e
TH0 = T0RH; //定时器重新加载重载值
1 w9 ?( r' _- @) H9 C2 p( b9 R& z TL0 = T0RL;
6 H& |7 \$ B1 f, [ UartRxMonitor(1); //串口接收监控3 u! J8 X1 L2 a- r* o
}/ v7 k6 E) P' I+ F. n) @% J8 y( O: O
STC89C52RC 单片机,定时器 1 作为波特率发生器,方式 1 下的波特率发生器必须使用定时器 1 的模式 2,红色部分到底想干嘛?
4 k2 b6 H% N# k! T |
|