/*8个灯从第一个开始依次渐亮,直到最后一个。
再从最后一个起渐暗,直到第一个。如此循环往复*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P00=P1^0; //P1口为低电平时LED亮
sbit P01=P1^1;
sbit P02=P1^2;
sbit P03=P1^3;
sbit P04=P1^4;
sbit P05=P1^5;
sbit P06=P1^6;
sbit P07=P1^7;
uchar cnt[8]={8,16,24,32,40,48,56,64};
//定义8个初始亮度级别
uchar flgdir[8]={1,1,1,1,1,1,1,1};
//在LED从暗到渐亮再从亮到渐暗是做计数方向标志
void main()
{
TMOD=0x11; //定时器0定时0.25mS,定时器1定时10ms
TH0=0xFF;
TL0=0x19;
TH1=0xDC;
TL1=0x00;
ET0=1;
ET1=1;
PT0=1;
EA=1;
TR0=1;
TR1=1;
P1=0x00;
while(1);
}
void timer0() interrupt 1
{
static uchar n;
TH0=0xFF;
TL0=0x19;
n++;
if(n==cnt[0])P00=1; //用n定时计数与cnt比较用来在P0各个位出现不同脉宽的PWM波行
if(n==cnt[1])P01=1;
if(n==cnt[2])P02=1;
if(n==cnt[3])P03=1;
if(n==cnt[4])P04=1;
if(n==cnt[5])P05=1;
if(n==cnt[6])P06=1;
if(n==cnt[7])P07=1;
if(n>64)
{
n=0;
P1=0;
}
}
void timer1() interrupt 3
{
uchar i;
TH1=0xDC;//10ms即100Hz频率改变cnt的值用来调整脉宽使LED出现渐变的效果
TL1=0x00;
for(i=0;i<8;i++)
{
if(flgdir==1)
{
cnt++;
if(cnt>63)flgdir=0;
}
else
{
cnt--;
if(cnt<9)flgdir=1;
}
}
} |