吕嘉淇 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日

悬赏问题

  • ¥15 麒麟V10桌面版SP1如何配置bonding
  • ¥15 Marscode IDE 如何预览新建的 HTML 文件
  • ¥15 K8S部署二进制集群过程中calico一直报错
  • ¥15 java python或者任何一种编程语言复刻一个网页
  • ¥20 如何通过代码传输视频到亚马逊平台
  • ¥15 php查询mysql数据库并显示至下拉列表中
  • ¥15 freertos下使用外部中断失效
  • ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
  • ¥15 devserver配置完 启动服务 无法访问static上的资源
  • ¥15 解决websocket跟c#客户端通信