1.从零开始的单片机生活-LED篇

发布时间:2026/10/10 9:08:11

1.从零开始的单片机生活-LED篇 目录1.前言2.51单片机介绍3.LED模块介绍4.点亮一个LED5.LED闪烁6.LED流水灯7.独立按键控制LED亮灭8.独立按键控制LED状态9.独立按键控制LED显示二进制10. 独立按键控制LED移位11.后记1.前言《关于没洗杯子在便利店门口穿越异世界学习51单片机这回事》 分享学习过程和感悟。2.51单片机介绍使用普中51-实验板Keil5写代码STC-ISP进行烧录。下面介绍开发板各部分。1.动态数码管模块2.接口3.接口4.8*8LED点阵模块5.LED模块本期主角6.矩阵按键模块7.红外接收模块8.DS18B20数字温度传感器将环境温度转化为数字信号9.NRF24L01无线通信模块实现2.4GHz频段的低功耗、短距离无线数据传输10.独立按键模块11.USB转TTL下载模块12.CH340C芯片实现USB下载和串口通信功能13.AMS1117低压差线性稳压器将USB提供的5V电源转换为单片机系统所需的3.3V电压14.电源开关15.ADC模块16.存储数据17.复位按键18.蜂鸣器模块19.DS1302时钟模块为单片机系统提供精准的实时时钟RTC功能20.五线四相步进电机21.STC89C52RC单片机芯片22.接口23.74HC595D芯片扩展I/O输入/输出口控制8x8 LED点阵模块24.74HC245KA芯片:驱动数码管段选驱动点阵屏/LED双向传输控制25.扩展芯片3.LED模块介绍1LED在生活中很常见它具有单向导通性只有施加正向电压时才会发光。2在单片机上是8个LED组成的LED模块。编号由D1到D8下面是两个限流电阻左上方的P20-P27就是LED所对应的端口引脚下面看看这一部分的原理图。3从电源正极出发经过LED再串联了限流电阻接到P2引脚。4那么我们怎样控制LED呢如图LED左端电源已经提供了高电平要使LED发光那么P2端口就要输出低电平。规定输出高电平为5V低电平为0V所以当P2输出0V,电路就会导通。5那么接下来的问题就是如何控制P2输出高低电平也就是单片机怎样控制外设。首先要了解寄存器寄存器是一种存储器以8个为一组单片机通过控制寄存器来控制外部设备。CPU向P2寄存器写入0/1连接驱动器后放大电流最后就再在输入/输出端口输出高低电平1对应5V高电平0对应0V低电平。所以只需要在P2端口的寄存器写入0/1就可以控制LED。4.点亮一个LED实现如图效果只点亮D1 LED,其余LED熄灭。代码如下#includeSTC89C5xRC.Hvoidmain(){while(1){P20xF0;}}首先引入头文件因为P2定义在这个头文件中不然keil5不知道P2是什么。#includeSTC89C5xRC.H接着是主函数P2的寄存器以8位为一组刚好对应D1-D8八个LED,所以用二进制的八位分别对应不过规定低位是D1高位是D8(如下图所示)。这样 P21111 1110 就可以点亮D1了。而while(1)的循环使程序一直运行。voidmain(){while(1){P211111110;}}用十六进制表示#includeSTC89C5xRC.Hvoidmain(){while(1){P20xFE;}}5.LED闪烁先看实现效果LED闪烁我们已经点亮了LED要实现LED闪烁那么LED的状态是亮—灭— 亮—灭……代码如下P21111 1111熄灭所有的LED,也就是D1的熄灭状态。P20xFE)#includeSTC89C5xRC.Hvoidmain(){while(1){P20xFE;P20xFF;}}看起来perfect但是实际在单片机上运行这个程序时会发现D1LED一直是亮的这是因为单片机的运行速度非常快熄灭的时间太短导致看起来“没有熄灭”所以我们要加一个“延时”来实现闪烁效果。这是一个500ms的延时函数:#includeINTRINS.HvoidDelay500ms(void)//11.0592MHz{unsignedchardata i,j,k;_nop_();i4;j129;k119;do{do{while(--k);}while(--j);}while(--i);}加上延时函数之后LED闪烁的过程变成了亮—延时—灭—延时……周期为一秒的闪烁完整代码如下#includeSTC89C5xRC.HvoidDelay500ms(void)//11.0592MHz{unsignedchardata i,j,k;_nop_();i4;j129;k119;do{do{while(--k);}while(--j);}while(--i);}voidmain(){while(1){P20xFE;Delay500ms();P20xFF;Delay500ms();}}6.LED流水灯先看实现效果LED流水灯我们已经点亮了一个LED那么依次点亮D1~D8同时使其余的LED熄灭再重复这个过程就得到了流水灯。得到了以下代码#includeSTC89C5xRC.Hvoidmain(){while(1){P20xFE;P20xFD;P20xFB;P20xF7;P20xEF;P20xDF;P20xBF;P20x7F;}}对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗下面是结果因为单片机的运行速度非常快快速的执行循环代码 使所有的LED看起来一直保持点亮所以必须增加延时函数。代码如下#includeSTC89C5xRC.HvoidDelay500ms(void)//11.0592MHz{unsignedchardata i,j,k;i4;j129;k119;do{do{while(--k);}while(--j);}while(--i);}voidmain(){while(1){P20xFE;Delay500ms();P20xFD;Delay500ms();P20xFB;Delay500ms();P20xF7;Delay500ms();P20xEF;Delay500ms();P20xDF;Delay500ms();P20xBF;Delay500ms();P20x7F;Delay500ms();}}7.独立按键控制LED亮灭先看实现效果独立按键控制LED亮灭首先介绍独立按键这里用到的是独立按键模块10电路原理图如图四个按键共地另一端连接P3端口要实现按下按键时LED点亮松手时熄灭就要检测按键什么时候被按下。寄存器不仅能发出指令还能检测端口的电平再放到寄存器中所以只需要读取按键对应端口的电平高低就知道了按键什么时候被按下。由于单片机上电时是高电平1按键一端是地按键按下电路导通变为低电平0。1代表按键没有被按下0代表按键被按下。我们来分析整个过程端口电平为1——按键按下——端口电平为0——点亮LED——松开按键——熄灭LED。代码如下#includeSTC89C5xRC.Hvoidmain(){while(1){if(P310){P200;}else{P201;}}}其中P31对应k1按键P20对应第一个LED(D1)。既可以像P20xFE来控制P2端口的八个寄存器也可以用P200/1来单独控制单个寄存器。8.独立按键控制LED状态先看演示独立按键控制LED状态要实现按下按键来点亮/熄灭LED 本质上是检测到按下一次按键后来LED端口在0/1之间进行切换那么就要讲到按键抖动。也就是说按键没有被按下时是高电平1按下时是低电平0松开又回到高电平1但在按下和松开的瞬间按键抖动会造成电平在0/1之间不断切换5~10毫秒后才会稳定。按下一次按键对应1——0——1的变化但是按键抖动造成随机次数的变化也就是会判断为多次按下按键所以我们要添加延时来消除抖动分别加在检测到按下和松手的时候。代码如下#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){while(1){if(P310)//1.检测到按键按下{Delay(20);//2.延时消除按下时的抖动while(P310);//3。等待按键松开Delay(20);//4.延时消除松开时的抖动P20~P20;//5.取反实现LED亮灭转换}}}第三步为什么不用#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){while(1){if(P310){Delay(20);if(P311){Delay(20);P20~P20;}}}}当按住按键时会跳过**if(P31 1)并循环执行整个程序松手后P31变为高电平1被if(P31 0)的判断卡住不能进入内层判断出现按下按键被忽略的情况而while(P31 0);**会卡住不放行不管你按多久松手后才继续往下执行翻转。9.独立按键控制LED显示二进制先看演示独立按键控制LED显示二进制来举个例子我们用八个二进制代表LED八个寄存器模拟二进制计数8765432100000000//初始 //000000001//每按键一次加1 //100000010//200000011//300000100//400000101//500000110//600000111//700001000//8~~~~~~发现LED的点亮就是按键按下次数的二进制表示再取反即可所以只需要记录按键次数每按下一次次数加一再将次数赋给P2端口即可。代码如下#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){charlednum0;while(1){if(P310){Delay(20);while(P310);Delay(20);lednum;P2~lednum;}}}10. 独立按键控制LED移位先看演示:独立按键控制LED移位要实现用两个按键控制LED左右移动先来举个例子这里我们用1表现LED点亮87654321寄存器00000001//假设初始电平状态00000010//左移00000100//左移00001000//左移00000100//右移~发现左右移动是初始情况左移位/右移位按键按下次数而次数由两个按键的加减得到再取反就得到点亮LED的寄存器表示。实现变量记录按键按下次数右移加左移减实际LED移动判断LED移动到边界的情况。代码如下#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){charlednum0;P2~0x01;while(1){if(P300){Delay(20);while(P300);Delay(20);lednum;if(lednum8){lednum0;}P2~(0x01lednum);}if(P310){Delay(20);while(P310);Delay(20);if(lednum0){lednum7;}else{lednum--;}P2~(0x01lednum);}}}11.后记拖延症陆陆续续写了很久第一次写这种文章内容格式不好之处请见谅。文章中有些图片截自B站江协科技。以后也会继续更新学习内容谢谢大家。求三连
延伸阅读

更多相关文章

2026/10/8 3:33:30

企业级RAG性能优化与质量治理(8):在线反馈、失败样本回流与持续优化闭环

文章摘要 前七篇已经完成文档解析、混合召回、索引版本治理、质量评测、查询增强、可信证据和缓存一致性。系统已经具备较完整的离线工程能力,但只依赖上线前数据集仍然不够。真实用户会带来开发团队从未考虑的口语表达、长文档、权限组合、动态数据、多轮指代、缓存…

2026/10/8 3:37:48

小红书作品怎么下载?免费开源工具三步搞定无水印批量下载

小红书作品怎么下载?免费开源工具三步搞定无水印批量下载 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&…

2026/10/10 14:58:05

手写小型C编译器:从词法分析到代码生成的完整实现解析

简介:一份小型C编译器完整实现源码,面向想深入钻研编译原理的学生与开发者。编译器将C语言翻译为可执行程序,需经历词法分析、语法分析、语义分析、优化与代码生成等阶段;这份代码完整覆盖这些核心流程,并配套头文件与…

2026/10/10 14:58:05

Java+SpringBoot+SSM宠物领养一站式系统:从设计到实现全解析

说个实话,宠物领养类系统在Java毕设里算是“常青树”,但很多同学拿到题目之后第一反应是先去搜“宠物领养系统源码”,结果要么下到一堆看不懂的工程,要么配了一晚上环境连登录页都打不开。我自己做过不少SpringBootSSM的业务系统&…

2026/10/10 14:58:05

CDO算法全解析:云漂移优化模型的Matlab实现与调参实战

最早听说云漂移优化(Cloud Drift Optimization,CDO)算法的时候,我其实没太当回事。做智能优化算法这行久了,什么豹子、狮子、瓢虫、向日葵的仿生算法见太多了,名字一个比一个唬人,能经得住测试函…

2026/10/10 14:53:04

显卡驱动卸载后如何重新安装?手把手教你恢复显示与性能

1. 显卡驱动卸载了怎么重新安装 手把手教你重新安装显卡驱动这玩意儿,平时安安静静待在系统里干活,你基本感觉不到它的存在。可一旦手贱把它卸了,或者卸载过程中出了岔子,那画面就精彩了——分辨率瞬间掉到800600,图标…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑