嵌入式 - 硬件:51单片机

本节重点

1. MCU、CPU、GPU、NPU、SOC、MPU、FPU

2. 内存、外存的区别

3. RAM和ROM的区别,单片机RAM大小

4. 三大总线及其特点

5. 发光二极管分类及其特点

6. 数码管显示原理

一、嵌入式

以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统。

二、51 单片机

1980 年,由 Intel 公司推出 MCS-51 系列的8051 型号单片机(多用于工业控制领域),实现从 MCU 向类 CPU 功能的拓展。
其他厂商代表型号:

  • Atmel:AT89C51;
  • Philip:P89V5 系列单片机(增强型单片机,支持 ISP 在线编程);
  • STC 宏晶半导体:STC89C51、STC89C52、STC89C52RC。

三、相关概念

术语全称 & 核心解释
CPUCentral Processing Unit(中央处理器):负责数据运算、指令处理;CPU 性能越高,指令处理和数据运算速度越快。
MCUMicro Controller Unit(微控制器)--- 单片机:集成度高,将 CPU、RAM、ROM、定时器、UART、IO 等功能集成到单芯片中;适用于简单控制场景,成本低。
MPUMicro Processing Unit(微处理器):集成度低,仅包含单独 CPU,需外接外设、存储模块;适用于复杂应用领域(如运行 Linux 系统),成本高。
GPUGraphics Processing Unit(图形处理器) ---- 显卡:负责图形处理、图形渲染;GPU 性能越好,图形显示质量越高。
NPUNeural Processing Unit(神经网络处理器):负责 AI 推理、硬件加速、神经网络处理(如卷积运算);例如华为 Mate60 的 “达芬奇 NPU” 可实现 AI 自动优化照片。
FPUFloating Point Unit(浮点数运算单元):专门完成浮点数的运算和处理(遵循 IEEE 754 标准);大部分集成在 CPU 内部。
SOCSystem On Chip(片上系统):集成度高,将存储芯片、外设芯片等多个功能模块集成到单块芯片上。

四、RAM 和 ROM

  • 外存:主要存放程序、代码、指令;掉电数据不丢失,读写速度慢,价格便宜(如移动硬盘 1T 约 300 元)。
  • 内存:主要存放程序运行过程中的临时变量;掉电数据丢失,读写速度快,价格昂贵(如内存条 16G 约 300 元)。
  • ROM:Read-Only Memory(只读存储器);存放单片机程序、指令,掉电数据不丢失。
  • RAM:Random Access Memory(随机访问存储器);存放临时变量、临时数据,掉电数据丢失。

单片机的存储系统简化为 “ROM+RAM”,分工明确:

  • ROM(只读存储器):单片机的 “程序仓库”,存放我们编写的控制程序、指令,掉电后数据不丢失(比如你写的 “LED 闪烁程序” 就存在这里)。
  • RAM(随机访问存储器):单片机的 “临时工作台”,存放程序运行中的临时变量(比如计算过程中的计数器值、传感器的实时数据),掉电后数据丢失。

注意:51 单片机的 RAM 容量很小,经典型号(如 STC89C52)的 RAM 仅为256 字节,因此编程时要避免定义过大的变量。

五、单片机内部结构:三大总线 + 核心模块

51 单片机的内部结构像一个 “微型工厂”,各模块协同工作,而 “三大总线” 负责连接各模块。

1. 核心内部模块

一块 51 单片机芯片内部集成了以下关键模块,无需外接就能实现基础控制功能:

  • CPU:核心运算单元,执行程序指令;
  • RAM/ROM:存储模块,对应上文的 “临时工作台” 和 “程序仓库”;
  • Timer(定时器):实现定时功能(如 “每隔 1 秒亮一次灯”);
  • PWM(脉冲宽度调制):控制输出信号的占空比(如调节 LED 亮度、电机转速);
  • IO 口:输入 / 输出接口(如连接 LED、按键、数码管);
  • 中断:处理紧急事件(如外部按键按下时,暂停当前程序优先响应按键);
  • UART(串口):实现单片机与电脑的通信(如程序下载、数据上传)。

2. 三大总线:连接模块的 “桥梁”

三大总线负责在内部模块间传输数据、地址和控制信号,是单片机工作的 “基础设施”:

  • 地址总线:“找位置”—— 负责传输 RAM 的地址,告诉 CPU “要访问的临时数据在 RAM 的哪个位置”。51 单片机的地址总线宽度为 8 位,最大寻址范围为2^8 = 256字节(对应 RAM 容量),单向传输(只能从 CPU 发往 RAM)。
  • 数据总线:“传数据”—— 在 CPU 和 RAM 之间传输实际数据(如变量值),双向传输(可从 RAM 读数据到 CPU,也可从 CPU 写数据到 RAM)。
  • 控制总线:“发指令”—— 负责传输控制信号,比如 “开始读数据”“中断请求”“IO 口控制”,协调各模块的工作时序(时序控制)

六、硬件基础:原理图中的关键元素

要让单片机工作,必须先看懂基础原理图,核心关注 “MCU 封装”“网络编号” 和 “LED 模块”。

1. MCU 封装:以 STC89C52RC 为例

STC89C52RC 最常用的封装是DIP40(双列直插式),即芯片有 40 个引脚,这些引脚分为 4 组 IO 口(P0~P3),对应程序中的端口寄存器(如unsigned char P2;—— 通过操作 P2 寄存器就能控制 P2 口的 8 个引脚)。

2. 网络编号

在实际电路中的一个编号,避免物理连线,相同网络的编号的引脚在实际电路中是彼此互通

3. LED 模块:单向导通的 “发光二极管”

具有单向导通性,分为共阳极和共阴极二极管

  • 共阳极 LED:所有 LED 的阳极接电源正极(VCC,5V),阴极接单片机的 IO 引脚。
    导通条件:单片机 IO 引脚输出低电平(0V),此时阳极(5V)和阴极(0V)形成电压差,电流流过 LED,使其发光。
  • 共阴极 LED:与共阳极相反,阴极接 GND,阳极接单片机 IO 引脚,需 IO 输出高电平才能发光。

七、编程核心:位运算(置 1 / 清 0 / 异或)

单片机编程频繁操作 IO 口的 “某一位”(比如 “让 P2 口的第 0 位输出低电平”),这就需要位运算—— 直接操作二进制的每一位(bit)。

1. 三种核心位运算

运算符号名称规则(对应 bit 比较)核心应用场景示例代码(以 unsigned char t 为例)
|按位或有 1 则 1,全 0 则 0指定位置 1(让某 bit=1)

把 t 的 bit0 和 bit7 置 1:

t |= (1 << 0) | (1 << 7);

&按位与全 1 则 1,有 0 则 0指定位清 0(让某 bit=0)

把 t 的 bit0 和 bit7 清 0:

t &= ~(1 << 0);

t &= ~(1 << 7);

^按位异或相同则 0,不同则 1指定位翻转(0 变 1,1 变 0)

把 t 的 bit0 翻转:

t ^= (1 << 0);

2. 练习

已知:unsigned char a = 0x62; unsigned char b = 0xFF;(16 进制转二进制:0x62=01100010,0xFF=11111111)

(1)将 a 的 bit0 和 bit7 置 1

        a |= (1 << 0) | (1 << 7);

(2)将 b 的高 4 位清 0

         t &= ~(0x0F << 4);         
t &= ~(0xF0 << 0);     

八、单片机程序创建、编写、编译、下载流程:

掌握 “编写 - 编译 - 下载” 流程,你就能让单片机执行你的指令(比如控制 LED 闪烁),这里以Keil4(51 单片机专用开发软件) 为例:

步骤 1:安装 Keil4

步骤 2:新建工程

  1. 点击菜单栏「Project」→「New Project」,选择工程保存路径,命名(如 “LED_Blink”);
  2. 选择芯片型号:在弹出的 “Select Device for Target” 窗口中,展开「Atmel」→选择「AT89C51」
  3. 弹出 “Copy Standard 8051 Startup Code to Project Folder” 时,点击「否」---------------------不拷贝启动代码

步骤 3:添加 C 语言文件

  1. 点击菜单栏「File」→「New」,新建空白文本;
  2. 按「Ctrl+S」保存,命名为 “main.c”(必须加.c 后缀,保存到工程同一目录);
  3. 双击左侧Grpup,点击Add 将文件加入到对应的Group下。

步骤 4:编写程序(以 LED 闪烁为例)

1  .#include <reg51.h>, 加入51单片机头文件

2 .需要加入while(1)避免程序跑飞

示例代码:

#include <reg51.h>// 延时函数(简单延时,约1秒)
void delay() {unsigned int i, j;for(i = 0; i < 60000; i++)for(j = 0; j < 10; j++);
}void main() {while(1) {P2 = 0xFE;  // P2口bit0=0(低电平),其他bit=1,对应LED亮delay();    // 延时1秒P2 = 0xFF;  // P2口全为1(高电平),LED灭delay();    // 延时1秒}
}

步骤 5:编译生成 HEX 文件

  1. 点击菜单栏「Project」→「Options for Target 'Target 1'」(或直接点工具栏 “魔术棒” 图标);
  2. 切换到「Output」选项卡,勾选「Create HEX File」(生成可下载的十六进制文件),点击「OK」;
  3. 点击工具栏「Build」(或按 F7),编译工程,下方 “Build Output” 窗口显示 “0 Errors” 即编译成功,工程目录下会生成 “LED_Blink.hex” 文件。

步骤 6:下载程序到单片机

(1)打开ISP软件,连接串口线

(2)选择单片机芯片型号:STC89C52/C51/C52RC

(3)根据串口识别的端口号,选择对应的端口  COM4

(4)选择"打开程序文件" -> 对应目录下的hex文件

(5)点击"下载/编程"按钮,将单片机复位后程序即可下载到单片机ROM中

九、数码管:单片机的 “显示窗口”

4 位共阴极数码管

数码管:51单片机搭载一个4位共阴极数码管,每一位数码管可以显示一些独立数值,数码管同一时刻只能显示一位

核心是 “位选 + 段选” 的配合。

1. 基本原理

4 位数码管看似能同时显示 4 个数字(如 “1234”),但同一时刻只能显示 1 位—— 利用 “视觉暂留效应”(人眼对光的残留时间约 0.1 秒),快速切换 4 位数码管的显示,让人感觉 “同时亮”。

2. 核心概念

  • 位选:“选哪一位显示”—— 选中某一位数码管(将P1寄存器对应bit位置1)

  • 段选:“显示什么数字”—— 数码管的每一段(a~g 段 + dp 小数点)对应一个 IO 口,通过控制 “段选端” 的高低电平,显示 0~9 的数字(如显示 “0” 需要 a~f 段亮,g 段灭)。

3. 显示流程(以显示 “1234” 为例)

  1. 位选选中第 1 位,段选输出 “1” 的段码,显示 “1”,延时 1ms;
  2. 位选选中第 2 位,段选输出 “2” 的段码,显示 “2”,延时 1ms;
  3. 位选选中第 3 位,段选输出 “3” 的段码,显示 “3”,延时 1ms;
  4. 位选选中第 4 位,段选输出 “4” 的段码,显示 “4”,延时 1ms;
  5. 循环执行 1~4 步,由于切换速度快(总周期 4ms),人眼看到 “1234” 同时显示。


十、重点总结 + 工具推荐

必背重点(面试 / 实操高频)

  1. 概念辨析:MCU(集成度高、简单控制)vs MPU(需外接外设、复杂应用);
  2. 存储区别:RAM(临时变量、掉电丢失)vs ROM(程序指令、掉电不丢);
  3. 三大总线:地址总线(单向、寻址)、数据总线(双向、传数据)、控制总线(时序控制);
  4. LED 导通:共阳极需阴极接低电平,共阴极需阳极接高电平;
  5. 位运算应用|置 1、&清 0、^翻转;
  6. 程序流程:Keil 编译生成 HEX,STC-ISP 下载,复位单片机生效。

实用工具推荐

  • 文档编写:Typora(用 Markdown 写技术文档,可导出 PDF);
  • 截图工具:PixPin(精准截图,支持标注,适合画原理图注释);
  • AI 辅助:腾讯元宝、ima(解决编程报错、原理疑问,提升学习效率)。

编写  .h


十一、实战练习

1.流水灯

main.c

led.c

2.数码管显示

main.c

digiter.c

digiter.h

delay.c  delay.h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95231.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Spring Boot 中 Redis 缓存穿透问题排查与解决方案

前言 作为一名普通的 Java 程序开发者&#xff0c;日常开发中难免会遇到一些看似简单但实际排查起来非常棘手的问题。在最近的一个项目中&#xff0c;我遇到了一个 Redis 缓存穿透的问题&#xff0c;导致系统在高并发下性能急剧下降&#xff0c;甚至出现服务响应超时的情况。这…

Ubuntu下配置并远程连接MySQL

1、安装mysql-serverapt update apt install mysql-server2、修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0 mysqlx-bind-address 0.0.0.03、启动并设置服务为开机自启动systemctl enable mysql.service --now4、查看服务状态systemct…

开源 C++ QT Widget 开发(九)图表--仪表盘

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 C QT Widget 开发&#xff08;一&#xff09;工程文件结构-CSDN博客 开源…

怎么为服务器设置或重置服务器密码?

创建服务器后&#xff0c;您可以设置服务器的登录密码&#xff0c;如果你忘记了密码&#xff0c;可以重新设置实例的密码。本文讲一下如何重置阿里云服务器密码。使用限制&#xff1a;离线重置密码仅支持在控制台设置或重置服务器管理员账号的密码。•Windows 实例的默认用户名…

【线性代数入门 | 那忘算8】洛谷P3389 高斯消元(内附行列式教学)

想了想还是单开了一篇&#xff0c;数学王子值得&#xff01; 专栏指路&#xff1a;《再来一遍一定记住的算法&#xff08;那些你可能忘记了的算法&#xff09;》 前置知识&#xff1a; 矩阵&#xff1a;数的集合&#xff0c;一般是方程的系数。 题面&#xff1a; 洛谷P3389 …

GEM5学习(3):如何快速创建一个组件

通过一个图并行计算的测试用例&#xff0c;来学习如何快速构建一个目标组件 其核心思想是通过继承现有组件再拓展自定义参数 创建脚本 如何创建脚本&#xff0c;具体还可以看官方说明&#xff1a;gem5: Adding cache to configuration script mkdir configs/tutorial/part1/…

数据血缘中的图数据库如何选择

Neo4j 和 ArangoDB 都是非常优秀的图数据库&#xff0c;但它们的设计哲学、核心架构和适用场景有显著的区别。 简单来说&#xff0c;核心区别在于&#xff1a; Neo4j 是原生图数据库&#xff0c;专为处理图数据和图查询而设计和优化。ArangoDB 是多模型数据库&#xff0c;同时支…

第27章学习笔记|学无止境:从“会用命令”到“会做工具”的进阶路线

第27章学习笔记|学无止境:从“会用命令”到“会做工具”的进阶路线 你已经能用 PowerShell 解决很多日常问题了。接下来最重要的,就是把零散命令升级为可复用的工具,并在真实场景中不断打磨。 一、为什么下一步是“工具化(Toolmaking)” 当任务开始“重复、多人用、可移…

C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)

第 37章 正则表达式(Regular Expressions) 目录 37.1 正则表达式(规范表达式)(Regular Expressions) 37.1.1 正则表达式相关符号(Regular Express Notation) 37.2 regex 37.2.1 匹配结果(Match Results) 37.2.2 格式化(Formatting) 37.3 正则表达式函数 37.3.1 …

sciml包scixgboost函数发布,轻松完成机器学习xgboost分析

Xgboost是Boosting算法的其中一种&#xff0c;Boosting算法的思想是将许多弱分类器集成在一起&#xff0c;形成一个强分类器。因为Xgboost是一种提升树模型&#xff0c;所以它是将许多树模型集成在一起&#xff0c;形成一个很强的分类器。 我目前整合了多个R包&#xff0c;编写…

Ubuntu中配置JMmeter工具

1、检查是否已安装Java 环境java -version若未安装&#xff0c;执行以下命令安装 OpenJDKsudo apt update sudo apt install openjdk-11-jdk # 或 openjdk-17-jdk2、用wget直接下载JMeter压缩包wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz将下载的…

LeetCode 925.长按键入

你的朋友正在使用键盘输入他的名字 name。偶尔&#xff0c;在键入字符 c 时&#xff0c;按键可能会被长按&#xff0c;而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字&#xff08;其中一些字符可能被长按&#xff09;&#…

9.3 模拟

lc190 颠倒二进制ret (ret << 1) (n >> i & 1);class Solution { public:uint32_t reverseBits(uint32_t n) {uint32_t ret 0;for (int i 0; i < 32; i)ret (ret << 1) (n >> i & 1);return ret;} };lc14 flag checkclass Solution {…

esp32小智ai对话机器人

ESP-IDF 环境搭建与问题解决 下载与安装 ESP-IDF 官方下载地址&#xff1a;https://dl.espressif.com/dl/esp-idf建议使用稳定版本&#xff0c;避免开发版可能存在的兼容性问题 中文编码问题解决方案 $env:PYTHONIOENCODING "utf-8" $env:PYTHONUTF8 "1&q…

11.类与对象

目录 1. 创建类与对象示例 1.1 __init__ 初始化器: 1.2 __new__构造器 1.3 什么时候需要重写 __new__? 1.4 init和new对比 2. 属性 2.1 实例属性 2.2 类属性 3. 作用域命名约定 3.1 非公共属性 3.2 公共属性 3.3 名称修饰 3.4 一眼看懂三种“可见性” 4. 方法 …

【js】Promise.try VS try-catch

前言JavaScript 正为 Promise 添加一个新的方法&#xff0c;使得处理异步函数更加清晰和安全。Promise.try 允许将任何函数包装在 Promise 中&#xff0c;无论它是否异步。使用 Promise.try 可避免传统 try/catch 结构与 Promise 链的混合使用&#xff0c;代码更简洁。try-catc…

MySQL-表的约束(上)

表的约束在 MySQL 中&#xff0c;表的约束&#xff08;Constraints&#xff09;用于确保数据库中数据的完整性和一致性。它们定义了对表中数据的规则和限制&#xff0c;防止无效或不一致的数据被插入、更新或删除。常见的 MySQL 表约束包括主键约束&#xff08;PRIMARY KEY&…

Frida + FART 联手:解锁更强大的 Android 脱壳新姿势

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ Frida FART 联手能带来什么提升&#xff1f; 增强 FART 的脱壳能力&#xff1a;解决对抗 FART 的壳、动态加载的 dex 的 dump 和修复&#xff1b; 控制 FART…

TLS/SSL(传输层安全协议)

文章目录一、核心概念二、为什么需要 TLS/SSL&#xff1f;三、工作原理与详细流程握手步骤详解&#xff1a;1.ClientHello & ServerHello&#xff1a;2.服务器认证 (Certificate, ServerKeyExchange)&#xff1a;3.客户端响应 (ClientKeyExchange, Finished)&#xff1a;4.…

什么是 AWS 和 GCE ?

AWS 和 GCE 是两种不同厂商提供的云计算服务&#xff0c;主要区别在于提供商和产品定位。AWS全称&#xff1a;Amazon Web Services提供商&#xff1a;亚马逊 (Amazon)简介&#xff1a;全球最大的云计算平台之一&#xff0c;提供完整的云服务&#xff0c;包括&#xff1a; 计算&…