. 串行通讯与并行通信

数字信号是八位二进制数,可以使用信号线传输,一种方案是使用一条数据线按照次序一位一位的传送,每传送完8位为一个字节,这就是串行通信。还有一种方法是使用八条数据线同时传送8个位的数据,一次传送一个字节,这就是并行通信。
俩种通信方式图示如下:

并行通信
特点为传输速度快,控制简单,但远距离传输时成本较高且接收方同时接收各位比较难
在这里插入图片描述
串行通信
特点为传输线少,远距离传输时成本低,但数据传输比并行通信复杂
在这里插入图片描述

  • 同步通信与异步通信

串行通信分为同步通信与异步通信
1.同步通信
顾名思义,同步通信就是对发送方和接收方的时钟实行直接控制,使双方的数据传输达到完全同步。数据以位的形式连续发送,且传送的字符之间不留间隙,即保持位同步和字符同步。双方的同步可以通过外同步和自同步俩种方式实现。
在这里插入图片阿瑟东
(前者为外同步,后者为自同步)
2.异步通信
和同步通信不同,异步通信的发送方和接收方使用各自的时钟控制数据的发射接收。异步通信是一种很常见的通讯方式,其发送端可以在任意时候发送字符,但与同步通信不同的是异步通信是以帧的形式发送数据的(异步通信中一个帧数据有十位:分别是一个起始位、八个数据位、一个停止位)
这样理解俩种通信方式:下课了,二狗喊铁蛋一起吃饭。同步通信就是:如果铁蛋听到了二狗叫他就马上和他去吃饭,如果一次没听到二狗就继续喊,直到铁蛋听到他的话并且和他去吃饭为止。异步通信就是:二狗喊了铁蛋一声然后就自己去吃饭了,铁蛋收到消息后可能立即去吃饭,也可能等一会去吃饭。(读者自行脑补hhh*.*)
图示如下:
在这里插入图片描述

– 实现51单片机串口通信的知识储备

目的:用异步通信实现单片机与计算机之间的数据交流
1.波特率
波特率可以衡量数字信号传输的速率,其大小为每秒传输二进制数的位数,单位为:bps。比如:每秒传输300帧数据,一帧数据是十个二进制数,则传输速率就是300×10=3000(bps)。单片机和计算机的传输速率要一致。
2.波特率的设置
计算机的波特率可以在界面上直接调整,那单片机的波特率要怎么设置呢?
我们一般是把T1(定时中断1)作为波特率的发生器,而且利用的是T1的工作方式2。
此时波特率的计算公式为:在这里插入图片描述
解释一下公式内容:
一.SMOD
SMOD属于PCON寄存器,不可位寻址,大家可以把其理解为波特率加倍标志,置0的时候不加倍,置1的时候波特率加倍。
在这里插入图片描述
二. fosc
fosc就是单片机的晶振频率,一般是11.0529MHz(还有一种情况是12MHz,但其误差相对较大,一般不予采用)1M=1000,000
三.(256-T初)
T1的工作方式2是八位数据自动装填(八位二进制数的范围是0~255,共256个数),初始值在开始时装入TH1和TL1,工作时只有TH1计数,当TH1溢出时把TL1中的初始值重新赋值给TH1,这样就实现了自动装填。
(256-T初)代表着每次定时器计数的次数。
3.如何设置波特率(假如设置波特率为9600bps)
首先-设置定时器T1的工作方式:编辑TMOD寄存器为TMOD=0X20;使定时器T1处于工作方式2;
然后-计算T1的初始值并装载TH1和TL1,波特率为9600bps时TH1=0XFD、TL1=0XFD;
最后-启动T1:编辑TCON寄存器中的TR1,使TR1=1(打开T1定时器)。通过设置PCON寄存器PCON=0X00设置SMOD=0。
4.如何确定串行口控制
通过编辑SCON寄存器控制串行口
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
其实主要是控制串行口的工作方式:SM0=0、SM1=1,和打开串行口的允许接收位:REN=1。
5.打开中断
打开总中断和串口通信中断:EA=1、ES=1。
6.SBUF寄存器
前面讲了一大堆铺垫,相信大家都有一个疑问:单片机是怎么发送数据呢?它又是如何接收数据呢? 如果要细讲这其中的传输原理,那会是复杂难懂的,好在单片机的内部硬件自带发送和接收数据的功能,它是通过SBUF寄存器实现的。
SBUF寄存器有俩个,一个是发送寄存器,另一个是接收寄存器(名字都一样),但在逻辑上SBUF只有一个(地址都为99H),物理结构上,这是俩个完全独立的寄存器。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据一定来自接收寄存器。
简单来讲:a=SBUF,代表单片机从计算机接收到了数据(接收到的数据自动存在接收寄存器SBUF中)并且从接收寄存器SBUF读取数据并赋给a。SBUF=a,代表单片机要给计算机发送a数据,只需将a赋给发送寄存器SBUF就行,发送寄存器SBUF会自动给计算机发送SBUF中的数据。
下面是其工作图:
在这里插入图片描述(RXD是接收引脚,TXD是发送引脚)
7.TI与RI
TI和RI都在SCON寄存器中。
TI是发送中断标志位,当数据发送完成后,TI由硬件置1,TI置1后向CPU提出中断申请,进入中断函数后需要软件置0(TI=0;)
RI是接收中断标志位,当数据接收完成后,RI由硬件置1,RI置1后向CPU提出中断申请,进入中断函数后需要软件置0(RI=0;)
8.串口中断
串口中断函数是

void (函数名无所谓) interrupt 4
{
	中断程序;
}

一旦TI或者RI为1就执行中断函数,并且需要在中断函数中将TI、RI重新置0。

– 话不多说,上代码!

#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar num;

void init()  //初始化函数
{
	TMOD=0x20;//设置定时器1的工作方式2---8位自动装填
	TH1=0xfd;//设置初始值:使比特率为9600bps
	TL1=0xfd;
	PCON=0x00;//SMOD=0,不加倍
	TR1=1;//打开定时器中断开关
	REN=1;//打开允许串行接收位
	SM0=0;//设置串行口通讯方式为方式1
	SM1=1;
	EA=1; //打开总中断
	ES=1; //打开串口通讯中断
}

void hhh() interrupt 4 //中断函数
{
	num=SBUF; //从计算机接收数据,赋给num
	RI=0;  //数据接收完毕后将RI软件置0
	SBUF=num;//向计算机发送数据num
	while(!TI); //TI=0时陷入死循环,直至数据发送完毕
	TI=0; //数据发送完毕后软件将TI置0
}

void main()//主函数就这么简单
{
	init();
	while(1);
}

接下来的事情就交给串口调试助手了

2019.4.19

版权声明:本文为quan0311原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/quan0311/p/15025197.html