89C51串行通信中,单片机如何自动调节波特率,望高手指点!(最好有详细的程序设计过程)

作者&投稿:镇饺 (若有异议请与网页底部的电邮联系)
AT89C51单片机的串行通信工作方式有4种,波特率可调整变化的方式有:( )还请高手帮帮忙~

方式1和方式3  b d

串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =((2^SMOD)/64)• fosc
方式1的波特率 =((2^SMOD)/32)•(T1溢出率)
方式3的波特率 =((2^SMOD)/32)•(T1溢出率)
注意:SMOD为PCON寄存器的最高位(即PCOM)。
T1 溢出率 = fosc /{12×[256 -(TH1)]} --将该公式代人方式1或3
最后推出公式:TH1=256-(fosc*2^SMOD)/(baudrate*12*32);
呵呵
如果你用方式2(波特率 =((2^SMOD)/64)• fosc )的话
12M的晶振就不能得到9600波特率了(除非你改变你的晶振,但是那样的晶振好像没有卖) 所以你只能选择方式1或3
而且12M的晶振在串口传输时会有误差,就如你上面算的那样结果会有小数点
TH1又只能是整数的 所以传输时会有误差.
参考:
#include
#define baudrate 9600UL
#define fosc 11059200UL//其中,UL是不能省略的,代表长整型。
unsigned char a,flag;
void serial_init(void)
{ unsigned char S_MOD=1;
TMOD=0x20;//T1工作在方式2
SCON=0x50;//SM0=0 SM1=1->串口通信在模式1,
//SM2=0->多级通信中使用的位,REN=1;
PCON=0;
if((PCON&0x80)==0x80) S_MOD=2;
TH1=256-(fosc*S_MOD)/(baudrate*12*32);//其中SMOD=0,
TL1=256-(fosc*S_MOD)/(baudrate*12*32);
TR1=1;ES=1;EA=1;
}

要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51
系列只提供一个串口,那么另一个串口只能靠程序模拟。
本文所说的模拟串口, 就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电
平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置
1,各种数据位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续
的时间,波特率越高,持续的时间越短。如波特率为9600BPS,即每一位传送时间为
1000ms/9600=0.104ms,即位与位之间的延时为为0.104毫秒。单片机的延时是通过执行若干条
指令来达到目的的,因为每条指令为1-3个指令周期,可即是通过若干个指令周期来进行延时的,
单片机常用11.0592M的的晶振,现在我要告诉你这个奇怪数字的来历。用此频率则每个指令周期
的时间为(12/11.0592)us,那么波特率为9600BPS每位要间融多少个指令周期呢?
指令周期s=(1000000/9600)/(12/11.0592)=96,刚好为一整数,如果为4800BPS则为
96x2=192,如为19200BPS则为48,别的波特率就不算了,都刚好为整数个指令周期,妙吧。至于
别的晶振频率大家自已去算吧

一个单片机的波特率固定了,不停的发出55H,呼叫对方。
另一个单片机上电后,要轮流使用不同的波特率来接收,当正确收到55H,即检测到了对方的波特率。
然后就用这个波特率,进行回应即可。

思路应该是检测开始位低电平的时间,求这个时间的倒数就是波特率了。
当检测到RX线上为低电平时,开始计时,当RX变为高电平时,停止计时,求这个时间差的倒数。

我补充一下
把所有波特率计算好放进数组,然后让固定单片机不停的发一个固定的字符串或字符 另一个可调的单片机每一段时间跟换波特率 如果收到那个固定的字符串则固定波特率

都是扯淡。这需要握手协议配合才能完成。

假设协议如下安排:

A以未知波特率连续发送特征字符串(比如0x55、0xAA组成的序列),直到B返回确认字符后才停止发送特征字符串。

B以特定波特率接收A发送的数据,并判断是否是特征字符串,如果不是就改变波特率继续接收,直到确认收到的是特征字符串为止就不再改变波特率,同时以这个波特率向A发送确认字符,这就完成波特率适应过程。


请问单片机 C51 串行通信中 定时器T1的取值公式中为什么要除以2 如...
SMOD是特殊功能寄存器PCON的第7位。 SMOD=1时串口通讯的波特率倍增, SMOD=0时波特率不倍增。

C51单片机串行接口的结构是怎样的?
C51系列单片机内部有一个功能很强的全双工串行异步通信接口(UART)。如图所示为C51单片机的串行口结构框图。它主要由两个串行数据缓冲器(SBUF)、发送控制、发送端口、接收控制、接收端口和波特率控制等组成。C51系列单片机串行接口结构框图 ...

C51单片机:设计一个串行通信程序,波特率为1200b\/s,发送数据I Love U...
include <reg51.h> \/\/晶振=12M void InitUART(void){ TMOD = 0x20;SCON = 0x40;TH1 = 0xE6;TL1 = TH1;PCON = 0x00;TR1 = 1;} void SendString(unsigned char *c){ while(*c){ SBUF = *c++;while(!TI);TI = 0;} } void main(void){ InitUART();SendString("I Love U Fore...

C51单片机串口通信中断的问题
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。

串行口通信C51程序?
void main(void) ( 9){ unsigned char dat; ( 10)Init_Com(); ( 11)while(1) ( 12)程序详细说明:(1)头文件包含。(2)声明串口初始化程序。(3)设置定时器1 工作在模式2,自动装载初值(详见第二讲)。(4)SMOD 位清0,波特率不加倍。(5)串行口工作在方式1,并允许...

求单片机c51的双机之间的串行通信设计课程设计程序,学得不精,所以求助...
发送程序如下:ORG 1000H ASTART: CLR EA MOV TMOD, #20H; 定时器1置为方式2 MOV TH1, #0F4H; 装载定时器初值,波特率2400 MOV TL1, #0F4H MOV PCON, #00H SETB TR1; 启动定时器 MOV SCON, #50H ; 设定串口方式1,且准备接收应答信号 ALOOP1: MOV SBUF, #0E1H ...

【51单片机系列】C51中的中断系统
INT1<\/: P3.3脚低电平或下降沿,以及T1定时器溢出,同样可触发中断。TI\/RI<\/: 串行通信完成后,中断标志触发,标志着数据传输的完成。中断响应的三大条件必须满足:中断源发出请求、中断允许位(IE)打开,以及CPU处于中断模式(EA=1)。以外部INT0为例,中断使用步骤如下:在主程序中设置:EA=1...

串口通信问题
下面是用VB6实现的PC机和单片机(C51)通信的简单测试程序,有关具体步骤,大概就是VB6代码里的步骤; 如果你的下位机为MCU,可以直接拷贝代码去调试!---C51代码(Atmel 89c51)--- \/*PC机通过串行口将数字(1,2,3...255)传给单片机,单片机收到后回传这个数字,并存入自己内部一段连续的空间中,PC...

c51单片机 C语言问3和4道题
异步串行通信是指通信双方以一个字符(包括特定附加位)作为数据传格单位且发送方传送字符的间隔时间不一定。同步串行通信是指允许连续发送一序列字符而每个字符的数据位数都相同且没有起始位和停止位。 异步串行通信是指通信中两个字节间的时间间隔是不固定的,而在同一个字节中的两个相邻位的时间间隔是...

C51单片机笔记(80C51的串行口)
80C51的串行口核心组件包括发送缓冲寄存器SBUF、串行控制寄存器SCON,以及接收缓冲寄存器。工作方式选择由SM0和SM1位决定,可选择标准8位传输(方式0)或扩展9位传输(方式2和3)。工作方式1则支持10位数据帧,包含起始位和停止位,适用于更复杂的数据传输场景。发送与接收过程遵循严谨的时序,从发送最低位...

江源县15892244400: 两个89C51单片机串行通信应如何连接 -
党祁二维: 1号单片机的TXD(发射)接2号单片机的RXD(接收).1号单片机的RXD接2号单片机的TXD.共地.

江源县15892244400: 单片机 串行通讯89C51 -
党祁二维: 前提是EA=1;ES=1;这时,抄当RI=1或TI=1时,就会进入中断服务函数中去了.在实袭际应用中,对于发送有两种处理方式,一种是作为普通的中断2113处理,即发送一5261个字节就进中断.还是有方式是将中断关闭,然后把数据统统发出后再打开中断,这种方式的好处是程序逻辑比4102较清晰,其他中断不1653会干扰到串口发送的进程.

江源县15892244400: 怎么实现51单片机与电脑串口之间的通信? -
党祁二维: 首先,单片机和微机通信的电气标准要一致,微机串口一般是RS232电气标准,所以要加电平转换芯片,大多用MAX232,一般单片机实验板上都提供这样的标准串口. 其次,要分别编写上位机和下位机软件程序,单片机程序参照例程、教科书...

江源县15892244400: 51单片机如何进行串口通信,并制定通信协议. -
党祁二维: 连线就是 交叉连接 A的TX到B的RX A的RX到B的TX,还有一根地线 串口线就这三根就够用了 然后就是初始化A和B的串口,设置波特率,工作模式,开中断等等 A和B的通信,你先调试一台机器,比如A,和电脑连接,用串口调试助手(网上找...

江源县15892244400: 单片机与单片机之间如何进行串行通信 -
党祁二维: 1、将两个单片机的RXD与TXD相连2、根据需要传输的数据编写传输协议3、编写串行通信程序,将自己需要发送的数据按照协议进行发送4、编写接收程序,按照协议进行接收5、将两个程序分别写入两个单片机,运行.

江源县15892244400: 怎么实现AT89C52单片机之间的串行通信 -
党祁二维: 首先要看pc机有没有串口,即是电脑上的com口,这是rs232口,有的话,就很方便.单片机的rxd,txd两个脚就是串行通信的引脚,用一片max232,或max202,把rxd,txd两脚接到max232上,组成一个rs232接口电路,max232的rxd,txd接到db9头...

江源县15892244400: 用51单片机怎么通过独立按键实现串口通信 比如说你按下一个键S1 在串口接收区能收到1 -
党祁二维: 用键盘检测程序检测按键按下,检测到按下就用串口向上位机发送字符“1”的ASCII码值,这样在串口调试助手里就可以看到字符“1”了

江源县15892244400: 51单片机串行通信 -
党祁二维: 串行通信分为查询方式和中断方式; TI和RI分别是8位串行口控制寄存器SCON的第1位和第0位; 1.TI:发送中断标志位.在方式0中,发送完8位数据后,由硬件置位;在其它方式中,在发送停止位之初由硬件置位.因此,TI=1是发送完一帧数据...

江源县15892244400: 51单片机串口通信的过程
党祁二维: 通信线上传输了一个字节到单片机串口上,硬件自动将其接收并存储在SBUF里,此时会产生一个中断(串口接收中断),单片机的相应中断使能(ES,EA)打开的时候,就可以进入中断,方便处理通讯.关闭中断时,仍可以使用查询的方式进行通讯处理.查询RI位, if(RI==1) {RI=0;//需要对其清零,硬件不会自动清零的 ......//以下是处理程序 } 发送的时候把需要发送的字节送入SBUF即可启动硬件发送,单片机只需查询TI(发送标志位)看看发送是否完成就行了.TI也需软件清零.

江源县15892244400: 在89C51单片机串行通信中,发送数据的第九位装入 - ----中 空填什么啊? -
党祁二维: 填“TB8”. 因为: 串行口控制寄存器SCON包含了串行口的工作方式选择、接收允许、发送和接收时的第九位数据及发送和接收的中断标志.SCON的格式如下:SM0 SM1 SM2 REN TB8 RB8 TI RI SM0、SM1为工作方式选择. SM0、SM...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网