51单片机按键控制LED移位
51单片机按键控制LED移位
文章目录
一、项目概要
本项目基于51单片机,实现两组独立LED灯通过4个独立按键分别控制上下循环移动功能。按键采用低电平有效触发,LED低电平点亮,灯珠移动到头后自动循环折返,程序使用 _crol_ / _cror_ 循环移位函数来实现。
二、硬件设计
1. 核心器件
- STC89C51/AT89C51 单片机
- 红色/绿色LED灯 16个
- 220Ω 限流电阻 16个
- 独立按键 4个 - 10K 上拉电阻 4个(或使用单片机内部上拉)
- 12MHz 晶振、22pF 电容、10K 复位电阻等最小系统配件
2. 电路连接方式
(1) LED部分(低电平点亮)
- 左侧LED:P0口控制
- D9 = P0.0、D8 = P0.1、D7 = P0.2、D6 = P0.3 - D5 = P0.4、D4 = P0.5、D3 = P0.6、D2 = P0.7
- 右侧LED:P2口控制
- D10 = P2.0、D11 = P2.1、D12 = P2.2、D13 = P2.3 - D14 = P2.4、D15 = P2.5、D16 = P2.6、D17 = P2.7
- 每个LED串联220Ω限流电阻后接地。
(2)按键部分(低电平有效)
- P1.0:左侧LED上移
- P1.1:左侧LED下移
- P1.2:右侧LED上移
- P1.3:右侧LED下移
- 按键一端接IO口,一端接地,IO口内部上拉使能。
可参考下图电路连接:

三、软件设计
1. 程序设计思路
- > 定义两组LED控制端口(P0、P2)与4个按键引脚(P1_0~P1_3)。
- > 使用 _crol_ (循环左移)、 _cror_ (循环右移)实现灯珠无缝循环移动。
- > 采用软件消抖,按键按下延时确认后再执行移位操作。
- > 左右两组LED独立控制,互不影响,上电默认点亮初始位。
- > 主循环中持续扫描按键状态,根据按键触发执行对应上下移动逻辑。
2. 完整代码
#include <reg51.h>
#include <intrins.h>
#include "delayms.h"
// 按键定义
sbit KEY_L_UP = P1^0; // 左灯 上移
sbit KEY_L_DOWN = P1^1; // 左灯 下移
sbit KEY_R_UP = P1^2; // 右灯 上移
sbit KEY_R_DOWN = P1^3; // 右灯 下移
u8 led_left = 0xFE; // 左边初始亮 D9(P0.0)
u8 led_right = 0xFE; // 右边初始亮 D10(P2.0)
void main(void)
{
led_left = 0xFE; // 1111 1110 → P0.0 亮
led_right = 0xFE;
P0 = led_left;
P2 = led_right;
while(1)
{
// ========== 左边灯控制 ==========
if(KEY_L_UP == 0) // 上移:D2 → … → D8 → D9
{
delay_ms(10);//消抖
if(KEY_L_UP == 0)
{
led_left = _cror_(led_left, 1); // 循环右移
P0 = led_left;
while(KEY_L_UP == 0); // 等待松开
}
}
if(KEY_L_DOWN == 0) // 下移:D9 → D8 → … → D2
{
delay_ms(10);
if(KEY_L_DOWN == 0)
{
led_left = _crol_(led_left, 1); // 循环左移
P0 = led_left;
while(KEY_L_DOWN == 0);
}
}
// ========== 右边灯控制 ==========
if(KEY_R_UP == 0)
{
delay_ms(10);
if(KEY_R_UP == 0)
{
led_right = _cror_(led_right, 1);
P2 = led_right;
while(KEY_R_UP == 0);
}
}
if(KEY_R_DOWN == 0)
{
delay_ms(10);
if(KEY_R_DOWN == 0)
{
led_right = _crol_(led_right, 1);
P2 = led_right;
while(KEY_R_DOWN == 0);
}
}
}
}
四、编译与下载
1.打开keil5项目工程,点击左上角的编译按键进行程序编译,编译结果显示0错误0警告就进行下一步的下载操作

2.打开proteus仿真工程,双击单片机进入配置页面,然后选择导入下载文件,最后点击OK,这样就下载好程序到单片机中了

3. 演示效果 :上电后左右两组LED各点亮1个初始灯,按下对应按键,LED分别上下循环移动,到达边界后自动折返。

五、小结
通过本次项目,可以掌握51单片机GPIO口控制LED、独立按键检测、软件消抖以及循环移位函数的使用方法。
最后,我已经把本次实验的完整源码、Proteus仿真文件、工程文件都整理好啦,需要的同学直接复制链接到百度网盘自取下载:
https://pan.baidu.com/s/14PkxNlzXecxIBVc8JZH5Pg?pwd=m7yx
⚠️ 特别提醒:本项目资料仅用于学习与技术交流分享,严禁用于任何商业用途或二次开发售卖,感谢理解!
更多推荐



所有评论(0)