89c52产生115200波特率

89c52产生115200波特率
89c52产生115200波特率

背景:

我们知道51常用的波特率是9600,但是由于需要,不得不使用其他的波特率,然而51的运算速度有限,在软件支持下最高只有57600的波特率,这次因为给的模块用的是115200的波特率,不得不使用其他的办法。

网上的教程杂乱,良莠不齐,写下次教程共享经验。

方案:

最初我想到的方案是更换22.1184MHZ的晶振,测试成功。

然后我根据资料,发现可以使用6T模式来加速51的运算速度。

方案一:更换晶振

根据图中的公式计算,倍频情况下,TH1为0xff的时候拥有最大波特率57600.

更换22MHz的晶振后升为115200.

随手贴写下代码:

方案二:使用6T模式

这个方案也比较简单,根据公式,需要6T模式。

普通下载是12T单倍速的如图:

我们只需要换成6T倍速的就可以直接用115200的波特率了。

程序同上。

波特率自适应的RS-485中继器设计

麓!誊萋囊霉毫螽囊篓蔷要毫曩囊枣鼍鬟蔓一鬻薹萋j鼍雾冀簪耋薹攀羔。川篓囊萋i薹鬻波特率自遁应的RS一485中继嚣设计 ■河北理工大学张习加李成群 引言 RS一485收发器采用平衡发送和差分接收,因此具有 抑制共模干扰的能力;加上接收器具有高灵敏度,能检测 低达200mV的电压,故传输信号能在千米以外得到恢 复。使用RS一485总线,一对双绞线就能实现多站联网, 构成分布式系统,且设备简单、价格低廉,能进行长距离通 信,因而得到了广泛的应用。由于在双绞线上的电平损 耗,RS一485标准通信的最大传输距离是1200m,因此更 远距离的应用中必须使用中继器。网络节点数与所选芯 片驱动能力和接收器的输入阻抗有关。RS一485标准规 定了最大总线负载为32个单位负载,若应用中总线负载 大于32个单位负载则必须使用中继器。 1RS一485中继器原理[1’2] Rs一485是半双工方式,两线双向传送差分信号,具 有多点、双向通信能力,即允许多个发送器和接收器连接 到同一条总线上,传输线上信号的传输方向不定。因此, 识别和控制好传输线上的信号传递方向是设计RS~485 中继器的关键。 RS一485标准规定:数据信号采用差分传输方式 (differential出ivermode),也称为“平衡传输”。它使用一 对双绞线,将其中一根线定义为A,另一根线定义为B,如 图1所示。 使能 A B f痞 I稍 f瘤 I自 +6V 许电平范围 +2V A—B电平范围 一2V 许电平范围 一6V 图1RS一485发送器的示意图 通常情况下,RS一485发送器A、B之间的正电平在+2~+6V,是一种逻辑状态;负电乎在一6~一2V,是另一种逻辑状态。在RS一485发送器件中,一般有一个“使能”控制信号,用于控制发送器与传输线的切断和连接。当“使能”端为低电平时,发送器输出处于高阻状态,称作“第三态”。它是有别于逻辑“1”与“o”的第三种状态。 对于RS一485接收器,也作出与发送器相对的规定,收、发端通过平衡双绞线将A—A与B—B对应相连。当在接收端A、B之间有大于+200mV的电平时,输出为正逻辑电平;小于一2。omV时,输出为负逻辑电平。在接收器的接收平衡线上,电平范围通常为200mV~6V,如图2所示。 A B 使能 电平范围 传输电平范围 图2RS一485接收器的示意图 RS一485接收器同样定义逻辑1(正逻辑电平)为B>A的状态,逻辑o(负逻辑电平)为A>B的状态,A、B之间的压差不小于200mV。在RS~485接收器件中,一般也有一个“使能”控制信号,用于控制接收器与传输线的切断和连接。当“使能”端为高电平时,接收器与传输线切断,接收器输出为高电平;当“使能”端为低电平时,接收器输出电平与总线信号的逻辑电平一致。 RS一485中继器原理图如图3所示。正常工作时主要有三个状态:空闲状态,数据从RS一485收发器Ul边的总线往RS一485收发器U2边的总线传送(简称“数据右传状态”),数据从RS一485收发器U2边的总线往RS一485收发器U1边的总线传送(简称“数据左传状态”)。(1)空闲状态 当中继器上电启动运行或总线上没有数据传送时,中继器工作在空闲状态。RS一485收发器U1、U2均为接收数据状态,U1、U2的ENl、EN2引脚均为低电平。 (2)数据右传状态 当RS一485收发器U1边检测到连接其A、B引脚总 62《牛I;机与嵌入式系'毛应用》adv@mesnet.com.cn(广告专用) 万方数据

51单片机串口通信及波特率设置

51单片机串口通信及波特率设置 MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。 1. 数据缓冲寄存器SBUF SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。 2. 状态控制寄存器SCON SCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。它的各个位定义如下: MSB LSB SM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。 SM0 SM1 工作方式功能波特率 0 0 0 8位同步移位寄存器Fosc/12 0 1 1 10位UART 可变 1 0 2 11位UART Fosc/64或Fosc/32 1 1 3 11位UART 可变 SM2在工作方式2和3中是多机通信的使能位。在工作方式0中,SM2必须为0。在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。此功能可用于多处理机通信。 REN为允许串行接收位,由软件置位或清除。置位时允许串行接收,清除时禁止串行接收。 TB8是工作方式2和3要发送的第9位数据。在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。在多处理机通信中,该位用于表示是地址帧还是数据帧。 RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。在工作方式0中RB8不使用。 TI 为发送中断标志位,由硬件置位,软件清除。工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1时,申请中断。CPU 响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除TI。 RI为接收中断标志位,由硬件置位,软件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式时,在接收停止位的中间由硬件置位。RI=1时,申请中断,要求CPU取走数据。但在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。在任何工作方式中都必须由软件清除RI。 系统复位时,SCON的所有位都被清除。 控制寄存器PCON也是一个逐位定义的8位寄存器,目前仅仅有几位有定义,如下所示:MSB LSB

STM32单片机的串口通信波特率计算方法

STM32单片机的串口通信波特率计算方法 1. 什么是波特率 不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。 2. STM32波特率相关的寄存器 STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。 该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。 3. 波特率计算方法 STM32的数据手册给出了计算方法,有一个公式,如下图所示: 在这个公式上,共有三个变量,其中两个我们是知道的,Fck和Tx/Rx波特率这两个是已知的,USARTDIV是未知的。通过该公式的描述可以看出如果使用USART1的话,那Fck 就是PCLK2=72MHz,否则就是PCLK1=36MHz,Tx/Rx波特率这个参数是已知的。只需要计算出USARTDIV的值赋值给USART_BRR寄存器就可以了。以115200为例,将公式变形后得到:USARTDIV = 72×1000000/(16×115200) = 39.0625。即将39.0625写入USART_BRR即可。 前文说过,USART_BRR的前4位存放小数部分,后12位存放整数部分。 那小数部分DIV_Fraction = 0.0625×16 = 1 = 0x01;那整数部分DIV_Mantissa = 39 = 0x27;那USART_BRR = 0X271; 数据手册给我们提供了一张数据表: 在这张数据表上,已经算出了常用的波特率值,我们可以拿来直接用。但是如果我们想把

用CPLD实现串行通信时的波特率自动侦测

用CPLD实现串行通信时的波特率自动侦测 杨李莎1朱华福 2 (1.长安大学研究生部,陕西西安 710064;2.云南昆船设备有限公司昆明 650236) 摘要:本文介绍了一种利用CPLD实现波特率自动侦测的方法,文章最后给出其仿真结果关键词:串行通信波特率自动侦测复杂可编程逻辑器件 Abstract: In this paper, it introduces a way to automatically detect baud rate by using CPLD, and in the end indicates it’s emulation results . Key words: serial communication baud rate auto detected CPLD 1、引言 串行数据通信是应用极为广泛的技术,通过数据传输控制或监测中心可以对远端设备进行控制和监测设备的工作状态。串行外设都会用到RS-232C 异步串行接口.传统上采用专用的集成电路即UART实现,如TI、EXAR、EPIC 的550、452等系列,但是我们一般不需要使用完整的UART的功能,而且对于多串口的设备或需要加密通讯的场合使用UART也不是最合适的。如今的许多的电器都有串口,主要用于软件的升级或者用于自诊断。通常单机设备的串行通信波特率设置都是采用硬件拨码的方式进行的,对于一些拨码开关特别多的设备来说难于记忆,因此能否寻求一种波特率自适应的方法来解决这个问题呢?回答是肯定的,本文就介绍一种用复杂可编程逻辑器件来实现波特率自动侦测的方法。系统只设计了数据接收模块,利用VHDL语言对其进行编程,最后给出其仿真结果。 2、系统设计 2.1系统介绍 图1所示为数据接收模块结构框图,数据接收模块由波特率发生基准时钟、开始位下降沿检测、接收控制、串并转换器、锁存器、缓冲器等部分组成。为了能准确地侦测出接收数据的波特率,数据接收模块中采用了波特率发生基准时钟,首先用基准时钟对RXD端的数据进行接收采样,然后按波特率自动侦测原理进行波特率自动侦测,最后产生一个与发送端发送的数据相同的波特率,利用波特率进行通信。 1【作者简介】杨李莎(1981—)女,长安大学研究生部04级交通信息工程及控制专业硕士研究生,主要从事高速公路和城市道路的交通控制及管理研究。

波特率计算

波特率选择 在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。 方式0 方式0的波特率固定为主振频率的1/12。 方式2 方式2的波特率由PCON 中的选择位SMOD 来决定,可由下式表示: 波特率=2的SMOD 次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc 3.方式1和方式3 定时器T1作为波特率发生器,其公式如下: 波特率=定时器T1溢出率 产生溢出所需的周期数/计数率T 132 2=溢出率T 1mod ?s 式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。 定时器T1工作于方式0:溢出所需周期数=8192-x 定时器T1工作于方式1:溢出所需周期数=65536-x 定时器T1工作于方式2:溢出所需周期数=256-x 因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。 当时钟频率选用11.0592MHZ 时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。 下表列出了定时器T1工作于方式2常用波特率及初值。 常用波特率 Fosc(MHZ) SMOD TH1初值 19200 11.0592 1 FDH 9600 11.0592 0 FDH 4800 11.0592 0 FAH 2400 11.0592 0 F4h 1200 11.0592 0 E8h 例如9600 11.0592 0 FDH 溢出率T 1定时时32 2 =波特率mod ?s T1溢出率= T1计数率/产生溢出所需的周期数 产生溢出所需的周期数=256-FD(253)=3 SMOD=0 11059200/12*3 *1/32=9600

CAN波特率设置及寄存器设置

CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。 实际上,CAN总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。 在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括: A.位同步时间(Tsync) B.时间段1(Tseg1) C.时间段2(Tseg2) 其中位同步时间占用1个Tscl;时间段2占用(Tseg1+1)个Tscl;时间段2占用(Tseg2+1)个Tscl,所以CAN控制器的位时间(TBit)就是: TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl CAN的波特率(CANbps)就是1/TBit。Tsync=1Tscl 但是这样计算出的值是一个理论值。在实际的网络通信中由于存在传输的延时、不同节点的晶体的误差等因素,使得网络CAN的波特率的计算变得复杂起来。CAN在技术上便引入了重同步的概念,以更好的解决这些问题。 这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转宽度SJW+1),要么时间段减少TSJW,因此CAN的波特率实际上有一个范围: 1/(Tbit+Tsjw) ≤CANbps≤1/(Tbit-Tsjw) CAN有波特率的值四以下几个元素决定: A.最小时间段Tscl; B.时间段1 TSEG1; C.时间段2 TSEG2; D.同步跳转宽度SJW SJW(重同步跳转宽度)决定了一次重同步期间一个位时间被延长或缩短的时间量子Tscl是通过总线时序寄存器设置计算的。 Tscl=(BRP+1)/FVBP。FVBP为微处理器的外设时钟。 而TSEG1与TSEG2又是怎么划分的呢?TSEG1与TSEG2的长度决定了CAN数据的采样点,这种方式允许宽范围的数据传输延迟和晶体的误差。其中TSEG1用来调整数据传输延迟时间造成的误差,而TSEG2则用来调整不同点节点晶体频率的误差。 TSEG1与TSEG2的是分大体遵循以下规则: Tseg1≥Tseg2≥2TSJW;Tseg2≥2Tscl 总的来说,对于CAN的波特率计算问题,把握一个大的方向就行了,其计算公式可了规结为: BitRate = Fpclk/( (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1))

单片机波特率的计算方法

51单片机波特率计算的公式和方法 51单片机芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。它的各个位的具体定义如下: SM0SM1SM2REN TB8RB8TI RI SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。 波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。 51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。 模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率,就是说定时器1每溢出一次,串口发送一次数据。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。

上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2下定时器1溢出速率的计算公式如下: 溢出速率=(计数速率)/(256-TH1初值) 溢出速率=fosc/[12*(256-TH1初值)] 上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD 设为1,分别看看那所要求的TH1为何值。代入公式: 11.0592M 9600=(2÷32)×((11.0592M/12)/(256-TH1)) TH1=250

波特率自适应

波特率自适应方案 一、波特率自适应概念 电表检测PC 机通信的波特率,并自动匹配通信。 二、方案 1、 点对点自适应通信,即PC 机与单一电表进行自适应通信。 如果我们想利用PC 机(波特率为1200bps )对未知波特率的电表通信,则需要进行下面几个步骤。 1.1 第一步:PC 机需要以1200bps 发送“ 55H 55H ” 1.2 第二步:等待未知波特率的电表应答。如果自适应成功则应答字符为:“80H ”,这时未知波特率的电表将更波特率为1200bps 。如果无应答,应答字符有误,或者在500ms 内未应答则此次自适应过程失败。重复第一步和第二步,重复三次都未应答则自适应失败。 1.3 第三步:成功自适应则可以利用1200bps 对电表进行通信。自适应失败只能将电表的波特率修改成1200bps 才能通信。 如果想用其他的波特率通信,请重复上面步骤 流程图 PC (1200)发送5555H → 电表回复80H → 1200正常通讯 →若要修改波特率 ↑ ↓ ← 电表未回复80H 2、 点对多自适应通信,即广播方式让总线上的电表统一波特率 流程图 3、 电表单片机自适应波特率原理 在不同波特率下发送一位数据的时间是不一样的,利用这个原理,确认在1200、2400、4800、9600状态下发送一个字节所需要的时间段B1、B2、B3、B4,将其存储到单片机中。 PC 机以广播方式1200bps 发送5555H 等待500ms 再次广播 发送55H 等待500m PC 机以 1200bps 抄读系统表

当PC机发送数据到电表时,单片机利用定时器测量接收一个字节的时间A,然后将A与B1,B2,B3,B4进行比对,假如A在B1范围内,那么单片机将电表波特率设置为1200,修改波特率结束。 流程图如下所示: 广播或者PC发送5555H(1200波特率) 单片机接收到第一个字节数据 55H,产生接收中断1 定时器开始工作,每产生一次定 时器中断就对变量A进行累加 单片机接收到第二个字节数据 55H,产生接收中断2 关闭定时器,将变量A与 B1/B2/B3/B4进行比对,确认A 属于范围B1 单片机将电表波特率改为1200 波特率修改成功

CAN波特率设置时的参数计算

CAN波特率设置时的参数计算 CAN(Controller Area Network)总线最早由德国 BOSCH公司提出,主要用于汽车内部测量与控制中心之间的数据通信。由于其良好的性能,在世界范围内广泛应用于其他领域当中,如工业自动化、汽车电子、楼宇建筑、电梯网络、电力通讯和安防消防等诸多领域,并取逐渐成为这些行业的主要通讯手段。 Can 控制器器只需要进行少量的设置就可以进行通信,其中较难设置的部分就是通信波特率的计算。CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。实际上,CAN总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。 CAN波特率设置时需要计算几个参数,这些参数共同决定波特率大小,由于计算比较复杂,希望有一个简易步骤,本人经过研究,找到一个简易办法,现贴出来分享,不对的地方请留言指正。需要说明的是,本人使用的can控制器是AT89C51CC03单片机中的can 首先,确定一下各项参数的取值范围: 参数范围编程值说明 BRP [1..64] 0-63 定义时间量子(时间份额)的长度tq Sync_Seg 1 tq 固定长度,总线输入与系统时钟同步 Prog_Seg [1..8]tq 0-7 补偿物理延时时间 Phase_Seg1 [1..8]tq 0-7 可通过同步暂时延长 Phase_Seg2 [1..8]tq 0-7 可通过同步暂时缩短 TSJW [1..4]tq 0-3 不能比任何一相位缓冲段长 以上是参数的取值范围,编程值是实际往寄存器里写的值,为实际取值减1。下面说一下步骤: 1、首先计算CAN时钟和波特率的比值; 2、根据比值确定预分频器的分频值BRP,计算时间量子的数目,这个数值范围是8-25; 3、将时间量子数减1(去掉Sync_Seg)后在Prog_Seg Phase_Seg1 Phase_Seg2三个参数中分配;

单片机波特率自适应

单片机从机的波特率自适应设置 一、硬件原理图 说明:DB9接到PC机的串口上。晶体震荡器可以用诸如11.0592MHz,14.7456MHz,对本文的介绍没有影响等等。这里,单片机为机为,PC机为主机。 二、自动设置理论原理 AT89C52的串行口有4种工作方式,方式1、3最常用。T2的波特率发生方式类似于常数自动重装入方式。用X16代替(RCAP2H,RCAP2L),则串行口方式1、3的波特率公式为: 波特率=fosc/[32 x (65536-X16 )]..……………………..……..…(A) 由(A)可得,单片机每接收1bit需要的时间为 接受1bit的时间=[32 x (65536- X16 )]/ fosc……………………(B) 单片机A T89C52为12分频指令系统,所以其机器周期为: 机器周期= 12/fosc……………………………………….….….……(C ) 我们可以很容易得到单片机接收1bit所需要的机器周期,假定为NUM,则由(B),(C)得NUM x 12/ fosc=[32 x (65536- X16)]/ fosc…………………………...(D) 由(D)可得,波特率定时时间常数为: X16=NUM x 3/8……………………………….…………………….….(E) 由此,关键需要得到单片机接受1 bit的机器周期数NUM。 三、自动检测主机信息的方法 不失一般性,假定串行通讯的字符协议为1起始位,8数据位,无奇偶校验位,1停止位,如下(图2)所示,

由定时器2工作原理(图3)知道,C/T2=0,TR2=0,则其加1计数,其计数速率为fosc/12,每加1需要的时间等于12/fosc,刚好就是一个机器周期。所以,只要我们在传输数据的某位开始处启动定时器,在传输该位结束时停止计数器,然后获取该范围的计数值,就是我们上面公式(E)中的NUM。 (定时器2工作原理,图3) 由图2知,如果主机(PC机)发给单片机01H(十六进制),则单片机P3.0接收数据如下波形(图4)。起始位开始时,启动定时器T2,当高电平来到时,关闭定时器T2,则计数值就等于NUM。 四、软件实现 1.流程图 这里给出获取定时常数的流程图,按主机发0x01来设计的 获取8bit数据的定时计数值(图5)计算定时时间常数(图6)

波特率计算来选择晶振频率

波特率计算 在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS—51串行口编程可约定四种工作方式。其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。 串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。一、方式0的波特率 方式0时,移位时钟脉冲由56(即第6个状态周期,第12个节拍)给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。所以,波特率为振荡频率的十二分之一,并不受PCON寄存器中SMOD的影响,即: 方式0的波特率=fosc/12 三、方式l和方式3的波特率 方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定,故波特宰由定时器T1的 溢出率与SMOD值同时决定,即: 方式1和方式3的波特率=2SMOD/32·T1溢出率 其中,溢出率取决于计数速率和定时器的预置值。计数速率与TMOD寄存器中C/T的状态有关。当C/T=0时,计数速率=fosc/2;当C/T=1时,计数速率取决于外部输入时钟频率。 当定时器Tl作波特率发生器使用时,通常选用可自动装入初值模式(工作方式2),在 工作方式2中,TLl作为计数用,而自动装入的初值放在THl中,设计数初值为x,则每过“256一x”个机器周期,定时器T1就会产生一次溢出。为了避免因溢出而引起中断,此时应禁止T1中断。这时,溢出周期为: 系统晶振频率选为11.0592MHZ就是为了使初值为整数,从而产生精确的波特率。 如果串行通信选用很低的波特率,可将定时器Tl置于工作方式0或工作方式1,但在 这种情况下,T1溢出时,需用中断服务程序重装初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的办法加以调整。 表6—2列出了各种常用的波特率及其初值。

串口通讯误码分析及波特率自适应技术

串口通讯误码分析及波特率自适应技术 -------------------------------------------------------------------------------- 串口通讯误码分析及波特率自适应技术(非典) 为讨论方便,只论证1位起始位+8位数据+1位停止位的误码问题 现设:发送方每位传输时间为TCK 接收方每位传输时间为RCK 起始位L(低电平),停止位H(高电平) 空闲状态为X(高电平),数据位DX(D0..D7) 通讯数据流为XXXXXLDDDDDDDDHXXXXXLDDDDDDDDHXXXX... 采样一般采用串口通讯公认的“中部三中取二”算法 当收发双方采用事先约定固定波特率串口通讯时,由于双方系统 时钟差异和线路传输时延,将会出现以下3种问题: 1. TCK=RCK时(可以稍有偏差) 发送数据流为XXXXXLDDDDDDDDHXXXXXLDDDDDDDDHXXXX... 接收数据流为XXXXXLDDDDDDDDHXXXXXLDDDDDDDDHXXXX... 故在这种情况下不会出现误码现象。 (别拍砖!这连腹中胎儿都“知道”,不敢“卖弄是非”) 2. TCKRCK时(发慢收快) 这种现象总会出现“群魔乱舞”的乱码,只有“天知道”。 解决的唯一方法是加快发送速率或降低接收速率。 所谓的“波特率自适应技术”,就是双方为防止以上问题的出现。 发送方特意在发送数据串前,先发送1个字节的“波特率校准码” 一般为大写字母U,即55H(数据流为方波信号)。 当然也有用AAH(数据流也为方波信号)的串口通讯“奇才”。 该技术的“精华”为“在线测试方波信号的半周期”。 这样,等到10个RCK后接收数据前,就可“从容地”计算出波特率, 从而达到“波特率自动校准”的目的即波特率自适应技术。

STM32_CAN波特率计算

一般设置CAN_SJW = 1,总结程序发现!!! can时钟是RCC_APB1PeriphClock(APB1从APB2而来,分频系数不同,导致APB1不同,mini版中一般是APB2为72Mhz,APB1是36MHz),你要注意CAN时钟频率 CAN波特率= RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler ; 另外尽可能的把采样点设置为CiA 推荐的值: 75% when 波特率> 800K 80% when 波特率> 500K 87.5% when 波特率<= 500K 所以对于100K 的波特率(假定使用8MHz 时钟) 可以修改该BS1 BS2 为: CAN_InitStructure.CAN_Prescaler=5; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; (1+13) / (1+13+2) = 87.5% CAN波特率计算—网友总结 STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用. bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟:

APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的, 然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图: 有了上边的这个图,基本就清楚了. 总线时钟MHz (3+TS1+TS2)*(BRP+1) ===================================================下面是我的计算:

常见导航仪默认端口和波特率大全

常见导航仪默认端口和波特率大全常见导航仪默认端口和波特率 1. 富威:COM2/4800 2. 索菱、索莱特:COM3/9600 3. 凯振:COM2/9600 4. 路特仕、图音:COM2/9600 5. 卡仕达、科骏达:COM1/9600或COM6/4800 6. 欧华:COM2/9600! 7.视宏:COM2/4800 8.超音:COM2/9600 9.凌盛:COM2/4800 10.佳艺田:COM2/9600 11.路畅:COM1/9600 常见品牌GPS导航端口速率汇总 常见品牌GPS导航端口速率汇总 车专用DVD品牌分辨率卡号端口号波特率 卡仕达 320*240 CF_Storage COM6 4800 480*234 MMC_Storage COM6 4800 科骏达320*240 CF_Storage COM6 4800 480*234 MMC_Storage COM6 4800 华阳(派迅) 416*234 存储卡COM2 9600 天派 SDMMC COM1 4800 欧华 320*240 Storage COM2 4800 科维320*240 Storage COM2 4800 城际通天籁专用420*240 CF_Storage COM6 4800 一线通新奥迪A6L480*234 Storage COM2 4800 黑匣子导航盒320*240 Storage COM2 4800 路特仕 800*480 Storage com1 9600 佳亿田320*240 Storage COM2 4800 途美A831、途美A837:com1 , 4800 途美A851、途美A852、途美A856:com2 , 4800 任E行Z10、Z20+、乐驾4300:com2 , 4800 依路行4302、4305、4306 :com2 , 4800 路驰com1 4800 HD500 com7 38400 奥可视T400、T410、T420等:com1 ,4800 神达C系列、乐游系列:com2 ,57600 神行者898、858、818:com2 ,4800 欧华com2 4800 新科com1 38400 纽曼com2 4800

【CN110048923A】一种多模块多波特率自适应的高速串行异步通信解决方法【专利】

(19)中华人民共和国国家知识产权局 (12)发明专利申请 (10)申请公布号 (43)申请公布日 (21)申请号 201910317377.2 (22)申请日 2019.04.19 (71)申请人 博能传动(苏州)有限公司 地址 215100 江苏省苏州市相城经济开发 区如元路100号 (72)发明人 支萌辉 尹泉 蒋生成  (74)专利代理机构 苏州智品专利代理事务所 (普通合伙) 32345 代理人 吕明霞 (51)Int.Cl. H04L 12/40(2006.01) (54)发明名称 一种多模块多波特率自适应的高速串行异 步通信解决方法 (57)摘要 本发明公开了一种多模块多波特率自适应 的高速串行异步通信解决方法,包括主机模块、 从机模块和高速串行异步通信模块,所述主机模 块包括ARM处理器、FPGA处理器一和并行总线一 模块,所述从机模块包括FPGA处理器二、DSP处理 器和并行总线二模块,所述主机模块和从机模块 通过高速串行异步通信模块相连;所述FPGA处理 器一与FPGA处理器二之间采用一问一答的主从 半双工高速串行异步通信模式,所述主机模块的 波特率预定义,从机模块通过波特率自适应算法 检测不同主机模块的波特率,并切换为所检测到 的波特率以实现与相应主机模块之间的通信。本 发明同一从机模块适用于不同的主机模块,让电 机驱动器模块化成为可能。权利要求书2页 说明书4页 附图1页CN 110048923 A 2019.07.23 C N 110048923 A

权 利 要 求 书1/2页CN 110048923 A 1.一种多模块多波特率自适应的高速串行异步通信解决方法,包括主机模块(1)、从机模块(2)和高速串行异步通信模块(3),其特征在于:所述主机模块(1)包括ARM处理器(11)、FPGA处理器一(12)和并行总线一模块(13),所述从机模块(2)包括FPGA处理器二(21)、DSP 处理器(22)和并行总线二模块(23),所述主机模块(1)和从机模块(2)通过高速串行异步通信模块(3)相连;所述FPGA处理器一(12)与FPGA处理器二(21)之间采用一问一答的主从半双工高速串行异步通信模式,所述主机模块(1)的波特率预定义,从机模块(2)通过波特率自适应算法检测不同主机模块(1)的波特率,并切换为所检测到的波特率以实现与相应主机模块(1)之间的通信。 2.根据权利要求1所述的一种多模块多波特率自适应的高速串行异步通信解决方法,其特征在于:所述ARM处理器(11)可以通过专用存储器接口或通用IO接口对FPGA处理器一(12)进行数据读写操作,所述ARM处理器(11)通过并行总线一模块(13)将需要发送给从机模块(2)的数据写入FPGA处理器一(12),所述ARM处理器(11)也可通过所述并行总线一模块(13)读取FPGA处理器一(12)中的数据。 3.根据权利要求1所述的一种多模块多波特率自适应的高速串行异步通信解决方法,其特征在于:所述FPGA处理器一(12)通过其内部的双端口RAM构建数据交互缓冲区,双端口RAM的一个端口由ARM处理器(11)控制,另一个端口由FPGA处理器二(21)的内部逻辑控制,所述FPGA处理器一(12)是高速串行异步通信的发起者,FPGA处理器一(12)包括向从机模块(2)定时发送数据以及接收和解析来自从机模块(2)的数据。 4.根据权利要求1所述的一种多模块多波特率自适应的高速串行异步通信解决方法,其特征在于:所述FPGA处理器二(21)通过其内部的双端口RAM构建数据交互缓冲区,双端口RAM的一个端口由DSP处理器(22)控制,另一个端口由FPGA处理器一(12)的内部逻辑控制,所述FPGA处理器二(21)包括向主机模块(1)定时发送数据以及接收和解析来自主机模块(1)的数据。 5.根据权利要求1所述的一种多模块多波特率自适应的高速串行异步通信解决方法,其特征在于:所述DSP处理器(22)可以通过专用存储器接口或通用IO接口对FPGA处理器二(21)进行数据读写操作,所述DSP处理器(22)通过并行总线二模块(23)读取缓存在FPGA处理器二(21)中的数据,所述DSP处理器(22)也可以将需要反馈给主机模块(1)的数据通过并行总线二模块(23)写入FPGA处理器二(21)。 6.根据权利要求1所述的一种多模块多波特率自适应的高速串行异步通信解决方法,其特征在于:所述高速串行异步通信模块(3)是主机模块(1)和从机模块(2)之间数据交互的通道,主机模块(1)定时将数据发送给从机模块(2),从机模块(2)接收到数据后,对接收数据进行校验和解析,并将主机模块(1)需要的数据反馈回去,从而实现主从模块间一问一答的半双工通信;所述高速串行异步通信模块(3)采用半双工的485物理链路层实现,且主机模块(1)采用预定义的波特率,不同类型的主机模块(1)可以定义不同的波特率。 7.根据权利要求1所述的一种多模块多波特率自适应的高速串行异步通信解决方法,其特征在于:所述主机模块(1)按照串行异步通信方式依次发送帧头、有效数据和CRC校验数据,其中帧头信号中带有波特率信息,该波特率信息通过帧头信号中的低电平宽度来表示,从机模块(2)通过检测低电平的宽度来识别不同主机模块(1)的波特率,从机模块(2)实时动态地检测每一帧数据的帧头信号,从而实现在从机模块(2)不断电的前提下对主机模 2

52单片机串口波特率设置函数

52单片机串口波特率设置函数 波特率设置太麻烦了吧,用函数设置吧,不必东奔西走的找了,个人自己写的代码,欢迎使用,不需要金币,好用就评价一下吧 注意了,仅用于52系列单片机,代码如下: /*----------52单片机波特率设置函数-------------- ------------------------------------------------ 作者:wenguang.li Email:liwg@https://www.360docs.net/doc/236202287.html,//wenguang.li@https://www.360docs.net/doc/236202287.html, MCU: *52 Cristal frequency unit MHz 晶体频率单位MHz Baudrate as you desired Example: set52_baudrate(11.0592,57600) Use Timer2 使用定时器2 ------------------------------------------------ ----------------------------------------------*/ //if osc=11.0592M //can set baudrate 110,300,600,1200,2400,4800,9600,19200,38400,57600,115200bps void set52_baudrate(float frequency,long int baudrate) { unsigned int itmp; unsigned char tlow,thigh; itmp=(int)(65536-(frequency*1000000)/(baudrate*32)); thigh=itmp/256; tlow=itmp%256; SCON=0x56; T2CON=0x30; RCAP2H=thigh; RCAP2L=tlow; TH2=thigh; TL2=tlow; TR2=1; //set ok } /////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////

通信速率、波特率、比特率简介

通信速率、波特率、比特率简介 数据通信速率:也就是数据传输速率,是指数据在信道中传输的速度。它可分为两种表示方式:码元速率(波特率)和信息速率(比特率)。 并行通信中,传输速率是以每秒传送多少字节(B / S)来表示。而串行通信中,传输速率在基波传输的情况下(不加调制,以其固有的频率传送)是用每秒钟传送的位数(bit/s)即比特率来表示。因此,1比特=1位/秒。 码元速率RB:每秒钟传送的码元数,单位为波特/秒(Baud/s),又称为波特率。 最常用的标准波特率是110、300、1000、1200、2400、4800、9600和19200波特。CRT终端能处理9600波特的传输,打印机终端速度较慢,点阵打印机一般也只能以2400波特的速率来接收信号。 通信线上所传输的字符数据是按位传送的,1个字符由若干位组成,因此每秒钟所传输的字符数--字符速率和波特率是两种概念。在串行通信中,所说的传输速率是指波特率,而不是指字符速率,两者的关系是:假如在某异步串行通信中传送1个字符,包括1个起始位,8个数据位,1个偶校验位,2个停止位,若传输速率是1200波特,那么,每秒所能传送的字符数是1200/(1+8+1+2)=100个。 信息速率Rb:每秒钟传送的信息量,单位为比特/秒(bit/s),又称为比特率。 比特率、波特率和信号编码级数的关系如下: Rb=RB*log2M 上式中:M-信号的编码级数,Rb-比特率,RB-波特率。 码元(Codecell):时间轴上的一个信号编码单元。 码元和编码级数M有关,也和表示法有关。一个信号往往可以携带多个二进制位,所以在固定的信息传输速率下,比特率往往大于波特率。换句话说,一个码元中可以传送多个比特。例如:当波特率为9600时,若M=2,则数据传输率为9600b/s;若M=16,则数据传输率为38.4kb/s。 例如,在使用二值编码表示时,二进制码元的编码级数是M=2,代入公式,那么就有:1bit=1baud,此时比特率和波特率相等。我们常用的是二进制码元,而且用二值表示,因而,被人误认为比特率与波特率是相等的。再进行分析,如果编码级数是M=4,即使用四进制码元,代入公式,情况就有变化,即有:2bit=1baud,此时的baud比bit的单位要大一倍,或者说bit在数值上比baud的数值大2倍。这与码元的进制表示法有关。因为二进制码元有2个数码,即0、1,可以用二值表示出来,如电平的(高、低)二值表示。而四进制码元有4个数码,即0、1、2、3。如果用二值表示,一个位置不够,需要两个位置表示,即00、01、10、11四种表示法,因而使得baud与bit在数值上不一样,这就是说,这与编码信号长度有关系。 编码信号:我们用一个图来表示编码信号,所用的码元用二进制来表示,即二值表示码元。同样的图形,其二进制码为001011010011,用了12个码元,而用四

相关文档
最新文档