当前位置: 首页 > news >正文

51单片机学习9 串口通讯

51单片机学习9 串口通讯

  • 一、串口通讯简介
    • UART
    • STC89C51RC/RD+的串口资源
  • 二、51单片机串口介绍
    • 1. 内部结构
    • 2. 寄存器
      • (1)串口控制寄存器SCON
      • (2)电源控制寄存器PCON
    • 3. 计算波特率
    • 4. 串口配置步骤
  • 三、 开发示例
    • 1. 硬件电路
    • 2. 代码实现

在这里插入图片描述

一、串口通讯简介

51单片机的串口通信是通过内置的串行通信口(UART)实现的,常用于与外部设备进行数据交换。
串口通信是一种基于串行传输的数据通信方式,通过一根数据线和一根时钟线(或不需要时钟线)进行数据传输。数据按照一定的规则和时序被发送和接收。

UART

串口通信通常使用异步串行通信协议(UART),其中数据按照一定的帧格式进行传输,包括起始位、数据位、校验位和停止位等。常见的串口通信速率(波特率)有9600、19200、38400等。

STC89C51RC/RD+的串口资源

STC89C51RC/RD+内置2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。 两个缓冲器可以共用一个地址码 99H。
两个缓冲器统称串行通信特殊功能寄存器SBUF。

二、51单片机串口介绍

1. 内部结构

在这里插入图片描述
如图所示:

  • TXD:接P3.1引脚
  • RXD:接P3.0引脚
  • SBUF 是缓冲区,分为发送缓冲区和接收缓冲区。
  • TH1和TL1是定时器1的功能,需要工作在方式2(自动重载模式),用来设置波特率;
  • 接收数据时,数据从引脚接收,通过移位寄存器接收到 SBUF,然后控制寄存器把RI置1(接收中断),然后触发中断;
  • 发送数据时,SBUF传到控制门,由发送控制器控制TI 触发中断;

2. 寄存器

(1)串口控制寄存器SCON

SCON 寄存器结构

Bit:   7      6      5      4      3      2      1      0┌────┬────┬────┬────┬────┬────┬────┬────┐│ SM0 │ SM1 │ SM2 │ REN │ TB8 │ RB8 │ TI  │ RI  │└────┴────┴────┴────┴────┴────┴────┴────┘

SCON 寄存器各位的功能

  • 位7-5:SM0、SM1、SM2(串口工作模式位)
  • 这三位用于设置串口工作的不同模式。它们的具体含义如下:
  • SM0、SM1:用于设置串口工作的模式,共有四种工作模式,包括模式0、模式1、模式2和模式3。
SM1SM0工作模式描述
00模式0移位寄存器,波特率固定
01模式110位异步收发器(8位数据),波特率可变
10模式211位异步收发器(9位数据),波特率固定
11模式311位异步收发器(9位数据),波特率可变
  • SM2:用于设置串口是否工作在多机通信模式,一般工作在单机模式时,该位为0。

  • 位4:REN(接收允许位): 该位用于控制串口的接收功能,置1时允许串口接收数据,清0时禁止串口接收数据。

  • 位3:TB8(发送位8): 该位用于设置在串口工作在模式2或模式3时发送的数据的第9位,通常用于设置奇偶校验位。

  • 位2:RB8(接收位8): 该位用于存储在串口接收到的数据的第9位,通常用于接收端的奇偶校验检测。

  • 位1:TI(发送中断标志位): 该位用于指示串口发送数据的中断标志,发送完一帧数据后会被置1,需要在中断服务程序中清零。

  • 位0:RI(接收中断标志位): 该位用于指示串口接收数据的中断标志,接收到一帧数据后会被置1,需要在中断服务程序中清零。

(2)电源控制寄存器PCON

PCON全称为Power Control Register(电源控制寄存器),它包含了一些与单片机的电源管理相关的控制位。

PCON寄存器结构

Bit:   7      6      5      4      3      2      1      0┌────┬────┬────┬────┬────┬────┬────┬────┐│ SMOD │ SMOD0│---- │ ---- │ ---- │ ---- │ POF0 │ POF1 │└────┴────┴────┴────┴────┴────┴────┴────┘

PCON寄存器各位的功能

  • 位7:SMOD(串口波特率倍增控制位)

    • SMOD用于控制串口波特率是否加倍。置1时,串口波特率加倍;清0时,不加倍。
  • 位6:SMOD0(串口0波特率倍增控制位)

    • 该位是SMOD的扩展位,一般在多串口通信时使用。SMOD置1时,SMOD0表示串口0的波特率是否加倍;SMOD清0时,该位无效。
      其它位与串口通讯没大关系。

3. 计算波特率

使用本文开源地址里的 51 波特率计算.exe 工具:
注意软件里设置定时器1的定时器方式,不是串口的工作方式。
SMOD:是否倍频(不是波特率加倍,只是计算初始值变化)。

在这里插入图片描述
晶振频率最好使用11.0592,这样误差比较小。

4. 串口配置步骤

  1. 通过TMOD寄存器 确定定时器T1工作方式2(自动重载) ;
  2. 通过SCON寄存器 确定串口工作方式 ;
  3. 计算T1的初值,设定波特率,装载 TH1,TL1;
  4. 启动定时器T1;
  5. 开启中断;
  6. 串口初始化;

三、 开发示例

1. 硬件电路

在这里插入图片描述
开发板使用USB转串口电路,同时也是下载模块的电路。

2. 代码实现

本代码效果: 串口接收数据后,原样返回串口。

uart_utils.c

#include "uart_utils.h"
#include <reg52.h>/**
* @brief 串口初始化
*/
void uart_init(u8 baud){// 设置计数器1的工作方式2TMOD = 0x20;// 设置定时器1的工作方式1SCON = 0x50; // 0b01010000 // 波特率倍频PCON = 0x80; // 0b10000000// 计数器初始值TH1 = baud;TL1 = baud;// 打开接收中断ES = 1; // 打开总中断EA = 1;// 启动定时器1TR1 = 1;
}
/**
* @brief 串口发送数据
*/
void uart_send(u8 dat){SBUF = dat;while(!TI);TI = 0;
}
/**
* @brief 使用中断接收串口数据
*/
void uart_recv() interrupt 4{u8 dat;if(RI){RI = 0;dat = SBUF;uart_send(dat);}
}

main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "types.h"
#include "timer_utils.h"
#include "uart_utils.h"/**
* @brief 主函数
*/
main()
{// 关闭所有ledled_all_off();uart_init(0xfa);while(1){}
}

操作步骤:

  1. 烧录程序;
  2. 在电脑打开串口调试助手,连接开发板串口,点打开,如下图所示;
  3. 在发送区输入字符,点发送。

调试效果:
在这里插入图片描述
本文代码开源地址:
https://gitee.com/xundh/learn51.git

相关文章:

  • 为wordpress特定分类目录下的内容添加自定义字段
  • 2021年XX省赛职业院校技能大赛”高职组 计算机网络应用赛项 网络构建模块竞赛真题
  • vscode使用Runner插件将.exe文件统一放到一个目录下
  • git基础-tagging
  • 【服务器】常见服务器高危端口
  • 爬取搜狗翻译项目实例
  • 网络协议栈--传输层--UDP/TCP协议
  • 简单的查看iPhone储存空间的几种方法,总有一种是你想要的
  • nginx mirror 流量镜像
  • [flask]http请求//获取请求头信息+客户端信息
  • 【C++】手撕哈希表的闭散列和开散列
  • Day08 Java复习8 Spring MVC概念
  • 蓝桥杯刷题-day5-动态规划
  • Chrome 插件打包发布
  • 单元测试框架 Junit
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Debian下无root权限使用Python访问Oracle
  • docker容器内的网络抓包
  • Golang-长连接-状态推送
  • If…else
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java IO学习笔记一
  • Java基本数据类型之Number
  • js 实现textarea输入字数提示
  • Laravel Telescope:优雅的应用调试工具
  • overflow: hidden IE7无效
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring boot 整合mybatis 无法输出sql的问题
  • Webpack 4 学习01(基础配置)
  • 关于Java中分层中遇到的一些问题
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 网页视频流m3u8/ts视频下载
  • ionic异常记录
  • 带你开发类似Pokemon Go的AR游戏
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)创业家杂志:UCWEB天使第一步
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .bat批处理(一):@echo off
  • .NET 4.0中的泛型协变和反变
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库