51单片机入门问题求解答

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

#include
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//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//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//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);
}

基于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 的数量或者其他参数,例如灯的颜色、亮度等。
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7724470
  • 这篇博客也不错, 你可以看下51单片机之定时器控制流水灯实验
  • 除此之外, 这篇博客: 51单片机实现流水灯中的 自定时长的延时函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    之前我们说过可以通过软件STC-IPS来生成一个没有参数的延时函数,但是延长的时间是固定的,在软件里设置500ms,它就只能延时500ms。我们可以改造函数,让函数的参数为延长的时间,这样就可以方便我们随时改变参数来控制时间。

    首先我们需要生成一个延时1ms的延时函数。
    在这里插入图片描述

    复制代码,粘贴到工程文件中。我们在括号里面添加形参xms,参数类型为unsigned int。它的意思是无符号整型数。不直接用int是为了节省空间。

    然后把函数主题放到一个while循环里,每执行一次xms-1,执行xms次后跳出循环。说人话就是,我们每执行一次while循环内的操作,延时1ms,执行xms次,就能延时xms 毫秒。

    void Delay1ms(unsigned int xms)		//@12.000MHz
    {
    	unsigned char i, j;
    	
        while(xms)
        {
         	i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);	  
            
            xms--;
            
        }
    }
    
    

    有了这个,我们就可以随心所欲地调整延时的长度。

  • 您还可以看一下 陈槐老师的零基础新手入门软件测试必知必会课程中的 常见软件测试面试题之水杯需要思考的维度小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^