0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UART串口通信的基本应用

GReq_mcu168 来源:玩转单片机 2020-08-05 10:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

通信的三种基本类型

常用的通信从传输方向上可以分为单工通信、半双工通信、全双工通信三类。

单工通信就是指只允许一方向另外一方传送信息,而另一方不能回传信息。比如电视遥控器、收音机广播等,都是单工通信技术

半双工通信是指数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一方,比如我们的对讲机就是典型的半双工。

全双工通信就发送数据的同时也能够接收数据,两者同步进行,就如同我们的电话一样,我们说话的同时也可以听到对方的声音。

UART 模块介绍

IO 口模拟串口通信,让大家了解了串口通信的本质,但是我们的单片机程序却需要不停的检测扫描单片机 IO 口收到的数据,大量占用了单片机的运行时间。这时候就会有聪明人想了,其实我们并不是很关心通信的过程,我们只需要一个通信的结果,最终得到接收到的数据就行了。这样我们可以在单片机内部做一个硬件模块,让它自动接收数据,接收完了,通知我们一下就可以了,我们的 51 单片机内部就存在这样一个 UART 模块,要正确使用它,当然还得先把对应的特殊功能寄存器配置好。

51 单片机的 UART 串口的结构由串行口控制寄存器 SCON、发送和接收电路三部分构成,先来了解一下串口控制寄存器 SCON。如表 11-1 表 11-2 所示。

表 11-1 SCON——串行控制寄存器的位分配

表 11-2 SCON——串行控制寄存器的位描述

前边学了那么多寄存器的配置,相信 SCON 这个地方,对于大多数同学来说已经不是难点了,应该能看懂并且可以自己配置了。对于串口的四种模式,模式 1 是最常用的,就是我们前边提到的 1 位起始位,8 位数据位和 1 位停止位。下面我们就详细介绍模式 1 的工作细节和使用方法,至于其它 3 种模式与此也是大同小异,真正遇到需要使用的时候大家再去查阅相关资料就行了。

在我们使用 IO 口模拟串口通信的时候,串口的波特率是使用定时器 T0 的中断体现出来的。在硬件串口模块中,有一个专门的波特率发生器用来控制发送和接收数据的速度。对于STC89C52 单片机来讲,这个波特率发生器只能由定时器 T1 或定时器 T2 产生,而不能由定时器 T0 产生,这和我们模拟的通信是完全不同的概念。

如果用定时器 2,需要配置额外的寄存器,默认是使用定时器 1 的,我们本章内容主要就使用定时器 T1 作为波特率发生器来讲解,方式 1 下的波特率发生器必须使用定时器 T1 的模式 2,也就是自动重装载模式,定时器的重载值计算公式为:

TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率

和波特率有关的还有一个寄存器,是一个电源管理寄存器 PCON,他的最高位可以把波特率提高一倍,也就是如果写 PCON |= 0x80 以后,计算公式就成了:

TH1 = TL1 = 256 - 晶振值/12 /16 /波特率

公式中数字的含义这里解释一下,256 是 8 位定时器的溢出值,也就是 TL1 的溢出值,晶振值在我们的开发板上就是 11059200,12 是说 1 个机器周期等于 12 个时钟周期,值得关注的是这个 16,我们来重点说明。在 IO 口模拟串口通信接收数据的时候,采集的是这一位数据的中间位置,而实际上串口模块比我们模拟的要复杂和精确一些。他采取的方式是把一位信号采集 16 次,其中第 7、8、9 次取出来,这三次中其中两次如果是高电平,那么就认定这一位数据是 1,如果两次是低电平,那么就认定这一位是 0,这样一旦受到意外干扰读错一次数据,也依然可以保证最终数据的正确性。

了解了串口采集模式,在这里要给大家留一个思考题。“晶振值/12/2/16/波特率”这个地方计算的时候,出现不能除尽,或者出现小数怎么办,允许出现多大的偏差?把这部分理解了,也就理解了我们的晶振为何使用 11.0592M 了。

串口通信的发送和接收电路在物理上有 2 个名字相同的 SBUF 寄存器,它们的地址也都是 0x99,但是一个用来做发送缓冲,一个用来做接收缓冲。意思就是说,有 2 个房间,两个房间的门牌号是一样的,其中一个只出人不进人,另外一个只进人不出人,这样的话,我们就可以实现 UART 的全双工通信,相互之间不会产生干扰。但是在逻辑上呢,我们每次只操作 SBUF,单片机会自动根据对它执行的是“读”还是“写”操作来选择是接收 SBUF 还是发送 SBUF,后边通过程序,我们就会彻底了解这个问题。

UART 串口程序

一般情况下,我们编写串口通信程序的基本步骤如下所示:

配置串口为模式 1。

配置定时器 T1 为模式 2,即自动重装模式。

根据波特率计算 TH1 和 TL1 的初值,如果有需要可以使用 PCON 进行波特率加倍。

打开定时器控制寄存器 TR1,让定时器跑起来。

这里还要特别注意一下,就是在使用 T1 做波特率发生器的时候,千万不要再使能 T1 的中断了。

我们先来看一下由 IO 口模拟串口通信直接改为使用硬件 UART 模块时的程序代码,看看程序是不是简单了很多,因为大部分的工作硬件模块都替我们做了。程序功能和 IO 口模拟的是完全一样的。

#include 《reg52.h》

void ConfigUART(unsigned int baud);

void main(){

ConfigUART(9600); //配置波特率为 9600

while (1){

while (!RI); //等待接收完成

RI = 0; //清零接收中断标志位

SBUF = SBUF + 1; //接收到的数据+1 后,发送回去

while (!TI); //等待发送完成

TI = 0; //清零发送中断标志位

}

}

/* 串口配置函数,baud-通信波特率 */

void ConfigUART(unsigned int baud){

SCON = 0x50; //配置串口为模式 1

TMOD &= 0x0F; //清零 T1 的控制位

TMOD |= 0x20; //配置 T1 为模式 2

TH1 = 256 - (11059200/12/32)/baud; //计算 T1 重载值

TL1 = TH1; //初值等于重载值

ET1 = 0; //禁止 T1 中断

TR1 = 1; //启动 T1

}

当然了,这个程序还是用在主循环里等待接收中断标志位和发送中断标志位的方法来编写的,而实际工程开发中,当然就不能这么干了,我们也只是为了用直观的对比来告诉同学们硬件模块可以大大简化程序代码,那么实际使用串口的时候就用到串口中断了,来看一下用中断实现的程序。请注意一点,因为接收和发送触发的是同一个串口中断,所以在串口中断函数中就必须先判断是哪种中断,然后再作出相应的处理。

#include 《reg52.h》

void ConfigUART(unsigned int baud);

void main(){

EA = 1; //使能总中断

ConfigUART(9600); //配置波特率为 9600

while (1);

}

/* 串口配置函数,baud-通信波特率 */

void ConfigUART(unsigned int baud){

SCON = 0x50; //配置串口为模式 1

TMOD &= 0x0F; //清零 T1 的控制位

TMOD |= 0x20; //配置 T1 为模式 2

TH1 = 256 - (11059200/12/32)/baud; //计算 T1 重载值

TL1 = TH1; //初值等于重载值

ET1 = 0; //禁止 T1 中断

ES = 1; //使能串口中断

TR1 = 1; //启动 T1

}

/* UART 中断服务函数 */

void InterruptUART() interrupt 4{

if (RI){ //接收到字节

RI = 0; //手动清零接收中断标志位

SBUF = SBUF + 1; //接收的数据+1 后发回,左边是发送 SBUF,右边是接收 SBUF

}

if (TI){ //字节发送完毕

TI = 0; //手动清零发送中断标志位

}

}

大家可以试验一下,看看是不是和前边用 IO 口模拟通信实现的效果一致,而主循环却 完全空出来了,我们就可以随意添加其它功能代码进去。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5625

    浏览量

    130880
  • uart
    +关注

    关注

    22

    文章

    1327

    浏览量

    107249
  • 串口通信
    +关注

    关注

    34

    文章

    1669

    浏览量

    58300

原文标题:UART串口通信的基本应用

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    JL杰理AC696N系列芯片开发UART串口应用宝典:打印、调音与通信Demo

    本文阐述了关于杰理AC696N系列芯片开发UART串口应用:打印、调音、通信Demo,能够为大家对AC696N系列芯片做串口类方案时的一个小参考,从多个方面入手,提示大家在一些小细节方
    的头像 发表于 03-31 10:00 576次阅读
    JL杰理AC696N系列芯片开发<b class='flag-5'>UART</b><b class='flag-5'>串口</b>应用宝典:打印、调音与<b class='flag-5'>通信</b>Demo

    17路UART,多串口服务器方案分享

    。 ▍ 多串口服务器方案 我们基于创龙科技T536评估板,搭建了一套12路串口服务器方案,该方案通过2路RS232、6路RS485和4路TTL UART接口连接12个温湿度传感器,基于Modbus协议实现多通道实时数据采集,并通
    的头像 发表于 03-02 17:03 292次阅读
    17路<b class='flag-5'>UART</b>,多<b class='flag-5'>串口</b>服务器方案分享

    【瑞萨RA × Zephyr评测】LED、按键和UART

    实现在Zephyr操作系统下按键控制 LED 的开关状态,并通过 UART 输出按键事件日志,验证 GPIO 和串口通信功能。
    的头像 发表于 01-10 10:21 2819次阅读
    【瑞萨RA × Zephyr评测】LED、按键和<b class='flag-5'>UART</b>

    NS16C2552/NS16C2752双串口UART芯片深度剖析

    NS16C2552/NS16C2752双串口UART芯片深度剖析 在电子设计领域,UART(通用异步收发传输器)芯片是实现串行通信的关键组件。TI公司的NS16C2552和NS16C2
    的头像 发表于 12-29 11:15 716次阅读

    使用CW32 MCU来实现UART串口通信与GPIO控制

    最近在项目中使用CW32 MCU,完成了一个简单的UART串口通信和GPIO控制的功能。CW32 MCU的资源相对丰富,特别适合一些低成本、低功耗的嵌入式应用。这里分享一下UART
    发表于 12-04 08:17

    UART 串口通信还能玩出什么花样?

    还记得打印机、鼠标和调制解调器曾经使用粗线和笨重连接器吗?那些必须拧进电脑里的连接器?这些设备很可能使用UART与电脑通信。虽然USB几乎完全取代了那些老式的线缆和连接器,但UART绝非过时之物。你
    的头像 发表于 11-24 19:05 648次阅读
    <b class='flag-5'>UART</b> <b class='flag-5'>串口</b><b class='flag-5'>通信</b>还能玩出什么花样?

    UART 升级到 USB-C: 串口通信演变史

    在嵌入式开发里,“串口”几乎是每个人绕不开的关键词。刚接触单片机时,我们用的就是UART:插上线,打开串口调试助手,能收发数据就觉得世界都亮了。然而,当你回头看,现在的桌面电脑几乎找不到传统
    的头像 发表于 11-17 10:54 1872次阅读
    <b class='flag-5'>UART</b> 升级到 USB-C: <b class='flag-5'>串口</b><b class='flag-5'>通信</b>演变史

    多路UART数据转发芯片 支持1主4从UART接口 UART扩展芯片

    -40℃ 至 85℃ 的工业级温度范围,能够在严苛环境下保持稳定通信。该芯片提供 1 个主 UART 和 4 个从 UART,共 5 个独立接口。主接口最高通信速率可达 460800
    的头像 发表于 11-12 10:33 681次阅读

    基于UART通讯控制TMC2208/2209模块驱动两相四线步进电机

    本文将介绍如何通过UART串口通信控制TMC2208/2209步进电机驱动模块驱动42步进电机。从TMC2209详细的说明的寄存器配置方法说明、常用指令说明、模块的串口连接方式、电流、
    的头像 发表于 11-10 19:33 3643次阅读
    基于<b class='flag-5'>UART</b>通讯控制TMC2208/2209模块驱动两相四线步进电机

    全国产UART无线串口模块技术全景解析与应用方案指南

    全国产UART无线串口模块技术全景解析与应用指南 一、国产UART无线模块技术发展现状 1.1 技术演进历程 UART无线串口模块 作为物联
    的头像 发表于 10-27 10:27 844次阅读

    基于FPGA开发板TSP的串口通信设计

    本文详细介绍基于Terasic FPGA开发板TSP(又名C5P和OSK)和其板载CP2102N USB-UART桥接芯片的串口通信系统设计与实现。系统采用Verilog HDL编写UART
    的头像 发表于 10-15 11:05 5012次阅读
    基于FPGA开发板TSP的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>设计

    基于FPGA开发板DE23-Lite的串口通信设计

    DE23-Lite开发板提供了一个UART通信接口(物理接口是下图的Type C接口),用户能够通过主机与Agilex 3 FPGA进行串口通信
    的头像 发表于 10-15 10:57 5038次阅读
    基于FPGA开发板DE23-Lite的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>设计

    Air780EGH串口通信优化:硬件电路设计核心要素剖析

    要充分发挥Air780EGH的串口通信效能,硬件电路设计必须精准把控核心要素。下面将深入分析UART接口的电平标准、流控信号配置、波特率适配及调试串口管理,为优化
    的头像 发表于 08-11 15:44 1004次阅读
    Air780EGH<b class='flag-5'>串口</b><b class='flag-5'>通信</b>优化:硬件电路设计核心要素剖析

    UART 扩展芯片 数据转发多串口扩展 1主4从,高效通信

    uart
    稳控自动化
    发布于 :2025年08月11日 14:20:36

    【沁恒CH585开发板免费试用体验】UART 串口通信

    通信口(UART)就是我们在嵌入式中常说的串口,它还是一种通用的数据通信议。从名字上可以看出,USART在UART基础上增加了同步功能,即U
    发表于 07-08 00:02