上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.4 呼吸灯应用系统软件设计
呼吸灯的软件是系统设计的重点,其主要功能是要输出合适的PWM波形来驱动三极管开关以使得RCL电路上获得适当的电源,而输出PWM波形的重点是对于51单片机的定时器/计数器的控制。
1.4.1 呼吸灯应用系统的软件流程
呼吸灯需要输出的PWM波形应该是一个脉冲宽度逐步增加,然后,再逐步减小的脉冲序列,可以使用定时器/计数器来控制完成,其应用系统的软件流程如图1.30所示。
图1.30 呼吸灯应用系统的软件流程
1.4.2 呼吸灯应用系统软件的应用代码
呼吸灯应用系统软件的应用代码如例1.1所示。
应用代码定义了一个标志位bit ArrowFlg,使用其来判别计数方向,当到达输出波形的最大宽度或者最小宽度时,修改这个标志位,然后在进行相应的计数之前,对该标志位进行判断,以决定增加计数器upCounter和减小计数器downCounter的计数方向。
【例1.1】 呼吸灯应用系统软件的应用代码。
#include <AT89X52.h> #define MAX 0x50 //定时上限定义 #define MIN 0x00 //定时下限定义 #define TIMELINE 11 //时间分频常数 #define TRUE 1 #define FALSE 0 //标志位常数 unsigned int TimeCounter; bit ArrowFlg=0; //方向标志位 unsigned char upCounter,downCounter; //增加计数器和减少计数器 sbit LED=P2^0; //T0的中断服务子函数
void T0Deal() interrupt 1 using 0 { TH0=0xf1; TL0=0xf1; TR0=1; TimeCounter++; //定时器/计数器增加 if(TimeCounter == TIMELINE) { if((upCounter==MAX)&&(downCounter==MIN)) //计数方向标志位切换 { ArrowFlg = FALSE; } if((upCounter == MIN)&&(downCounter == MAX)) { ArrowFlg= TRUE; } if(ArrowFlg==1) //如果是增加计数 { upCounter++; downCounter--; } else //如果是减少计数 { upCounter--; downCounter++; } TimeCounter=0; } } //延时函数 void Delay(unsigned int i) { unsigned int j; while(i--) { for(j=0;j<32;j++); //延时 } } void main() { upCounter = MIN; downCounter=MAX; //计数器初始化 TMOD=0x01; //设置定时器工作方式 TH0 = 0xF0; TL0=0xF0; //T0初始化值 EA = 1; ET0=1; //打开T0中断
TR0=1; //启动T0 while(1) { LED=0; //输出变化的PWM波形 Delay(downCounter); LED=1; Delay(upCounter); } }