MZJ 发表于 2025-4-20 13:21:26

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

按钮控制流水灯就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();
                             }
                        }
                       
                        {
                       }
                }
        }
}

国芯人工智能 发表于 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 = ~(0x010; i--) {
      P2 = ~(0x01 = 0; i--) {
      P2 = ~(0x01

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 学习第二天擎天柱ai8051u按钮控制流水灯