【51】串行口通信,配置理论和c51代码

目录

一、理论介绍

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串口相关寄存器

4af9a5b94afb44819cde82c6a8a92c08.png

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

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

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

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

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

1): SM0、SM1(Serial Mode)

80e1dd8c401447d28dedeacd7fa4e1a5.png

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

2): SM2

325cbfe1dce14f098f37f82568fc7138.png

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

 3): REN (Receive Enable) 

ab26b392b8dc4c94824b2ee4dcc2f566.png

        置1,允许接收

4):  TB8、RB8

6f4ce8c7ba37483aaaa00b03e4954823.png

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

5): TI、RI

a80a504d3c964c82a4b02aa6e1d7debd.png

4adb560304f54affa85e5cf21fa36c43.png

        在初始化时置为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 电源控制)(不可位寻址):

dadf0f912be3451aabcbe85cf9923826.png

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

二、串口配置代码实例

1. 串口初始化函数

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

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

b16677707a4d401f865b33c7391d81ba.png

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

ee53c12927f94eea80f1ac20078dacb8.png

区分模式1与模式2:

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

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

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

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

38f2e5ec6d6746c7b89923b3e938abb5.png

 最终配置代码如下:

79530d1baee542b0b2a5846f91096dc6.png

代码释义:

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

2. 串口发送函数

8c08947f576d4807810ba83363819840.png

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

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

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

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

3. 串口接收设置

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

a468fa9b0ba340af985b0b1f6990aad8.png

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

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

39b5df445f0a4575adbb5afa2981ba83.png

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

三、进一步了解串口

1. 硬件电路

5b015d9121bd4e15a2a49eb44dc4cb04.png

注:“电平标准”是数据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. 常见通信接口比较

ac6e2c4e5cfe4a9ba8effb7276416aa3.png

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

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

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

b55a890c91514ac2af47ed5e0b9abf0d.png

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

4. 串口内部模式图

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

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zosea231

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值