51单片机应用开发25例
上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);
            }
            }