如何修改该段代码,使52单片机完成这一操作


#include
#define dutymax 50
#define uchar unsigned char
#define uint  unsigned int

//sbit led1 = P1^0;
//sbit led2 = P1^1;
//sbit led3 = P1^2;
//sbit led4 = P1^3;
//sbit led5 = P1^4;
//sbit led6 = P1^5;
//sbit led7 = P1^6;
//sbit led8 = P1^7;

sbit key = P3^0;//S2按键位定义
//sbit key_s3 = P3^1;
int state = 1;


void delay_ms (uint t)
{
     uint i , j;

    for(i = 0;i < t;i ++)
    {
        for (j = 0;j < 124;j ++);
    }
}

void main()
{
    
    while (1)
    {
        
        uchar n;
        if(key == 0)//判断S2是否按键
        {
            delay_ms(5);//软件延时
            if(key == 0)
            {
                state = 1 - state;    
            }
            while(!key);    //松手检测
        }

        if (key == 1 && state == 1)
        {
            if (n == 0x00)
            {
             n = 0x01;
             P1 = ~n;
            }
            delay_ms (1000);            
             n = n << 1;
            P1 = ~n;
        }
        else if (key == 1 && state == 0)
        {
             if (n == 0x00)
            {
             n = 0x80;
             P1 = ~n;
            }
            delay_ms (1000);    
            n = n >> 1;
            P1 = ~n;    
        }
        
    }

}

这段代码已经可以实现流水灯并且按键使流水灯方向改变的操作,但是如何加入代码使灯同时具有呼吸效果呢,尝试多次均现只呼吸不流水的情况,需要代码解答

呼吸灯代码:

#include "reg52.h"

sbit LedHuxi1=P1^0;

#define time (65536-1000) // 单次定时1ms
unsigned char T_High, T, ti, dir;


void InitTimer0(void)
{
  TMOD=0x01;
    TL0 = time;                     //initial timer1 low byte
    TH0 = time >> 8;                //initial timer1 high byte
    TR0 = 1;                        //timer1 start running
    ET0 = 1;                        //enable timer1 interrupt
    EA = 1;                         //open global interrupt switch
}
void Delay(void)
{
  unsigned char i,j;
    for(i=0;i<100;i++)
      for(j=0;j<255;j++)
            ;
}


void main(void)
{
  T_High=0; //高电平
    T=30;      //周期
    ti=0;
    dir=0;
  InitTimer0();
  while(1){
      Delay();
        if((T_High<T)&&(dir==0)) 
            T_High++;
        else if(T_High==T) {
          dir=1;
          T_High--;
        }
        else if((T_High>0)&&(dir==1))
        T_High--;
        else 
            dir=0;
    }

}

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
    TL0 = time;                    
    TH0 = time >> 8;               
    if(ti<T_High){
          LedHuxi1=1;
            ti++;
        }else if(ti<T){
          LedHuxi1=0;
            ti++;
        }else{
          ti=0;
        }
    
}

融合你的while (1)就能达到要求

呼吸控制的是灯的亮度变换,流水控制的是灯亮与否,就看你的流水灯是想所有灯一个节奏呼吸还是各个灯独立控制,只要在流水的基础上加上对应的PWM亮度控制就ok了。

参考一下