初步学习 51 单片机
使用魔法方才能看到图片!
学习前准备
- 普中 A2 开发板
- B 站江协课 51 入门视频
- Keil uVision5 软件 keygen.exe 破解软件
- stc-isp 烧录软件
- 学习的动力 (我是想加入学习智能车社团,你呢?)
声明:本博客有很多都是询问 GPT 生成的,也有自己的大白话理解,仅作本人自己学习的记录
并非教程,而是个人觉得难点的记录
串口
串口的定义
串口,也称为串行通信接口,是一种通过 “一根线” 按顺序发送数据的通信方式。与 “并行通信”(一次传输多个数据位)不同,串口每次只传输一个数据位。
51 单片机内自带 UART (Unversal Asynchronous Receiver Transmitter, 通用异步收发器), 可以实现单片机的串口通信
单片机的串口可以实现单片机与单片机,单片机和电脑 (使用 USB 转串口), 单片机和各式各样的模块进行互相通信,极大的拓宽了单片机的应用范围,增强了单片机系统的硬件实力
串口的电平协议
说白了就是规定多少伏是 1, 多少伏是 0, 不同的电平协议不能互用,要用转换器,可以看到开发板上写了 USB 转 TTL 模块,就是转化为了 TTL (Transistor-Transistor Logic) 协议了
常见的电平协议 (GPT)
TTL 电平协议
电压范围
:典型的 TTL(Transistor-Transistor Logic)电平通常为 5V 或 3.3V。
- 逻辑 “1”:表示高电平,通常是 5V 或 3.3V。
- 逻辑 “0”:表示低电平,通常是 0V。
应用:TTL 广泛用于单片机(如 STC89C52RC)、模块(如蓝牙模块)等短距离通信。它使用的电平较低,适合 低功耗设备
RS232 电平协议
- 电压范围:
- 逻辑 “1”:通常表示为负电压,一般在 **-3V 到 - 12V** 之间。
- 逻辑 “0”:表示为正电压,通常为 **+3V 到 + 12V** 之间。
- 特点:RS232 的电平较高,适用于长距离通信或噪声较大的环境。它在计算机串口、工业设备、调制解调器等早期设备中较为常见。
- 电平转换:由于 RS232 与 TTL 的电平差异较大,在通信时需要使用电平转换芯片(如 MAX232)将 TTL 电平转换为 RS232 电平。
RS485 电平协议
- 电压范围:RS485 是一种差分信号标准,通过一对差分信号线来传输数据。
- 差分电压:两个信号线的电压差用于表示数据的逻辑状态。
- 特点:RS485 支持多设备总线通信,适用于长距离和噪声较大的工业环境。它比 RS232 更适合远距离传输,且支持多点连接(多设备共享同一条通信线路)。
- 差分信号:RS485 使用差分信号,这意味着它在一对双绞线上的信号电压差来表示数据,从而提高抗干扰能力。
RS422 电平协议
- 电压范围:RS422 与 RS485 相似,也是基于差分信号传输,电压范围大致相同。
- 特点:RS422 主要用于单主多从通信,即一个发送器与多个接收器通信,适用于中等距离的通信。RS422 的抗干扰能力和传输距离也比 RS232 要强。
CMOS 电平协议
- 电压范围:CMOS(Complementary Metal-Oxide-Semiconductor)电平协议的工作电压范围通常较宽,常见的有 3.3V 或 1.8V 的电平。逻辑 “1”:通常为电源电压(3.3V 或 1.8V)。逻辑 “0”:通常为 0V。
- 应用:CMOS 电平常用于更低功耗的设备或微控制器中,与 TTL 类似,但工作电压更低。
电平转换
如果两个通信设备使用不同的电平协议,则需要进行电平转换。例如,TTL 设备与 RS232 设备通信时,需要通过一个电平转换器(如 MAX232)将 5V 或 3.3V 的 TTL 电平转换为 RS232 所需的 ±12V 电平。类似的,TTL 与 CMOS 之间也可能需要电平转换,尤其是在电压差较大的情况下。
总结
串口的电平协议决定了设备间通信时使用的电压标准,不同的协议适用于不同的应用场景:
- TTL 和 CMOS 适用于短距离、低功耗的设备;
- RS232 适用于长距离、较早期的计算机设备;
- RS485 和 RS422 则更适合工业通信环境,尤其是在需要长距离、多点连接时。
了解电平协议有助于正确配置设备之间的通信并确保信号的可靠传输。
硬件电路
VCC 表示供电口,如果设备 1 和设备 2 均有独立供电那么就不需要这一条线,如果设备 2 没有独立供电,可以依靠 VCC 吸血
TXD 表示 Transmit Data 负责将设备的数据通过串口发送出去
RXD 表示 Receive Data 用于从串口接收外部设备发送的数据
GND 表示接地值,是一种公共电位基准,其中的 TXD,RXD 的电压指的是和 GND 的差值 其中设备 1 和设备 2 的 GND 必须连接在一起
其中 1 的 TXD 需要接到 2 的 RXD 上面 (我发送端接到你的接收端)
2 的 TXD 需要接到 1 的 RXD 上面 (我发送端接到你的接收端)
另外还可以一发多收 (一个 TXD 接到多个设备的 RXD 上面)(不规范的用法)
常见的通信接口的比较
大白话
先来几句简单的大白话
全双工就是打电话,同时发出接受
半双工就是对讲机,要么收听 要么发出
异步通信就是双方约定通信频率,不需要时钟线,速度慢
同步通信就是依靠时钟线来约定通信频率,速度快
全双工通信(Full-Duplex Communication)
- 定义:全双工通信是指双方可以同时发送和接收数据的通信方式。换句话说,两个设备可以在同一时间进行双向通信,不用等待对方传输完成。
- 特点:
- 高效,因为发送和接收可以同时进行。
- 需要两条独立的信道(或线缆),一条用于发送数据,另一条用于接收数据。
- 例子:常见的电话通信就是全双工的,你和对方可以同时说话和听对方说话。
- 应用:UART 和 SPI 协议支持全双工通信。
半双工通信(Half-Duplex Communication)
- 定义:半双工通信是指通信双方不能同时进行发送和接收,而是需要轮流传输数据。在某个时刻,一个设备只能发送或接收数据,而不是同时进行。
- 特点:
- 数据的发送和接收需要切换方向,效率相对较低。
- 一条数据线可以既用于发送,也用于接收。
- 例子:对讲机就是半双工通信,你说话时对方无法同时说话,必须等你说完。
- 应用:I²C 协议采用半双工通信。
异步通信(Asynchronous Communication)
- 定义:异步通信是指不依赖时钟信号的通信方式。数据在不固定的时间间隔内传输,发送和接收双方通过特殊的起始位和停止位来标记数据的开始和结束,确保数据能够正确识别。
- 特点:
- 不需要时钟线,硬件连接较为简单。
- 通信速率较慢,因为发送方和接收方需要自行管理数据传输的时序。
- 例子:UART 就是一种异步通信协议。
- 应用:串口通信、调试接口等。
同步通信(Synchronous Communication)
定义:同步通信是指通信双方依赖时钟信号进行数据传输。在传输过程中,发送和接收双方共享一个时钟信号,以确保数据传输的同步。每次发送数据时,时钟信号都会同步标记数据的时序。
特点:
- 需要一条额外的时钟线。
- 数据传输速率较高,因为发送方和接收方可以通过时钟信号保持同步,无需起始位和停止位。
例子:SPI 和 I²C 协议都是同步通信协议。
应用:需要快速、可靠数据传输的场景,例如传感器、显示屏等。
有关 51 单片机的 UART
一般只使用模式 1
看红色框 框出来的内容 RXD 和 TXD 就是串口通信的那两个东西
但是 RXD 与 P3_0 重合 TXD 与 P3_1 重合 但是我们操作的时候只需要操作串口就行了
我们可以在原理图中看到 USB 转 TTL 中有 RXD 和 TXD 这个代表 连接到了 51 单片机 TXD 和 RXD 的引脚上
所以电脑与单片机串口通信的逻辑是 使用 USB 线连接到 USB 转 TTL 模块,再使用直连的方式连接到单片机的 TXD 和 RXD 的引脚上
串口参数及时序图
校验位
校验位可以检验前面的数据正确与否
校验的分类
- 无校验
- 奇校验
- 偶校验
- 0 校验
- 1 校验
不同校验的区别
GPT 解释如下
你提到的校验位用于检查数据传输或存储过程中的错误。下面是你提到的几种校验方式的解释:
无校验(No Parity):没有任何校验位,这意味着数据没有附加额外的信息来检测错误。这种方式虽然简单,但无法检测数据传输中的错误。
奇校验(Odd Parity):在数据中添加一个额外的位(校验位),使得数据中 1 的个数为奇数。如果 1 的个数已经是奇数,则校验位设置为 0;如果是偶数,则校验位设置为 1。
偶校验(Even Parity):在数据中添加一个校验位,使得数据中 1 的个数为偶数。如果 1 的个数已经是偶数,则校验位设置为 0;如果是奇数,则校验位设置为 1。
0 校验(Zero Parity):在数据中添加一个校验位,总是设置为 0。这种方式基本上是无校验的一种形式,因为它不提供任何实际的错误检测功能。
1 校验(One Parity):在数据中添加一个校验位,总是设置为 1。类似于 0 校验,这也基本上是不进行错误检测的一种方式。
总结:
- 奇校验和偶校验是最常见的错误检测方法,能够检测出单个比特位的错误。
- 无校验、0 校验和 1 校验并不提供有效的错误检测,通常不用于需要数据准确性的应用场合。
举个例子:
奇校验 : 0000 1111 那么我的校验位就是 1, 因为我的前八位和为 4, 奇校验要求 9 位数之和为奇数
再比如偶校验: 0101 0101 那么我的校验位就是 0, 因为我的前八位和为 8, 偶校验要求 9 位数之和位偶数
0,1 检验存在的意义
当然我有疑问了
既然 0,1 校验都不能提供有效的错误检测,那他们存在的意义是什么
解释:
0 校验和 1 校验通常在实际应用中并不常用,但它们仍然有一些特定的用途和意义:
0 校验
- 测试目的:0 校验常用于测试或调试阶段,以确保系统能够正确处理校验位。因为校验位总是 0,这意味着不对数据进行实际的校验。
- 占位符:在一些特定的通信协议或系统设计中,0 校验可能作为占位符使用,准备将来可能加入的校验功能。
1 校验
- 测试目的:类似于 0 校验,1 校验也可以用于测试或调试,确保系统能处理校验位,尽管校验位总是 1,不进行实际的错误检测。
- 特定应用:在某些特殊的场景中,可能需要将校验位设置为 1 以符合特定的协议要求或实现方式。
总结
- 实际应用:0 校验和 1 校验在实际数据传输和存储中并没有提供有效的错误检测能力,因此它们在实际通信系统中并不常见。
- 主要作用:它们更多是作为占位符或用于测试目的,而不是用于真实的数据保护和错误检测。
串口模式图
在右边那根虚线左边的都是 MCU 内部东西,外部引出两根引脚 TXD,RXD
最左边的那一条上下箭头的那根是 MCU 的内部总线,串口这个设备相当于挂载在总线上面
SBUF
SBUF 指的是串口数据缓存寄存器 在物理上指的是两个独立的寄存器 但是占用相同的地址 但是操作逻辑很简单
当我们想要发出数据的时候,只需要将值放入 SBUF 即可,然后数据发出去以后会自动申请 TI (transmit interrupt) 发送中断
当我们想要接受数据的时候,会自动申请 RI (receive interrupt), 一旦中断,便进入中断函数,我们所需要做的只是读取 SBUF 就行,
SBUF 寄存器
功能:
SBUF
(Serial Buffer Register)是用于串口通信的双缓冲寄存器。它用于存储串口发送和接收的数据。
工作原理:
- 发送数据:当你向
SBUF
写入数据时,数据会被放入发送缓冲区。随后,发送缓冲区的数据会被传输到串口移位寄存器(SBUF
的发送部分),然后通过串口发送出去。 - 接收数据:当串口接收到数据时,数据会被放入接收缓冲区。随后,接收缓冲区的数据会被读取到
SBUF
的接收部分。
- 发送数据:当你向
寄存器的分配:
- 在 8051 系列单片机中,
SBUF
寄存器分为两个部分:发送缓冲区和接收缓冲区。具体来说:- 发送缓冲区:当你写入
SBUF
时,数据先存入发送缓冲区,然后再由发送移位寄存器发送出去。 - 接收缓冲区:当串口接收到数据时,数据会存入接收缓冲区,随后可以通过读取
SBUF
获取接收到的数据。
- 发送缓冲区:当你写入
- 在 8051 系列单片机中,
寄存器映射:
- 在 8051 单片机中,
SBUF
寄存器通常映射在一个特定的内存地址,具体地址依赖于单片机的型号。
- 在 8051 单片机中,
串口和中断系统
在单片机(例如 STC89C52RC)中,IE(Interrupt Enable,中断使能寄存器)和 IP(Interrupt Priority,中断优先级寄存器)是用来管理和控制中断的关键寄存器。它们的功能如下:
IE 寄存器(Interrupt Enable)
IE 寄存器用于控制中断的使能。通过设置或清除 IE 寄存器中的位,可以启用或禁用各种中断源。
IE 寄存器的结构
在 STC89C52RC 中,IE 寄存器通常是一个 8 位寄存器,其结构如下(每一位对应不同的中断源):
位位置 | 说明 |
---|---|
7 | EA: 总中断使能位 |
6 | ES1: 串口 1 中断使能位 |
5 | ET1: 定时器 1 中断使能位 |
4 | EX1: 外部中断 1 使能位 |
3 | ET0: 定时器 0 中断使能位 |
2 | EX0: 外部中断 0 使能位 |
1 | Reserved: 保留位 |
0 | Reserved: 保留位 |
- EA(总中断使能位):控制所有中断的使能。如果 EA 为 1,则允许中断系统处理所有的中断请求;如果 EA 为 0,则禁用所有中断。
- ES1、ET1、EX1、ET0 和 EX0:这些位用于使能或禁用具体的中断源。例如,ES1 用于使能串口 1 的中断,ET1 用于使能定时器 1 的中断等。
操作
- 设置 位为 1 以启用对应的中断。
- 清除 位为 0 以禁用对应的中断。
IP 寄存器(Interrupt Priority
IP 寄存器用于设置中断的优先级。通过配置 IP 寄存器中的位,可以确定中断源的优先级,以便在多个中断同时发生时,优先处理重要的中断。
IP 寄存器的结构
在 STC89C52RC 中,IP 寄存器的结构如下:
位位置 | 说明 |
---|---|
7 | PS: 串口 0 中断优先级位 |
6 | PT1: 定时器 1 中断优先级位 |
5 | PX1: 外部中断 1 优先级位 |
4 | PT0: 定时器 0 中断优先级位 |
3 | PX0: 外部中断 0 优先级位 |
2 | Reserved: 保留位 |
1 | Reserved: 保留位 |
0 | Reserved: 保留位 |
- PS(串口 0 中断优先级位):设置串口 0 中断的优先级。
- PT1、PX1、PT0 和 PX0:这些位设置定时器 1、外部中断 1、定时器 0 和外部中断 0 的优先级。
优先级设置
- 设置为 1:表示该中断源的优先级高。
- 设置为 0:表示该中断源的优先级低(或者默认优先级)。
总的来说,IE 就是管理哪些信号可以中断 哪些信号不能中断 \
IP 就是管理中断信号的优先级
我们看到串口的 TI 和 RI, 其实连接到了 SCON 的这边,然后一起通过一个或门,也即有一出一,只有有一个有信号就放行,接下来是 ES1 (IE 内的) 和 PS (IP 内的)
串口相关的寄存器
当然!我们可以更具体地展开 SCON、SBUF、PCON 和 IE 寄存器在 STC89C52RC 单片机中的功能和配置。
SCON 寄存器(Serial Control Register)
SCON 寄存器用于配置串口的工作模式和控制串口的状态。它是一个 8 位寄存器,具体功能如下:
SCON 寄存器的结构
位位置 | 说明 | 备注 |
---|---|---|
7 | SM0 | 串口工作模式选择位 (模式 0) |
6 | SM1 | 串口工作模式选择位 (模式 1) |
5 | SM2 | 9 位数据模式使能位 |
4 | REN | 接收使能位 |
3 | TB8 | 发送数据的第 8 位 (9 位数据模式) |
2 | RB8 | 接收数据的第 8 位 (9 位数据模式) |
1 | TI | 发送中断标志位 |
0 | RI | 接收中断标志位 |
- SM0 和 SM1:控制串口的工作模式。
- 模式 0:8 位数据,1 位起始位,1 位停止位。
- 模式 1:8 位数据,1 位起始位,1 位停止位(常用模式)。
- 模式 2:9 位数据,1 位起始位,1 位停止位。
- 模式 3:特殊模式,通常用于一些特殊的通信协议。
- SM2:在 9 位数据模式下有效,设置为 1 表示启用 9 位数据模式。
- REN:接收使能,设置为 1 启用串口接收。
- TB8 和 RB8:在 9 位数据模式下,用于发送和接收第 9 位的数据。
- TI 和 RI:发送中断标志位和接收中断标志位,当相应的操作完成时会被置位。
SBUF 寄存器(Serial Buffer Register)
SBUF 寄存器是串口数据的缓冲区。它用于存储串口传输的数据。
SBUF 寄存器的功能
- 写入数据:将数据写入 SBUF 时,数据被放入发送缓存区,并在接下来的时钟周期中通过串口发送。
- 读取数据:从 SBUF 读取数据时,获取的是从串口接收到的数据。
PCON 寄存器(Power Control Register)
PCON 寄存器用于控制单片机的功耗模式及其他电源相关设置。
PCON 寄存器的结构
位位置 | 说明 | 备注 |
---|---|---|
7 | SMOD | 串口波特率加倍位 |
6-5 | Reserved | 保留位 |
4-0 | IDLE | 空闲模式设置位 |
- SMOD:设置为 1 时,串口的波特率加倍;设置为 0 时,使用正常波特率。
- IDLE:设置为 1 时,单片机进入空闲模式,减少功耗,但保持部分功能运行。
- POWERDOWN:设置为 1 时,单片机进入掉电模式,几乎所有的功能都停止运行,只有中断能够唤醒单片机。
IE 寄存器(Interrupt Enable Register)
IE 寄存器用于使能和禁用各种中断源。它控制中断的整体使能以及各个中断源的使能。
IE 寄存器的结构
位位置 | 说明 | 备注 |
---|---|---|
7 | EA | 全局中断使能位 |
6 | ES1 | 串口 1 中断使能位 |
5 | ET1 | 定时器 1 中断使能位 |
4 | EX1 | 外部中断 1 使能位 |
3 | ET0 | 定时器 0 中断使能位 |
2 | EX0 | 外部中断 0 使能位 |
1 | Reserved | 保留位 |
0 | Reserved | 保留位 |
- EA:总中断使能位,设置为 1 时允许所有中断;设置为 0 时禁用所有中断。
- ES1、ET1、EX1、ET0 和 EX0:这些位用于使能特定的中断源。例如,ES1 用于使能串口 1 的中断,ET1 用于使能定时器 1 的中断等。
总结
- SCON:配置串口的工作模式和控制串口的状态。
- SBUF:串口数据的缓冲区,用于读写数据。
- PCON:控制功耗模式和串口波特率。
- IE:控制中断的使能状态和中断源的使能。
具体配置串口
单片机型号:STC89C52RC
UART 的工作模式的选择:模式一 (8 位 UART, 波特率可变)
配置串口控制寄存器 SCON
根据手册,我们需要将工作模式调至模式 1, 所以需要将 SM0,SM1 分别置为 0,0
SM2 是使用模式 2 和模式 3 可以使用多机通信控制位,因为我们使用模式 1, 所以这里直接置其为 0
REN (Receive Enable) : 接收使能
当 REN=1 时,串口接收功能被开启,允许单片机通过串口接收数据
当 REN=0 时,串口接收功能关闭,即使有数据来也不会被单片机接收
上面这两个东西都是有关于模式 2 模式 3 的不用管
TI (Transmit Interrupt) : 发送中断
TI = 0:正在发送数据。
TI = 1:数据发送完成,可以发送下一字节
我们要手动复位
RI (Receive Interrupt) : 接收中断
RI = 0:未接收到数据或数据正在接收中。
RI = 1:接收完成,数据存储在 SBUF 中,可以读取
我们重新观察 SCON
分别解释所有意思
SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
SCON | 98H | name | SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
Special Function Register name,特殊功能寄存器名称 | 在单片机内存中的具体位置 | 串口的模式选择位(SM0)帧错误标志位(FE) | 串口模式选择位 1 | 多机通信控制位 | 接收允许位 | 发送中断标志位 | 接收中断标志位 | |||
0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
一直使我疑惑的是 bit 下面对应的是 name?
这就很奇怪?
其实完全可以把第三列之后的看成一个新的表格。这个表格表示了 SCON 下的每个位子对应的名称
bit 行:告诉你寄存器的每一位是第几位(从 B7 到 B0),即位号。
name 行:告诉你这些位号对应的功能。
配置电源控制寄存器 PCON
虽然名字叫电源控制寄存器,但是其内部其实是既包含电源控制的位,又包含串口配置的位
解释一下 SMOD
SMOD(波特率选择位)
作用:SMOD 用于控制串口通信的波特率。
功能:
- SMOD=1:使串行通信方式 1、2、3 的波特率加倍。也就是说,如果你的系统时钟频率保持不变,SMOD=1 会使波特率加倍。
- SMOD=0:波特率为正常值,不加倍。
SMOD0(帧错误检测有效控制位)
- 作用:SMOD0 用于控制串口的帧错误检测功能以及串口工作方式的选择。
- 功能:
- SMOD0=1:使得 SCON 寄存器中的 SM0/FE 位用于帧错误检测(FE)。帧错误检测是用于识别数据传输过程中是否发生了错误。
- SMOD0=0:SM0/FE 位用于指定串口的工作方式,与 SM1 一起决定串口的工作模式。具体来说,SM0 和 SM1 的组合决定了串口的工作模式,如模式 0、模式 1、模式 2 或模式 3
复位状态
- SMOD:复位时 SMOD=0。
- SMOD0:复位时 SMOD0=0。
配置 IE 寄存器
如果我需要通过串口接收数据的话,我就需要进行配置 IE 寄存器,需要进行中断
如果我只需要通过串口向电脑发送数据的话,我就不需要配置 IE 寄存器,因为我不需要中断去执行什么程序
选择波特率
江协科老师说的是由于之前我们使用定时器 0 进行延迟和中断,但是串口是要用定时器 1 的,所以 copy 的代码要进行微调
首先在 TMOD 这边要改为定时器 1, 其次定时器的工作模式要改为模式 2 (8 位自动重装)
优缺点对比表
特性 | 16 位定时器 | 双 8 位自动重装定时器 |
---|---|---|
计数范围 | 0 到 65535 | 每个定时器 0 到 255 |
资源占用 | 较多 | 较少 |
配置复杂度 | 较高 | 较低 |
适用场景 | 需要长时间延迟或高精度计时 | 资源紧张,短时间计时,高频率计数 |
中断频率 | 较低(计数范围大) | 较高(需要频繁重装) |
自动重装功能 | 无自动重装功能,需手动设置 | 每次溢出自动加载预设值 |
波特率生成 | 更灵活,适用于较低波特率 | 需要额外配置才能生成低波特率 |
这里使用 stc-isp 直接生成代码
1 | void Uart1_Init(void) //4800bps@11.0592MHz |
这里的 AUXR 是对于比较高级的单片机,在 STC89C52 中是没有的,所以要删除
1 | void Uart1_Init(void) //4800bps@11.0592MHz |
最终配置
代码及注释:
1 |
|
我们观察到 串口助手中的输出内容为 2F 即为调试成功
这里有几个注意事项
- 使用 HEX 模式进行接收 (16 进制)
- 记得打开串口,看图中红色方框中的关闭串口,原本是打开串口,记得点击
- 波特率应该设置为 4800
波特率不匹配输出乱码
我不明白为什么应该设置为 4800, 我将其改为 9600, 并且不修改代码,观察输出:
询问 GPT
你遇到的问题是由于 波特率不匹配 导致的。当你在程序中设置了串口波特率为 4800 bps,而你手动将串口助手的波特率改为 9600 bps 时,接收的数据就会出现乱码,这是因为发送端和接收端的时钟不同步。
具体原因:
发送端的波特率是 4800 bps:
- 你在代码中通过
UART_Init()
函数设置了单片机的串口波特率为 4800 bps。在这个波特率下,单片机会按照 4800 bps 的速率发送数据。
- 你在代码中通过
接收端的波特率是 9600 bps:
- 当你手动将串口助手的波特率设置为 9600 bps 时,串口助手接收数据的速率是 9600 bps。但此时,发送端仍然是按照 4800 bps 的速率发送数据。由于接收端和发送端的波特率不同步,接收端会错误地解读从发送端传输过来的数据,从而导致数据被错误解析,显示出乱码(如
FE
和86
)。
- 当你手动将串口助手的波特率设置为 9600 bps 时,串口助手接收数据的速率是 9600 bps。但此时,发送端仍然是按照 4800 bps 的速率发送数据。由于接收端和发送端的波特率不同步,接收端会错误地解读从发送端传输过来的数据,从而导致数据被错误解析,显示出乱码(如
原理:
串口通信是基于时钟同步的异步通信方式,发送端和接收端必须以相同的波特率进行通信。如果两端的波特率不同步,接收端接收到的数据位会错位,导致数据被错误解读。
举例:
- 你发送的字节是
0x2F
,其二进制表示为00101111
。 - 当波特率不匹配时,接收端可能会以不同的方式解释这些位,导致解码出错误的字节,如
FE
(11111110
) 或86
(10000110
),因为接收端的时钟周期与发送端的时钟周期不一致。
解决方法:
确保发送端和接收端的波特率一致:
- 你可以保持串口助手的波特率与单片机的波特率一致。例如,单片机设定为 4800 bps 时,串口助手的波特率也应设置为 4800 bps。
修改程序中的波特率:
- 如果你希望在串口助手中使用 9600 bps,可以修改代码中的波特率设置。你可以将定时器 1 的初始值和重载值调整为适合 9600 bps 的参数。对于 11.0592 MHz 的时钟频率,9600 bps 的设置可以是:这样你就可以在程序中使用 9600 bps,同时在串口助手中设置为 9600 bps。c
1
2TL1 = 0xFD; // 定时初始值
TH1 = 0xFD; // 定时重载值
- 如果你希望在串口助手中使用 9600 bps,可以修改代码中的波特率设置。你可以将定时器 1 的初始值和重载值调整为适合 9600 bps 的参数。对于 11.0592 MHz 的时钟频率,9600 bps 的设置可以是:
总结:
不同步的波特率会导致数据接收错误。你只需要确保发送端和接收端的波特率保持一致,数据就会正确显示。
I2C 总线
概括
I2C(Inter-Integrated Circuit)是一种可以让电子设备互相 “对话” 的通信方式。它只用两条线:一条是数据线(SDA),用来传输信息,另一条是时钟线(SCL),用来同步数据传输的时间。
简单来说 I2C 的特点是:
- 主设备和从设备:一个主设备控制整个通信过程,它告诉从设备什么时候开始传信息,什么时候停止。
- 两条线传数据:只需要两条线就可以连接很多设备,非常适合引脚少的微控制器。
- 设备有地址:每个设备都有自己的地址,就像每个家庭的门牌号,主设备可以找到并和特定的设备对话。
- 双向通信:设备之间可以互相发送或接收数据。
你可以把 I2C 想象成一个简单的班级老师和学生的对话:
- 老师(主设备)告诉某个学生(从设备)他想提问,然后学生回答。
- 老师用一种节奏(时钟线)控制每个人的发言时间。
- 每个学生(设备)都有自己的名字(地址),老师能点名找到他们。
这个协议常用在嵌入式系统里,比如智能车上,你可以用它让传感器和微控制器 “交谈”。
存储器介绍
易失性存储器 / RAM:
- SRAM(静态 RAM)
- DRAM(动态 RAM)
非易失性存储器 / ROM:
- Mask ROM(掩膜 ROM)
- PROM(可编程 ROM)
- EPROM(可擦除可编程 ROM)
- E2PROM(电可擦除可编程 ROM)
- Flash(闪存)
- 硬盘、软盘、光盘等
存储器类型 | 优势 | 劣势 | 常用场景 |
---|---|---|---|
SRAM (静态 RAM) | 访问速度快,无需刷新 | 成本较高,功耗较大 | 高速缓存(Cache)使用 |
DRAM (动态 RAM) | 成本较低,密度高 | 需要定期刷新,速度较慢 | 系统主存储器 |
Mask ROM | 制造成本低,数据永久存储 | 一次编程,不能修改 | 嵌入式系统中固化的固件或程序 |
PROM (可编程 ROM) | 可以由用户编程一次 | 只能编程一次,不可擦除 | 初期产品原型、小批量生产的设备 |
EPROM (可擦除可编程 ROM) | 可以多次擦写和重写 | 擦写需要特殊设备,速度较慢 紫外线 (30 分钟) | 测试开发阶段的设备固件 |
E2PROM (电可擦除可编程 ROM) | 电擦除,重写次数多 | 写入速度慢于 Flash,成本较高 容量很少 | 配置信息存储,如网络设备的 MAC 地址 |
Flash (闪存) | 快速读写,高密度,耐用性好 | 写入速度及耐用性不及硬盘 | 移动设备存储,如智能手机、USB 闪存驱动器 |
左边地址,下面是数据
Mask Rom 出场就带有二极管,无法改变
PROM 出厂自带两个二极管,其中蓝色二极管反向电压大可以击穿,所以叫” 只能编程一次,不可擦除”
顾名思义” 烧录”!