1. 基于pteus的51单片机实例(4)–呼吸灯
呼吸灯早大概是(只是大概,大家不要真正考究这个了)苹果用在电脑上的,电脑的指示灯会的由暗变亮,又逐步从亮到暗,灯光的亮灭过程非常类似人的吸气-呼气过程,所以被大家称为呼吸灯。
在很多手机上都会有这种呼吸灯,因为这种灯光亮度的变化能够起到很好的视觉效果,甚至早期呼吸灯还是一些手机的卖点之一。
1.1. 实验目的
本实例中我们就来完成一个呼吸灯的设计:通过51单片机的I/O端口控制发光二极管,使发光二极管的灯光完成由亮到暗,再由暗到亮的循环过程。
呼吸灯的变化与人的呼吸很相似,有两个阶段组成:
吸气:灯的亮度由暗变亮;
呼气:灯的亮度由亮变暗。
由于呼吸灯是模拟人的呼吸实现的,一般人在平静情况下呼吸是每分钟12~20次(儿童的呼吸次数会稍大一些)。并且人在不同状态下,呼吸也是不一样的,例如剧烈运动时,呼吸次数会加快,如果想要真实模拟人在不同状态下的呼吸情况,可以通过单片机编程控制实现呼吸灯的变化。
1.2. 设计思路
1、本实例使用发光二极管作为呼吸灯的光源;
2、呼吸灯的驱动电路-使用RCL电路;
3、使用51单片机的一个I/O端口控制呼吸灯驱动电路的工作;
4、编写基于定时器的呼吸灯控制软件。
1.3. 基知识
本实例用到的基知识有下面几个方面:
1、发光二极管的工作原理
这方面知识在实例1中已做介绍,在此不再赘述;
2、呼吸灯实现的原理
通过实例1我们已了解到,发光二极管是电流驱动型器件,电流驱动器件是根据驱动电流的大小而输出不同的率。所以发光二极管发光亮度的强弱与通过它的电流大小相关,通过发光二极管的电流大,其发光亮度就强;反之,通过发光二极管的电流小,其发光亮度就弱,当电流小到程度,发光二极管就熄灭了。
所以想要实现呼吸灯的效果,方法就是控制通过发光二极管的电流大小,使通过发光二极管的电流逐步由小变大,然后再由大变小。
3、呼吸灯驱动电路
单片机通用I/O端口输出的一般都是数字,即要么输出“1”(高电平),要么输出“0”(低电平),不能输出中间电平,那么对于连接到单片机端口的驱动电路来说,只能获得电流或者电流,这样显然是无法实现控制电流由小到大或者由大到小变化的。
这时就需要一个能实现这种能的电路,这个电路原理是将单片机输出的数字为模拟电路。本例用了RCL电路来实现。
RCL响应电路是一种可以进行储能-释放的电路,其电路原理如1所示。电源对电容充电,此时电容就会累积的电量,电源撤走后,电容开始放电,放电回路中通过电阻和电感,而电感会产生逆电动势,这个逆电动势会反过来再给电容充电,这时电容就会处于一个反复的充放电过程,直到电容上储存的电脑被R2消耗完,电容的反复充放电的过程才会结束。
如果在电阻和电感之间串联一个发光二极管, 随着充放电过程中电流的消耗,通过发光二极管上的电流也会跟着变化。这样就实现了发光二极管的亮度控制。
RCL响应电路的充放电时间是可以通过相关公式计算的。
1.4. 电路设计
本实例的电路如2所示。
1、51单片机
利用单片机的I/O口控制呼吸灯驱动电路,实现呼吸灯效果。
2、三极管开关电路
51单片机输出PWM波,当输出高电平,三极管Q2导通,Q1截止,电源开始给RCL电路充电;当输出低电平,Q2截止,Q1导通,RCL电路上的电源断开,RCL电路开始放电。
3、RCL电路
利用充放电原理将单片机I/O端口输出的数字转换为模拟,进而控制发光二极管通过的电流。
本实例使用51单片机的P2.7端口驱动一个由PNP和NPN三极管构成的开关电路,电源通过该开关电路给RCL电路供电,发光二极管串联到这个RCL电路的电阻上。
1.5. 程序设计
本实例代码如下。
#include<AT89X52h> //宏定义 #define MAX 0x50 //定时上限 #define MIN 0x00 //定时下限 #define TIMELINE 11 //时间分频常数 #define TRUE1 #define FALSE 0 //标志位常数 //全变量定义 unsied intTimeCounter; bitArw=0; //方向标志位,用来判断计数方向,当达到PWM波的或宽度,修改该标志 unsied char upCounter,downCounter;//增加计数器和减少计数器 it LED=P2^0; //T0的中断服务子函数 void T0Dealinterrupt 1 using 0 { TH0=0xf1; TL0=0xf1; TR0=1; TimeCounter++;//定时计数器增加 if(TimeCounter==TIMELINE) { if((upCounter==MAX)&&(downCounter==MIN))//计数方向标志位切换 { Arw=FALSE; } if((upCounter==MIN)&&(downCounter==MAX)) { Arw=TRUE; } if(Arw==1)//如果是增加计数 { upCounter++; downCounter--; } else //如果是减少计数 { upCounter--; downCounter++; } TimeCounter=0; } } //函数 void Delay(unsied int i) { unsied int j; while(i--) { for(j=0;j<32;j++); // } } int in(void) { upCounter=MIN; downCounter=MAX; //计数器初始化 TMOD=0x01;//设置定时器工作方式 TH0=0xF0; TL0=0xF0 ;//T0初始化值 EA=1; ET0=1;//开中断 TR0=1;//启动T0 while(1) { LED=0;//输出变化的PWM波形 Delay(downCounter); LED=1; Delay(upCounter); } }
本实例使用51单片机定时器实现PWM波输出,关于PWM波原理及编程实现,我们在随后讲解定时器时会详细介绍。
1.6. 实例
在keil下将本程序代码编译后,生成hex文件,将这个HEX文件装载到本实例的pteus电路的51单片机中,点击开始按钮,就可以观察到呼吸灯的效果了。
1.7. 总结
在实际应用中,有两种方式调整呼吸灯的变化效果,一种是修改程序,调整51单片机输出的PWM波形;另一种是修改电路,调整RCL电路中电阻、电容、电感的值。
很明显,修改程序必须改电路中的元器件要方便得多。在本例中,通过修改程序的方式是,只需要修改程序中MAX和MIN这两个变量的值就可以了。
文章来源于网络:个人学习栈 » 51单片机led呼吸灯代码中断写法(51单片机基础知识汇总原理程序代码)