51单片机led呼吸灯代码中断写法(51单片机基础知识汇总原理程序代码)

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消耗完,电容的反复充放电的过程才会结束。

1 RCL响应电路

如果在电阻和电感之间串联一个发光二极管, 随着充放电过程中电流的消耗,通过发光二极管上的电流也会跟着变化。这样就实现了发光二极管的亮度控制。

RCL响应电路的充放电时间是可以通过相关公式计算的。

1.4. 电路设计

本实例的电路如2所示。

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<AT89X52h>
//宏定义
#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单片机基础知识汇总原理程序代码)