七、51单片机串口

  • 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。

  • 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。

  • 51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。

硬件电路

  • 简单双向串口通信有两根通信线(发送端TXD和接收端RXD)

  • TXD与RXD要交叉连接

  • 当只需单向的数据传输时,可以直接一根通信线

  • 当电平标准不一致时,需要加电平转换芯片

  • TXD:Tramsmit Exchang Data

  • RXD: Receive Exchange Data

  • 一般EX开头的英文单词缩写都会缩写成X

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

  • TTL电平:+5V表示1,0V表示0(晶体管晶体管逻辑电路(Transistor-Transistor Logic))

  • RS232电平:-3~-15V表示1,+3~+15V表示0

  • RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

接口及引脚定义

常见通信接口比较

此外还有:CAN、USB等

相关术语:

  • 全双工:通信双方可以在同一时刻互相传输数据

  • 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

  • 单工:通信只能有一方发送到另一方,不能反向传输

  • 异步:通信双方各自约定通信速率

  • 同步:通信双方靠一根时钟线来约定通信速率

  • 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

51单片机的UART

  • STC89C52有1个UART

  • STC89C52的UART有四种工作模式: 模式0:同步移位寄存器 模式1:8位UART,波特率可变(常用) 模式2:9位UART,波特率固定 模式3:9位UART,波特率可变

                

串口参数及时序图

  • 波特率:串口通信的速率(发送和接收各数据位的间隔时间)

  • 检验位:用于数据验证

奇偶校验:约定当前数据中1的个数是奇数或者是偶数,通过在检验位补1或者0来校验数据是否正确

例如:发送数据 0000 0011,当前约定的是奇数校验,则需在检验位补1,使得数据的1为奇数,此时数据变成 0000 0011 1,如果约定为偶数校验则补0,此时数据为 0000 0011 0.

  • 停止位:用于数据帧间隔

8位数据格式

9位数据格式

串口模式图

  • SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器

  • 在发送完成后,会产生一个TI(Transmit Interrupt发送中断)来告知发送完成,在接收数据时也会产生一个RI(Receive Interrupt 接收中断),来告知有数据发送过来了。

串口和中断系统

为了方便讲解,这里使用的中断系统图是传统51单片机的图,STC89C52的中断系统图可参考手册

串口相关寄存器

数据显示模式

  • HEX模式/十六进制模式/二进制模式:以原始数据的形式显示

  • 文本模式/字符模式:以原始数据编码后的形式显示

串口向电脑发送数据

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char Sec;
void main()
{
        UART_Init();                        //串口初始化
        while(1)
        {
                UART_SendByte(Sec);        //串口发送一个字节
                Sec++;                                //Sec自增
                Delay(1000);                //延时1秒
        }
}

串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。其格式如下: 

SM0/FE:当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个无效停 止位时,通过UART接收器设置该位。它必须由软件清零。

当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式, 如下表所示。

  • 其中SM0、SM1按下列组合确定串行口的工作方式:

  • REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动 串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。

  • TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位, 即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位

  • RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1, 向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到 停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复位,即RI=0。

  • 定时器的配置可看上节。

#include <REGX52.H>
/**
  * @brief  串口初始化,4800bps@12.000MHz
  * @param  无
  * @retval 无
  */
void UART_Init()
{
        SCON=0x40;
        PCON |= 0x80;
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x20;                //设置定时器模式
        TL1 = 0xF3;                //设定定时初值
        TH1 = 0xF3;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
/**
  * @brief  串口发送一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
        SBUF=Byte;
        while(TI==0);
        TI=0;
}

波特率的计算

可看到UART.c中串口初始化函数里TL(定时器初值)为0xF3(10进制为243),计数器最大值为2^8(256),所以计数值为256-243 = 13,所以每隔13us溢出一次,那么溢出的频率就是1/13(约等于0.7692MHZ),在配置SMOD时,将其配置为1,波特率加倍,通过看串口与系统中断的原理图可知波特率还需要除以16,0.7692MHZ/16 = 0.00480769MHZ,转化为HZ等于4807.69HZ。

电脑通过串口控制LED灯

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
void main()
{
        UART_Init();                //串口初始化
        while(1)
        {     
        }
}
void UART_Routine() interrupt 4
{
        if(RI==1)                                        //如果接收标志位为1,接收到了数据
        {
                P2=~SBUF;                                //读取数据,取反后输出到LED
                UART_SendByte(SBUF);        //将受到的数据发回串口
                RI=0;                                        //接收标志位清0
        }
}

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值