这个拖尾灯,或者扫描灯,或者流星灯,不管怎么叫,原理上估计都是一样的。这玩意困扰了我好长的时间。我知道用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