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

发布者:幸福自由最新更新时间:2012-10-16 来源: 21ic 关键字:51单片机  串行通讯  波特率 手机看文章 扫描二维码
随时随地手机看文章

    本文介绍一种在 80C51 串行通讯应用中自动检测波特率的方法。按照经验,程序起动后所接收到的第1个字符用于测量波特率。 
    这种方法可以不用设定难于记忆的开关,还可以免去在有关应用中使用多种不同波特率的烦恼。人们可以设想:一种可靠地实现自动波特检测的方法是可能的,它无须严格限制可被确认的字符。问题是:在各种的条件下,如何可以在大量允许出现的字符中找出波特率的定时间隔。 
    显然,最快捷的方法是检测一个单独位时间(single bit time),以确定接收波特率应该是多少。可是,在 RS-232 模式下,许多 ASCII 字符并不能测量出一个单独位时间。对于大多数字符来说,只要波特率存在合理波动(这里的波特率是指标准波特率),从起始位到最后一位“可见”位的数据传输周期就会在一定范围内发生变化。此外,许多系统采用 8 位数据、无奇偶校验的格式传输 ASCII 字符。在这种格式里,普通 ASCII 字节不会有 MSB 设定,并且,UART总是先发送数据低位(LSB),后发送数据高位(MSB),我们总会看见数据的停止位。 
    在下面的波特率检测程序中,先等待串行通讯输入管脚的起始信号(下降沿),然后起动定时器T0。在其后的串行数据的每一个上升沿,将定时器 T0的数值捕获并保存。当定时器T0溢出时,其最后一次捕获的数值即为从串行数据起始位到最后一个上升沿(我们假设是停止位)过程所持续的时间。 
    CmpTable 表格列出了每一波特率的最大测量时间。这些数据是经过选择的,所以,4 个数据位时间(加上起始位时间)仍可产生正确的波特率。 
    使用这种方法时,必须遵守一个假设:这种技术仅取决于所接收到的一个字符,接收这个字符的波特率必须大于最低波特率。本质上来说,这意味着这个字符必须来自正常敲击键盘时所产生的字符。 
    在PC上,我们不可能快速、连续地敲击两个字符,以欺骗程序。但是,PC的功能键具有一个问题,因为它会连续发送两个紧挨着的字符,使程序检测得到错误的波特率。在为 12MHz时钟频率而设计的的例子程序中,其总采样时间大约为 65mS,大约可以在 RS-232 通讯中以300bps的速度发送两个字符。 
    假如使用了奇偶校验,当4 个MSB以及所接收字节的奇偶校验位均这同一值时,就可能会发生错误。这类错误的发生取决于系统是使用了奇校验或偶校验,可能发生于小写的字母“p”到“z”,还有花括号({})、垂直条(|)、波纹线(~),以及删除键“delete”。值得注意的是,惯常的提示符按键(如,空格键、回车键、及返回键),是没有这些限制的(奇数还是偶数的限制?)。 
    在以此方式运行程序时,如第一个字节已经过去,但串行口(UART)的波特率未能正确设置,那将造成用于检测波特率的第一个字符丢失。同样,如果在正常通讯中检测到串行口的通讯“帧”错误,绝大部分“实时”程序必须重复这一检测波特率的过程。 
    如需采用另外设定的晶体振荡频率、波特率,请使用下列公式计算 CmpTable的表项目:
          
    记住,表项目是两个字节的数值,所以上述公式的结果一定要分成高位字节及低位字节(如果采用十六进制,则容易得出高位、低位字节)。当然,也可以用汇编程序来完成所有的运算。
上述的公式是由以下得来的:
 
 
    备注:在 8-N-1 格式的数据通讯中,‘#-of-bits’(“可见”位数)是 9,以及‘bits-to-recognize’(最小认可位数)是5。
  
;**********************************************
;自动的波特率检测程序
;**********************************************************
$  Title(Automatic Baud Rate Detection Test)
$  Date(12–16–91)
$  MOD552
;*******************************************************
; Definitions
;*************************************************
RX   BIT   P3.0   ;串行口的接收管脚
CharH   DATA   30h   ;捕获定时器T0的高位字节
CharL   DATA   31h   ;捕获定时器T0的低位字节
BaudRate   DATA   32h   ;存贮最终确定的波特率
Display   EQU  P4   ;显示结果的端口
;*******************************************************
; Reset and Interrupt Vectors
;***************************************************
  ORG 8000h
Start:   ACALL   AutoBaud     ;检测波特率
  MOV   Display,  BaudRate   ;显示波特率值
  SJMP   Start
;**********************************************************
; Subroutines
;**********************************************************
;AutoBaud Rate Detect Routine.
;通过测量接收第一个字符所需要的时间来确定波特率。部分接收字符可能会发生错误,
;主要是那些以3(4?)位同样数值结束的字符。波特率指针(检测结果)保存在ACC中。
;******************************************************** [page]
AutoBaud:   MOV   TMOD,  #01h   ;初始化T0(串行口波特率定时器)
  MOV   TH0,  #0   ;将T0 置于16位定时器模式
  MOV   TL0,  #0
  MOV   TCON,  #0
  MOV   CharH,  #0   ;预置波特率检测结果
  MOV   CharL,  #0
AB0:   JB   RX,  AB0   ;等待串行通讯起始
  SETB   TR0     ;起动定时器 T0
AB1:   JB   TF0,  AB3   ;检查定时器是否溢出?
  JNB   RX,  AB1   ;检测串行信号上升沿?
  MOV   CharH,  TH0   ;在串行信号上升沿捕获定时器T0数值
  MOV   CharL,  TL0
AB2:   JB   TF0,  AB3   ;检查定时器是否溢出?
  JB   RX,  AB2   ;检查串行信号下降沿?
  SJMP   AB1     ;返回,继续采集
AB3:   CLR   TR0     ;最大的采集时间已经超过,检查结果
  CLR   TF0     ;清除定时器溢出标志
  MOV   BaudRate,  #19   ;设置波特率表指针
CmpLoop:   MOV   A,  BaudRate
  MOV   DPTR,  #CmpTable
  MOVC   A,  @A+DPTR   ;取一个表项目(高位字节)以进行比较
  DEC   BaudRate
  CJNE   A,    CharH,    Cmp1   ;捕获值与表项目的高位字节相等?
  SJMP   CmpLow     ;高位字节相等,检查低位字节
Cmp1:   JC   CmpMatch     ;表项目小于定时值,则符合?
  DJNZ   BaudRate,  CmpLoop   ;未至表项目的结尾,则继续?
  SJMP   CmpMatch    ;至比较结束
CmpLow:   MOV   A,  BaudRate
  MOVC   A,  @A+DPTR   ;取一个表项目(低位字节)以进行比较
  CJNE   A,    CharL,    Cmp2   ;捕获值与表项目的低位字节相等?
  SETB   C     ;结果相等
Cmp2:   JC   CmpMatch     ;如果表项目<定时值,则置位C
  DJNZ   BaudRate,  CmpLoop   ;未至表项目的结尾,则继续?
CmpMatch:   MOV   A,  BaudRate   ;数据比较完成
  CLR   C     ;产生结果(波特率索引)
  RRC   A
  MOV   BaudRate,  A   ;保存结果
  RET
;*******************************************************
; CmpTable    比较表
;*****************************************************
;比较表所保持的定时值用于公认的波特率转换情况。表项目为低位(LSB)、高位(MSB)。
;这些数据是以12MHz为基准操作。
CmpTable:  DB 40h,0   ;0 – 超出范围,值太低
  DB 80h,0   ;1 – 38400 baud.
  DB 0,01h   ;2 – 19200 baud.
  DB 0,02h   ;3 – 9600 baud.
  DB 0,04h   ;4 – 4800 baud.
  DB 0,08h   ;5 – 2400 baud.
  DB 0,10h   ;6 – 1200 baud.
  DB 0,20h   ;7 – 600 baud.
  DB 0,40h   ;8 – 300 baud.
  DB 0,80h    ;9 – 超出范围,值太高
END

附: 波特率自动检测程序(通过验证)
  RX  BIT  P3.0  ;串行数据接收端
  CharH  EQU  30H  ;计时数据高位 TH0
  CharL  EQU  31H  ;计时数据低位 TL0
  BaudRt  EQU  32H  ;波特率计算值
;subroutine
AutoBaud:  MOV  TMOD,  #01H  ;初始化“T0”为计时器
  MOV  TH0,  #0
  MOV  TL0,  #0
  MOV  TCON,  #0
  MOV  CharH,  #0
  MOV  CharL,  #0
  JB  RX,  $  ;等待通讯开始位
  SETB  TR0
CHK1:  JBC  TF0,  CHK_END  ;若溢出,则开始计算
  JNB  RX,  $-2  ;检测串行数据上升沿
  MOV  CharH,  TH0  ;捕获“T0”计时数
  MOV  CharL,  TL0
  JBC  TF0,  CHK_END  ;若溢出,则开始计算
  JB  RX,  $-2  ;检测串行数据下降沿
  SJMP  CHK1
CHK_END:  CLR  TR0    ;停止计数器
  MOV  DPTR,  #baudtable
  MOV   BaudRt,  #19
LOOP:  MOV  A,     BaudRt  ;
  MOVC  A,  @A+DPTR  ;取表格数据(高位)
  DEC  BaudRt    ;索引地址减 1
  CJNE  A,  CharH,  CMP_1  ;检查结果范围
  SJMP  CMP_LOW
CMP_1:  JC  MATCH    ;若表中值 < 计时值,则匹配
  DJNZ  BaudRt,  LOOP
  SJMP  MATCH    ;表查完,至结束查表程序
CMP_LOW:  MOV  A,  BaudRt  ;高位相等,比较低位
  MOVC  A,  @A+DPTR  
  CJNE  A,  CharL,  CMP_2
  SETB  C    ;相等则匹配
CMP_2:  JC  MATCH    ;若低位字节 < 计时值,则匹配
  DJNZ  BaudRt,  LOOP
MATCH:  MOV  A,  BaudRt  ;转换为波特率索引值
  CLR  C
  RRC  A
  MOV  BaudRt,  A  ;保存
  RET
;波特率索引表(LSB 在前,MSB 在后,晶振为11.0592MHz)  
baudtable:  DB  03CH,00H  ;0-越限,值太小
    DB  078H,00H  ;1-波特率 38400
    DB  0F0H,00H  ;2-波特率 19200 
    DB  0E0H,01H  ;3-波特率  9600 
    DB  0C0H,03H  ;4-波特率  4800 
    DB  080H,07H  ;5-波特率  2400 
    DB  00H,00FH  ;6-波特率  1200 
    DB  00H,01EH  ;7-波特率   600 
    DB  00H,03CH  ;8-波特率   300 
    DB  00H,078H  ;9-越限,值太大 
  END

关键字:51单片机  串行通讯  波特率 引用地址:51 单片机串行通讯中波特率的自动检测

上一篇:单片机汇编语言实现DES加密算法
下一篇:51汇编模拟PT2272解码程序

推荐阅读最新更新时间:2024-03-16 13:10

一文读懂51单片机的RAM分区
51单片机RAM分为四个区域 1.工作寄存器区(00H~1FH) 2.位寻址区(20H~2FH) 3.用户RAM区(30H~7FH) 4.特殊功能寄存器(80H~FFH) 其中1.2.3处于RAM低128单元,4处于高128单元 也就是声明变量时data与idata位置 而栈就是在用户RAM区内人为开辟的一段空间,用于存放数据,而单片机也相应的为这段空间提供了硬件也就是SP寄存器 SP是一个8位寄存器用于存放栈顶位置
[单片机]
一文读懂<font color='red'>51单片机</font>的RAM分区
新手必看初学51单片机几个不易掌握的概念
随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路,单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很深入地讲解这些概念,但这些内容又是学习中必须要理解的,下面就结合本人的学习、教学经验,对这些最基本概念作一说明,希望对自学者有所帮助。 一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的
[单片机]
MSC-51单片机的3字节和4字节浮点数计算程序分析
MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。 ;这是本人使用的MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。 ; FLOATING PROGRAM ;########################################## ;########################################## ;----------------------------------------------- ; IEEE754 FLOAT CONVERT TO 4 BYTES FLOAT ; IN
[单片机]
MSC-<font color='red'>51单片机</font>的3字节和4字节浮点数计算程序分析
51单片机交通灯全套设计资料分享
1、用单片机stc89C52 设计一个交通灯系统,并用数码管显示时间,LED指示通行。 2、用protel 99se设计电路图,pcb图等 3、数码管用三极管驱动。 4、按键功能:黄灯常亮(深夜模式)、禁行、东西通行、南北通行、时间加、时间减、切换、确定。 仿真图: 1、单片机是通用的无论51还是52、无论stc还是at都一样,引脚功能都一样,原理图和程序也是一样的。 2、原理图中的. sch等格式是要用protel99se打开的,没有软件的不要紧,我已帮您转换成word格式和pdf格式的了。 3、程序中的.c文件可以用记事本打开,就是程序了。其他的是写程序是自动生成的,没什么用的。 4、可以按照正面布局,尽量不要按照实
[单片机]
<font color='red'>51单片机</font>交通灯全套设计资料分享
交换指令(5条)举例——mcs51单片机汇编语言
交换 指令 (5条) 这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。 XCH A,Rn ;(A)←→(Rn)累加器与工作寄存器Rn中的内容互换 XCH A,@Ri ;(A)←→((Ri))累加器与工作寄存器Ri所指的存储单元中的内容互换 XCH A,data ;(A)←→(data)累加器与直接地址单元中的内容互换 XCHD A,@Ri ;(A3-0)←→((Ri)3-0)累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换 SWAP A ;(A3-0)←→(A7-4)累加器中的内容高低半字节互换
[单片机]
51单片机的程序计数器PC
PC的作用是用来存放将要执行的指令地址,共16位,可对64K ROM直接寻址,PC低8位经P0口输出,高8位经P2口输出。也就是说,程序执行到什么地方,程序 计数器 PC就指到哪里,它始终是跟蹿着程序的执行。我们知道,用户程序是存放在内部的ROM中的,我们要执行程序就要从ROM中一个个字节的读出来,然后到CPU中去执行,那么ROM具体执行到哪一条呢?这就需要我们的程序 计数器 PC来指示。 程序计数器PC具有自动加1的功能,即从存储器中读出一个字节的指令码后,PC自动加1(指向下一个存储单元)。
[单片机]
51单片机】0.96寸OLED取模教程
一、 文字取模 1.打开软件 2.选择模式 3.选项设置 点阵内的数字手动输入999,然后点击确定。 4.生成字模 以字宽字高16*16为例 复制到代码中调用即可。 如果需要改变字体大小可通过改变字宽字高比,进行重新取模 二、 图片取模 1.选择一张图片打开 打开方式选择画图 2.图片调整大小 0.96寸oled是128*64的,所以不能超出这个范围,否则就会乱码 我们这里选择的是68*64,可以自行修改,不要超出范围就行: (【水平x:0~127】;【垂直y:0~63】) 3.修改图片格式并且保存 4.打开软件,设置选项选择图形模式 5.打开选项设置进行调整
[单片机]
【<font color='red'>51单片机</font>】0.96寸OLED取模教程
基于MCS-51单片机的IEEE-488接口设计
1 概 述 智能仪器程控接口电路的设计,首先是根据仪器的功能确定该仪器的接口功能。文中所涉及的仪器是以MCS-51系列单片机作为内部控制器的高速数据采集装置,由于A/D转换器既要向计算机输送采集结果,又要接受计算机对其工作条件的控制,因此,在程控接口电路设计时,设置了六种接口功能:源挂钩功能(选用SH1功能子集)、受者挂钩功能(选用AH1功能子集)、讲功能(选用T5功能子集)、听功能(选用L4功能子集)、远地/本地功能(选用RL功能子集)和器件触发功能(选用DT1功能子集)。 2 接 口 功 能 (IF) 设 计 如图1所示是该仪器的原理框图,其中接口功能电路由时序转换与信号控制电路、MC68488和四片M
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved