|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,为什么这么写 H; w' h; F& V! f1 M! E
9 {' C, n( E: c$ S$ s( ~& C/ Y1 _
void UartRxMonitor(unsigned char ms), U* J$ J8 c' O! Y
{
! r6 t1 R" l; G static unsigned char cntbkp=0;& c# [0 P4 {$ H" }( p v9 _1 f
static unsigned char idletmr=0;
$ A }2 D1 ~% z if(cntRxd>0) //接收计数器大于零时,监控总线空闲时间
( V, K. @$ Z6 z$ i, V7 |{! ?+ e Q: k" Z1 U5 N ~7 }
if (cntbkp!=cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时
' ]& z, u Q5 n4 B/ H' g7 l4 Z {) p: e* t8 f+ K
cntbkp=cntRxd;5 f5 Z% I6 [9 i" W) L1 w. y
idletmr=0;
1 L9 n, S- w: d; \5 r. K }4 `- Z" q; p* d
else) j. D) ~5 i4 h3 ?1 g1 ]
{% Q$ _; c, d+ {
if(idletmr<30) //接收计数器未改变,即总线空闲时,累积空闲时间6 b F, `0 e# o) T0 q
{
. }& u2 L$ T$ E Z idletmr+=ms;
4 ]. `7 G. n( Q+ V- F; _ e8 g: B if(idletmr>=30) //空闲时间超过 30ms 即认为一帧命令接收完毕
7 R2 P: k; O3 S4 @ {
: Z& q* k% F5 O cmdarrived=1; //设置命令到达标志
- q1 I) X, I7 s* ~- f* h }. @4 e# X+ p9 A+ [( i1 }
}4 v! A0 J5 b/ t. b' `0 h8 D
}( ^, A+ M$ |% j. t$ u/ |1 M
}
4 D" u; o! P' P# q else8 {- y$ O1 V) A" F, u
{
# p& { f$ d R: ^/ o# @6 ? cntbkp=0;# W9 q) M! R8 _/ Y1 Z5 o! s
}
" w. q- |3 L3 [* f6 x* q}! M6 }& L' x# e; D6 w9 c
, [; S8 L ~! g
void ConfigTimer0(unsigned int ms) //T0 配置函数: O: `# h0 Z& |
{. {) X1 D1 G ^* Z
unsigned long tmp;" x0 f* _! x- Q: q8 j
tmp = 12000000/12; //定时器计数频率
8 D, t+ F9 o( Y+ D8 R tmp = (tmp*ms)/1000; //计算所需的计数值6 {% C# G( n8 m R
tmp = 65536-tmp; //计算定时器重载值
1 ` t1 d6 `2 k& y: x6 `& m tmp = tmp+34; //修正中断响应延时造成的误差
' K/ ]$ y1 P0 D+ [7 I' D0 Z4 ^$ m T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
5 t6 o8 x/ n5 m T0RL = (unsigned char)tmp;3 q( \2 K; C8 M/ [" z- H* }# C
TMOD &= 0xF0; //清零 T0 的控制位
! t5 [3 I* f! W4 ^( N TMOD |= 0x01; //配置 T0 为模式 1. m# H E4 l( u. E
TH0 = T0RH; //加载 T0 重载值5 x( K; ? ~$ q2 [- @- v- ]( t
TL0 = T0RL;2 l* V( F+ S5 B* @
ET0 = 1; //使能 T0 中断
$ |" i8 m0 L( R& c7 @; E* C TR0 = 1; //启动 T0/ u" L/ S/ `, u7 I9 R
}% F( g# |4 r4 G/ O2 ~" V5 L9 o
void InterruptTimer0() interrupt 1 //T0 中断服务函数
* Z2 b; n; X) O# }# }$ Y{# |3 }6 H" B9 B; O: ?
TH0 = T0RH; //定时器重新加载重载值& c7 {" p: e) ^9 t6 E3 {- M+ v
TL0 = T0RL;& d/ I) \2 x/ w! L8 H
UartRxMonitor(1); //串口接收监控 r& _7 A6 a1 b, V# ^1 z/ c) V; b
}
* M6 N ]! [* Z7 Q5 I* KSTC89C52RC 单片机,定时器 1 作为波特率发生器,方式 1 下的波特率发生器必须使用定时器 1 的模式 2,红色部分到底想干嘛?
; b/ U& V( b0 T& R |
|