您的位置 首页 主动

51单片机之寄存器-3.3单片机串口通讯之发送与接纳

本节主要讲解单片机的通信。通信主要是指单片机与外界设备交流,也就是通过导线传送或者接收信息。举个例子来说明,你想把仓库A中的货物通

本节首要解说单片机的通讯。通讯首要是指单片机与外界设备沟通,也便是经过导线传送或许接纳信息。举个比如来阐明,你想把库房A中的货品经过卡车配送到库房B,总共有8个箱子,每辆卡车一次只能运送1个箱子。明显,假如只用一辆卡车,那么需求8次运送结束,假如运用8辆卡车,那么一次就运送完了。相同,在单片机通讯中也是如此。这个卡车便是信息传输通道。卡车数量越多,传输越快。假如只需一辆卡车那么便是串行通讯,假如是八辆卡车便是并行通讯。很明显,卡车数量越多,运送的速度越快,可是本钱越高。因而依据CPU与外设之间连线结构和数据传送办法的不同,可将通讯分为并行通讯和串行通讯两种根本办法。很简略能够看出并行通讯的特点是数据一起传送,速度快,效率高,但本钱也高。串行通讯的特点是传输线少,本钱低,但传送速度慢。现在许多电脑没有并口接口了,这儿咱们只讲串行通行。

图1 串行通讯示意图

咱们现在许多笔记本现已没有串口,咱们一般选用USB转串口。先来看图1中的一个比如,现在想让P1把在A地址的D3,D5,D8,D9,D11组球经过P2的帮助一个一个传递到B点,要求按次序传递,并且传递完结后不能打乱次序。假如不做任何处理,只需P1在某一组中如D3组,有一个球传错或许漏传,那么将导致后边的传递悉数错位。改善的办法便是在传每组第一个球时,先传个赤色的标签,告知P2接下来要传的是这一组的第一个球。当这一组传递完结后,再给一个绿色的标签,告知P2,这一组的球传递结束。这样即便某一组传错了,也不会影响下一组的传递。现在咱们具体看看这个进程。(1) P1需求挑选传哪一组的球。(2) 准备好符号 (3) 告知P2现在要开端作业. 一起在传递进程要确保P1和P2的速度共同,不然传递也会出问题。知道了这个比如,现在咱们具体的来评论一下串口异步通讯。

图2 单片机串行通讯示意图

如图所示,两个单片机的串行通讯,传送一根线TXD,接纳一根线RXD,现在咱们只评论传送这部分。设定单片机1为咱们开发板上的类型STC89C52RC. 已然是传送,那么传送什么内容。现在假定我要传送0111000B(38H)这个数据。那么怎样让单片机知道我要传这个数据呢?如上图所示,只需求运用图中SBUF=dataTXD(即SBUF=0x38)这个查办。当单片机看到这条指令后,把0x38写入SBUF,就发动串行通讯的发送。也便是说,这条查办告知了单片机两个信息,1.发送什么内容,2.现在就开端发送。单片机就开端以0和1的办法开端发送了。那么这样又出现问题了,单片机2怎样知道单片机1要给我传数据了?最简略的办法的便是给需求传送的数据前后加个标签,这样两个标签之间的内容便是单片机1要传送的信息了。当然也能够在8位数据后增加其他标签,这个便是串口的传送办法了。这个由SCON串行操控器来设置:

这儿咱们挑选作业办法1,SM0/SM1设置为0/1。8位数据位加开端位和中止位,总共10位,也称为一帧。那么这个开端位和中止位什么参加呢?当单片机TXD发送信息时,单片机就主动参加了。因而,这儿咱们总结一下,SBUF=dataTXD当碑文到这条指令时,告知了单片机三个重要信息,1. 要传送什么信息,2. 什么时候开端传, 3. 主动在这个数据前增加开端位和中止位。可是又有个问题,传多快呢?这儿需求引进一个概念,波特率。波特率界说为每秒传输的码元个数,单位是波特(Baud),简写为B。而每秒钟传送的二进制数码的位数则界说为比特率,单位是比特每秒,b/s或bps。在串行通讯体系中,传送的信号可能是二进制,八进制,十进制等,只需在二进制通讯体系中波特率和比特率在数值上才是持平。本教程所描绘的串行通讯传输信号都是选用二进制信号传送的,故比特率和波特率持平。例如,通讯两边每秒所传送的信息量是480字节,每一字节包括10位(1个开端位,8个数据位,1个中止位),则波特率为:

480×10=4800b/s=4800B

这儿需求留意彼此通讯的甲乙两边有必要具有相同的波特率,不然无法成功完结串行数据通讯。如上图所示,给出了串行通讯作业办法1的波特率。

现在来总结一下,串口通讯的发送进程

(1)挑选作业办法

(2)设置速度

(3)发送什么信息,打上符号,开端传送

以上3个进程中,第三步中三个使命经过SBUF=0x38(假定我要传这个数据)这句代码就悉数完结了。因而在此之前咱们要先设置好作业办法和传送速度(波特率).

这些进程不需求伤心,只需求翻开串口帮手就一望而知了,

参阅代码如下:

#include “reg52.h”

void delayUs(unsigned char t);

void delayMs(unsigned char t);

void main(void)

{

SM0=0;

SM1=1;//串口作业形式

TMOD=0X20;

TH1=TL1=253; //波特率9600

TR1=1;

while(1)

{

SBUF=0x38;

delayMs(250);

delayMs(250);

}

}

void delayUs(unsigned char t)

{

while(–t);

}

void delayMs(unsigned char t)

{

while(–t)

{

delayUs(245);

delayUs(245);

}

}

已然知道怎样操作串口通讯怎样发送,咱们依照相同的思路看看怎样操作串口接纳。首要接纳到的信息在哪里?将SBUF=dataTXD替换为dataRXD=SBUF. 前者一共把数据写进SBUF,发送;后者一共把SBUF中的数据读出了,接纳。留意接纳缓冲器SBUF和发送缓冲器SBUF姓名相同,地址也相同,可是是两个独立的物理空间。作业办法的挑选与速度设置与前面相同。那么,怎样让单片机知道开端接纳呢?需求分量两个条件,TI=0和REN=1. REN一共串口接纳答应。别的,当接纳完结一帧数据(8位)后,操控信号复位,中止标志RI被置”1″,呈中止请求状况。在作业办法1下,一起分量SM2=0,RI=0接纳数据有用。咱们能够收拾一下串口接纳的进程如下,

(1)挑选作业办法(作业办法1)

(2)设置速度

(3)开端接纳(TI=0,REN=1)

(4)接纳的信息在哪里。(dataRXD=SBUF)

(5)接纳的数据有用(SM2=0,RI=0)

串行通讯接纳的参阅代码如下:

#include “reg52.h”

#define uchar unsigned char

void delayUs(unsigned char t);

void delayMs(unsigned char t);

void main(void)

{

uchar MyRevData;

SM0=0;

SM1=1;//串口作业形式1

REN=1;

TMOD=0X20;

TH1=TL1=253; //波特率9600

TR1=1;

while(1)

{

MyRevData=SBUF;

delayMs(250);

P1=MyRevData;

delayMs(250);

RI=0; //当接纳完结一帧数据(8位)后,操控信号复位,中止标志RI被置”1″,呈中止请求状况。在作业办法1下,SM2=0,RI=0数据有用

}

}

void delayUs(unsigned char t)

{

while(–t);

}

void delayMs(unsigned char t)

{

while(–t)

{

delayUs(245);

delayUs(245);

}

}

将代码编译烧写后进行测验,翻开STC-ISP烧写软件,选中串口帮手,设置COM端口,波特率等参数,翻开串口,然后输入要传送的内容,如下图所示。

在发送区内输入FF后点击”发送字符/数据”,LED悉数平息,输入00,点击发送,LED悉数点亮

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/263563.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部