. 串行通讯与并行通信

数字信号是八位二进制数,可以使用信号线传输,一种方案是使用一条数据线按照次序一位一位的传送,每传送完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是接收引脚,

(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);

}


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

关键字:51单片机  串口通信  数据线 引用地址:51单片机—串口通信

上一篇:51单片机—红外遥控
下一篇:C51—模拟IIC总线实现EEPROM存取数据

推荐阅读

最近写STM32程序,用到了共用体,由此,引发了疑问。 比如:将0x12345678存储到一个U32类型的变量里面。大端和小端分别是这样存储的。 大端存储: 低地址 …… 高地址 0x 12 34 56 78 小端存储: 低地址 …… 高地址 0x 78 56 34 121234567看代码 `#...
互联网由PC互联网发展到移动互联网,再到物联网,本身就是一个不进化的过程,无论传统IT通信厂商华为中兴,还是传统互联网巨头BATJ,或是移动互联网新贵小米及TMD等,都不会也不能错过物联网;根据Gartner的测算,预计到2020年全球物联网设备数量将达到204亿,达到人口的3倍以上;据IDC数据显示,2020年全球将超过250亿台设备联网,同时在网用户将达44亿人...
  数字万用表辨别区分火线/零线的方法如下:  第一步:准备好交流电源、数字式万用表、电笔  将数字式万用表打到交流AC(700V)档。  第二步:将黑色表笔缠绕左手两三圈(特别注意:表笔笔尖不要碰到手,有可能会触电)  将红色表笔与未知零/火线的任何一根接触。如下图万用表显示数值为HV009(左边)  第三步:按照第二步一样操作——黑色表...
8月31日,2021年中国·黄石新经济发展云招商推介会正式举行。黄石发布消息显示,会上,15个合作项目正式签约,其中包括了武汉洹河显示材料产业项目。武汉洹河显示材料产业项目由武汉洹河科技有限公司投资建设,总投资5亿元,从事光电显示技术和激光技术相关领域的产业投资及产品研发、制造、销售,年产150万台触摸智能化终端一体机、年产700台显示领域应用...

史海拾趣

问答坊 | AI 解惑

【藏书阁】图解电子技术快速入门

目录: 第一章 怎样使用万用表  第一节 万用表  一、万用表的结构与功能  二、万用表的测量原理  三、万用表的使用方法  第二节 数字万用表  一、数字万用表的结构与功能  二、数字万用表的测量原理  三、数字万用表的使用方 ...…

查看全部问答∨

wince CryptoAPI 能进行DSA 签名吗

发现网上提供的一些用微软的CryptoAPI库存进行数字签名的demo,都是RSA签名,而且签名的公钥和私钥对都是用CryptoAPI中的函数产生的,而不能选择一个私钥进行签名,请问CryptoAPI下能随意选择一个私钥来进行DSA签名吗…

查看全部问答∨

如何将vxworks tornado shell打印内容重定向到PC程序的界面上

我想将vxworks tornado shell上的打印内容在我自己写的一个 PC程序的界面上进行显示 是否可以通过shell重定向功能实现呢 ? 请高手指点!!! …

查看全部问答∨

NDIS驱动为什么InitializeHandler没有被自动调用???

一个网卡驱动,使用NDIS5.1, sources里加了CDEFINES=$(CDEFINES) -DNDIS_MINIPORT_DRIVER=1  -DNDIS51_MINIPORT=1 DriverEntry里初始化: NDIS_MINIPORT_CHARACTERISTICS ch; ... ch.MajorNdisVersion      &nbs ...…

查看全部问答∨

申请LM3S8962开发板

希望能够申请到并与大家一起分享! OPEN MAKE OPEN SHARE! [ 本帖最后由 sblpp 于 2010-10-13 15:32 编辑 ]…

查看全部问答∨

各种程控滤波器设计感觉不错

本帖最后由 paulhyde 于 2014-9-15 03:12 编辑    …

查看全部问答∨

自己搜到的一些资料 可能发重了

本帖最后由 paulhyde 于 2014-9-15 09:21 编辑 自己逛几个论坛搜的 和大家分享一下  …

查看全部问答∨

这次KEIL真怪了???

如图每次打开那条黑线都有、、、、求解释…

查看全部问答∨

DSP-Sitara进度如何呢,有没有希望团购成功呢

DSP-Sitara团购帖,大家都在期待ing…………https://bbs.eeworld.com.cn/thread-356179-1-1.html…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved