串口波特率设置

串口波特率设置
串口波特率设置

波特率计算

在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对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列出了各种常用的波特率及其初值。SMOD=0时,波特率=fose/32*12(256-X)

SOMD=1时,波特率=2*fose/32*12(256-X)

X为定时器初值,SMOD是特殊功能寄存器PCON的D7位

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

51串口通信程序(带详细注释)

51串口通信程序(带详细注释) #include#include //后面有一个比较函数#define uchar unsigned char#define uint unsigned intbit UART_Flag=0; //定义串口接收标志位 uchar str[50]; //定义一数组uchar length=0; //数组长度从0 开始void init() //初 始化uart{ TMOD=0X20; //定时器1 定时器方式工作模式2,可自动重载的8 位计数器常把定时/计数器1 以模式2 作为串行口波特率发生器 SCON=0X50; //选择工作模式1 使能接收,允许发送,允许接收 EA=1; //开总中断 ES=1; //打开串口中断ET1=0; //打开定时器中断 PCON=0X80; //8 位自动重载,波特率加倍 TH1=0XFF; //用22.1184 mhz 波特率 TL1=0XFF;TR1=1; //打开中时器 }void UART_Putch(uchar dat) //输出一个字符{SBUF=dat; //把数据送给sbuf 缓 存器中 while(TI!=1);//发送标志位TI 如果发送了为1,没发送为0,没发送等待,到 了退出循环 TI=0; //到了,TI 清为0 }void init1() interrupt 4 //uart 中断,4 为串口中断{ if(RI==1) //收到数据{ uchar m=SBUF; //m 为计算机发送给串口的数据,例,open //总体思想是,计算 机通知串口,我要发数据了RI=0; //收到清0 if(m==) //判断m 这位数据有无{ UART_Putch(); //回车UART_Putch(); // 换行str[length]=; //数据最后位加0 标 志位表示发完了数据UART_Flag=1; // 传完标志位} else if(m==) { } else if(m==)//b表退格//下面几句表删锄{ UART_Putch();

51单片机课设 串口计算器

[二0一三年]

1作品简介 本作品为带有串口通信功能的计算器,PC可通过串口助手软件将算式发送至单片机,单片机立即将计算结果发送回PC,并且在液晶上显示结果。串口通信波特率为两档可调,分别为9600bps和4800bps,可通过两个按键调整,同时在液晶上会显示当前的波特率。 计算器可自动识别输入的字符串,并自动判断输入的算式是否正确;可自动识别算式中包含错误字符、除数为零、浮点数做取余运算等错误。当计算结果超出设定范围时在液晶上出现“超出范围”提示,同时向PC发送“The result is out of range! ”。 2作品整体方案 2.1 串行通信功能: 实验板和PC电脑通过USB线相连,使MCU和PC软件“串口助手”能够进行串行通信。 (1)当实验板上电时默认波特率为9600bps,并发送欢迎词和提示词,例如“Welcome to Calculator V1.0”,"You can press key1 and key2 to change baud rate.".... (2)当实验板上按键1按下时波特率变更为4800bps,按键2按下时波特率变更为9600bps,并用两个LED灯指示相应的波特率。 2.2 计算器功能 通过串口助手发送框发送需要计算的公式,例如20*4=,MCU收到后解析公式并计算结果,将结果返回给串口,例如“The result is 80”,同时将计算结果显示在数码管上,具体细节如下: (1)可以进行加(+)、减(-)、乘(*)、除(\)、取余(%)运算; (2)整形、浮点型运算; (3)当计算结果为整形数时,有效的运算结果范围是-999~9999,超过此结果,返回相应的提示符,例如“The result is out of range.”,液晶上显示“超出范围”; (4)当计算结果为浮点数时,有效的运算结果范围是-99.9~999.9,液晶上保

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

8051的串口波特率的计算(笔记版)

8051的串口波特率的计算 1、方式0的波特率,固定为晶振频率的十二分之一。 2、方式2的波特率,取决于PCON寄存器的SMOD位。PCON是一个特殊的寄 存器,吹了最高位SMOD位,其他位都是虚设的。计算方法如下: SMOD=0,波特率为晶振的1/64; SMOD=1,波特率为晶振的1/32. 3、方式1与方式3的波特率都是由定时器的溢出率决定的。 公式为: BR=(2SOMD/32)*(定时器TI的溢出率) 通常情况下,我们使用定时器的方式2,即比率发生器,自动重载计数常数。 溢出的周期为: T=(256-X)*12/fosc 溢出率为溢出周期的倒数,即 T1=1/T 所以: 式中:SMOD是所选的方式,fosc是晶振频率。X是初始值。 51单片机模拟串口波特率计算方法 1.计算波特率位间隔时间(即定时时间,其实就是波特率的倒数) 位间隔时间(us)=10(6)(us)/波特率(bps)

2.计算机单片机指令周期: 指令周期(us)=12/晶振频率(Mhz) 补充问题:做串口通信时,为什么要把晶振频率设为11.0592,为什么要把波特率设为9600? 先说波特率。波特率从300到115200都可以,甚至更高或更低。一般规范的波特率都是3的倍数,比如9600、19200、38400;但是并不是一定的,波特率也可以是10000或者10001、10002,只要你的设备能产生符合这个要求的频率,尤其是自己用时,波特率都是很随意的,没有限制。只是多数时候为了和电脑配合,波特率才规范为固定的几个值,且为了传输稳定,用9600。 用11.0592晶振的原因是51单片机的定时器导致的。通常用11.0592M晶振是为了得到标准的无误差的波特率。举例说来,如我们要得到的9600的波特率,晶振为11.0592M和12M,定制器1为2SMOD设为1,分别看看那所求的TH1为何值。代入公式: 11.0592M 9600=(2/32)*((11.0592M/12)(256-TH1)) TH 1=250 12M 9600=(2/32)*((12M/12)(256-TH1)) TH1=249.49

MSP430串口波特率的设置与计算

MSP430波特率的计算 给定一个BRCLK时钟源,波特率用来决定需要分频的因子N: N = fBRCLK/Baudrate 分频因子N通常是非整数值,因此至少一个分频器和一个调制阶段用来尽可能的接近N。 如果N等于或大于16,可以设置UCOS16选择oversampling baud Rate模式注:Round():指四舍五入。 Low-Frequency Baud Rate Mode Setting 在low-frequency mode,整数部分的因子可以由预分频实现: UCBRx = INT(N) 小数部分的因子可以用下列标称公式通过调制器实现: UCBRSx = round( ( N –INT(N) ) × 8 ) 增加或减少UCBRSx一个计数设置,对于任何给定的位可能得到一个较低的最高比特误码率。如果确定是这样的情况UCBRSx设置的每一位必须执行一个精确的错误计算。 例1:1048576Hz频率下驱动以115200波特率异步通讯 ACLK = REFO = ~32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz。 N = fBRCLK/Baudrate = 1048576/115200 = ~9.10 UCBRx = INT(N) = INT(9.10) = 9 UCBRSx = round( ( N –INT(N) )×8 ) = round( ( 9.10 –9) × 8 )=round(0.8 )=1 UCA0CTL1 |= UCSSEL_2;// 选SMCLK为时钟 UCAxBR0 = 9; UCAxBR1 = 0; UCAxMCTL = 0x02;//7-4:UCBRFx,3-1:UCBRSx,0:UCOS16 UCBRSx 为寄存器UCAxMCTL的1-3位,所以写入0x02(00000010) 例2:32768Hz频率下驱动以2400波特率异步通ACLK = REFO = ~32768Hz, MCLK = SMCLK = DCO ~1.045MHz N = fBRCLK/Baudrate = 32768/2400 = ~13.65 UCBRx = INT(N) = INT(13.65) = 13 UCBRSx = round( ( N –INT(N) )×8 ) = round( ( 13.65 –13) × 8 )=round(5.2)=5 UCA0CTL1 |= UCSSEL_1; // 选ACLK为时钟 UCAxBR0 = 13;UCAxBR1 = 0 ; UCAxMCTL = 0x0A;//7-4:UCBRFx,3-1:UCBRSx,0:UCOS16 UCBRSx为寄存器UCAxMCTL的1-3位,所以写入0x0A(00001010) Oversampling Baud Rate Mode Setting 在oversampling mode 与分频器设置如下:

串口通讯—传输速率与传输距离

串口通讯—传输速率与传输距离 1.波特率 在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,即每秒钟传送的二进制位数,其单位为bps(bits per second)。它是衡量串行数据速度快慢的重要指标。有时也用“位周期”来表示传输速率,位周期是波特率的倒数。国际上规定了一个标准波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4Kbps、19.2Kbps、28.8Kbps、33.6Kbps、56Kbps。例如:9600bps,指每秒传送9600位,包含字符的数位和其它必须的数位,如奇偶校验位等。大多数串行接口电路的接收波特率和发送波特率可以分别设置,但接收方的接收波特率必须与发送方的发送波特率相同。通信线上所传输的字符数据(代码)是逐为位传送的,1个字符由若干位组成,因此每秒钟所传输的字符数(字符速率)和波特率是两种概念。在串行通信中,所说的传输速率是指波特率,而不是指字符速率,它们两者的关系是:假如在异步串行通信中,传送一个字符,包括12位(其中有一个起始位,8个数据位,2 个停止位),其传输速率是1200b/s,每秒所能传送的字符数是1200/(1+8+1+2)=100个。 2.发送/接收时钟 在串行传输过程中,二进制数据序列是以数字信号波形的形式出现的,如何对这些数字波形定时发送出去或接收进来,以及如何对发/收双方之间的数据传输进行同步控制的问题就引出了发送/接收时钟的应用。 在发送数据时,发送器在发送时钟(下降沿)作用下将发送移位寄存器的数据按串行移位输出;在接收数据时,接收器在接收时钟(上升盐)作用下对来自通信线上串行数据,按位串行移入移位寄存器。可见,发送/接收时钟是对数字波形的每一位进行移位操作,因此,从这个意义上来讲,发送/接收时钟又可叫做移位始终脉冲。另外,从数据传输过程中,收方进行同步检测的角度来看,接收时钟成为收方保证正确接收数据的重要工具。为此,接收器采用比波特率更高频率的时钟来提高定位采样的分辨能力和抗干扰能力。 3. 波特率因子 在波特率指定后,输入移位寄存器/输出移位寄存器在接收时钟/发送时钟控制下,按指定的波特率速度进行移位。一般几个时钟脉冲移位一次。要求:接收时钟/发送时钟是波特率的16、32或64倍。波特率因子就是发送/接收1个数据(1个数据位)所需要的时钟脉冲个数,其单位是个/位。如波特率因子为16,则16个时钟脉冲移位1次。例:波特率=9600bps,波特率因子=32,则接收时钟和发送时钟频率=9600×32=297200Hz。 4.传输距离 串行通信中,数据位信号流在信号线上传输时,要引起畸变,畸变的大小与以下因素有关: 波特率——信号线的特征(频带范围)

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.360docs.net/doc/c410647166.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

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; 数据手册给我们提供了一张数据表: 在这张数据表上,已经算出了常用的波特率值,我们可以拿来直接用。但是如果我们想把

单片机波特率的计算方法

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

51串口通信协议(新型篇)

51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include #include //预定义 //帧 #define F_ST1 0x6e //帧头标志n #define F_ST2 0x79 //帧头标志y #define F_R 0x72 //帧类型读r #define F_W 0x77 //帧类型写w #define F_D 0x64 //帧类型数据帧d #define F_B 0x62 //帧类型写回应帧b #define F_C 0x63 //帧类型重发命令帧c #define F_Q 0x71 //帧类型放弃帧q #define F_ADDR 0x31 //器件地址0-9 #define F_END 0x7a //帧尾标志z #define F_SPACE 0x30 //空标志0 #define F_ERR1 0x31 //错误标志1,flagerr 1 #define F_ERR2 0x32 //错误标志2 2 //常数 #define S_MAXBUF 16 //接收/发送数据的最大缓存量 #define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为

单片机与PC机串行通信中波特率的确定

单片机与PC机串行通信中波特率的确定 关键字:单片机 PC机串行通信波特率 1 单片机异步通信口的特点及波特率的选定 MSC51系列单片机有一个全双工的异步通信口,他利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。异步串行通信发送和接收数据的速率与移位脉冲同步。一般用51系列的T1定时器作为波特率发生器,T1的溢出率经二分频(或不分频)后又经十六分频作为串行发送或接收的移位脉冲,移位脉冲的速率即波特率。单片机的异步通信波特率与串行口的工作方式、主振频率Fosc及定时器T1的工作方式有关。一般通信中使T1工作于方式2(可重装时间常数方式),若Fosc取6 MHz,则波特率的计算公式如下: 其中:SMOD是可编程的(即PCON的第8位),由此公式计算出的波特率是不标准的波特率。? 2 PC机异步通信口及其波特率的设置 由于UART(通用异步接收/发送器)的产品型号很多,PC机和XT机都采用的是INS8250芯片, AT机采用的是NSI16450芯片,他们二者是兼容的。因此这里以8250芯片为例来说明PC机异步通信波特率的设定方法。PC机中有2个异步通信口,一个是COM1,其端口地址范围是3F8H~3 FFH,另一个是COM2,其端口地址是2F8H~2FFH。其与MODEM配合可以实现远距离通信。其波特率是标准波特率50~9 600 b/s。 8250内部有10个寄存器端口,其中有一个除数锁存器,可以通过编程除数的大小来确定异步通信的波特率。8250使用的频率是1843 2 MHz的基准时钟输入信号,所以必须用分频的方法产生所需要的波特率(移位脉冲)。除数锁存器的值必须在8250初始化时设置,即把通信线路控制器的最高位(DLAB)置1,然后分两次把除数锁存器的高8位和低8位分别写入端口地址3F8H和3F9H(COM1),8250传送或接收串行数据时使用的时钟信号的频率是数据传输波特率的16倍,即波特率=16×除数/1 843 200。由此公式可以计算出几种标准波特率与除数的对应值如下:对应于波特率为1 200 b/s的除数锁存器的低8位值为60H;对应于波特率为2 400 b/s的除数锁存器低8位的值为30H;对应于波特率为4 800 b/s的除数锁存器低8位的值为18H;对应于波特率为9 600 b/s的除数锁存器低8位的值为0CH。 3 用PC机的汇编语言设计的串行通信程序中波特率的设定 PC机的ROM BIOS串行通信管理程序为14H号中断处理程序,他可支持DTE与DCE间的通信,也能支持两个DTE间用MODEM连接方式的RS232C接口通信。BIOS串行通信管理程序的功能是:串行口初始化、发送数据字符、接收数据字符和取串行口状态。他是利用查询方式来实现数据字符的接收和发送,但当查询超时一定时间后就不再继续查询,而认为是线路故障或对方未准备好,并通过返回参数中的超时标志来表示操作失败。 BIOS INT 14H的中断功能调用的入口和出口参数如下: 例如要设计用COM1来发送字符,波特率为1200 b/s,8 个数据位,1个停止位,采用查询方式无效验位,则初始化程序如下: 4 利用Turbo C编写的PC机通信程序中波特率的设定 Turbo C函数库中提供了专门的调用BIOS串行软中断的函数Bioscom(int cmd,char byte,int pure),其中:参数cmd用来设置通信类型,cmd=0,初始化串行口pure;cmd=1,发送一个字符;cmd=2,接收一个字符;cmd=3返回串口当前状态。参数byte用来确定串行口的异步

MCS-51单片机串行口工作方式与波特率计算举例

MCS-51单片机串行口工作方式与波特率计算举例 1)方式0 方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD 输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。 实际应用在串行I/O口与并行I/O口之间的转换。 2)方式1 方式1是点对点的通信方式。8位异步串行通信口,TXD为发送端,RXD为 接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。 在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。 (1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入 输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND 和DATA无效,发送停止位,一帧结束,置TI=1。 (2)接收:REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD 端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。此后: A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。

基于51单片机的波特率自动识别系统程序

#include #define uint unsigned int #define uchar unsigned char #define disp_off 0x3e //关显示 #define disp_on 0x3f //开显示 #define disp_x 0xb8 //页地址 #define disp_z 0xc0 //行地址 #define disp_y 0x40 //列地址 #define comm 0 //命令标志 #define dat 1 //数据标志 #define data_ora P0 //MCU P0<------> LCM sbit cs1=P2^0; //cs1=L,选择左半屏 sbit cs2=P2^1; //cs2=L,选择右半屏 sbit rs =P2^2; //H:写数据,L:写指令 sbit rw =P2^3; //H:读,L:写 sbit e =P2^4; //读写使能 sbit bf =P0^7; //执行操作标志 sbit res=P0^4; //复位初始化标志 uchar uart_data,temp,baud_set=0x00; uchar dispnum[90]; uchar baud[5]={0x00,0x09,0x06,0x00,0x00}; uchar r_dat[4]={0x00,0x10,0x00,0x00}; uchar code baudrate[7][5]={ {0x00,0x00,0x03,0x00,0x00}, {0x00,0x00,0x06,0x00,0x00}, {0x00,0x01,0x02,0x00,0x00}, {0x00,0x02,0x04,0x00,0x00}, {0x00,0x04,0x08,0x00,0x00}, {0x00,0x09,0x06,0x00,0x00}, {0x01,0x04,0x04,0x00,0x00}, }; //波特率大小 uchar code hz11[]={ /*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/ 0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0, 0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00, 0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B, 0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00, /*-- 文字: 送--*/

串口通信测试方法

串口通信测试方法 1 关于串口通信的一些知识: RS-232C是目前最常用的串行接口标准,用来实现计算机和计算机之间、计算机和外设之间的数据通信。 在PC机系统中都装有异步通信适配器,利用它可以实现异步串行通信。而且MCS-51单片机本身具有一个全双工的串行接口,因此只要配以电平转换的驱动电路、隔离电路就可以组成一个简单可行的通信接口。 由于MCS-51单片机的输入和输出电平为TTL电平,而PC机配置的是RS-232C 标准串行接口,二者电气规范不一致,因此要完成PC机与单片机的数据通信,必须进行电平转换。 注明:3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片: 2 实现串口通信的三个步骤: (1)硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 使用MAX232串口通信电路图(9孔串口接头) (2)串行通信程序设计 ①通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种

约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC 机与单片机之间进行通信,在设计过程中,有如下约定:

串口波特率自动检测

串行通信波特率的一种自动检测方法 (哈尔滨工业大学控制工程系150001) 任贵勇屈彦成王常虹 摘要:给出了一种利用接收到的字符信息检测串行终端通信波特率的方法。此方法简单、可靠、易行,并给出了实现这种检测方法的伪代码。 关键词:自动检测;波特率 串行通信是终端和主机之间的主要通信方式,通信波特率一般选择1800、4800、9600和 19200等。终端的类型有很多种,其通信速率也有很多种选择。主机怎样确定终端的通信速率呢?本文给出了一种简单、易行的方法:设定主机的接收波特率(以9600波特为例),终端发送一个特定的字符(以回车符为例),主机根据接收到的字符信息就可以确定终端的通信波特率。本文对这种方法予以详述。 1 基本方法 回车符的ASCII值为0x0D。串行通信时附加一个起始位和终止位,位的传输顺序一般是先传低位再传高位。此时回车符的二进制表示方式为: 图1 回车符的位序列 串行通信中一个二进制位的传输时间(记为T)取决于通信的波特率,9600波特时一个二进制位的传输时间是19200波特时一个二进制位传输时间的两倍,即:2*T19200=T 9600。因此,9600波特时一个位的传输时间,19200波特时可以传输两个位。同样地,9600波特传输两个位的时间在4800波特时只能传送一个位。主机设定接收波特率为9600,终端只有也以9600波特发送的字符,主机才能正确地接收。发送波特率高于或低于9600都会使主机接收到的字符发生错误。接收波特率为9600,终端以不同的波特率发送回车符时,主机接收到的二进制序列如表1所示。 从表1中可以看出,除了19200和1800波特时两种特例情况,其他情形的二进制序列都是 9600波特时二进制序列的变换。取前十个二进制位与9600波特时的二进制位相对应。忽略缺少停止位‘1’引发的数据帧错误,把接收到的字符表示成字节方式(如表1的最右列所示)。例如:在发送速率为1200波特,接收速率为9600波特时,主机得到的字节是0x80,而不是正确的回车符0x0D。因为在不同的发送速率下(9600,4800,2400,1200)得到的字节不同,所以通过接收字符的判定就可以确定发送波特率。 发送波特率为19200时,其发送速度正好是接收速度(9600波特)的两倍,因此发送端的两个二进制位会被接收端看作一个。取决于不同的串行接口硬件,‘01’和‘10’这两种二进制位组合可能被认为是‘1’或者‘0’。幸运的是,只有0~4位存在这样的歧义问题,后面的位因为都是停止位,所以都是‘1’。因此,发送速率为19200波特时接收到的字符其高半个字节为0xF。低半个字节可能是多个值中的一个,但不会是0x0,因为0x0D中有相邻的两个‘1’,这就会至少在低半个字节中产生一个‘1’。因此,整个字节的形式为0xF?,且低半个字节不为0。 表1 不同波特率下的二进制序列

串行通讯波特率和定时器的关系

串行通讯波特率和定时器的关系 波特率代表数据的传输速率,即每秒钟传送的二进制位数,单位为位/秒。若波特率为1200,则代表每秒钟有1200个二进制位在数据线上传输,换句话说,即每个二进制位信号电平在数据线上保持的时间为11200s 。这样,就将定时器和波特率联系起来了。 51单片机中串行通讯对应着3种波特率: 1. 对于方式0,波特率是固定的,为单片机时钟的十二分之一,即: osc /12f ; 2. 对于方式2,波特率有两种可供选择,即 /32osc f 和/64osc f ,对应于以下公式: osc 2/64SMOD f =?波特率 SMOD 为PCON 寄存器中的控制位(最高位),其取值为0或者1。 1. 对于方式1和方式3,波特率均为可变的,由定时器T 的溢出速率来决定。设: osc ::and::::V T 12f f B 1T T V X n = 定时器的溢出速率; 系统晶振频率,则 位定时器内部加1计数器加1需要的时间;波特率; 定时器溢出需要的时间,为定时器计数初值。 对于定时器方式0,取值为13;对于定时器方式1,取值位16; 对于定时器方式2和3,取值为8。 and 32and (2/32)2SMOD SMOD B B V V ???=?= ?? ?即: ()()osc ×2122n n f 12V T =X f X ??=- ??-?? 即: 2×n f X 12V =- 联立得: 2132and 32and 2SMOD SMOD B T T B ??==? ????即: 从上式可见,每个二进制位电平信号在数据线上保持的时间为定时器溢出需要的时间乘

51单片机串口通信

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

相关文档
最新文档