吕嘉淇 2023-04-22 15:38 采纳率: 33.3%
浏览 27
已结题

51单片机入门问题求解答

哪位兄弟帮看一下如何让程序变得更简便,实现一个流水呼吸灯 在此基础上怎么改呢

#include<reg52.h>
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
void Delay(unsigned int t); 
void main (void)
{
                  
unsigned int CYCLE=600,PWM_LOW=0;

 P1=0xFF;
 
while (1)         
  {
 LED0=1;
 Delay(60000);        //特意加延时,可以看到熄灭的过程
 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低
 //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次

     LED0=0;        //点亮LED  
     Delay(PWM_LOW);//延时长度,600次循环中从1加至599
     LED0=1;        //熄灭LED
       Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
     
   }
 LED0=0;
 for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程

     LED0=0;
     Delay(PWM_LOW);
     LED0=1;
       Delay(CYCLE-PWM_LOW);
     
   }
                     //主循环中添加其他需要一直工作的程序
  break;}

while (1)         
  {
 LED0=1;
 Delay(60000);        //特意加延时,可以看到熄灭的过程
 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低
 //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次

     LED1=0;        //点亮LED  
     Delay(PWM_LOW);//延时长度,600次循环中从1加至599
     LED1=1;        //熄灭LED
       Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
     
   }
 LED1=0;
 for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程

     LED1=0;
     Delay(PWM_LOW);
     LED1=1;
       Delay(CYCLE-PWM_LOW);
     
   }
                     //主循环中添加其他需要一直工作的程序
  break;}
  while (1)         
  {
 LED2=1;
 Delay(60000);        //特意加延时,可以看到熄灭的过程
 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低
 //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次

     LED2=0;        //点亮LED  
     Delay(PWM_LOW);//延时长度,600次循环中从1加至599
     LED2=1;        //熄灭LED
       Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
     
   }
 LED2=0;
 for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程

     LED2=0;
     Delay(PWM_LOW);
     LED2=1;
       Delay(CYCLE-PWM_LOW);
     
   }
                     //主循环中添加其他需要一直工作的程序
  break;}
void Delay(unsigned int t)
{
 while(--t);
}
  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-22 15:45
    关注

    基于Monster 组和GPT的调写:

    用循环结构和数组来简化代码,这样可以避免多次复制黏贴代码,同时也可以方便地扩展流水灯的数量

    #include <reg52.h>
    
    #define LED_NUM 8
    #define CYCLE 600
    
    sbit LED_Pins[LED_NUM] = {P1^0, P1^1, P1^2, P1^3, P1^4, P1^5, P1^6, P1^7};
    
    void Delay(unsigned int t);
    
    void main(void)
    {
        unsigned int PWM_LOW = 0;
        unsigned int i = 0;
        
        while (1)
        {
            for (i = 0; i < LED_NUM; i++)
            {
                LED_Pins[i] = 1;
                Delay(60000);
                for (PWM_LOW = 1; PWM_LOW < CYCLE; PWM_LOW++)
                {
                    LED_Pins[i] = 0;
                    Delay(PWM_LOW);
                    LED_Pins[i] = 1;
                    Delay(CYCLE - PWM_LOW);
                }
                LED_Pins[i] = 0;
            }
        }
    }
    
    void Delay(unsigned int t)
    {
        while (--t);
    }
    
    
    
    • 这个程序使用了一个数组 LED_Pins 来存储 LED 管脚的位置,然后使用一个循环结构来依次点亮每个 LED 灯,再进行流水灯的效果演示。你可以根据需要改变 LED 的数量或者其他参数,例如灯的颜色、亮度等。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月30日
  • 已采纳回答 4月22日
  • 创建了问题 4月22日

悬赏问题

  • ¥21 matlab怎么求时域信号的二阶导数
  • ¥15 判断两个表是否完全相同
  • ¥15 java map类型数据格式,如何快速通过前缀匹配元素
  • ¥15 stc12c5a60s2、QMC5883L、LCD1602组合测量磁场所需程序
  • ¥20 Win11测试yolov4,“找不到nvcuda.dll”怎么办?
  • ¥15 simulink绘制bode图
  • ¥15 php_network_getaddresses: getaddrinfo failed: Name or service not known
  • ¥15 用msg发消息出现的问题
  • ¥15 unity3d机械臂
  • ¥20 工控机出现散热器转一下停一下这种情况,是什么原因造成的