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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

2#
发表于 2019-4-23 15:00 | 只看该作者
红色部分的作用是把你需要的中断触发时间(毫秒)配置到定时器T0。
- j: D9 e) G8 ^0 }$ M2 j8 A这里使用定时器最大值从T0R的加载值开始计数一直到65535溢出,所以触发的计数时间是65536-tmp

该用户从未签到

3#
发表于 2019-4-23 15:11 | 只看该作者
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。" F( ^! H& i- J% @2 O& B
/ z% i0 |" A' S
tmp = 12000000/12; //定时器计数频率------跟你的单片机(1T/12T),晶振有关
2 f; t7 ^: G# {tmp = (tmp*ms)/1000; //计算所需的计数值-----1s=1000ms
0 J8 z5 g: Y* I   
. j) e/ R( p) H1 e) f以下就是计算定时的值了=
% x1 K, V3 _9 r% H4 f. Btmp = 65536-tmp; //计算定时器重载值-
- w6 z+ t  t7 O$ h: ?   tmp = tmp+34; //修正中断响应延时造成的误差
$ Z6 G0 N" C% \6 P* {5 q[color=Red]   T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节/ j% A7 ]6 i9 K# D( y3 R9 J
   T0RL = (unsigned char)tmp;

点评

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

该用户从未签到

4#
 楼主| 发表于 2019-4-23 15:21 | 只看该作者
relchhiclty 发表于 2019-4-23 15:113 r+ u) O7 s( z5 X" ]
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。
% p$ e$ y) S  {0 Q8 T7 R9 x, w$ i- H5 {
tmp = 12000000/12; //定时器 ...

, G7 K' G- R, Q! l: ]& L, E2 @修正误差那34怎么来的?
8 L9 L' C4 M7 Z( L: B

点评

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

该用户从未签到

5#
发表于 2019-4-23 15:26 | 只看该作者
artic 发表于 2019-4-23 15:21
+ `6 }+ X# z/ `" d修正误差那34怎么来的?
" i% U6 s( {) W' G! }* a
你可以试试用定时器产生一定频率的波形,用示波器看看,) L8 l+ i/ i" {: L2 O
在定时中断里面处理的东西越多,定时越不精确。
' u- h. l1 a; Z- J; e具体为什么是34 我也不清楚,
9 }' ^: H4 l( o! {  N我猜是
$ W* S+ @8 K3 T1、根据实际测量出来的结果进行调整吧。
& j7 N  L. O! L9 G; J8 P' o; @8 {2、根据代码运行的延时而修正的吧,比如运行一个_nop_()就是1uS之类的。
0 Q# Z2 J6 t" q; q- [% @

点评

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

该用户从未签到

6#
 楼主| 发表于 2019-4-23 16:38 | 只看该作者
relchhiclty 发表于 2019-4-23 15:26
8 L% i% E) F/ b2 B7 X; u1 [' Y你可以试试用定时器产生一定频率的波形,用示波器看看,  r) x: X5 ^8 _
在定时中断里面处理的东西越多,定时越不精确。 ...

2 c5 [* y' m" R. Q% L1 @: V谢谢. L1 _5 S( t2 N. L5 N5 R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-24 01:24 , Processed in 0.125000 second(s), 29 queries , Gzip On.

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

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

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