LED 循环流水(pwm控制)

  本章是基于51单片机的使用,设置4个亮度ABCD,分配给八个led,之后led再实现呼吸流水的效果。

  led实现效果是用pwm实现的(本人认为pwm就是对电平的数字编程),用pwm控制占空比,视觉上会产生一种视觉差,进而出现呼吸效果(就是逐渐变亮在变暗)。

 首先,在实现呼吸流水前,先设置4个亮度ABCD,使A>B>C>D,使数码管显示出ABCDDCBA的亮度效果。

1 .  ABCD四个亮度可以使用延时函数来实现,定义一个延时很小的延时函数,在一个while循环里面,让八个灯开关,但打开的时间使用延时函数控制,就相当于把一个while函数的循环时间党组一个周期,各个LED在一个周期里打开的时间长短不同,由于while快速扫描,就会出现LED亮度不同的效果。led的状态上电后是打开的,按下按键1后初始状态关闭,定时器开始工作,实现呼吸流水效果。

2.pwm本人认为是将一个周期分成多份,在一个周期里面设置两种状态,定义一个计数变量,用两个for循环让它自加,如果小于第一个状态可以给端口赋高电平;如果小于第二种状态给端口赋低电平。拿led举例,将一个周期分四份,有四分之三的时长led=0,有四分之一的时间led=1。

这样这个二极管会比较亮;如果有二分之一的时间led=0;剩下二分之一led=1;二极管回比刚刚暗

3.  在呼吸流水效果中,我使用了两个定时器。在定时器1中,定义四个亮度的led,设置一个t0,用它来不断对led进行占空比调节,在定时器2中,对一中的几个临界值进行调节。代码如下:

 

#include<reg52.h>
#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 key1=P3^0;
sbit key2=P3^1;

uchar i,y,a,n;
void delay(uint s)                          //延时函数
{
uint j,k;
    for(j=s;j>0;j--)
    for(k=1;k>0;k--);
}
uchar num1=180,num2=80,num3=80,num4=80;
bit bz1 = 1,bz2=1,bz3=1,bz4=1;                           //定义bz初始值
void init();
void ledinit();//定时器0 初始化
void main()
{
     ledinit();
	if(key1==0)
	{init();
	while(1)
	{}
	}
}
void ledinit()
{
	while(key1!=0)
	{ led1=0;led8=0;
		delay(400);
		led1=1;led8=1;
		
		led2=0;led7=0;
		delay(300);
		led2=1;led7=1;
		
		
		led3=0;led6=0;
		delay(200);
		led3=1;led6=1;
		
		led4=0;led5=0;
		delay(100);
		led4=1;led5=1;
	}
}
void init(void)                       
{    
    TMOD = 0x11;                     
    EA = 1;                           
    TH0 = (65535-500)/256;            
    TL0 = (65535-500)%256;  
    ET0 = 1;                         
    TR0 = 1;                          
    TH1 = (65535-20000)/256;          
    TL1 = (65535-20000)%256;    
    ET1 = 1;                          
    TR1 = 1;                          
 }   
void T0_time(void)  interrupt 1            
{
    static uchar t0=0;
    TH0=(65535-500)/256;              
    TL0=(65536-500)%256;
    t0++;
    
    if(t0 > num1)                      
     {  led1 = 0;                        
			  led8=0; }
     
   if(t0 < num1)                    
    {    led1 = 1;                  
			   led8=1; }
		if(t0>num2)
		{  led2=0;
		    led7=0;  }
    if(t0<num2)
		{		
			led2=1;
			 led7=1;
		}
				
		if(t0>num3)
		{  led3=0;
		    led6=0;  }
    if(t0<num3)
		{		
			led3=1;
			 led6=1;
		}

   if(t0>num4)
		{  led4=0;
		    led5=0;  }
    if(t0<num4)
		{		
			 led4=1;
			 led5=1;
		}		
				
		if(t0 > 40)                       
    {
        t0 = 10;
    }

}

void T1_time(void)  interrupt 3             
{
    static uchar t1=0;
    TH1=(65535-47685)/256;            
    TL1=(65536-47685)%256;
    t1++;
    if(t1 == 1)                     
    {
        t1 = 0;

        if(bz1==1)
        { num1--;   }        
         if(bz1 == 0)
        {num1++;}
       if(num1 == 10)
        { bz1 = 0;  }
       if(num1==70) 
      	{ bz1 = 1; } 

    		 if(bz2==1)
        { num2--;   }       
         if(bz2 == 0)
        {num2++;}
       if(num2 == 5)
        { bz2 = 0;  }
       if(num2==70) 
      	{ bz2 = 1; } 		
           
        if(bz3==1)
        { num3--;   }       
         if(bz3 == 0)
        {num3++;}
       if(num3 == 5)
        { bz3 = 0;  }
       if(num3==60) 
      	{ bz3 = 1; } 
       
       if(bz4==1)
        { num4--;   }       
         if(bz4 == 0)
        {num4++;}
       if(num4 == 5)
				 if(num4 == 5)
        { bz4 = 0;  }
       if(num4==50) 
      	{ bz4 = 1; } 
		   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林哈哈.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值