5
21
2011
1

51单片机拖尾灯实现

 

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

下面是一点演示视频,不是很清晰。噪音很大,讲究这看吧。

 

Category: 单片机 | Tags: | Read Count: 4617

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com