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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51单片机学485串口通讯时,有一段代码有注释可是看不懂了,烦请能人把忙解答一下,为什么这么写# F. j* c; A  ^  b8 [, g
% G$ O( J1 k) V0 D; R
void UartRxMonitor(unsigned char ms)! s" W* d* |  i9 y0 n5 A9 ~
{* `* ~, U$ R. f! P
    static unsigned char cntbkp=0;1 V3 \  A5 V" ]6 t1 [. }- L! b4 ~
    static unsigned char idletmr=0;
  d$ B* W' o$ n& V) }  if(cntRxd>0) //接收计数器大于零时,监控总线空闲时间( x- B2 h% u) L
{
& a( K2 U1 ]; D* Y0 `/ g    if (cntbkp!=cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时, O; e; \. [1 c; K
   {" I! [/ z4 k: R( L* t
    cntbkp=cntRxd;! I) T: j8 D: u
    idletmr=0;- {# i' P* q1 @  T5 s" j$ q
   }" {3 y( F% R0 W. i9 t" k
    else/ ~- N( ^2 r* ?& G
   {
1 ]2 k, C6 L6 f# T! z  D    if(idletmr<30) //接收计数器未改变,即总线空闲时,累积空闲时间4 A# k- H! I4 l) `' |0 V& w1 D
   {( B& B+ h  l0 @6 E. \9 V! J
    idletmr+=ms;( C. u# `* Q: @- s3 A( i5 i0 E
      if(idletmr>=30) //空闲时间超过 30ms 即认为一帧命令接收完毕9 Z9 g( z* n" z$ P; b4 J. [
     {4 N1 F+ Q7 c2 b/ u0 _
      cmdarrived=1; //设置命令到达标志
. B/ @7 Y0 B+ v3 N/ f0 {     }' y0 S9 L4 t4 H2 V% p5 Z
   }$ L; n3 A3 G0 H5 t
  }
2 b6 m+ W7 ^3 g/ w8 ]: L6 U# v}
  H( D' S5 z* \" A   else
  A2 n/ j2 x' N' J  {
1 O& e  A8 }5 h$ x1 T    cntbkp=0;+ Z$ x* [5 b. H! [' s4 ]
   }7 J: r  w5 \$ f
}
% U4 y4 s; M1 @1 z, A* D' H1 [
0 R, v4 V, n! k8 {/ n" U& lvoid ConfigTimer0(unsigned int ms) //T0 配置函数
8 Q) @/ I$ A/ A% x& s5 W{+ H7 w9 a+ x+ k) K) i
   unsigned long tmp;
3 a; \6 A) o- \7 m. T  tmp = 12000000/12; //定时器计数频率# a6 H/ X% X$ }" R) e% l9 F: ?4 k
   tmp = (tmp*ms)/1000; //计算所需的计数值
* i  i. ?" M& _0 l/ C   tmp = 65536-tmp; //计算定时器重载值5 Y% z" ]0 P! t' e2 K, i4 w& O
   tmp = tmp+34; //修正中断响应延时造成的误差
8 c8 U) ?) b9 `- H; n7 b   T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
: V+ ~; f; _& n5 y( n: }9 k9 y7 s   T0RL = (unsigned char)tmp;

( o: F- x, g/ b/ R0 l   TMOD &= 0xF0; //清零 T0 的控制位
4 m% h) [9 K* @1 `4 f1 R* T. S, u   TMOD |= 0x01; //配置 T0 为模式 18 L" ], G8 w9 P3 s6 P6 O
   TH0 = T0RH; //加载 T0 重载值
" w4 h; H; `+ {   TL0 = T0RL;
7 m5 B1 w" K9 f% H   ET0 = 1; //使能 T0 中断
' d8 j: t( f% U  c( `' K$ X   TR0 = 1; //启动 T0" g7 k7 V: k1 U0 w2 X* j
}
& r% H$ h( ~5 D5 r0 o' wvoid InterruptTimer0() interrupt 1 //T0 中断服务函数
4 y/ ^/ c% P9 _" w/ ^{- G3 a! X* m: S( x5 e
   TH0 = T0RH; //定时器重新加载重载值
1 w9 ?( r' _- @) H9 C2 p( b9 R& z   TL0 = T0RL;
6 H& |7 \$ B1 f, [   UartRxMonitor(1); //串口接收监控3 u! J8 X1 L2 a- r* o
}/ v7 k6 E) P' I+ F. n) @% J8 y( O: O
STC89C52RC 单片机,定时器 1 作为波特率发生器,方式 1 下的波特率发生器必须使用定时器 1 的模式 2,红色部分到底想干嘛?
4 k2 b6 H% N# k! T

该用户从未签到

2#
发表于 2019-4-23 15:00 | 只看该作者
红色部分的作用是把你需要的中断触发时间(毫秒)配置到定时器T0。4 f+ p$ f0 h$ z: k. O2 z8 w* b
这里使用定时器最大值从T0R的加载值开始计数一直到65535溢出,所以触发的计数时间是65536-tmp

该用户从未签到

3#
发表于 2019-4-23 15:11 | 只看该作者
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。( s- M' d# \, E# h. `( `, l- E
- k$ ]$ a; Y) a+ p$ f1 d
tmp = 12000000/12; //定时器计数频率------跟你的单片机(1T/12T),晶振有关0 J8 X1 l6 {/ q% J+ @3 }
tmp = (tmp*ms)/1000; //计算所需的计数值-----1s=1000ms
* w5 A; A- b- K4 E4 f   ( ]+ ~% v, U& K8 H
以下就是计算定时的值了=
. L) \5 E+ ^1 ^$ z) etmp = 65536-tmp; //计算定时器重载值-9 s2 N3 ~$ _  J% `' F8 X5 F
   tmp = tmp+34; //修正中断响应延时造成的误差9 T; a9 x& v* L! x  {( G
[color=Red]   T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
3 W/ S& o1 j) q* F   T0RL = (unsigned char)tmp;

点评

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

该用户从未签到

4#
 楼主| 发表于 2019-4-23 15:21 | 只看该作者
relchhiclty 发表于 2019-4-23 15:11& q* o6 H2 n. r9 {) G
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。
& |8 x% t' k. z1 g* c9 O
* q& x+ A3 P5 x/ _  otmp = 12000000/12; //定时器 ...

* M" d1 K' U8 q# x+ Y0 s. B修正误差那34怎么来的?+ v8 j3 X( n$ H6 L0 [  W- d& b2 O

点评

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

该用户从未签到

5#
发表于 2019-4-23 15:26 | 只看该作者
artic 发表于 2019-4-23 15:21# L2 f5 {7 F" T6 [
修正误差那34怎么来的?
, Y3 j* D' d) b( \" [7 j2 X
你可以试试用定时器产生一定频率的波形,用示波器看看,
  ?5 M6 G  \! w% u在定时中断里面处理的东西越多,定时越不精确。# A0 S: E5 n, C5 p: g2 ?# ^
具体为什么是34 我也不清楚,
" E5 H# Q3 T1 O! m2 e我猜是% ?  D7 p# g+ j: b' m
1、根据实际测量出来的结果进行调整吧。
9 U! Y: }* m6 i& D. i- E" K2、根据代码运行的延时而修正的吧,比如运行一个_nop_()就是1uS之类的。
8 m( o6 p+ _3 T1 k8 x3 E

点评

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

该用户从未签到

6#
 楼主| 发表于 2019-4-23 16:38 | 只看该作者
relchhiclty 发表于 2019-4-23 15:266 k# w, i4 z# D" L7 |5 c, x
你可以试试用定时器产生一定频率的波形,用示波器看看,* ], z% |! [- ?( o
在定时中断里面处理的东西越多,定时越不精确。 ...

( P" H: j6 y, G2 D0 `谢谢
: y# |: H8 j" j2 u/ C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-28 11:50 , Processed in 0.093750 second(s), 29 queries , Gzip On.

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

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

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