本章是基于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; }
}
}