博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51单片机—串口通信
阅读量:3948 次
发布时间:2019-05-24

本文共 2718 字,大约阅读时间需要 9 分钟。

. 串行通讯与并行通信

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

俩种通信方式图示如下:

并行通信

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

  • 同步通信与异步通信

串行通信分为同步通信与异步通信

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

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

目的:用异步通信实现单片机与计算机之间的数据交流

1.波特率
波特率可以衡量数字信号传输的速率,其大小为每秒传输二进制数的位数,单位为:bps。比如:每秒传输300帧数据,一帧数据是十个二进制数,则传输速率就是300x10=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 charuchar 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

转载地址:http://kawzi.baihongyu.com/

你可能感兴趣的文章
KVO & KVC 比较 - KVC
查看>>
iOS-tableView联动
查看>>
iOS--Masonry解决 tableViewCell 重用时约束冲突
查看>>
git 与 svn 的主要区别!
查看>>
iOS-截屏,从相册选择图片,制作磨砂效果图片
查看>>
iOS-截取字符串中两个指定字符串中间的字符串
查看>>
数据库-数据库操作(使用FMDB)
查看>>
FMDB介绍以及在 swift 中的数据库操作
查看>>
iOS运行时机制(附Demo演练)
查看>>
宽字符串输出问题
查看>>
将整数转换为宽字符串
查看>>
在类中定义enum实现整数常量功能
查看>>
suse11通过安装最新内核可以上网的经验
查看>>
SUSE静态配置IP成功上网
查看>>
通过sleep让程序等待外部条件改变
查看>>
通过等待键盘输入让程序等待外部条件改变
查看>>
通过限制循环次数来避免死循环
查看>>
ADO连接字符串
查看>>
字符数组的位置决定程序能否成功执行--不明白
查看>>
拷贝代码时没有仔细检查,导致误修改了函数参数
查看>>