51单片机的串口通信

1.串口通信

(1)串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。

(2)串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。

(3)串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。

2.串行通信

串行通信,即数据一位一位得按顺序发送。并行通信,即数据的各位同时发送。

2.1串行通信的分类

(1)按通讯方式
同步通讯:带时钟同步信号传输。比如:SPI(全双工),IIC(半双工)通信接口。
异步通讯:不带时钟同步信号。比如:UART(全双工),单总线(半双工)。-----传输双方要约定好波特率

(2)按数据传送方向
单工:只支持数据在一个方向上传输;
半双工:允许数据在两个方向上传输,某一时刻只有一个传输方向;
全双工:允许数据同时在两个方向上传输。

备注:UART是通用异步收/发器,USART是通用同步/异步收/发器。USART在UART基础上增加了同步功能,即USART是UART的增强型。

2.2波特率

波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标。单位:位/秒 bit/s

波特率9600bit/s表示:每秒可以传输9600个二进制位。

就是说传输1位的时间:1s/9600=104us;

就是说传输1次数据的时间:104us*10=1.04ms;

2.3电平转换电路

(1)PC机上的通信接口有USB接口,相应电平逻辑遵照USB原则;还有DB9接口(九针口),相应电平逻辑遵照RS-232原则。而单片机上的串行通信通过单片机的RXD、TXD、VCC、GND四个引脚,相应电平逻辑遵照TTL原则。

所以单片机通信接口的电平逻辑和PC机通信接口的电平逻辑不同,需要电平转换电路。

(2)PL2303、CP2102、CH340芯片是 USB 转 TTL串口 的芯片,MAX232芯片是 TTL电平与RS232电平的专用双向转换芯片,可以TTL转RS-232,也可以RS-232转TTL。

举例说明:

外购USB转TTL模块,如下图所示。该模块一端接入PC机的USB接口,另一端有TXD、RXD、GND、5V、3.3V五个引脚,分别与单片机的RXD、TXD、GND、5V引脚相连,对于采用3.3V供电的单片机则把5V改为3.3V即可。该模块核心就是一块PL2303、CP2102芯片进行USB与TTL电平的转换

3.UART通信

UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。奇校验是指每帧数据中,包括数据位和奇偶校验位在内的全部9个位中1的个数必须是奇数,偶校验同理。

起始位为0,停止位为1。没有奇偶校验位,发送和接收一次数据就是10位。

3.1串行口的结构

 (1)有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。

(2)SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:

  • SM0和SM1为工作方式选择位,可选择四种工作方式:

  • SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
  • REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
  • TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用
  • RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位
  • TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
  • RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

(3)PCON中只有一位SMOD与串行口工作有关

SMOD(PCON.7)  波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。

3.2串口的工作方式1

方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。

(1)方式1输出

(2)方式1输入

用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平。检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。

接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。

3.3定时器初始值计算公式

(1)51单片机串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

方式0的波特率 =  fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)

(2)当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。

这时溢出率取决于TH1中的计数值。 T1 溢出率 = fosc /{12×[256 -(TH1)]}。一般fosc=12MHZ或11.0592MHz

3.4实验程序

(1)普中科技的程序

#include "reg52.h"

typedef    unsigned int u16;
typedef unsigned char u8;

void UsartInit()
{
    SCON=0x50;//串口的工作方式1,而且REN=1(允许串口接收位)
    TMOD=0x20;//计数器T1,工作方式2
    PCON=0x80;//波特率增倍,SMOD=1

    TH1=0xF3;//计数器的初值,此时波特率是4800=(2/32)*T1溢出率,所以T1溢出率=76800
    TL1=0xF3;//T1溢出率=12MHZ/(12*(256-TH1))=76800,所以TH1=243=0xf3

    EA=1; //打开总中断开关
    ES=1;//    打开接收中断开关
    TR1=1; // 打开计数器
}

void main()
{
    UsartInit();
    while(1);
}

void Usart() interrupt 4
{
    u8 ReceiveData;

    ReceiveData=SBUF;//    接收到的数据
    RI=0;               //清除接收中断标志位
    SBUF=ReceiveData;     //    将接收的数据移到发送缓存器
    while(!TI);//          等待数据发送完成
    TI=0;         //           清除发送完成标志


}

************************************************************************************************************

(2)拓展程序

#include <reg51.h>            
#include <intrins.h>

typedef unsigned int u16;      
typedef unsigned char u8;

sbit led=P2^0;


void UsartInit()
{
    SCON=0x50;//串口工作方式1,REN=1:打开串口允许位
    PCON=0x80;//倍频

    TMOD=0x20;    //定时器T1,工作方式2
    TH1=0xF3; //波特率为4800=(2*32)/T1溢出率,所以T1溢出率=76800
    TL1=0xF3; //T1溢出率=12M/{12*(256-TH1)}  TH1=243

    EA=1;
    ES=1;
//    ET1=1; 不打开定时中断
    TR1=1;

}

void UsartSendbyte(u8 byte)
{
         
    SBUF=byte;
    while(!TI);
    TI=0;

}

void UsartSendchar(u8 *c)
{
      while(*c!='\0')
      {
             UsartSendbyte(*c);
          c++;

      }


}

void main()
{
   UsartInit();
   while(1);


}

void Usart() interrupt 4
{
     u8 receiveData;
    u8 a[]="I receive\r\n";

    if(RI)
    {
         RI=0;
         receiveData=SBUF;
        if(receiveData=='1')
        {
             led=0;

      }
        else
        {
             led=1;

        }

    }
    UsartSendchar(a);
   if(TI)
   {

        TI=0; 

}

}

(3)汇编指令分析

发送指令:   MOV SBUF,A  ;CPU把累加器A中的内容写入发送的SBUF(99H),再由TXD引脚一位一位地向外发送,即:若接收数据,只需要在串口中断标志位置位后(通过中断方式或查询方式),就可读取sbuf中的内容了。 


接收指令:   MOV  A, SBUF      ;接收端RXD一位一位地接收数据,直到收到一个完整的字符数据后,则通知CPU,再通过这条指令CPU从SBUF(99H)中读出数据,并送到累加器中.

(4)单片机与单片机的通信

  • 点对点的通信--硬件连接

  • 多机通信---硬件连接

单片机构成的多机系统常采用总线型主从式结构。所谓主从式,即在数个单片机中,有一个是主机,其余的是从机,从机要服从主机的调度、支配。80C51单片机的串行口方式2和方式3适于这种主从式的通信结构。当然采用不同的通信标准时,还需进行相应的电平转换,有时还要对信号进行光电隔离。在实际的多机应用系统中,常采用RS-485串行标准总线进行数据传输。

  • 14
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值