🌹作者简介: @鹤辞 ,喜欢玩弄单片机,嵌入式,PCB制作,电路设计等等,希望自己的学习经历经验能够对你们有启发
🌹前期回顾:单片机之MAX7219芯片使用篇_@鹤辞的博客-CSDN博客_max7219
🌹努力目标:突破1000粉丝🌹支持鹤辞:点赞👍,留言👏, 关注💖,收藏🤞
目录
单片机串口通信
单片机串口通信的用处很广泛例如:可以用于下载程序,有ISP功能的单片机借助于串口来下载控制程序,比较方便,省了编程器烧录的麻烦;用于将采集数据上传到电脑,单片机一般做底层工作,电脑做数据分析工作,他们之间的数据交换利用串口比较方便;可以利用串口对单片机进行控制;利用串口进行数据交换,采用主从方式,可以控制设备协调工作。
串口通信原理
通信有并行通信和串行通信两种方式。在多微机系统以及现代测控系统中信息的交换多采用串行通信方式,串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备.
串口通信的分类
串口通信有异步通信和同步通信,首先我先介绍下异步通信:
异步通信:异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致
同步通信:同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。
串口通信的方向:
串口通信的方向分为三种:单工,半双工,全双工
单工:数据传输仅能沿一个方向,不能实现反向传输
半双工:数据传输可以沿两个方向,但需要分时进行
全双工:数据可以同时进行双向传输
![](https://i-blog.csdnimg.cn/blog_migrate/f94d50b8f17d052b1a16b19c913b51c3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba8a79a1c764f40c5785cca0b1ece153.png)
![全双工](https://i-blog.csdnimg.cn/blog_migrate/2b823e775e4e02dd389e65b62adffec0.png)
串口通信的错误校验:
(1)奇偶校验:在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错
(2)代码和校验:代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行
(3)循环冗余校验:循环冗余校验通过某种数学运算,实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输,存储区的完善性校验等
单片机的串口结构:
该结构中有2个物理地址上独立的接收,发送缓冲器SBUF,属于特殊功能寄存器,可同时发送,接收数据。它们占用同一地址(99H);接收器是双缓冲器。
串行通信的数据结构:
串口的工作方式寄存器SCON:
SM2,多机通信控制位,主要用于方式2和方式3;当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。
TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。
在方式0和方式1中,该位未用。
RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
SM0,SM1用于串口的工作方式选择位;
串口的工作方式:
工作方式寄存器PCON:
![](https://i-blog.csdnimg.cn/blog_migrate/53978502fa196b54b220c535a2f9e906.png)
PCON是没有位寻址的,也就是说不能直接操作SMOD,要直接操作PCON寄存器
SMOD:是波特率是否加倍的选择位
当SMOD=0时,不加倍
当SMOD=1时,加倍
此处,波特率是串口每秒发送的位数,比如2400的波特率就是每秒发送2400位,串口用定时器T1作为波特率发生器,这时定时器软件设置在工作方式2(可自动重装初值),常用的波特率与定时器1的参数设置如下
因为波特率=(2SMOD/32)*定时器溢出率
定时器T1的溢出率=单片机内部时钟频率/(256-x)
试中,x是定时器的初值
所以波特率=(2SMOD/32)*单片机内部时钟频率/(256-x)
常用波特率与定时器T1的参数关系表:
上手实验:
设置串口的程序如下:
void UsartInit() //设置串口函数
{
TMOD=0x20; //选择计算器工作方式2
SCON=0x50; //设置定时器为T1
TH1=0XF4; //计数器初值设置 波特率是4800bit/s
TL1=0XF4; //计数器终值设置
PCON=0x80; // SMOD=1,波特率加倍
ES=1; //打开串口中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
完整可执行代码:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void UsartInit()
{
TMOD=0x20;
TH1=0XF4;
TL1=0XF4;
PCON=0x80;
TR1=1;
SCON=0x50;
ES=1;
EA=1;
}
int main()
{
UsartInit();
while(1);
}
void Usar() interrupt 4
{
u8 receiveDate;
receiveDate=SBUF;
RI=0;
SBUF=receiveDate;
while(!TI);
TI=0;
}
打开烧录软件:
烧录代码之后,打开串口,在发送缓冲区发送数据,然而在接收缓冲区能够接收到如图:
如果文章对你有那么一点启发,能不能.......👍👍👍
哈哈****能不能动动你的小手,点个关注喽!