|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,为什么这么写
) Y* c2 W" `: V1 ~5 d/ G; N6 L5 O5 P) L0 t
void UartRxMonitor(unsigned char ms)( w1 D/ f% G9 m. D; k0 j7 k
{) u( o# J( v7 B" J# m
static unsigned char cntbkp=0;
( \$ A4 z. O, K2 v, `! x static unsigned char idletmr=0;
$ N5 x7 y% ~ j1 z if(cntRxd>0) //接收计数器大于零时,监控总线空闲时间
! z7 u+ h. ?( y6 D3 A7 q" v, R{
' m1 j7 z' k+ P T% E; q if (cntbkp!=cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时
2 M) Q% D0 k& o, Q7 L {8 N( z; k) b9 o( N- o) p
cntbkp=cntRxd;' m q4 X4 `, I! T, S& M
idletmr=0;8 }6 t. M; m7 f4 y. D
}
" H1 @! H p: I# q5 n& u' {! _* g else
$ {1 z! w9 M+ s5 L { u4 J, A& {: q7 ]& m% Q1 Z/ s v
if(idletmr<30) //接收计数器未改变,即总线空闲时,累积空闲时间
2 A3 p/ o) B8 ]: @* q2 i {
0 l0 S5 H: t0 q0 R& N, V9 X9 d" } idletmr+=ms;
2 E4 i0 w0 P1 r! A' l$ [: Q if(idletmr>=30) //空闲时间超过 30ms 即认为一帧命令接收完毕 W* T6 T. y2 g( e
{
& B( k+ c* v1 X( ?$ y cmdarrived=1; //设置命令到达标志
8 X# R6 _/ W# Z }
5 G( K1 u8 t$ R1 [5 O9 H% @. F1 S }
/ V" m& P }1 I4 o7 ] n$ O }6 R4 o' U+ t" M3 |- u$ }
}0 g; Z9 h2 C) z+ f3 L' e# z6 A
else4 r4 d3 U6 g6 G* m n( v
{6 M+ r- n, m1 h, W
cntbkp=0;! W$ ]- @& ~; E- J9 d
}
0 \- _" O6 t" c+ j+ ^- r}1 S; ?" a* O9 v' b
# [# f! x" M' q' i7 h1 o
void ConfigTimer0(unsigned int ms) //T0 配置函数- F) m" L B; c1 c% g' a
{! I: K" o& M. m+ a. D
unsigned long tmp;, O& C! {6 c! O2 v! D$ A
tmp = 12000000/12; //定时器计数频率
2 i* _$ | ]7 M) S; } tmp = (tmp*ms)/1000; //计算所需的计数值
. ^& v7 g3 L! h9 ]' [7 k tmp = 65536-tmp; //计算定时器重载值0 J6 t& ]4 z8 r: F, J" B
tmp = tmp+34; //修正中断响应延时造成的误差0 o& a7 W7 B% Z
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
* l4 E4 P2 I# N* S2 |% Y: l T0RL = (unsigned char)tmp;
4 C$ F2 j9 \, U2 {& C) @ TMOD &= 0xF0; //清零 T0 的控制位
8 T: v# c1 g/ Z( k' Q1 R9 f TMOD |= 0x01; //配置 T0 为模式 1
- U1 j+ \) k( f+ M TH0 = T0RH; //加载 T0 重载值# {* S4 q' L+ v9 Q$ Q# t o$ t
TL0 = T0RL;, H, d' W6 ?3 C; \# J' d
ET0 = 1; //使能 T0 中断7 K' h1 h, Q0 ?1 \
TR0 = 1; //启动 T0! u9 `7 s: m" I6 q* C
}
/ g+ V9 Z3 e2 d( Wvoid InterruptTimer0() interrupt 1 //T0 中断服务函数& E5 E: ?0 K, m, r9 k& ^( ~% Z! T; w; X
{
& t9 `5 L) |* `" \0 }. k TH0 = T0RH; //定时器重新加载重载值; Q# a# H3 I9 l# C
TL0 = T0RL;
( _" A$ e( J/ P5 d. L UartRxMonitor(1); //串口接收监控
& Y; q! g9 E2 n0 t( ^5 h}3 P) ]) c: F6 ~; Q6 V: ~- q j" Q6 z
STC89C52RC 单片机,定时器 1 作为波特率发生器,方式 1 下的波特率发生器必须使用定时器 1 的模式 2,红色部分到底想干嘛?
; k9 R2 \$ ?$ q* k |
|