51单片机之寄存器-3.3单片机串口通信之发送与接收
图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;//串口工作模式
51单片机寄存器串口通信发送与接 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)