学习STC51单片机18(芯片为STC89C52RCRC)

每日一言

你远比自己想象中强大,咬咬牙,再坚持一下。

UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器,是一种在单片机和嵌入式系统中广泛使用的串行通信协议。它通过两根线(TX 发送、RX 接收)实现全双工通信,特点是异步传输 (无需共享时钟信号),使用特定的帧格式和波特率进行数据传输。

核心概念

异步通信

    1. 没有共享时钟,依赖双方约定的波特率 (如 9600、115200bps)同步数据。
    2. 发送方和接收方各自使用独立的时钟源,通过起始位和停止位标识数据边界。

数据帧格式

    1. 起始位 (1 位,低电平):标志数据开始。
    2. 数据位 (通常 5-8 位):实际传输的数据,默认 8 位可表示一个字节。
    3. 奇偶校验位 (可选):用于简单错误检测。
    4. 停止位 (1 或 2 位,高电平):标志数据结束。

常见参数

    1. 波特率 :每秒传输的比特数,需双方一致。
    2. 数据位 :通常为 8 位(兼容 ASCII 和字节操作)。
    3. 校验位 :无校验、奇校验或偶校验。
    4. 停止位 :1 位或 2 位。

工作原理

发送流程

    1. 空闲状态:线路保持高电平(逻辑 1)。
    2. 发送起始位(低电平),通知接收方准备接收数据。
    3. 按位发送数据(低位在前)。
    4. 可选校验位。
    5. 发送停止位(高电平),恢复空闲状态。

接收流程

    1. 检测到起始位(高→低跳变)后,启动定时器采样数据位。
    2. 按约定的波特率和数据位逐位读取数据。
    3. 验证校验位(如有)。
    4. 根据停止位判断数据结束。

优缺点

  • 优点 :实现简单、成本低、兼容性强,适合短距离通信。
  • 缺点 :传输速率较低(相比 SPI、I²C),抗干扰能力较弱。

应用场景

  • 单片机与传感器、模块(如 GPS、蓝牙模块)通信。
  • 调试信息输出(如 STM32 的串口打印)。
  • 设备间的简单数据传输。

我们来了讲讲波特率吧:波特率就是因为双方硬件不同,所以要设置相同的传输率(波特率),主要用于衡量每秒传输的数据位数,比如9600波特率,就是表示每秒传输9600位数据

首先我们想要进行串口通信那么肯定是要先将的波特率初始化,那么我们现在不会写,我们这个STCISP烧录软件有这个初始化波特率的

那么关键来了计算波特率和晶振有关,我们为什么要选晶振为11.0592Mhz,那是因为和这边计算波特率有关,我们这个参数算波特率是最准的,误差率为0.00%

我们在计算初始波特率参数TH1,TL1的时候需要用到晶振的实际频率数值,所以晶振提供稳定的时钟信号,决定了定时器的计时精度,而定时器又常用来设置波特率,控制数据传输速度。比如在一些单片机中,通过设置定时器的参数,结合晶振频率,就能精准地设定波特率

因为在计算波特率以及单片机相关参数时,使用的公式和算法都是基于基本单位 "赫兹" 来设计的哦

单片机和pc就等于是两个硬件,都有自己的发送和接收缓冲区,,但是pc自己的缓冲区不叫做SUBF

这个接受缓冲区是pc的接收缓冲区 这个发送缓冲区是单片机的发送缓冲区也就是SUBF,单片机的发送缓冲区叫做SUBF,接收缓冲区也叫做SUBF

串口通信1:发送一个字符b给pc

以下是代码

我们要先初始化波特率,在我们还不会自己配置波特率的时候,可以用软件生成的方式来

例如以下这种方式:

这个串口我们选择通用1,8位数据,选择定时器1,8位自动重载,定时器时钟选择12T

??为什么选择8位数据

在异步通信中,数据通常以字节为单位传输,也就是 8 位数据位。这样的设置是为了方便数据的打包和传输,而且和计算机系统中字节的定义相匹配,通用性很强。不同的单片机可能在具体设置上有点差异,但 8 位数据位是很常见的。

复习一下

bit 是位,是计算机中最小的数据单位,只有 0 和 1 两种状态。而字节(Byte)是由 8 个 bit 组成的,它是信息存储中常用的基本单位呢

好的知道了之后我们讲解main函数里面的操作我们的目的是输入a发送后,pc循环接收到a

那么我们要先将b赋值到data_info (好看的作用),然后将data_info赋值到SUBF,也就是发送缓冲区

发送缓冲区就是SUBF = data_info 这样的用法目的是 把东西放在发送缓冲区啊.....哈哈哈哈,要把东西发送出去,肯定要往发送缓冲区装东西啊 哈哈哈

然后就好了,我们加了延时1秒循环发送和pc循环接收反馈到stcisp软件上如下

我们只需要打开串口就有这样的效果啦

这个是第一个串口通信的案例

相关推荐
文弱书生65642 分钟前
ElectronBot复刻-电路测试篇
嵌入式硬件
xiaohanbao091 小时前
day40 python图像数据与显存
python·深度学习·学习·算法·机器学习·图像
似是燕归来1 小时前
STM32 HAL库函数学习 GPIO篇
stm32·单片机·学习
FakeOccupational3 小时前
【电路笔记 TMS320F28335DSP】McBSP 从源时钟得到 生成时钟 CLKG & 帧同步信号 FSG
笔记·单片机·fpga开发
会编程的果子君3 小时前
西门子嵌入式学习笔记---(1)裸机和调度器开发
笔记·学习
QQ_hoverer3 小时前
Java设计模式之工厂模式与策略模式简单案例学习
java·开发语言·学习·设计模式·策略模式
我的golang之路果然有问题3 小时前
快速了解 GO之接口解耦
开发语言·笔记·后端·学习·golang
每次的天空3 小时前
Android-GestureDetector学习总结
android·学习
casual_clover4 小时前
Android 之 kotlin 语言学习笔记二(编码标准)
android·学习·kotlin
平凡灵感码头4 小时前
STM32 启动文件详解:理解单片机启动的“引导者”
stm32·单片机·嵌入式硬件