【Proteus仿真】点亮小灯系列仿真——小灯闪烁/流水灯/交通灯
目录
0案例视频效果展示
0.1 例子1:单个LED闪烁
0.2 例子2:流水灯共阳极接法
0.3 例子3:流水灯共阴极极接法
0.4 例子4:花样流水灯
0.5 例子5:交通灯
1基础知识补充
1.1PWM信号
1.1.1基础知识
1.1.2物理本质
1.1.3应用
1.1.4实现方式
2例子1:单个LED灯闪烁仿真
2.1电路原理图
2.1.1电路组成及接线
2.2控制程序
2.2.1示波器效果
2.2.2控制程序步骤
2.2.3源代码
3例子2:流水灯共阳极接法
3.1电路原理图
3.1.1电路组成及接线
3.2控制程序
3.2.1控制程序步骤
3.2.2源代码
4例子3:流水灯共阴极接法
4.1电路原理图
4.1.1电路组成及接线
4.2控制程序
4.2.1控制程序步骤
4.2.2源代码
5例子4:花样流水灯
5.1电路原理图
5.1.1电路组成及接线
5.2控制程序
5.2.1控制程序步骤
5.2.2源代码
6例子5:交通灯
6.1电路原理图
6.1.1电路组成及接线
6.2控制程序
6.2.1控制程序步骤
6.2.2源代码
7 硬件工程师笔试面试相关文章链接
摘要:本文介绍了基于AT89C51单片机的LED控制案例,共包含5个实例:1)单个LED闪烁;2)共阳极流水灯;3)共阴极流水灯;4)花样流水灯;5)交通灯模拟。每个案例详细说明了电路原理图、接线方式和控制程序实现,其中重点讲解了PWM调光原理及其在LED控制中的应用。案例由简至繁,从基础I/O控制到复杂花样显示,最后实现交通灯逻辑控制,展示了单片机在LED控制中的典型应用方法。文中提供了完整的源代码,便于读者理解和实践。
0案例视频效果展示
0.1 例子1:单个LED闪烁
例子1:单个LED灯闪烁
0.2 例子2:流水灯共阳极接法
例子2:流水灯共阳极接法
0.3 例子3:流水灯共阴极极接法
例子3:流水灯共阴极接法
0.4 例子4:花样流水灯
例子4:花样流水灯
0.5 例子5:交通灯
例子5:交通灯
1基础知识补充
1.1PWM信号
1.1.1基础知识
PWM(Pulse Width Modulation,脉冲宽度调制)是一种周期性方波,其频率 f 固定,而高电平持续时间(脉宽)可调。
频率 f:1 s 内 PWM 波形重复多少次。
占空比 Duty:高电平时间 / 周期,0~100 %。
分辨率:占空比最小可调步长(8 bit ⇒ 255 级,16 bit ⇒ 65535 级)。
1.1.2物理本质
用“面积等效”思想把数字信号变成“模拟”效果的万能工具
数字 I/O 只能输出 0/1,但通过高速开关把能量切成小片,在负载上取时间平均,就得到 0~Vcc 之间的任意电平:
V̅ = D × Vhigh
1.1.3应用
LED 调光、RGB 呼吸灯
直流电机调速、舵机角度控制
开关电源(Buck/Boost)、音频 D 类功放
逆变器、太阳能 MPPT 充电
通信:红外 NEC、舵机 1~2 ms 脉宽协议
1.1.4实现方式
软件:
定时器中断 + I/O 翻转(51、AVR 无硬件 PWM 时)
硬件:
专用定时器 PWM 通道(STM32 TIMx, AVR Timer1/3, ESP32 MCPWM)
片上 sigma-delta 调制(ESP8266)
专用 IC(TL494、SG3525、DRV8871)
2例子1:单个LED灯闪烁仿真
实现功能:LED灯固定时间循环亮灭(闪烁)
本质:单片机的某个 I/O 口输出高/低电平,去驱动一个LED
2.1电路原理图
2.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P1.0—>连接共阳极LED小灯/示波器 |
复位电路 | |
晶振电路 | |
示波器 | |
共阳极LED小灯 |
2.2控制程序
2.2.1示波器效果
P1.0引脚的PWM信号能够实现闪烁参数的控制
PWM信号周期——>小灯闪烁频率
PWM信号占空比——>小灯闪烁亮度
2.2.2控制程序步骤
库文件与引脚定义
延时函数
主程序控制
2.2.3源代码
//功能:LED按设定的时间间隔闪烁#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}
3例子2:流水灯共阳极接法
实现功能:流水灯从左到右依次闪烁。
本质:单片机的I/O 口输出高/低电平,去驱动一个流水灯。
3.1电路原理图
3.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>连接共阳极LED流水灯 |
复位电路 | |
晶振电路 | |
共阳极LED流水灯 |
3.2控制程序
3.2.1控制程序步骤
库文件
延时函数
主程序(循环左移)
_crol_ 是 Keil C51(以及 Keil C166、部分国产 51 编译器)提供的 “循环左移” 内联函数(intrinsic),原型位于头文件 <intrins.h> 中。
_cror_函数同上所述
功能:把一个无符号字符或整型变量 整体向左循环移动 n 位,移出的最高位会回到最低位。
3.2.2源代码
//功能:接在P0口的8个LED从左到右循环依次点亮,产生流水灯效果#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}
4例子3:流水灯共阴极接法
实现功能:流水灯从左到右依次闪烁后从右到左依次闪烁一直循环。
本质:单片机的I/O 口输出高/低电平,去驱动一个流水灯。
4.1电路原理图
4.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P2.0-P2.7—>连接共阴极LED流水灯 |
复位电路 | |
晶振电路 | |
共阴极LED流水灯 |
4.2控制程序
4.2.1控制程序步骤
库文件
延时函数
主程序(循环左移/循环右移)
4.2.2源代码
//功能:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}
5例子4:花样流水灯
实现功能:两排流水灯按照程序设定进行花样闪烁。
本质:单片机的I/O 口输出高/低电平,去驱动一个流水灯。
5.1电路原理图
5.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>连接共阳极LED流水灯 P2.0-P2.7—>连接共阳极LED流水灯 |
复位电路 | |
晶振电路 | |
两排LED流水灯 |
5.2控制程序
5.2.1控制程序步骤
库函数
预设的闪烁花样闪烁方案1
预设的闪烁花样闪烁方案1
延时函数
主程序(循环方案1/2)
5.2.2源代码
//按照预设的闪烁花样闪烁#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}
6例子5:交通灯
实现功能(模仿交通灯亮):东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,一直重复。
本质:单片机的I/O 口输出高/低电平,去驱动一个流水灯。
6.1电路原理图
6.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.5—>连接共阳极交通灯 |
复位电路 | |
晶振电路 | |
交通灯 |
6.2控制程序
6.2.1控制程序步骤
库函数与引脚定义
延时函数
交通灯切换函数
主函数
6.2.2源代码
//东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,一直重复。#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; //东西向灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; //南北向灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//交通灯切换void Traffic_Light(){switch(Operation_Type){case 1: //东西向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case 2: //东西向黄灯闪烁,绿灯关闭DelayMS(300);YELLOW_A=~YELLOW_A;GREEN_A=1;if(++Flash_Count!=10) return; //闪烁5次Flash_Count=0;Operation_Type=3;break;case 3: //东西向红灯,南北向绿灯亮RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;DelayMS(2000);Operation_Type=4;break;case 4: //南北向黄灯闪烁5次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1;if(++Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}
7 硬件工程师笔试面试相关文章链接(部分链接)
更多文章可前往主页观看
1、硬件工程师笔面试真题汇总(2025版本)_硬件工程师面试题-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程师笔试面试高频考点汇总——(2025版)_电容或者电感对锁存器的影响-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程师笔试面试汇总(2025版本)_硬件工程师面试题-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程师笔试面试学习汇总——器件篇目录(2025版本)_【【硬件工程师炼成之路】器件篇(更新中。。。)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/142316204
硬件工程师笔记——电子器件汇总大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程详尽版--(2025最新版)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331