找回密码
 注册
关于网站域名变更的通知
查看: 669|回复: 6
打印 上一主题 下一主题

51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,...

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-23 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2019-4-23 15:00 | 只看该作者
红色部分的作用是把你需要的中断触发时间(毫秒)配置到定时器T0。
7 K& p' j% a8 c. G" M+ P这里使用定时器最大值从T0R的加载值开始计数一直到65535溢出,所以触发的计数时间是65536-tmp

该用户从未签到

3#
发表于 2019-4-23 15:11 | 只看该作者
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。
6 J+ Q0 K, w# w% F. N& O  i/ G$ s- S8 T. V5 H: E6 `% L
tmp = 12000000/12; //定时器计数频率------跟你的单片机(1T/12T),晶振有关
9 Y; Y4 y7 T$ p. [) P. v( S6 Atmp = (tmp*ms)/1000; //计算所需的计数值-----1s=1000ms: i% U9 Y0 w$ d( z7 ^
   + N& H' b% i6 @/ R3 S* |  s4 _
以下就是计算定时的值了=
' l6 U+ I2 R' J: u  ^+ ~tmp = 65536-tmp; //计算定时器重载值-% M. A( w+ i; j. m% H
   tmp = tmp+34; //修正中断响应延时造成的误差
3 v) ~2 w8 {4 M[color=Red]   T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节1 `9 X0 ^3 ?. U2 Y# \
   T0RL = (unsigned char)tmp;

点评

修正误差那34怎么来的?  详情 回复 发表于 2019-4-23 15:21

该用户从未签到

4#
 楼主| 发表于 2019-4-23 15:21 | 只看该作者
relchhiclty 发表于 2019-4-23 15:11
: q8 l4 J, E2 ~$ Q9 X$ b7 z你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。1 X& c5 x" P7 B1 o% T

8 w( z6 O7 J1 u7 J7 G. I1 E1 k! gtmp = 12000000/12; //定时器 ...

: b  I" ~: q7 D6 l+ m% e6 }修正误差那34怎么来的?
4 R8 y; p4 e3 ]! }

点评

你可以试试用定时器产生一定频率的波形,用示波器看看, 在定时中断里面处理的东西越多,定时越不精确。 具体为什么是34 我也不清楚, 我猜是 1、根据实际测量出来的结果进行调整吧。 2、根据代码运行的延时而  详情 回复 发表于 2019-4-23 15:26

该用户从未签到

5#
发表于 2019-4-23 15:26 | 只看该作者
artic 发表于 2019-4-23 15:21
6 ~7 Q7 Y: ]/ N# {; _0 i+ Z修正误差那34怎么来的?

4 A, `3 Z0 I  o) G' l9 ?" ?你可以试试用定时器产生一定频率的波形,用示波器看看,
; S0 x& L/ J. g/ o3 @在定时中断里面处理的东西越多,定时越不精确。
4 R5 X1 [+ f4 x# N) N) l8 P- L' i8 u具体为什么是34 我也不清楚," [9 i/ _8 v9 R) g8 \8 ]
我猜是* E. Y4 L/ S0 s; h1 Q" M' V
1、根据实际测量出来的结果进行调整吧。
4 K3 z! N  C) b, Y. X2、根据代码运行的延时而修正的吧,比如运行一个_nop_()就是1uS之类的。
! f$ e' A4 U' k$ @

点评

谢谢  详情 回复 发表于 2019-4-23 16:38

该用户从未签到

6#
 楼主| 发表于 2019-4-23 16:38 | 只看该作者
relchhiclty 发表于 2019-4-23 15:262 J4 M! m7 c# y# |# y
你可以试试用定时器产生一定频率的波形,用示波器看看,2 ^2 }8 _1 |! V5 X7 M7 |
在定时中断里面处理的东西越多,定时越不精确。 ...
: O' N( v& i; @
谢谢
3 k, s: _; @# z: E: \6 t+ l% w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-11 16:26 , Processed in 0.156250 second(s), 29 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表