
这个拖尾灯,或者扫描灯,或者流星灯,不管怎么叫,原理上估计都是一样的。这玩意困扰了我好长的时间。我知道用PWM可以做出明暗效果。但是无法做到实现多路控制。
在网上有种叫“霹雳游侠扫描灯”的东西。好像是用专用的ic做的。找不到相关的源码。
自己想啊想。一直想了一个月。直到昨天,上课的时候灵光一闪,突然想到一个好的点子,用定时器控制多路PWM。然后赶快记下。

呵呵,字写的有点丑了。。
其实原理很简单,用定时器同时控制多路i/o口做PWM。main函数只要设置相应的参数就行了。这样的好处就是调用起来非常方便。而且如果主频够高的话,可以随意控制多路LED。不知道网上有相同类似的东西么,不过这玩意确实是我自己想起来的。由被动接受到主动创造的一部分。意义深远。O(∩_∩)O哈哈~
程序如下,不详细解释,很简单。
//多路LED控制
//元素
//2010.05.21
#include <REG52.h>
#define uint unsigned int
#define uchar unsigned char
#define delaytime 10 //延迟时间
//管脚定义
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;
uint t=1;
uint LED[8]={0}; //8个led
//延迟函数
void delay_ms (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
//定时,1ms
void time0_server_(void)interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
if(t >=9)
t = 1;
else
t++;
if(t >LED[0]) //LED0 亮度
P2_0 = 1;
else
P2_0 = 0;
if(t > LED[1]) //LED1 亮度
P2_1 = 1;
else
P2_1 = 0;
if(t > LED[2]) //LED2 亮度
P2_2 = 1;
else
P2_2 = 0;
if(t > LED[3]) //LED3 亮度
P2_3 = 1;
else
P2_3 = 0;
if(t > LED[4]) //LED4 亮度
P2_4 = 1;
else
P2_4 = 0;
if(t > LED[5]) //LED5 亮度
P2_5 = 1;
else
P2_5 = 0;
if(t > LED[6]) //LED6 亮度
P2_6 = 1;
else
P2_6 = 0;
if(t > LED[7]) //LED7 亮度
P2_7 = 1;
else
P2_7 = 0;
}
void Init_t0(void)//定时器初始化
{
TMOD = 0x01;//选择方式1
TH0 = 0xFC;
TL0 = 0x18;//1ms
EA = 1;
ET0 = 1;
TR0 = 1;//开始计数
}
void main(void)
{
uint i,j;
LED[7] = 10;
Init_t0();
for(i = 0;i <8;i++)
LED[i] = i;
while(1)
{
LED[0] = 10;
delay_ms(delaytime);
LED[1] = 10;
LED[0] = 6;
delay_ms(delaytime);
LED[2] = 10;
LED[1] = 6;
LED[0] = 2;
for(i = 0;i < 5;i++)
{
LED[i] = 0;
LED[i+1] = 2;
LED[i+2] = 6;
LED[i+3] = 10;
delay_ms(delaytime);
}
LED[5] = 0;
LED[6] = 2;
LED[7] = 6;
delay_ms(delaytime);
LED[6] = 0;
LED[7] = 2;
delay_ms(delaytime);
LED[7] = 0;
delay_ms(delaytime);
/*
for(i = 0;i <8;i++)
{
for(j = 0;j < 8;j++)
LED[j] = (i+j)%8;
delay_ms(10);
} */
}
}
下面是一点演示视频,不是很清晰。噪音很大,讲究这看吧。
2013年6月25日 16:10
qsqwqdef