文章目录

一、项目概要

二、硬件设计

三、软件设计

四、编译与下载

五、小结


一、项目概要

本项目基于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  

⚠️ 特别提醒:本项目资料仅用于学习与技术交流分享,严禁用于任何商业用途或二次开发售卖,感谢理解!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐