51单片机-串口通信

一:原理介绍

一.串口通信

二.接口及引脚定义

2排9针

串口是传输数据的

vga接口是用于传输视频的(电脑和投影连接或与显示屏),传输的是模拟信号,所以画面的分辨率不高

不支持热插拔,所以要用螺丝进行固定保护

补充:

建议Dp1.2和Dp1.4

4k电视 建议买HDMI2.1

过长会出现降速

三.硬件电路

通信需要三根线,TXD,RXD,GND

四.电平标准

TTL(晶体管晶体管逻辑)

单片机使用TTL电平

USB接口,CAN总线接口都使用的是差分传输

前两种十多米距离的数据误差就高了 ,而RS485电平可以传输千米

51单片机是不支持流控制的

五.常见的通信接口的比较

SCL,SCLK是一种时钟线

补充:

同步通信的配合很好,但是需要设置专门的时钟线(这是一个劣势),即使设置了专门的时钟线,可能由于电路传播的不同路径,不同导体,高频远距离还是会导致时钟相位不同,数据传输丢失bit

采用同步通信时,将许多字符组成一个信息组,这样,字符可以一个接一个地传输,但是,在每组信息(通常称为

帧)的开始要加上同步字符,在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。在同步传输过程

中,一个字符可以对应5~8位。当然,对同一个传输过程,所有字符对应同样的数位,比如说n位。这样,传输时,按

每n位划分为一个时间片,发送端在一个时间片中发送一个字符,接收端则在一个时间片中接收一个字符。

同步传输时,一个信息帧中包含许多字符,每个信息帧用同步字符作为开始,一般将同步字符和空字符用同一个

代码。接收端当然是应该能识别同步字符的,当检测到有一串数位和同步字符相匹配时,就认为开始一个信息帧,于

是,把此后的数位作为实际传输信息来处理。

版权声明:本文为CSDN博主「yundanfengqing_nuc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yundanfengqing_nuc/article/details/50911590

连续发送两个sync同步字符,告诉接收方要与其进行同步

信号编码当中包括了时钟信号

曼彻斯特编码针对bit丢失,通过不同码元来结合数据信号和时钟信号,每一位中间电平转换(分隔)即表示数据代码,又作为定时信号使用,是一种双相码,接收方可以明显地分辨数据间的分隔,用于(1-10M/s)低速以太网,早期的局域网的使用

差分曼彻斯特编码,数据的表示在于每一位开始处是否有电平转换,有电平转换表示为0,没有电平转换表示为1,每一位中间电平转换只作为定时信号,不表示数据 ,用于令牌环网

异步通信可以提高cpu的效率,不用像同步通信那样时刻接收时钟信号

由于UART不能挂载多个设备,所以没有UART总线的概念

单工(例如:遥控器)

同步是遇到一个上升沿就进行一次采样(格外地加一根线)

六.串口的参数及时序图

一位一位地进行发送(先发低位,再发高位)

校验(排错率不高)

补充:下面进行串口通信的工作原理解释

以发送“A”为例

从左到右依次将数据发送出去

第一位是起始位永远是低电平

最后一位是停止位永远是高电平

发送数据的时候必须要有时间间隔

9600的波特率

发送的时间间隔一定要和波特率完全对应上

对应不上的话会导致接收的数据不准,数据错乱

七.串口模式图

SBUF放在赋值号左边,使用发送寄存器

SBUF放在赋值号右边,使用接收寄存器

补充:

半双工:允许双向传输数据,但是不能同时传输,就是两个可以切换的单工(类似于对讲机,只能有一方讲话)

全双工:允许双向同时传输数据(类似于手机,双方可以同时讲话)

TB8和RB8都是有关第9位数据的处理,所以不管它

二:代码实现

1.配置寄存器

(1)SCON寄存器介绍

serial control串口控制

frame error

使用8位数据传输时,不需要进行帧错误的检测

TI(发送中断标志位):发送完毕后,必须要通过软件(代码)进行置0

RI同理

(2)SBUF初始化时不需要进行配置

(3)IE,IPH,IP

发送不需要开启中断,所以不用进行配置

(4)从机地址SADEN

不需要进行配置

串口向电脑发送数据不需要配置中断,直接使用Delay

串口的发送速率(波特率)是由定时器决定的

由于串口的波特率传输较快,所以需要较16位定时器更精准,故采用双八位自动重装模式

此处波特率加倍是要进行分频,如果不加倍的话时钟会变慢,变慢后就不能匹配,形成比较大的误差

波特率越低,通信越稳定,误差的影响更小

注:

2.代码实现

(1)串口向电脑发送数据

 

(2)电脑通过发送串口控制LED

接收需要一个中断系统,电脑发送的时间不确定,也不能一直用CPU进行检测

所以要利用中断,当电脑发送数据的时候才将数据取出

a.寄存器配置

开启中断

b.代码实现

子函数+interrupt +中断号整体就变成了中断服务子函数

interrupt+中断号 跟在那个函数后面,那个函数就是中断服务子函数

优化:

由于发送和接收标志位采用同一个中断,所以在中断子函数里面需要对中断源进行判断

注:

定时器和串口中断函数与主函数的耦合性比较大,所以要写成模板

c.波特率的计算

T1溢出率的计算

256-243(F3)=13次

12MHz每隔1us就计数一次,所以溢出率=1/13=0.0769230MHz

0.07692/16=0.00480769MHz=4807.69Hz

误差计算:7.69/4800

d.补充

文本模式:接收到什么就给你显示什么,写下什么就给你发送什么

数据进行传输的时候(即发送数据后)会进行编码

ASCII码表前33位是不可见字符

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值