串行通信的基础知识以及简单的应用(通过使用Proteus、VSPD、COMTool通过串口控制LED)。

串行通信基础知识

串行通信基本介绍

串行通信

是一种设备与设备间的数据交换方式,串行通信是通过通信通道或计算机总线一次一次发送一位数据的过程,它遵循串行通信协议。

串行通信标准

有RS-232C / RS-422A / RS-485EIA(电子工业协会的通信标准),但是其中使用最为广泛的是RS-232C标准。

设备类型

既然是通信,当然至少要有两个设备。

DCE: 数据通信设备。此术语表示被动运行的设备,例如调制解调器,打印机和绘图仪。

DTE: 数据终端设备。此术语表示活动运行的设备,例如计算机。

参考链接

串行通信基础知识

串行通讯

USART—串口通信

串口通讯(上)——基础概念

信号线说明

在RS-232C中,已定义并标准化了要使用的连接器和信号分配。下表描述了D-sub 9针信号分配和信号线。

UART-Serial

序号名称符号数据方向说明
1载波检测DCDDTE→DCEData Carrier Detect,数据载波检测,用于DTE告知对方,本机是否收到对方的载波信号
2接收数据RXDDTE←DCEReceive Data,数据接收信号,即输入
3发送数据TXDDTE→DCETransmit Data,数据发送信号,即输出。两个设备之间的TXD与RXD应交叉相连
4数据终端(DTE)就绪DTRDTE→DCEData Terminal Ready, 数据终端就绪,用于(DTE)就DTE向对方告知本机是否已准备好绪
5信号地GND-地线,两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,所以两个串口设备之间必须要使用地线连接,即共地。
6数据设备(DCE)就绪DSRDTE←DCEData Set Ready,数据发送就绪,用于DCE告(DCE)就知对方本机是否处于待命状态绪
7请求发送RTSDTE→DCERequest To Send,请求发送,DTE 请求DCE本设备向DCE端发送数据
8允许发送CTSDTE←DCEClear To Send,允许发送,DCE回应对方的RTS发送请求,告知对方是否可以发送数据
9响铃指示RIDTE←DCERing Indicator, 响铃指示,表示DCE端与线路已接通

简单的应用

通过Proteus以及虚拟串口工具VSPD和串口助手COMTool可以在电脑上仿真串口通信。

实现如下功能

当我们在PC上的COMTool中发送'a'时,单片机连接的LED每隔1s闪烁1次。当我们在COMTool中发送'b'时,单片机连接的LED每隔2s闪烁1次。当我们在COMTool中发送'c'时,单片机连接的LED熄灭

本文所使用的软件

  1. Proteus 8 professional
  2. Virtual Serial Port Driver 9.0
  3. COMTool

前置知识

对于80c51单片机与串口通信相关的寄存器

串行端口缓冲寄存器(SBUF)

占用同一地址的物理上的两个寄存器,一个只读,一个只写。当对该地址进行写操作时对只写寄存器进行操作,当对该地址进行读操作时对只读寄存器进行操作

串行端口控制寄存器(SCON)

地址是98H,因此可以位寻址,用以设定串行口工作方式,接收/发送控制及设置状态标志的特殊功能寄存器,详细介绍如下(该寄存器在上点后):

符号功能
7SM0与SM1组合使用,控制串口工作方式
6SM1与SM0组合使用,控制串口工作方式
5SM2多机通信控制位,主要用于工作方式2和方式3。
4REN允许串行接收位,由软件置1或0
3TB8补充位,具体作用可以由软件决定
2RB8补充位,具体作用可以由软件决定
1TI发送中断标志位,数据发送完毕时由硬件置1,需要由软件置0
0RI接收中断标志位,数据接收完毕时由硬件置1,需要由软件置0

注:该寄存器在上电后所有位都会置0

串行端口工作方式

SM0SM1工作方式说明波特率
000移位寄存器Fosc/12
01110位异步收发器(8位数据)由定时器1决定
10211位异步收发器(9位数据)Fosc/64或Fosc/32
11311位异步收发器(9位数据)由定时器1决定

注:Fosc为晶体振荡器的频率。

定时器1做波特率发生器

当使用定时器1做波特率发生器时,应该尽量使用其定时器工作方式2,以自动装载初值模式用作波特率发生器。如果使用其它工作方式,需要使用中断服务程序重装初值。中断响应时间和执行指令时间会使波特率产生一定的误差,虽然可用改变初值的办法加以调整。

在本文中,使用11.0592Mhz晶体振荡器为单片机提供机器频率,使用该值的理由参见下方的相关链接3

计算公式如下

晶振频率11.0592Mhz(Fosc),Baudrate 波特率
当SMOD为0时:Baudrate = Fosc/(32 * 12 * (256-TH1))
当SMOD为1时:Baudrate = Fosc/(16 * 12 * (256-TH1))

套入公式解出定时器初值TH1=0xFD

相关链接

80C51串行口通信

80C51的串行口结构和原理(1-概念)

8051通讯协议:UART,RS232

8051 UART /串行通信教程

原理图部分

80c51单片机+LED电路+串口电路

UART-LED

代码部分

该代码在Keil 5调试通过

#include<reg51.h>

unsigned int Count=0;
//Fosc=11.0592Mhz
unsigned int Count_Max=3600;
sbit LED_Status=P1^0;

char Flash_Mode='a';

//初始化串口
void UART_Init(){
    SCON=0x50;
    PCON=0x00;
    ES=1;
}

//初始化定时器
void InitTimer(){
    TMOD=0x22;
    EA=1;
    //初始化定时器0
    TH0=0x00;
    TL0=0x00;
    ET0=1;
    TR0=1;
    //初始化定时器1(波特率发生器)
    TL1=0xFD;
    TH1=0xFD;
    TR1=1;
}

//重置定时器
void ResetTimer0(){
    TR0=0;
    TL0=0x00;
    Count=0;
    TR0=1;
}

//LED闪烁
void Flash(){
    unsigned int i=20000;
    LED_Status=1;
    while(--i);
    LED_Status=0;
}

void is_Flash() interrupt 1{
    if(Count<Count_Max){
        ++Count;
    }
    else{
        Flash();
        Count=0;
    }
}

//处理通过串口接收的数据
void UART_Recv() interrupt 4{
    ES=0;
    if(RI){
        if(SBUF==Flash_Mode){
            ES=1;
            return;
        }
        Flash_Mode=SBUF;
        switch(Flash_Mode){
            case 'a':{
                ResetTimer0();
                Count_Max=3600;
            }break;
            case 'b':{
                ResetTimer0();
                Count_Max=7200;
            }break;
            case 'c':{
                TR0=0;
                LED_Status=0;
            }break;
            default:break;
        }
        RI=0;
    }
    ES=1;
}

void main(){
    Flash();
    InitTimer();
    UART_Init();
    while(1);
}

调试部分

  1. 通过VSPD创建串口对
  2. 在Proteus导入在Keil 5中生成的HEX文件
  3. 在Proteus上进行仿真,在COMTool上打开对应串口
  4. 在COMTool上发送'a''b''c',观察Proteus上LED的变化情况

调试视频

结语

关于VSPD和COMTool这两个软件的使用还是非常简单的,所以在本文中并没有详细的描述,最主要的难点是定时器与波特率之间的联系,以及通过波特率来计算定时器1的初值。

Last modification:May 18th, 2020 at 09:46 am