news 2026/8/20 9:42:37

【嵌入式成长1】STC89C51点亮LED|GPIO原理、闪烁、流水灯实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【嵌入式成长1】STC89C51点亮LED|GPIO原理、闪烁、流水灯实战教程

一、LED实际应用场景

LED即发光二极管,生活中随处可见:显示屏、广告牌、指示灯、装饰灯带。单片机最基础、经典的入门实验就是点亮LED。

二、LED点灯基础原理

插件LED灯珠长引脚=正极,短引脚=负极

LED只有两端形成电压差、流过合适大小电流的时候才会发光。

⚠️LED不能直接接电源!必须串联限流电阻,电流过大直接烧毁灯珠。

限流电阻计算公式

R=VCC−VLEDIR=\frac{V_{CC}-V_{LED}}{I}R=IVCCVLED

  • 插件LED常规工作电流:20mA
  • 贴片LED常规工作电流:5mA
  • 红/黄光压降约1.8V,蓝/白光压降约3V

举个例子:3.3V供电、黄色贴片LED
R=(3.3−1.8)/0.005=300ΩR=(3.3-1.8)/0.005=300ΩR=(3.31.8)/0.005=300Ω

实际产品指示灯经常选用几千欧的大电阻,牺牲亮度换取更低功耗。

三、单片机GPIO控制LED

GPIO全称General‑purpose input/output通用输入输出引脚,可以配置输出高低电平,以此控制LED亮灭。

STC89C51的IO分组:

  • P0口:P0.0~P0.7
  • P1口:P1.0~P1.7
  • P2口:P2.0~P2.7
  • P3口:P3.0~P3.7
  • P4口:P4.0~P4.6

两种硬件接法

  1. IO口直接输出高电平点亮LED(不推荐):单片机IO输出驱动能力弱,亮度不足
  2. VCC供电,LED负极接IO引脚,IO输出低电平点亮LED(开发板标准接法

本实验开发板硬件:LED1、LED2、LED3分别接P2.7P2.6P2.5引脚输出低电平 → LED点亮

方式1:整体操作IO寄存器

直接给整个端口寄存器赋值,一次性控制8个引脚电平

P2=0x53;

0x53是十六进制,对应二进制0101 0011,对应控制P2口8个引脚电平。

进制简单科普

  • 十进制:0‑9,逢十进一,适合人阅读
  • 二进制:只有0、1,对应硬件高低电平,但是数字太长不好写
  • 十六进制:0‑9、A‑F,0x前缀,紧凑表达二进制,单片机代码最常用

一键点亮P2口全部LED示例代码

#include<reg52.h>voidmain(){P2=0x00;//全部输出低电平while(1){}}

while(1)死循环,单片机程序运行到这里永久停留

方式2:单独控制某一个引脚(sbit位定义)

sbit是C51编译器独有的关键字,可以单独操作寄存器其中某一个IO引脚,语法格式

sbit led1=P2^7;

代表:把P2.7引脚别名定义为led1,后续代码直接操作led1即可控制引脚电平。

单颗LED点亮完整代码

#include<reg52.h>sbit led=P2^7;voidmain(void){led=0;//输出低电平,点亮LEDwhile(1){}}

四、LED闪烁实验

闪烁逻辑:点亮 →延时一段时间 →熄灭 →延时一段时间,循环往复。

51单片机时间基础概念

  1. 时钟周期:晶振频率的倒数,12M晶振,时钟周期=1/12 us
  2. 机器周期:51单片机默认12时钟周期 =1个机器周期
  3. 指令周期:CPU执行一条汇编指令花费的总机器周期

软件延时原理:让CPU空循环,消耗时间,达到延时效果

通用毫秒延时函数(12M晶振)
voiddelay_ms(unsignedintxms)//@12MHz{unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}}

也可以使用STC‑ISP软件自动生成精准延时代码,省去手动计算

LED闪烁完整可运行代码

#include<reg52.h>sbit led=P2^7;//带参延时函数 12M晶振voiddelay_ms(unsignedintxms){unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}}voidmain(){while(1){led=0;delay_ms(500);//亮500msled=1;delay_ms(500);//灭500ms}}

五、流水灯实现

硬件:LED1(P2.7)、LED2(P2.6)、LED3(P2.5)依次循环点亮

版本1:单独位操作写法,可读性高

#include"reg52.h"#include"intrins.h"sbit LED1=P2^7;sbit LED2=P2^6;sbit LED3=P2^5;voidDelay1000ms()//@11.0592MHz{unsignedchari,j,k;_nop_();i=8;j=1;k=243;do{do{while(--k);}while(--j);}while(--i);}voidmain(){while(1){LED1=0;LED2=1;LED3=1;Delay1000ms();LED2=0;LED1=1;LED3=1;Delay1000ms();LED3=0;LED1=1;LED2=1;Delay1000ms();}}

版本2:端口寄存器整体赋值写法,代码简洁

#include<reg52.h>voiddelay_ms(unsignedintxms){unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--)}}voidmain(){while(1){P2=0xDF;//1101 1111 P2.7输出低delay_ms(500);P2=0xBF;//1011 1111 P2.6输出低delay_ms(500);P2=0x7F;//0111 1111 P2.5输出低delay_ms(500);}}

版本3:位运算封装函数,扩展性最强

#include<reg52.h>voiddelay_ms(unsignedintxms){unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--)}}//点亮指定P2端口引脚voidopen_led(unsignedintnum){P2=0xFF&~(1<<num);}voidmain(){while(1){open_led(7);delay_ms(500);open_led(6);delay_ms(500);open_led(5);delay_ms(500);}}

六、拓展知识点 bit / sbit / sfr区别

  1. bit:C51扩展基础数据类型,1位布尔变量,值只能是01,在单片机RAM空间分配存储空间,类似bool
bit flag=0;
  1. sbit:位别名定义,用来直接操作特殊寄存器的某一个引脚,不占用RAM内存,直接绑定硬件地址
sbit OV=PSW^2;

sbit三种标准写法

sbit OV=0xd2;sbit OV=PSW^2;sbit OV=0xD0^2;
  1. sfr:定义8位特殊功能寄存器,直接绑定硬件寄存器地址,reg52.h头文件内部大量使用sfr定义P0‑P3等端口
sfr P1=0x90;

七、本章小结

1、LED必须串联限流电阻,防止烧毁
2、可以整体赋值寄存器或者sbit单独控制单个IO引脚
3、软件空循环实现延时,完成LED闪烁效果
4、流水灯可以使用3种不同编码思路实现

下一章预告:独立按键检测,软件消抖原理与代码实现

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 9:42:23

语言检测技术选型:为何LLM并非最佳选择及专用方案实践

如果你正在开发一个多语言应用&#xff0c;或者需要处理用户输入的文本分类&#xff0c;你可能会想&#xff1a;“既然大语言模型&#xff08;LLM&#xff09;这么聪明&#xff0c;让它来识别文本语言&#xff0c;岂不是又快又准&#xff1f;” 这听起来很合理&#xff0c;毕竟…

作者头像 李华
网站建设 2026/8/20 9:42:21

技术博客标题优化实战:从SEO到三段式结构,提升文章打开率

在实际技术博客写作中&#xff0c;标题优化是提升文章可读性和搜索引擎友好度的重要环节&#xff0c;但很多开发者习惯性地将项目名称或功能描述直接用作标题&#xff0c;导致文章在信息流中缺乏吸引力&#xff0c;也难以被目标读者精准搜索到。一个结构清晰、关键词前置、符合…

作者头像 李华
网站建设 2026/8/20 9:41:18

《二手房市场分析必备:链家房源数据爬虫实战》

一、为什么要写这篇博客 在房地产数据分析、区域价格监测、投资决策支持等场景中,二手房市场数据是极其重要的基础资源。链家(现与贝壳找房深度整合)作为国内最大的二手房交易平台之一,拥有覆盖全国主要城市的房源信息,包括户型、面积、总价、单价、建筑年代、小区名称、…

作者头像 李华
网站建设 2026/8/20 9:38:49

Excel VBA插件开发:从工资条自动化到专业工具构建

你有没有遇到过这样的场景&#xff1a;每个月发工资前&#xff0c;财务同事都要花上大半天&#xff0c;把一份完整的工资表&#xff0c;手动拆分成成百上千条独立的工资条&#xff0c;再逐一发给员工&#xff1f;复制表头、插入空行、调整格式……这些操作机械、重复&#xff0…

作者头像 李华
网站建设 2026/8/20 9:37:26

计算机毕业设计之微信小程序减肥系统修改版

随着健康意识的不断提升&#xff0c;减肥成为了许多人关注的重点话题。为了满足广大用户科学、便捷减肥的需求&#xff0c;本研究设计并实现了一个基于微信小程序的减肥系统。该系统前台采用Uni-app框架开发&#xff0c;后台则基于Spring Boot框架构建&#xff0c;结合Vue前端技…

作者头像 李华