原创 51单片机串行通讯中波特率的自动检测

2009-8-16 08:24 2849 5 5 分类: MCU/ 嵌入式

发布: 2009-4-04 00:23 |  作者: hnrain |   查看: 11次


本文介绍一种在 80C51 串行通讯应用中自动检测波特率的方法。按照经验,程序起动后所接收到的第1个字符用于测量波特率。

&Q fS"[b_.I44606
ku,`m8o&Q44606        这种方法可以不用设定难于记忆的开关,还可以免去在有关应用中使用多种不同波特率的烦恼。人们可以设想:一种可靠地实现自动波特检测的方法是可能的,它无须严格限制可被确认的字符。问题是:在各种的条件下,如何可以在大量允许出现的字符中找出波特率的定时间隔。 电子园51单片机学习网fP-oa}3S` kb6Ah

电子园51单片机学习网-l-a u9ld,J


y2Gf&U~n$i~tPJ44606        显然,最快捷的方法是检测一个单独位时间(single bit time),以确定接收波特率应该是多少。可是,在 RS-232 模式下,许多 ASCII 字符并不能测量出一个单独位时间。对于大多数字符来说,只要波特率存在合理波动(这里的波特率是指标准波特率),从起始位到最后一位“可见”位的数据传输周期就会在一定范围内发生变化。此外,许多系统采用 8 位数据、无奇偶校验的格式传输 ASCII 字符。在这种格式里,普通 ASCII 字节不会有 MSB 设定,并且,UART总是先发送数据低位(LSB),后发送数据高位(MSB),我们总会看见数据的停止位。

:OX_2i7l"i0Zy44606

W|?(q DW5Ef7f44606电子园51单片机学习网7q6}2oOj-c
       在下面的波特率检测程序中,先等待串行通讯输入管脚的起始信号(下降沿),然后起动定时器T0。在其后的串行数据的每一个上升沿,将定时器 T0的数值捕获并保存。当定时器T0溢出时,其最后一次捕获的数值即为从串行数据起始位到最后一个上升沿(我们假设是停止位)过程所持续的时间。电子园51单片机学习网N:U#C E*~(w"nv


{l1y.r(gny\44606
W `j0{~44606       CmpTable 表格列出了每一波特率的最大测量时间。这些数据是经过选择的,所以,4 个数据位时间(加上起始位时间)仍可产生正确的波特率。 电子园51单片机学习网}&x0H&|S(IVZ s)\


k&h`;VQ44606电子园51单片机学习网 l:Si9T6BU
       使用这种方法时,必须遵守一个假设:这种技术仅取决于所接收到的一个字符,接收这个字符的波特率必须大于最低波特率。本质上来说,这意味着这个字符必须来自正常敲击键盘时所产生的字符。 电子园51单片机学习网"\ ilJ"a"q#u

电子园51单片机学习网)KL X q8`U2}

电子园51单片机学习网a3}ok)t*e h
       在PC上,我们不可能快速、连续地敲击两个字符,以欺骗程序。但是,PC的功能键具有一个问题,因为它会连续发送两个紧挨着的字符,使程序检测得到错误的波特率。在为 12MHz时钟频率而设计的的例子程序中,其总采样时间大约为 65mS,大约可以在 RS-232 通讯中以300bps的速度发送两个字符。

o"a6naYU/J!R44606 电子园51单片机学习网b*f4_G"@w-z


6u iw ts)|44606      假如使用了奇偶校验,当4 个MSB以及所接收字节的奇偶校验位均这同一值时,就可能会发生错误。这类错误的发生取决于系统是使用了奇校验或偶校验,可能发生于小写的字母“p”到“z”,还有花括号({})、垂直条(|)、波纹线(~),以及删除键“delete”。值得注意的是,惯常的提示符按键(如,空格键、回车键、及返回键),是没有这些限制的(奇数还是偶数的限制?)。 

*k"j n4Iqx6B,z7g44606

SG,lU*]X&B*ve44606
HmI(HRKu])^xC44606      在以此方式运行程序时,如第一个字节已经过去,但串行口(UART)的波特率未能正确设置,那将造成用于检测波特率的第一个字符丢失。同样,如果在正常通讯中检测到串行口的通讯“帧”错误,绝大部分“实时”程序必须重复这一检测波特率的过程。 电子园51单片机学习网~ C5HX DS


;N&_c v]*F F"fUB44606
3mP(w1`ZxK44606      如需采用另外设定的晶体振荡频率、波特率,请使用下列公式计算 CmpTable的表项目:电子园51单片机学习网e P,d0\|:s$n
          

cpiL~^ T1L(Q44606 电子园51单片机学习网#P!`4G,r+\ A W

电子园51单片机学习网 T1R"Z_ A O+o
记住,表项目是两个字节的数值,所以上述公式的结果一定要分成高位字节及低位字节(如果采用十六进制,则容易得出高位、低位字节)。当然,也可以用汇编程序来完成所有的运算。

b q(C\p3~ R44606 电子园51单片机学习网\;h0g"[ J2f

电子园51单片机学习网&o\1d*?/r;B
上述的公式是由以下得来的:
9k)E%Y @(gn44606 
r#Yia7T ?$d44606点击看大图 电子园51单片机学习网+?4_2U7}P9zQ

电子园51单片机学习网u4[D Xb(`%O]

电子园51单片机学习网A'D8E ~.J/y^(s T
备注:在 8-N-1 格式的数据通讯中,‘#-of-bits’(“可见”位数)是 9,以及‘bits-to-recognize’(最小认可位数)是5。
3]i;z#_4R44606  
f ~$z#ny2d!a44606;*****************************************************************************
6[~|g0J44606;自动的波特率检测程序 电子园51单片机学习网'Aq+krJ/yR*sd
;***************************************************************************** 电子园51单片机学习网 I VQP7@.]8|-R
$  Title(Automatic Baud Rate Detection Test) 电子园51单片机学习网*k2Fe2z {
$  Date(12–16–91)
G-ML+La]44606$  MOD552
R tF(at+_44606;***************************************************************************** 电子园51单片机学习网;MC Y5Q.f.y.G-B
; Definitions 电子园51单片机学习网xNT,b$L)b
;***************************************************************************** 电子园51单片机学习网#L@#Y z#rB~
RX   BIT   P3.0   ;串行口的接收管脚 电子园51单片机学习网~ Sz9z.N
CharH   DATA   30h   ;捕获定时器T0的高位字节
'Wqoq*\?2dM#_O44606CharL   DATA   31h   ;捕获定时器T0的低位字节
7a}Dkl#l:up44606BaudRate   DATA   32h   ;存贮最终确定的波特率 电子园51单片机学习网 j^d,LRDJ*f
Display   EQU  P4   ;显示结果的端口 电子园51单片机学习网5]tN&XE@
;*****************************************************************************
{N5LdSl X8iZ@44606; Reset and Interrupt Vectors
7Y3EA&t)r|R44606;***************************************************************************** 电子园51单片机学习网}|.Z Rl5Pj*\P
  ORG 8000h 电子园51单片机学习网P ``a0hBe
Start:   ACALL   AutoBaud     ;检测波特率 电子园51单片机学习网2{k5l:v{%i5g
  MOV   Display,  BaudRate   ;显示波特率值 电子园51单片机学习网+X9| k!W{j
  SJMP   Start
)oVyF4?R44606;***************************************************************************** 电子园51单片机学习网^crufKI
; Subroutines 电子园51单片机学习网%m|J;@3WA
;***************************************************************************** 电子园51单片机学习网b8MO4qZ s e3H
;AutoBaud Rate Detect Routine.
5O\1Br;ul)\ i44606;通过测量接收第一个字符所需要的时间来确定波特率。部分接收字符可能会发生错误, 电子园51单片机学习网XZD-F3Qq,l^N3K
;主要是那些以3(4?)位同样数值结束的字符。波特率指针(检测结果)保存在ACC中。
N7_c| IS44606;***************************************************************************** 电子园51单片机学习网]K6X DM+G?
AutoBaud:   MOV   TMOD,  #01h   ;初始化T0(串行口波特率定时器) 电子园51单片机学习网p#Fo|t2@
  MOV   TH0,  #0   ;将T0 置于16位定时器模式 电子园51单片机学习网nc#a(z'b'qyS:k q
  MOV   TL0,  #0 电子园51单片机学习网#z@?E0e YP_
  MOV   TCON,  #0
7S"s@m!c.Q:Mi(TI44606  MOV   CharH,  #0   ;预置波特率检测结果
5{ i ~2J?2oM44606  MOV   CharL,  #0 电子园51单片机学习网m-{p{r)QHC/k&T5h
AB0:   JB   RX,  AB0   ;等待串行通讯起始 电子园51单片机学习网X,\ |,p%L9B+e}i"y
  SETB   TR0     ;起动定时器 T0 电子园51单片机学习网6N3pZMGJP
AB1:   JB   TF0,  AB3   ;检查定时器是否溢出?
A6i3gE!\44606  JNB   RX,  AB1   ;检测串行信号上升沿? 电子园51单片机学习网0W*@sHy4]3[
  MOV   CharH,  TH0   ;在串行信号上升沿捕获定时器T0数值 电子园51单片机学习网"i)u*A(VxF
  MOV   CharL,  TL0
A4E.YTL44606AB2:   JB   TF0,  AB3   ;检查定时器是否溢出? 电子园51单片机学习网3A2h]l {o;q9MM
  JB   RX,  AB2   ;检查串行信号下降沿? 电子园51单片机学习网+IM^-~ sC
  SJMP   AB1     ;返回,继续采集 电子园51单片机学习网 WGyt vQT&wo
AB3:   CLR   TR0     ;最大的采集时间已经超过,检查结果
6bN$\-x8R%MN44606  CLR   TF0     ;清除定时器溢出标志
;ZM4J3}4D%n7iw{r44606  MOV   BaudRate,  #19   ;设置波特率表指针 电子园51单片机学习网 |a Ih"O p
CmpLoop:   MOV   A,  BaudRate
J/wcI5[4Q&s ~44606  MOV   DPTR,  #CmpTable 电子园51单片机学习网:]1t#B2IN9d
  MOVC   A,  @A+DPTR   ;取一个表项目(高位字节)以进行比较
KY$lGyKC44606  DEC   BaudRate
%Gp&I3n$U&@:]!k44606  CJNE   A,    CharH,    Cmp1   ;捕获值与表项目的高位字节相等? 电子园51单片机学习网6ZU{ _R.O1s;Ld
  SJMP   CmpLow     ;高位字节相等,检查低位字节
HS4B*G/a'c%u44606Cmp1:   JC   CmpMatch     ;表项目小于定时值,则符合? 电子园51单片机学习网!yQ T\'qL
  DJNZ   BaudRate,  CmpLoop   ;未至表项目的结尾,则继续? 电子园51单片机学习网)Jap-y [ry(P5d:_(_
  SJMP   CmpMatch    ;至比较结束
M,wM ^*T I44606CmpLow:   MOV   A,  BaudRate 电子园51单片机学习网"N*RD omx~6Q)j$i
  MOVC   A,  @A+DPTR   ;取一个表项目(低位字节)以进行比较 电子园51单片机学习网q ~0P#sj#br
  CJNE   A,    CharL,    Cmp2   ;捕获值与表项目的低位字节相等? 电子园51单片机学习网s/Kr%Sf0xjx0_0v
  SETB   C     ;结果相等
p*w(s(R\8i$z{44606Cmp2:   JC   CmpMatch     ;如果表项目<定时值,则置位C 电子园51单片机学习网1gNwSNAOT
  DJNZ   BaudRate,  CmpLoop   ;未至表项目的结尾,则继续?
I,j9~7z%FN(K7N nIH.jj44606CmpMatch:   MOV   A,  BaudRate   ;数据比较完成 电子园51单片机学习网o `r&A#b3Knk5{&\eG
  CLR   C     ;产生结果(波特率索引) 电子园51单片机学习网gK*H"I~$Ff8?0H8t
  RRC   A 电子园51单片机学习网pB#oL/M0M3Z,E G
  MOV   BaudRate,  A   ;保存结果
#BF|$n[d44606  RET
7eWn jB],O44606;*****************************************************************************
e1I xgi(BwhAa44606; CmpTable    比较表
%C uC d+I8q|44606;***************************************************************************** 电子园51单片机学习网1y$]!LB8sB$q
;比较表所保持的定时值用于公认的波特率转换情况。表项目为低位(LSB)、高位(MSB)。
2{&ym,b%B%t)L44606;这些数据是以12MHz为基准操作。
l C3}Yg;B44606CmpTable:  DB 40h,0   ;0 – 超出范围,值太低 电子园51单片机学习网iZS:y"g6rI.gK i
  DB 80h,0   ;1 – 38400 baud.
LL(H/pHhU+R44606  DB 0,01h   ;2 – 19200 baud. 电子园51单片机学习网/C6T8mz$y~
  DB 0,02h   ;3 – 9600 baud.
4i3Z_;Bz)G6O(?44606  DB 0,04h   ;4 – 4800 baud.
@[+F5DT+KNg'Yf44606  DB 0,08h   ;5 – 2400 baud. 电子园51单片机学习网l\FAo T3U7zR
  DB 0,10h   ;6 – 1200 baud. 电子园51单片机学习网8p-m:R8{ SY;E i
  DB 0,20h   ;7 – 600 baud.
] f x$eCo(D44606  DB 0,40h   ;8 – 300 baud. 电子园51单片机学习网-P)O-M q+Y x(n7[
  DB 0,80h    ;9 – 超出范围,值太高 电子园51单片机学习网C_7m8_5P0D_#fG![
END 电子园51单片机学习网N"VX `[!{"kU

电子园51单片机学习网I/sA |y7w;~ v E:~/O

附: 波特率自动检测程序(通过验证) 电子园51单片机学习网#M _5fP!n4HQu
  RX  BIT  P3.0  ;串行数据接收端
o$TQJS q i44606  CharH  EQU  30H  ;计时数据高位 TH0
_#r9GQu Q44606  CharL  EQU  31H  ;计时数据低位 TL0
*Q/zMN.M2Rnr44606  BaudRt  EQU  32H  ;波特率计算值
4s"},^-j#Bv },zR44606;subroutine
c4~,g#W4f*V44606AutoBaud:  MOV  TMOD,  #01H  ;初始化“T0”为计时器 电子园51单片机学习网W W/[K1k8jp#O%n@k
  MOV  TH0,  #0
T]tq^hd.L@5Pb44606  MOV  TL0,  #0 电子园51单片机学习网.B4m.bl!i+L
  MOV  TCON,  #0
B~0Ou T c H;[2S44606  MOV  CharH,  #0
||;m^ O44606  MOV  CharL,  #0 电子园51单片机学习网vfTW$p9z:B-|*W
  JB  RX,  $  ;等待通讯开始位 电子园51单片机学习网#?6G6Fo{g_ Y
  SETB  TR0
6R3} H8S+U(\%I~c44606CHK1:  JBC  TF0,  CHK_END  ;若溢出,则开始计算 电子园51单片机学习网2qGdD5t~
  JNB  RX,  $-2  ;检测串行数据上升沿
.W3uf Ga t"W A44606  MOV  CharH,  TH0  ;捕获“T0”计时数
A!]OC%u*H0f44606  MOV  CharL,  TL0 电子园51单片机学习网\3?5Wii!nMjy*s
  JBC  TF0,  CHK_END  ;若溢出,则开始计算 电子园51单片机学习网&}N+O-?"M|c[&I;k/v
  JB  RX,  $-2  ;检测串行数据下降沿
c z~"K8h5nULQ&Ah44606  SJMP  CHK1
f0G*h5O g4Ljj4r h44606CHK_END:  CLR  TR0    ;停止计数器
7R2z c/B7?R s:^44606  MOV  DPTR,  #baudtable
MaN`?(_g&u44606  MOV   BaudRt,  #19
7`oTgI5vXA;hd44606LOOP:  MOV  A,     BaudRt  ; 电子园51单片机学习网\ TxuUd/jQ%Q*F
  MOVC  A,  @A+DPTR  ;取表格数据(高位)
z7N[/M^wD44606  DEC  BaudRt    ;索引地址减 1 电子园51单片机学习网|,Z3s-co\!^
  CJNE  A,  CharH,  CMP_1  ;检查结果范围 电子园51单片机学习网,u B.T1vh ?}6SGy
  SJMP  CMP_LOW
^|HI@?W"c!V44606CMP_1:  JC  MATCH    ;若表中值 < 计时值,则匹配
Pc4L9m0N-a_sY44606  DJNZ  BaudRt,  LOOP
K{ F5le:[&\(hq44606  SJMP  MATCH    ;表查完,至结束查表程序 电子园51单片机学习网-jEE%m t.}4X%B
CMP_LOW:  MOV  A,  BaudRt  ;高位相等,比较低位
J!G S_{7K3G/l*DC44606  MOVC  A,  @A+DPTR  
} ~({ddFz44606  CJNE  A,  CharL,  CMP_2 电子园51单片机学习网L!? I,lX |7G9k
  SETB  C    ;相等则匹配 电子园51单片机学习网's6|LxO3Q^lTe4j \
CMP_2:  JC  MATCH    ;若低位字节 < 计时值,则匹配 电子园51单片机学习网^!f V,dlt)H}(i
  DJNZ  BaudRt,  LOOP
7F*x a(y4n9Nh44606MATCH:  MOV  A,  BaudRt  ;转换为波特率索引值 电子园51单片机学习网ZCvg%W2t5v \"h z
  CLR  C 电子园51单片机学习网c+[+oO'KS
  RRC  A
9@]B!E ^2e#W3E44606  MOV  BaudRt,  A  ;保存
~%pe6u:y]I:`0r:Rpm44606  RET 电子园51单片机学习网+G@ hd Fj
;波特率索引表(LSB 在前,MSB 在后,晶振为11.0592MHz)   电子园51单片机学习网|{.eD8]
baudtable:  DB  03CH,00H  ;0-越限,值太小
H)A:dXr SB44606    DB  078H,00H  ;1-波特率 38400
(m^y@o7v5Mac44606    DB  0F0H,00H  ;2-波特率 19200 
ba;B [y44606    DB  0E0H,01H  ;3-波特率  9600 
{:[3k1w/G44606    DB  0C0H,03H  ;4-波特率  4800  电子园51单片机学习网 | ?S+N8bM
    DB  080H,07H  ;5-波特率  2400 
'R&fs'? | _'zWD44606    DB  00H,00FH  ;6-波特率  1200  电子园51单片机学习网op~~0G1n&h
    DB  00H,01EH  ;7-波特率   600  电子园51单片机学习网'w8`C`$k[`+o,V
    DB  00H,03CH  ;8-波特率   300 
U,gIZN{Z)w44606    DB  00H,078H  ;9-越限,值太大 
-Vb'CM+H b,zN44606  END

*pt fV&tC0pNR44606
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条