51单片机系列--串口通讯

青旅半醒 2022-08-30 04:24 411阅读 0赞

串行通信和并行通信

串行通信和并行通信都是一种通信传输方式,都适用于计算机与计算机、计算机与单片机之间的数据通信,在传输中存在相互转换的关系。但是两者在使用上还是有着不同的:

  1. 一次传输的传输量不同
    并行通信传送八路信号,一次并行传送传送完整的一个字节信息。串行通信在一个方向上只能传送一路信号,一次只能传送一个二进制位,传送一个字节信息时,只能一位一位地依次传送。
  2. 传输速度不同
    串行的传输速度慢,但是对线路的要求低一些。 并行的对线路的要求高,但是速度快。
  3. 传输距离不同
    串行线路仅使用一对信号线,线路成本低并且抗干扰能力强,因此可以用在长距离通讯上;而并行线路使用多对信号线(还不包括额外的控制线路),线路成本高并且抗干扰能力差,因此对通讯距离有非常严格的限制。
    在这里插入图片描述
    并行通信图
    在这里插入图片描述
    串行通信图

同步通信与异步通信

串行通信分为同步通信与异步通信,区别:

  1. 同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
  2. 同步通信效率高,异步通信效率较低。
  3. 同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
  4. 同步通信可用于点对多点,异步通信只适用于点对点。

通俗点说,就是同步是终端A告诉终端B后,等到终端B跑过来后两个终端小伙伴一起搞事情;异步是终端A告诉终端B后,终端A就直接跑去干活了。

电平标准

  1. TTL电平:+5V表示10V表示0
  2. RS232电平:-3~-15V表示1,+3~+15V表示0
  3. RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

常用通信接口

在这里插入图片描述

传输方向

  1. 1. 全双工:通信双方可以在同一时刻互相传输数据
  2. 2. 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
  3. 3. 单工:通信只能有一方发送到另一方,不能反向传输
  4. 4. 异步:通信双方各自约定通信速率
  5. 5. 同步:通信双方靠一根时钟线来约定通信速率
  6. 6. 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

知识点细分

**波特率:**单片机或计算机在串口通信时的速率。其大小为每秒传输二进制数的位数,单位为:bps。比如:每秒传输255帧数据,一帧数据是十个二进制数,则传输速率就是255x10=2550(bps)。两个终端之间进行串口通信,波特率要一致才能进行。
比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:10位×240个/秒 = 2400 bps
**检验位:**用于数据验证
**停止位:**用于数据帧间隔
**波特率设置:**波特率是基于定时器T1工作方式2进行的,没了解过定时器的小伙伴可以看一下我写过的51单片机系列–定时器中断。
网上给出的波特率的计算方式为:
在这里插入图片描述
其中

  1. 1.SMOD
  2. 属于PCON寄存器,不可位寻址,置0的时候不加倍,置1的时候波特率加倍。
  3. 2. fosc
  4. fosc就是51的晶振频率,我使用的52单片机的是11.0529MHz
  5. 3.256-T初)
  6. T1的工作方式2是八位数据自动装填(八位二进制数的范围是0~255,共256个数),初始值在开始时装入TH1TL1,工作时只有TH1计数,当TH1溢出时把TL1中的初始值重新赋值给TH1,这样就实现了自动装填。
  7. (256-T初)代表着每次定时器计数的次数。

设置方法
首先-设置定时器T1:工作模式寄存器TMOD设为0X20(工作方式2);
在这里插入图片描述
然后-计算T1的初始值并装载TH1和TL1,波特率为9600bps时TH1=0XFD、TL1=0XFD;
最后-启动T1:编辑TCON寄存器中的TR1,使TR1=1(打开T1定时器)。通过设置PCON寄存器PCON=0X00设置SMOD=0(不加倍)。
如何确定串行口控制
SM0=0、SM1=1,和打开串行口的允许接收位:REN=1
打开中断
打开总中断和串口通信中断:EA=1、ES=1。
SBUF寄存器
单片机的内部硬件自带发送和接收数据的功能,它是通过SBUF寄存器实现的。SBUF寄存器有两个,一个是SBUF发送寄存器,另一个是SBUF接收寄存器,但两者的地址都为99H。所以在逻辑上只有一个SBUF,而在物理结构上,这又是两个完全独立的寄存器。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据一定来自接收寄存器。
在这里插入图片描述
TI与RI
TI和RI都在SCON寄存器中。
TI是发送中断标志位,当数据发送完成后,TI由硬件置1,TI置1后向CPU提出中断申请,进入中断函数后需要软件置0(TI=0);
RI是接收中断标志位,当数据接收完成后,RI由硬件置1,RI置1后向CPU提出中断申请,进入中断函数后需要软件置0(RI=0);

示例代码(串口通信闪烁灯)

main.c

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "UART.h"
  4. sbit led=P2^2;
  5. void main()
  6. {
  7. UART_Init(); //串口初始化
  8. while(1)
  9. {
  10. }
  11. }
  12. void UART_Routine() interrupt 4
  13. {
  14. if(RI==1) //如果接收标志位为1,接收到了数据
  15. {
  16. led=~led; //读取数据,取反后输出到LED
  17. Delay(1000);
  18. UART_SendByte(SBUF); //将受到的数据发回串口
  19. RI=0; //接收标志位清0
  20. }
  21. }

UART.c

  1. #include <REGX52.H>
  2. /** * @brief 串口初始化,4800bps@12.000MHz * @param 无 * @retval 无 */
  3. void UART_Init()
  4. {
  5. SCON=0x50;
  6. PCON |= 0x80;
  7. TMOD &= 0x0F; //设置定时器模式
  8. TMOD |= 0x20; //设置定时器模式
  9. TL1 = 0xF3; //设定定时初值
  10. TH1 = 0xF3; //设定定时器重装值
  11. ET1 = 0; //禁止定时器1中断
  12. TR1 = 1; //启动定时器1
  13. EA=1;
  14. ES=1;
  15. }
  16. /** * @brief 串口发送一个字节数据 * @param Byte 要发送的一个字节数据 * @retval 无 */
  17. void UART_SendByte(unsigned char Byte)
  18. {
  19. SBUF=Byte;
  20. while(TI==0);
  21. TI=0;
  22. }
  23. /*串口中断函数模板 void UART_Routine() interrupt 4 { if(RI==1) { RI=0; } } */

UART.h

  1. #ifndef __UART_H__
  2. #define __UART_H__
  3. void UART_Init();
  4. void UART_SendByte(unsigned char Byte);
  5. #endif

串口通信助手界面
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,411人围观)

还没有评论,来说两句吧...

相关阅读

    相关 51单片机系列--串口通讯

    串行通信和并行通信 串行通信和并行通信都是一种通信传输方式,都适用于计算机与计算机、计算机与单片机之间的数据通信,在传输中存在相互转换的关系。但是两者在使用上还是有着不同

    相关 51 单片机串口实验

    51单片机有一个全双工的串行口。 在 PROTEUS 软件中,可以使用虚拟终端,和单片机的串口进行通信实验。 此时,并不需要在电路中加上 TTL-RS2

    相关 51单片机串口通信(UART)

    项目描述: 1.串口工作方式为1(8位UART,波特率可变),无校验位; 2.通信数据格式为:1位起始位 + 8位数据位 + 1位停止位; 3.上电后MCU给上位机