找回密码
 立即注册
查看: 19|回复: 1

学习第二天擎天柱ai8051u按钮控制流水灯

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:16:06
已绑定手机

5

主题

4

回帖

35

积分

新手上路

积分
35
发表于 2025-4-20 13:21:26 | 显示全部楼层 |阅读模式
按钮控制流水灯就if else
P33控制往返流水灯
P32控制逆序流水灯
松开按钮断电
#include <AI8051U.H>
void Delay500ms(void)        //@12.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 1499998UL;
        while (i) i--;
}
void main()
{
        P3M1=0;
        P3M0=0;
        P2M1=0;
        P2M0=0;
        while(1)
        {
                if(P33==0)
                {
                P20=1;
                P21=0;
                Delay500ms();
                P21=1;
                P22=0;
                Delay500ms();
                P22=1;
                P23=0;
                Delay500ms();
                P23=1;
                P24=0;
                Delay500ms();
                P24=1;
                P25=0;
                Delay500ms();
                P25=1;
                P26=0;
                Delay500ms();
                P26=1;
                P27=0;
                Delay500ms();
                P27=1;
                P26=0;
                Delay500ms();
                P26=1;
                P25=0;
                Delay500ms();
                P25=1;
                P24=0;
                Delay500ms();
                P24=1;
                P23=0;
                Delay500ms();
                P23=1;
                P22=0;
                Delay500ms();
                P22=1;
                P21=0;
                Delay500ms();
                P21=1;
                P20=0;
                Delay500ms();
                }
                else
                {if(P33!=0)
                        {
                                P20=1;
                                P21=1;
                                P22=1;
                                P23=1;
                                P24=1;
                                P25=1;
                                P26=1;
                                P27=1;
                                if(P32==0)
                             {
                                                         Delay500ms();
                                                        P27=1;
                                                        P26=0;
                                                        Delay500ms();
                                                        P26=1;
                                                        P25=0;
                                                        Delay500ms();
                                                        P25=1;
                                                        P24=0;
                                                        Delay500ms();
                                                        P24=1;
                                                        P23=0;
                                                        Delay500ms();
                                                        P23=1;
                                                        P22=0;
                                                        Delay500ms();                                       
                                                        P22=1;
                                                        P21=0;
                                                        Delay500ms();
                                                        P21=1;
                                                        P20=0;
                                                        Delay500ms();
                             }
                        }
                         
                        {
                         }
                }
        }
}

bcb18de560288f07b8282c83007a5770.mp4

3.28 MB, 下载次数: 1

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-20 13:23:00 | 显示全部楼层
在嵌入式系统中,流水灯控制是一个经典的应用场景,尤其对于初学者而言,通过按钮控制流水灯的变化能够有效理解GPIO(通用输入输出端口)的基本操作以及条件判断语句的使用。以下是对您提供的代码的详细解析与优化建议。

1. 代码解析

1.1 硬件连接
P33:用于控制往返流水灯的按钮。
P32:用于控制逆序流水灯的按钮。
P2端口:连接了8个LED灯,分别对应P20到P27。

1.2 代码结构
Delay500ms函数:用于实现500ms的延时。通过一个无符号长整型变量i进行计数,循环递减至0,从而实现延时。
主函数main:
初始化P2和P3端口为普通IO模式。
通过while(1)进入无限循环,检测按钮状态。
如果P33为低电平(按钮按下),则依次点亮P20到P27的LED,然后再依次熄灭,实现往返流水灯效果。
如果P32为低电平(按钮按下),则依次点亮P27到P20的LED,实现逆序流水灯效果。

1.3 代码问题
代码冗余:往返流水灯的实现部分代码过于冗余,重复了多次Delay500ms和LED控制语句,不利于维护和扩展。
缺乏按钮去抖动处理:在实际应用中,机械按钮在按下和释放时会产生抖动,可能导致多次误触发。代码中未加入去抖动处理。
代码可读性差:流水灯控制的逻辑较为复杂,缺乏模块化和注释,不利于理解和修改。

2. 代码优化

2.1 去抖动处理
为了消除按钮抖动的影响,可以在检测按钮状态时加入延时去抖动处理。常见的去抖动方法是通过延时一段时间后再次检测按钮状态,确保按钮稳定按下或释放。

2.2 模块化设计
将流水灯的控制逻辑封装为函数,提高代码的可读性和可维护性。

2.3 优化后的代码

```c
include

define uchar unsigned char
define uint unsigned int

// 延时函数
void Delay500ms(void) {
    uint i = 1499998UL;
    while (i--) ;
}

// 去抖动函数
bit ButtonDebounce(bit pin) {
    if (pin == 0) {
        Delay500ms();
        if (pin == 0) return 1;
    }
    return 0;
}

// 往返流水灯函数
void FlowLED() {
    uchar i;
    for (i = 0; i < 8; i++) {
        P2 = ~(0x01  0; i--) {
        P2 = ~(0x01 = 0; i--) {
        P2 = ~(0x01

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:25 , Processed in 0.147047 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表