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

1.点亮一颗小小的LED

51单片机

51单片机——点亮LED

配置流程

① 确定LED的连接方式

为什么?

因为需要知道LED是接在单片机引脚的正极还是负极。

  • LED正极接IO口,负极接地 → 输出高电平点亮。
  • LED负极接IO口,正极接电源 → 输出低电平点亮。

所以第一步不是写代码,而是先分析硬件电路


② 找到对应的IO引脚

为什么?

只有操作连接LED的那个引脚,电平变化才能传递到LED。


③ 输出正确的电平

为什么?

LED本质上是二极管,只有形成电流回路才能发光。

根据连接方式选择输出高电平或低电平,使LED两端形成合适的电压差,电流流过LED,从而点亮。


为什么51如此简单?

因为51单片机的硬件架构比较简单

  • 时钟系统简单。上电后整个单片机使用统一的系统时钟,不需要像 STM32 那样为 GPIO、USART、ADC 等外设分别开启时钟。
  • GPIO 功能单一。大多数 IO 上电后即可作为普通数字输入/输出使用,不需要配置工作模式。
  • 没有复杂的引脚复用机制。一个引脚通常只有少量功能,不需要配置复用功能(AF)。

因此,点亮 LED 的流程非常直接:

分析硬件 → 找到 IO → 输出正确电平。

stm32

配置流程

①打开对应模块的时钟

  • 打开对应引脚对应GPIO时钟即可。

为什么?

打开对应模块时钟以后,该模块才能开始工作

因为 CPU 一直都是工作的。
只是:

GPIO 没有时钟。 ↓ GPIO寄存器不会响应。 ↓ GPIO内部逻辑停止。 ↓ 所以操作GPIO没有效果。

STM32 将 CPU、GPIO、USART、TIM、ADC 等划分为多个独立的硬件模块,每个模块都需要时钟才能工作。为了降低功耗、提高资源利用率,这些模块的时钟默认可以独立控制,因此使用某个模块之前,需要先使能它的时钟。

绝大多数引脚都是按照GPIOA~GPIOX来进行分组划分,还有按照其他方式来进行划分。因此要使用哪个模块的引脚就需要去打开哪个模块的时钟,比如你要使用PA1,那就只需要打开GPIOA模块的时钟。这些模块的时钟开关都是单独存在,互不影响。这样做的好处就是:

  • 降低功耗,同时避免未使用外设无意义地运行

还有一个问题就是,stm32单片机中的一个引脚通常有大量复用功能,这些功能会针对不同的场景,比如会作为定时器的PWM输出或者是捕获,此时还需要打开这部分模块的时钟。


一个引脚通常有大量复用功能

真正可以这样理解:

GPIO 更像是一块交通枢纽。

例如:

PA9。

可以连接:

GPIO

USART1_TX

TIM1_CH2

I2C

这些模块都想使用 PA9。
那么:
到底是谁连接过去?
答案就是:

AF(Alternate Function)配置。

所以:
不是 GPIO 自己产生 PWM。
而是:

TIM1 产生 PWM。 ↓ AF把TIM1连接到PA9。 ↓ PA9输出PWM。

这是很多初学者容易混淆的地方。

个人总结:

  • 一个GPIO引脚更像一个交通枢纽,它不仅只能单纯的输出高低电平和等待输入的高低电平,而是连接着功能模块,比如定时器、串口、I2C通信。比如PA9,到底是哪一个功能模块想连接过去,就需要AF配置,所以不是GPIO自己产生PWM,而是某个定时器产生PWM,AF把TIM1连接到PA9,然后PA9才输出PWM的

AI总结:

  • STM32 将不同的功能划分为多个独立的硬件模块,每个模块只有在获得时钟后才能工作。一个功能往往不是由某一个模块单独完成,而是由多个模块协同完成。例如输出 PWM,需要 GPIO 模块负责引脚输出、定时器模块负责产生 PWM 信号,两者都必须使能时钟并完成相应配置

从这里就可以看到了,打开对应模块时钟不仅仅只是针对从GPIOX中做选择了,还有许多模块

②配置工作模式

  • 配置高速输出模式
  • 推挽输出模式

为什么?

STM32的一个引脚所承载的功能远比51丰富。
例如一个 PA8 可能既可以是:

  • GPIO
  • USART
  • SPI
  • I2C
  • PWM
  • 输入捕获
  • MCO

硬件不知道你到底想让它干什么。

因此需要你告诉它:

“今天你就是一个 GPIO 输出。”

所以,我们就需要单独针对,输入和输出来进行一个配置了。

假如引脚连接的是LED的负极:
就需要给LED输入低电平,站在单片机的视角上,就是单片机控制该引脚输出低电平,因此就得配置输出模式,在这里还可以选择输出的速度,有低速、中速、高速,我选择高速。但是事情到这里还没有结束
接下来还需要选择具体输出模式,有四种:

  • 推挽输出
  • 开漏输出
  • 复用推挽输出
  • 复用开漏输出

先不看复用,就从开漏和推挽展开,这样去理解:
推挽,就是说1不2,输出高电平就是高电平,输出低电平就是低电平,它的驱动比较稳定。
开漏,通常会有一个默认输出电平,然后通过某个触发开关,让它输出电平发生变化,关掉这个开关就会恢复默认输出电平。

试着反问:如果使用开漏会出现一个怎样的情况?

  • 输出高电平的时候,其实并没有真正的输出高电平
  • 只是将MOS管断开
  • 如果没有外部上拉,LED就不会工作。

所以我需要的是一个能够主动输出高、低电平,而不是要去依赖外部

③控制对应引脚输出正确电平

为什么?

LED本质上是二极管,只有形成电流回路才能发光。

http://www.cnnetsun.cn/news/3176222.html

相关文章:

  • Embedding是什么,为什么文本能变成向量
  • Layout 组件 + Store 模块的双层架构:关注点分离如何在中后台落地
  • 彻底搞懂RAG技术原理、落地流程与工程优化
  • 智能体内存架构设计:从原理到实践,构建具备长期记忆的AI助手
  • 从全连接层到Transformer FFN:3种网络结构图的演进与绘制要点
  • 3步实现Windows 10/11完美运行经典老游戏:dxwrapper兼容性解决方案完全指南
  • 基于FOC的无刷电机驱动方案设计与实现
  • Prometheus 告警静默:静默不是把问题关掉
  • 谈谈 IT 软件开发工程师 基本功
  • HR面试整理记录:2026年3款视频关键信息工具,高效出面试纪要
  • Leiden 算法 Python 实战:3步解决 Louvain 社区不连通问题(附代码)
  • 如何用uesave轻松解锁Unreal引擎游戏存档编辑?终极指南
  • Databricks SQL可扩展工作流:从慢查询到稳定数据服务
  • 如何用Rust开源工具uesave轻松编辑Unreal引擎游戏存档?终极指南来了!
  • 3步解决Deforum扩展安装与使用难题:从零到动画生成的完整指南
  • NumPy常用函数
  • ReActor:Stable Diffusion中最快的AI换脸插件,3步实现专业级人脸替换
  • InstructGPT 论文阅读笔记
  • Android存储清理终极指南:如何用SD Maid 2/SE让手机重获新生
  • RCNN vs YOLO 架构对比:从 3 个维度解析两阶段与单阶段检测器核心差异
  • 突破平台界限:Bottles如何让Linux用户无缝运行Windows软件生态
  • 【架构实战】金丝雀发布:灰度流量的精准控制与回滚
  • Jeepay开源支付系统深度解析:企业级分布式架构设计与生产部署最佳实践
  • WB实验管理:构建可追溯、可复用的机器学习实验体系
  • MLS点云道路标线自动化提取:基于PCL与OpenCV实现95%+准确率(附代码)
  • 线性回归落地七步闭环:从可控变量到业务可执行的因果模型
  • 深入深出openclaw:gateway代码实现阅读1
  • 西方形式主义认知范式泡沫化与贾子实践本位认知体系的替代性建构—— 基于多轮网络思辨对话文本的跨学科实证研究
  • 如何在浏览器中实现实时人体姿态搜索:pose-search完整指南
  • web应用技术作业10