admin管理员组

文章数量:1597898

目录

一、理论介绍

1. SCON(Serial Control 串口控制)(可位寻址)

1): SM0、SM1(Serial Mode)

2): SM2

 3): REN (Receive Enable) 

4):  TB8、RB8

5): TI、RI

2. SUBF(Serial Buffer 串行数据缓冲器)

3. PCON(Power Control 电源控制)(不可位寻址):

二、串口配置代码实例

1. 串口初始化函数

2. 串口发送函数

3. 串口接收设置

三、进一步了解串口

1. 硬件电路

2. 常见通信接口比较

3. 串口时序图、相关参数(可在串口助手中设置)

4. 串口内部模式图


        51单片机内部有1个UART(Univer Asynchronous Receiver Transmittier,通用异步收发器)可以实现单片机的串口通信;串口相关引脚有RXD和TXD,在STC89C52单片机上,RXD与P3.0寄存器共用引脚10,TXD与寄存器P3.1共用引脚11

一、理论介绍

51串口相关寄存器

        下面按顺序对每个寄存器进行解析(基于操作手册):

1. SCON(Serial Control 串口控制)(可位寻址)

位序号76543210
位符号SM0/FESM1SM2RENTB8RB8TIRI
含义工作模式控制位接收控制位

方式2或3,发送和接收的第9位数据

发送和接收中断请求标志位

1): SM0、SM1(Serial Mode)

        常配置UART的工作模式为方式1(8位UART,波特率可变),则令SM0=0; SM=1,本文以该模式为例进行串口配置

2): SM2

        使用模式1时不起作用,配置为0

 3): REN (Receive Enable) 

        置1,允许接收

4):  TB8、RB8

        使用模式1时不起作用,配置为0

5): TI、RI

        在初始化时置为0即可,当发送/接收完成时,硬件自动置1,执行中断函数,然后需要软件置0使复位。


至此,SCON的所有位寄存器分析完毕,回顾一下整个寄存器:

位序号76543210
位符号SM0/FESM1SM2RENTB8RB8TIRI
含义工作模式控制位接收控制位

方式2或3,发送和接收的第9位数据

发送和接收中断请求标志位

        若要使用UART的模式1,且允许接收,则配置SCON = 0X50  //0101 0000

2. SUBF(Serial Buffer 串行数据缓冲器)

        AKA: 串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址;写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器,在串口初始化时不需要配置(具体工作方式见目录中“串口内部模式图”)

3. PCON(Power Control 电源控制)(不可位寻址):

        其中,SMOD表现为“置0时T1溢出率除以2,置1时不操作”(具体工作方式见目录中“串口内部模式图”)

二、串口配置代码实例

1. 串口初始化函数

        串口的初始化包括串口本身初始化和波特率配置;前者需配置SCON、PCON寄存器,后者需配置定时器,此处注意串口需要使用定时器1,模式2(8位自动重装模式),而定时器一般配置的是定时器0,模式1,二者配置代码区别如下:

串口定时器配置:定时器1,模式2

 定时器定时/记数配置:定时器0,模式1

区分模式1与模式2:

        十六位(模式1)记数容量大,但每次都需要自己写的代码赋初值,效率低;

        双八位(模式2)将16位分开,8位计数,另8位存放初值,每次计数完成后AR(自动重装)会自动将初值赋给CNT(计数器),不用另做代码处理,效率高。

        具体地,模式2时,定时器会在计数值溢出后自动重新赋值,而不用等待定时器溢出后程序响应中断,再执行相应语句,因而能提高效率

也可用串口助手配置波特率,注意89C52中没有AUXR寄存器,相关代码要删除(使用波特率加倍以减小误差):

 最终配置代码如下:

代码释义:

        SCON、PCON是串口配置,TMOD是关于波特率的定时器模式配置,定时器初值借助软件计算而得,赋值完成后禁止定时器1中断,因为定时器1在用作生成波特率时,只要产生溢出就会产生波特率,不需要中断响应,相应的,ET1=0后自然也不需要对EA置0,最终用TR1=1启动计时器

2. 串口发送函数

        函数执行过程:将待发送的数据写入发送缓存 → 循环检测发送中断信号TI,若检测到TI=1则跳出循环,对TI置0复位

        至此,我们可以用串口初始化函数、串口发送函数通过串口向电脑发送数据,其主函数如:

void main()
{
    UART_Init();
    UART_SendByte(0x11);            //执行结果:电脑端串口助手接收到数据11
}

        注意:使用串口助手时,波特率的配置和串口初始化时的配置要对应,串口要对应;此外,发送速率过快或波特率过大可能产生数据误差,若收发数据不一致,可尝试减慢数据发送速度(如加入延时函数)、更改波特率(如波特率加倍)以减小数据误差

3. 串口接收设置

        在上述基础上,如果要实现串口的接收,则初始化时需要这样设置:

        不同于仅实现串口发送时的初始化函数,这里在配置SCON中的REN=1的基础上,还需配置EA=1; ES=1; (串口接收要用中断)。即:在原有函数的基础上,添加了“允许接收、中断程序”(原有的发送功能仍然有效)

        注意!由于51单片机串口结构及中断原理,串口发送和接收时都会触发中断(同为中断号4),因此,需要通过接收并判断中断信号RI,区分中断信号的具体类别,具体中断函数例如:

        上图中,RI=1表示接收到数据,判断后记得软件置0(复位);至此,我们将中断函数写入主程序,就可以实现当串口接收到设定数据时,执行相应操作

三、进一步了解串口

1. 硬件电路

注:“电平标准”是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
        1. TTL电平: +5V表示1,0V表示0
        2. RS232电平: -3~-15V表示1, +3~+15V表示0
        3. RS485电平:两线压差+2~+6V表示1, -2~-6V表示0 (差分信号)

例如当USB与单片机串口通信,因电平标准不同,需加入芯片转换电平

2. 常见通信接口比较

注:不同“通信方式”区别如下:

        全双工:通信双方可以在同一时刻互相传输数据
        半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
        单工:通信只能有一方发送到另一方,不能反向传输
        异步:通信双方各自约定通信速率
        同步:通信双方靠一根时钟线来约定通信速率
        总线:连接各个设备的数据传输线路(类似于联通各城市的高速公路)

3. 串口时序图、相关参数(可在串口助手中设置)

相比8位数据格式,9位数据格式多出来一位检验位

4. 串口内部模式图

        由上图可以看到,串口利用定时器1(图中T1) 控制波特率。

        此外,以下图串口发送数据过程为例,当发送控制器使能控制门,将发送寄存器SBUF中的数据由TXD发送出去的同时,还会产生发送中断请求信号TI(Transmit Interrupt),激活中断程序。

本文标签: 代码通信串行口理论和