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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

2#
发表于 2019-4-23 15:00 | 只看该作者
红色部分的作用是把你需要的中断触发时间(毫秒)配置到定时器T0。
3 m& H- m* c5 K3 p8 z3 l3 e" M0 M这里使用定时器最大值从T0R的加载值开始计数一直到65535溢出,所以触发的计数时间是65536-tmp

该用户从未签到

3#
发表于 2019-4-23 15:11 | 只看该作者
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。& M, C! l# |* h
" W$ M+ ^+ i  v$ m3 X; e3 ^
tmp = 12000000/12; //定时器计数频率------跟你的单片机(1T/12T),晶振有关
9 |6 D1 S- D' r& A- o: ftmp = (tmp*ms)/1000; //计算所需的计数值-----1s=1000ms2 m% e: |, e  T# _4 `* v
   5 u6 Y1 Q5 {2 r& P; D% q
以下就是计算定时的值了=4 ~; h. ]0 M: ]7 I
tmp = 65536-tmp; //计算定时器重载值-0 r; W, [- i( e6 R% A6 y
   tmp = tmp+34; //修正中断响应延时造成的误差& |6 O. C4 [4 u& u# r1 R
[color=Red]   T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
" t+ E" R1 {7 b: i# c+ _8 s) j! s; F   T0RL = (unsigned char)tmp;

点评

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

该用户从未签到

4#
 楼主| 发表于 2019-4-23 15:21 | 只看该作者
relchhiclty 发表于 2019-4-23 15:11( e7 O' f2 A' K* @
你这是定时器0啊,就简单的定时器配置吧,和波特率什么的应该没有关系吧。' y6 M1 f5 m, W9 j" V

, U. V- x. R$ f: p2 |" Wtmp = 12000000/12; //定时器 ...

! ~. M' ~) z( J- m" E# }6 f% V& ]修正误差那34怎么来的?- _) }' K9 A- f

点评

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

该用户从未签到

5#
发表于 2019-4-23 15:26 | 只看该作者
artic 发表于 2019-4-23 15:21
$ p' C0 g' D$ m修正误差那34怎么来的?
7 N( a+ ^& v  T( W# `$ m) d  W3 s
你可以试试用定时器产生一定频率的波形,用示波器看看,7 d" y0 B4 o5 ]: T: v
在定时中断里面处理的东西越多,定时越不精确。
- F0 Q; {) k7 z1 [$ M具体为什么是34 我也不清楚,* @# y+ k8 f- k5 t: Q+ c6 i. i  [
我猜是/ D( N4 Y# ]9 x' F! a* ?
1、根据实际测量出来的结果进行调整吧。5 A) N( Z3 e- F5 X9 g6 J; Y, X
2、根据代码运行的延时而修正的吧,比如运行一个_nop_()就是1uS之类的。7 z# N, f( t( u5 T! R

点评

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

该用户从未签到

6#
 楼主| 发表于 2019-4-23 16:38 | 只看该作者
relchhiclty 发表于 2019-4-23 15:263 j3 U7 q5 Q2 `$ R! D- R6 w
你可以试试用定时器产生一定频率的波形,用示波器看看,
: a8 ]; v! i4 i& o: s1 a在定时中断里面处理的东西越多,定时越不精确。 ...

7 u0 ]/ s( p- Q3 M5 z谢谢: m6 b3 A( w- S/ }% ?* w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-16 21:16 , Processed in 0.140625 second(s), 29 queries , Gzip On.

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

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

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