本节首要解说单片机的通讯。通讯首要是指单片机与外界设备沟通,也便是经过导线传送或许接纳信息。举个比如来阐明,你想把库房A中的货品经过卡车配送到库房B,总共有8个箱子,每辆卡车一次只能运送1个箱子。明显,假如只用一辆卡车,那么需求8次运送结束,假如运用8辆卡车,那么一次就运送完了。相同,在单片机通讯中也是如此。这个卡车便是信息传输通道。卡车数量越多,传输越快。假如只需一辆卡车那么便是串行通讯,假如是八辆卡车便是并行通讯。很明显,卡车数量越多,运送的速度越快,可是本钱越高。因而依据CPU与外设之间连线结构和数据传送办法的不同,可将通讯分为并行通讯和串行通讯两种根本办法。很简略能够看出并行通讯的特点是数据一起传送,速度快,效率高,但本钱也高。串行通讯的特点是传输线少,本钱低,但传送速度慢。现在许多电脑没有并口接口了,这儿咱们只讲串行通行。
咱们现在许多笔记本现已没有串口,咱们一般选用USB转串口。先来看图1中的一个比如,现在想让P1把在A地址的D3,D5,D8,D9,D11组球经过P2的帮助一个一个传递到B点,要求按次序传递,并且传递完结后不能打乱次序。假如不做任何处理,只需P1在某一组中如D3组,有一个球传错或许漏传,那么将导致后边的传递悉数错位。改善的办法便是在传每组第一个球时,先传个赤色的标签,告知P2接下来要传的是这一组的第一个球。当这一组传递完结后,再给一个绿色的标签,告知P2,这一组的球传递结束。这样即便某一组传错了,也不会影响下一组的传递。现在咱们具体看看这个进程。(1) P1需求挑选传哪一组的球。(2) 准备好符号 (3) 告知P2现在要开端作业. 一起在传递进程要确保P1和P2的速度共同,不然传递也会出问题。知道了这个比如,现在咱们具体的来评论一下串口异步通讯。
如图所示,两个单片机的串行通讯,传送一根线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悉数点亮