|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,为什么这么写
, L5 d3 K9 Z: I( J; B* K& \) x
4 M. J# ]3 W/ j$ Z! p7 v- P+ Yvoid UartRxMonitor(unsigned char ms)
$ r) L$ V# l0 J3 `% ^2 b5 V{
7 ~) ?8 j6 g/ n+ x static unsigned char cntbkp=0;
& ^* [/ ~. ]4 K9 d static unsigned char idletmr=0;
# y' r) o% u: [ n$ m if(cntRxd>0) //接收计数器大于零时,监控总线空闲时间, ]" _1 J1 B" n3 t2 R$ c0 P
{
0 F* p; n2 p9 p0 l0 b if (cntbkp!=cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时$ q$ i+ h8 r) M( R0 B. G1 w1 b% u
{
( y- L* Y5 b3 Q& c3 S3 @5 ] cntbkp=cntRxd;
: z6 w* T5 @; H( ?8 _* I6 i7 I" v; s) u& } idletmr=0;
3 J f6 a* m9 |5 B }* ~/ \. O u8 ]$ R
else
' M8 K4 c. T1 M5 h/ J V7 W {
3 ~7 T( f8 W2 r" @, X7 M, ?3 X if(idletmr<30) //接收计数器未改变,即总线空闲时,累积空闲时间
: \8 w7 s' N% y# C2 b; E& n {& J$ N4 F& R! q- Q, z, z9 F
idletmr+=ms;$ i K1 Z! Y( Z6 h6 Z2 f* Z
if(idletmr>=30) //空闲时间超过 30ms 即认为一帧命令接收完毕 S5 u. ]+ Y" V" `4 [
{
& Y0 N3 y9 S* l$ V$ c% G) D+ T cmdarrived=1; //设置命令到达标志
( B' l- K ?+ }0 L6 {7 K }- Z9 \1 _5 [ G6 \& M8 ?: ?
}7 J% }2 q/ i" J4 Q @1 Y! X
}- B" J6 P/ ^! D. M7 g2 ]: I/ C g Y
}2 f# d6 C! x4 ?1 k* a# @
else2 z$ b( c* ]% q( b6 f
{7 ?' h/ f' B, V' i( a6 k
cntbkp=0;/ }, @( r, [6 t$ z: D- K5 O
}
. @, {6 ~8 ?% \+ X9 g/ N# w}
6 a% B# v7 J4 t+ G
' y3 f0 ^1 i9 f$ y/ fvoid ConfigTimer0(unsigned int ms) //T0 配置函数
- O% k+ b& P0 N3 B i- h: B{
0 G. P) x, a" c9 a' W' R0 k unsigned long tmp;: ?" j! y, _6 N( n8 a+ h6 t
tmp = 12000000/12; //定时器计数频率4 ]; ~# g1 r1 w( z; V6 ]. I1 H
tmp = (tmp*ms)/1000; //计算所需的计数值
1 @* E) Z. h) C- \& L" q: J% R tmp = 65536-tmp; //计算定时器重载值
0 k' E. k) b$ z0 g6 }) R1 d tmp = tmp+34; //修正中断响应延时造成的误差; J- v$ E/ P* u6 D T* ]! S/ e! z
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
% y8 ~8 j% o& F6 x' o T0RL = (unsigned char)tmp;, ]# G2 Y8 Y/ ]- D: V
TMOD &= 0xF0; //清零 T0 的控制位
c2 n- u/ Q: s5 U. q/ E TMOD |= 0x01; //配置 T0 为模式 1
, M' q, h6 N: W( ]- N [0 M& O TH0 = T0RH; //加载 T0 重载值
1 q/ l$ S" [9 L3 y TL0 = T0RL;
# e* F! \( [$ b ET0 = 1; //使能 T0 中断
% }# Q% A7 @# f0 U TR0 = 1; //启动 T0
8 g+ ^; N H) b! U. |}
@* @+ m# B7 b5 h& J, kvoid InterruptTimer0() interrupt 1 //T0 中断服务函数
5 g/ X D; W+ e5 _7 q* u2 r: e{
7 l/ ^7 D( M3 j( x: ^( z# k TH0 = T0RH; //定时器重新加载重载值
, t6 M# |. U8 J4 N TL0 = T0RL;
# b8 }% F3 ]" A1 F UartRxMonitor(1); //串口接收监控* Q5 E5 |( N. [
}
% w3 t- Z0 h0 ^8 [2 |" p( K) k$ a0 |STC89C52RC 单片机,定时器 1 作为波特率发生器,方式 1 下的波特率发生器必须使用定时器 1 的模式 2,红色部分到底想干嘛?) k& b; C) @- `: k" k
|
|