3
22
2011
1

呼吸灯

在今年春节的时候,在大街上看到很多的流行灯,非常的漂亮。

而今天在看单片机的书时,看到制作呼吸灯的例子,思索一下,发现者流星灯就是有很多的呼吸灯制作而成的。看了一下书上的源码,感觉很有意思。

 


#include <REG51.h> //51头文件
/*********************************************************************************************
//《C_无级亮度闪烁》
#define DY_PORT		P1 //设置LED连接的I/O组
#define DY_SPEED	1 //设置每一个明亮级的停留时间(值域:0~65535)
#define DY_PWM		50 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX		50 //设置最大明亮(值域:小于明亮总级数)
/*********************************************************************************************/
//《B_无级亮度变化》
#define DY_PORT		P1 //设置LED连接的I/O组
#define DY_SPEED	1 //设置每一个明亮级的停留时间(值域:0~65535)
#define DY_PWM		500 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX		500 //设置最大明亮(值域:小于明亮总级数)
/*********************************************************************************************
//《A_8级亮度变化》
#define DY_PORT		P1 //设置LED连接的I/O组
#define DY_SPEED	100 //设置每一个明亮级的停留时间(值域:0~65535)
#define DY_PWM		500 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX		8 //设置最大明亮(值域:小于明亮总级数)
/*********************************************************************************************

bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED
#define [代替名]	[原名]  //用代替名代替原名(可以方便修改常改或调试的值)例:#define LED P1
sbit  [自定义名] = [系统位名] ; //自定义系统位名。例:sbit Add_Key = P3 ^ 1;
unsigned char [自定义名] ; //定义一个0~255的整数变量.例:unsigned char a;
unsigned int [自定义名] ; //定义一个0~65535的整数变量

/*********************************************************************************************/
void delay (unsigned int a){ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
	unsigned char i;
	while( --a != 0){
		for(i = 0; i < 12; i++); 
	}   				   
}
/*********************************************************************************************/
void display (unsigned int a){ //显示程序(50ms的PWM宽度)
	DY_PORT = 0x00; //LED小灯亮
	delay (a); 		//延时a的长度
	DY_PORT = 0xff; //LED小灯灭
	delay (DY_PWM-a);//延时总PWM长度减a
}
/*********************************************************************************************/
void main (void){ //主程序 
    unsigned int t=1;
	unsigned int i;
	bit LOOP=0; //LOOP是循环切换标志

	while (1){
		if(LOOP == 0){ //变亮循环
			for(i = 0; i < DY_SPEED; i++){
				display(t);
			}
			t++;
			if(t>(DY_MAX-2)){
				LOOP = 1;
			}
		}
		if(LOOP == 1){ //变暗循环
			for(i = 0; i < DY_SPEED; i++){
				display(t);
			}
			t--;
			if(t<2){
				LOOP = 0;
			}
		}
    }
}
/*********************************************************************************************/

从这里看起来就很有意思了。想渐明渐暗,用到的是PWM(脉冲宽度调制)。简单的讲,对于这个灯,就是调节暗和明的比例。

比如10为一个时间段的话,那么1/10为明,9/10为暗,这样亮度就算是1了。因为机器的时间段非常的短到人们看到的一直是连续的。

另外想到一点,当时序短到一定的程度的时候,那么本来连续的程序,变成为了并行(这话说得不是很严密,要看什么样的程序)。所以,我们能一边上qq,一边看网页。

另外,面向过程符合机器的思维,面向对象符合人的思维。

学嵌入式很有意思的一点就是,你可以理解到程序运行的本质。有一种掌控感,而拥有掌控这项技能的,似乎只有神。。。

我一直想,学计算机应该从底层学起,虽然让让人很提不起兴趣。

言归正传,说道这个程序,有个缺点,就是无法独立控制很多的LED灯。我查了很多的资料。却没有得到很明确的结果。倒是发现了一点国内教材的通病----天下文章一大抄。我买的基本教材,竟然大部分一样。更可恨的是,连图也一样。这让我情何以堪。后来我发现图的出处----单片机的使用说明书。感情这说明书就是最好的教材。其实不光我们技术比国外落后,教材也落后。就像大学里那些只会照着ppt读的老师一样恶心。

看了看单片机的说明书,发现上面有现成的PCA模块。可惜我的这个型号只能同时控制两路。在网上找到有控制16路的,目前还看不懂。

看来流星灯的制作,还是有点小困难的。还得继续研究。

下面是两路的程序

 

#include <reg52.h>

//设置sfr
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAP1L = 0xFB;
sfr CCAP1H = 0xFB;

sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;

sbit CR = 0xDE;

void PWM_init(void)
{
	CMOD = 0x02;//设置PCA定时器
	CL = 0x00;
	CH = 0x00;
	//PWM0的设置
	CCAPM0 = 0x42;
	CCAP0L = 0x00;
	CCAP0H = 0x00;
	//PWM1的设置
	CCAPM1 = 0x42;
	CCAP0L = 0x00;
	CCAP0H = 0x00;
	CR = 1;//启动PCA定时器
}
//设置PWM0的参数
void PWM0_set(unsigned char a)
{
	CCAP0L = a;
	CCAP0H = a;
}
//设置PWM1的参数
void PWM1_set(unsigned char a)
{
	CCAP1L = a;
	CCAP1H = a;
}

void delay (unsigned int a){ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
	unsigned char i;
	while( --a != 0){
		for(i = 0; i < 12; i++); 
	}   				   
}
void main(void)
{
	unsigned int i;
	PWM_init();//PWM初始化
	PWM0_set(0x00);//设置PWM0占空比
	PWM1_set(0x00);//设置PWM1占空比
	while(1)
	{
		for(i = 0;i < 256;i++)
		{
			PWM0_set(i);
			PWM1_set(256 - i);
			delay(100);
		}
		for(i = 256;i > 0;i--)
		{
			PWM0_set(i);
			PWM1_set(256 - i);
			delay(100);
		}
	}
}

效果如下:

OK,先到这里。

Category: 单片机 | Tags: 呼吸灯 PWM | Read Count: 4354
Avatar_small
jiong 说:
2011年3月22日 12:15

犀利的小马哥


登录 *


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