使用魔法方才能看到图片!

学习前准备

  • 普中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”:表示高电平,通常是5V3.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之间也可能需要电平转换,尤其是在电压差较大的情况下。

总结

串口的电平协议决定了设备间通信时使用的电压标准,不同的协议适用于不同的应用场景:

  • TTLCMOS 适用于短距离、低功耗的设备;
  • RS232 适用于长距离、较早期的计算机设备;
  • RS485RS422 则更适合工业通信环境,尤其是在需要长距离、多点连接时。

了解电平协议有助于正确配置设备之间的通信并确保信号的可靠传输。

硬件电路

image-20240916123525152

  • 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上面)(不规范的用法)

常见的通信接口的比较

image-20240916124447029

大白话

先来几句简单的大白话

全双工就是打电话,同时发出接受

半双工就是对讲机,要么收听 要么发出

异步通信就是双方约定通信频率,不需要时钟线,速度慢

同步通信就是依靠时钟线来约定通信频率,速度快

全双工通信(Full-Duplex Communication)

  • 定义:全双工通信是指双方可以同时发送和接收数据的通信方式。换句话说,两个设备可以在同一时间进行双向通信,不用等待对方传输完成。
  • 特点:
    • 高效,因为发送和接收可以同时进行。
    • 需要两条独立的信道(或线缆),一条用于发送数据,另一条用于接收数据。
  • 例子:常见的电话通信就是全双工的,你和对方可以同时说话和听对方说话。
  • 应用:UART 和 SPI 协议支持全双工通信。

半双工通信(Half-Duplex Communication)

  • 定义:半双工通信是指通信双方不能同时进行发送和接收,而是需要轮流传输数据。在某个时刻,一个设备只能发送或接收数据,而不是同时进行。
  • 特点:
    • 数据的发送和接收需要切换方向,效率相对较低。
    • 一条数据线可以既用于发送,也用于接收。
  • 例子:对讲机就是半双工通信,你说话时对方无法同时说话,必须等你说完。
  • 应用:I²C 协议采用半双工通信。

异步通信(Asynchronous Communication)

  • 定义:异步通信是指不依赖时钟信号的通信方式。数据在不固定的时间间隔内传输,发送和接收双方通过特殊的起始位和停止位来标记数据的开始和结束,确保数据能够正确识别。
  • 特点:
    • 不需要时钟线,硬件连接较为简单。
    • 通信速率较慢,因为发送方和接收方需要自行管理数据传输的时序。
  • 例子:UART 就是一种异步通信协议。
  • 应用:串口通信、调试接口等。

同步通信(Synchronous Communication)

  • 定义:同步通信是指通信双方依赖时钟信号进行数据传输。在传输过程中,发送和接收双方共享一个时钟信号,以确保数据传输的同步。每次发送数据时,时钟信号都会同步标记数据的时序。

  • 特点:

    • 需要一条额外的时钟线。
    • 数据传输速率较高,因为发送方和接收方可以通过时钟信号保持同步,无需起始位和停止位。
  • 例子:SPI 和 I²C 协议都是同步通信协议。

  • 应用:需要快速、可靠数据传输的场景,例如传感器、显示屏等。

有关51单片机的UART

image-20240916140513924

一般只使用模式1

看红色框 框出来的内容 RXD和TXD就是串口通信的那两个东西

但是RXD 与P3_0重合 TXD 与P3_1重合 但是我们操作的时候只需要操作串口就行了

image-20240916141045927

我们可以在原理图中看到USB转TTL中有RXD 和TXD 这个代表 连接到了 51单片机 TXD 和RXD的引脚上

所以电脑与单片机串口通信的逻辑是 使用USB线连接到USB转TTL模块,再使用直连的方式连接到单片机的TXD和RXD的引脚上

串口参数及时序图

image-20240916142553704

image-20240916142657812

校验位

校验位可以检验前面的数据正确与否

校验的分类

  • 无校验
  • 奇校验
  • 偶校验
  • 0校验
  • 1校验

不同校验的区别

GPT解释如下

你提到的校验位用于检查数据传输或存储过程中的错误。下面是你提到的几种校验方式的解释:

  1. 无校验(No Parity):没有任何校验位,这意味着数据没有附加额外的信息来检测错误。这种方式虽然简单,但无法检测数据传输中的错误。

  2. 奇校验(Odd Parity):在数据中添加一个额外的位(校验位),使得数据中1的个数为奇数。如果1的个数已经是奇数,则校验位设置为0;如果是偶数,则校验位设置为1。

  3. 偶校验(Even Parity):在数据中添加一个校验位,使得数据中1的个数为偶数。如果1的个数已经是偶数,则校验位设置为0;如果是奇数,则校验位设置为1。

  4. 0校验(Zero Parity):在数据中添加一个校验位,总是设置为0。这种方式基本上是无校验的一种形式,因为它不提供任何实际的错误检测功能。

  5. 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校验在实际数据传输和存储中并没有提供有效的错误检测能力,因此它们在实际通信系统中并不常见。
  • 主要作用:它们更多是作为占位符或用于测试目的,而不是用于真实的数据保护和错误检测。

串口模式图

image-20240916145507625

在右边那根虚线左边的都是MCU内部东西,外部引出两根引脚TXD,RXD

最左边的那一条上下箭头的那根是MCU的内部总线,串口这个设备相当于挂载在总线上面

image-20240916151421130

SBUF

SBUF指的是串口数据缓存寄存器 在物理上指的是两个独立的寄存器 但是占用相同的地址 但是操作逻辑很简单

当我们想要发出数据的时候,只需要将值放入SBUF即可,然后数据发出去以后会自动申请TI(transmit interrupt) 发送中断

当我们想要接受数据的时候, 会自动申请RI (receive interrupt),一旦中断,便进入中断函数,我们所需要做的只是读取SBUF就行,

SBUF 寄存器

  1. 功能

    • SBUF(Serial Buffer Register)是用于串口通信的双缓冲寄存器。它用于存储串口发送和接收的数据。
  2. 工作原理

    • 发送数据:当你向 SBUF 写入数据时,数据会被放入发送缓冲区。随后,发送缓冲区的数据会被传输到串口移位寄存器(SBUF 的发送部分),然后通过串口发送出去。
    • 接收数据:当串口接收到数据时,数据会被放入接收缓冲区。随后,接收缓冲区的数据会被读取到 SBUF 的接收部分。
  3. 寄存器的分配

    • 在8051系列单片机中,SBUF 寄存器分为两个部分:发送缓冲区和接收缓冲区。具体来说:
      • 发送缓冲区:当你写入 SBUF 时,数据先存入发送缓冲区,然后再由发送移位寄存器发送出去。
      • 接收缓冲区:当串口接收到数据时,数据会存入接收缓冲区,随后可以通过读取 SBUF 获取接收到的数据。
  4. 寄存器映射

    • 在8051单片机中,SBUF 寄存器通常映射在一个特定的内存地址,具体地址依赖于单片机的型号。

串口和中断系统

image-20240916160912663

在单片机(例如 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,则禁用所有中断。
  • ES1ET1EX1ET0EX0:这些位用于使能或禁用具体的中断源。例如,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中断的优先级。
  • PT1PX1PT0PX0:这些位设置定时器1、外部中断1、定时器0和外部中断0的优先级。

优先级设置

  • 设置为 1:表示该中断源的优先级高。
  • 设置为 0:表示该中断源的优先级低(或者默认优先级)。

总的来说,IE就是管理哪些信号可以中断 哪些信号不能中断\

IP就是管理中断信号的优先级

我们看到串口的TI和RI,其实连接到了SCON的这边,然后一起通过一个或门,也即有一出一,只有有一个有信号就放行,接下来是ES1(IE内的)和PS(IP内的)

串口相关的寄存器

image-20240916163115539

当然!我们可以更具体地展开 SCONSBUFPCONIE 寄存器在 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 接收中断标志位
  • SM0SM1:控制串口的工作模式。
    • 模式0:8 位数据,1 位起始位,1 位停止位。
    • 模式1:8 位数据,1 位起始位,1 位停止位(常用模式)。
    • 模式2:9 位数据,1 位起始位,1 位停止位。
    • 模式3:特殊模式,通常用于一些特殊的通信协议。
  • SM2:在 9 位数据模式下有效,设置为 1 表示启用 9 位数据模式。
  • REN:接收使能,设置为 1 启用串口接收。
  • TB8RB8:在 9 位数据模式下,用于发送和接收第 9 位的数据。
  • TIRI:发送中断标志位和接收中断标志位,当相应的操作完成时会被置位。

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 时禁用所有中断。
  • ES1ET1EX1ET0EX0:这些位用于使能特定的中断源。例如,ES1 用于使能串口1的中断,ET1 用于使能定时器1的中断等。

总结

  • SCON:配置串口的工作模式和控制串口的状态。
  • SBUF:串口数据的缓冲区,用于读写数据。
  • PCON:控制功耗模式和串口波特率。
  • IE:控制中断的使能状态和中断源的使能。

具体配置串口

单片机型号:STC89C52RC

UART的工作模式的选择: 模式一(8位UART,波特率可变)

配置串口控制寄存器SCON

image-20240916171238784

根据手册,我们需要将工作模式调至模式1,所以需要将SM0,SM1分别置为0,0

image-20240916171418695

SM2是使用模式2和模式3可以使用多机通信控制位,因为我们使用模式1,所以这里直接置其为0

image-20240916171601130

REN (Receive Enable) :接收使能

当REN=1时,串口接收功能被开启,允许单片机通过串口接收数据

当REN=0时,串口接收功能关闭,即使有数据来也不会被单片机接收

image-20240916172209391

上面这两个东西都是有关于模式2模式3的不用管

image-20240916194834284

TI (Transmit Interrupt) :发送中断

TI = 0:正在发送数据。

TI = 1:数据发送完成,可以发送下一字节

我们要手动复位

image-20240916195119902

RI (Receive Interrupt) :接收中断

RI = 0:未接收到数据或数据正在接收中。

RI = 1:接收完成,数据存储在 SBUF 中,可以读取

我们重新观察SCON

image-20240916195311088

分别解释所有意思

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下的每个位子对应的名称

image-20240916200548496

  • bit 行:告诉你寄存器的每一位是第几位(从 B7 到 B0),即位号。

  • name 行:告诉你这些位号对应的功能。

配置电源控制寄存器PCON

虽然名字叫电源控制寄存器,但是其内部其实是既包含电源控制的位,又包含串口配置的位

image-20240916204759806

解释一下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寄存器,因为我不需要中断去执行什么程序

image-20240916210154150

选择波特率

江协科老师说的是由于之前我们使用定时器0进行延迟和中断,但是串口是要用定时器1的,所以copy的代码要进行微调

首先在TMOD这边要改为定时器1,其次定时器的工作模式要改为模式2(8位自动重装)

优缺点对比表

特性 16位定时器 双8位自动重装定时器
计数范围 0 到 65535 每个定时器 0 到 255
资源占用 较多 较少
配置复杂度 较高 较低
适用场景 需要长时间延迟或高精度计时 资源紧张,短时间计时,高频率计数
中断频率 较低(计数范围大) 较高(需要频繁重装)
自动重装功能 无自动重装功能,需手动设置 每次溢出自动加载预设值
波特率生成 更灵活,适用于较低波特率 需要额外配置才能生成低波特率

这里使用stc-isp 直接生成代码

image-20240916212223207

1
2
3
4
5
6
7
8
9
10
11
12
13
void Uart1_Init(void)	//4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF4; //设置定时初始值
TH1 = 0xF4; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}

这里的AUXR是对于比较高级的单片机,在STC89C52中是没有的,所以要删除

1
2
3
4
5
6
7
8
9
10
11
void Uart1_Init(void)	//4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF4; //设置定时初始值
TH1 = 0xF4; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}

最终配置

代码及注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <REGX52.H>


void UART_Init(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF4; //设置定时初始值
TH1 = 0xF4; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}

void UART_SendByte(unsigned char Byte)
{
SBUF=Byte; //这里的SBUF其实指的是单片机TXD上的那个地址,比较智能
while (TI == 0); //TI在前面讲过了,是 发送中断标志位 平时是0,当发送之后变成1 若是1则跳出while循环
TI=0; //每次都应该手动置0,这个内容在前面讲过
}
void main()
{
UART_Init(); //初始化一下串口
UART_SendByte(0x2F); //测试一下能否正常输出
while(1)
{

}
}

image-20240916235900258

我们观察到 串口助手中的输出内容为 2F 即为调试成功

这里有几个注意事项

  • 使用HEX模式进行接收 (16进制)
  • 记得打开串口,看图中红色方框中的关闭串口,原本是打开串口,记得点击
  • 波特率应该设置为4800

波特率不匹配输出乱码

我不明白为什么应该设置为4800,我将其改为9600,并且不修改代码,观察输出:

image-20240917000219434

询问GPT

你遇到的问题是由于 波特率不匹配 导致的。当你在程序中设置了串口波特率为 4800 bps,而你手动将串口助手的波特率改为 9600 bps 时,接收的数据就会出现乱码,这是因为发送端和接收端的时钟不同步。

具体原因:

  1. 发送端的波特率是 4800 bps

    • 你在代码中通过 UART_Init() 函数设置了单片机的串口波特率为 4800 bps。在这个波特率下,单片机会按照 4800 bps 的速率发送数据。
  2. 接收端的波特率是 9600 bps

    • 当你手动将串口助手的波特率设置为 9600 bps 时,串口助手接收数据的速率是 9600 bps。但此时,发送端仍然是按照 4800 bps 的速率发送数据。由于接收端和发送端的波特率不同步,接收端会错误地解读从发送端传输过来的数据,从而导致数据被错误解析,显示出乱码(如 FE86)。

原理:

串口通信是基于时钟同步的异步通信方式,发送端和接收端必须以相同的波特率进行通信。如果两端的波特率不同步,接收端接收到的数据位会错位,导致数据被错误解读。

举例:

  • 你发送的字节是 0x2F,其二进制表示为 00101111
  • 当波特率不匹配时,接收端可能会以不同的方式解释这些位,导致解码出错误的字节,如 FE (11111110) 或 86 (10000110),因为接收端的时钟周期与发送端的时钟周期不一致。

解决方法:

  1. 确保发送端和接收端的波特率一致

    • 你可以保持串口助手的波特率与单片机的波特率一致。例如,单片机设定为 4800 bps 时,串口助手的波特率也应设置为 4800 bps。
  2. 修改程序中的波特率

    • 如果你希望在串口助手中使用 9600 bps,可以修改代码中的波特率设置。你可以将定时器1的初始值和重载值调整为适合 9600 bps 的参数。对于 11.0592 MHz 的时钟频率,9600 bps 的设置可以是:
      1
      2
      TL1 = 0xFD;  // 定时初始值
      TH1 = 0xFD; // 定时重载值
      这样你就可以在程序中使用 9600 bps,同时在串口助手中设置为 9600 bps。

总结:

不同步的波特率会导致数据接收错误。你只需要确保发送端和接收端的波特率保持一致,数据就会正确显示。

I2C总线

概括

I2C(Inter-Integrated Circuit)是一种可以让电子设备互相“对话”的通信方式。它只用两条线:一条是数据线(SDA),用来传输信息,另一条是时钟线(SCL),用来同步数据传输的时间。

简单来说 I2C的特点是:

  1. 主设备和从设备:一个主设备控制整个通信过程,它告诉从设备什么时候开始传信息,什么时候停止。
  2. 两条线传数据:只需要两条线就可以连接很多设备,非常适合引脚少的微控制器。
  3. 设备有地址:每个设备都有自己的地址,就像每个家庭的门牌号,主设备可以找到并和特定的设备对话。
  4. 双向通信:设备之间可以互相发送或接收数据。

你可以把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闪存驱动器

image-20240920132707975

左边地址,下面是数据

Mask Rom出场就带有二极管,无法改变

PROM 出厂自带两个二极管,其中蓝色二极管反向电压大可以击穿,所以叫”只能编程一次,不可擦除”

顾名思义”烧录”!

image-20240920151034449

image-20240920151215381

image-20240920151758874

image-20240920155227288

image-20240920162112213

image-20240920202812761