单片机 > 单片机程序设计 > 详情

基于MSP430F5529的智能灯设计

发布时间:2020-08-27 发布时间:
|

#include

 

void IO_Init();

void InitADC();

unsigned int  GetAD(char channel);

void light_Compare(int templight);

int counter=0;                          //中断计数器参数,单位秒

 

/**

 * main.c

 */

 

int main(void)

{

    IO_Init();                          //IO初始化

    InitADC();                          //初始化ADC模块

 

    int voice = 0;                      //缓存声音响度

    int light = 0;                      //缓存环境亮度

 

    WDTCTL = WDT_ADLY_1000;             //设置中断定时1s

    SFRIE1 |= WDTIE;                    //使能WDT中断          WDTIE=(0x0001)/* WDT Interrupt Enable */

    _EINT();                            // 使能全局中断

 

    while(1){

        voice = GetAD(0);               //读取声音缓存

        while(voice>3000){               //声音与阈值比较

            counter=0;                  //定时器置零

            do{

                light = GetAD(1);       //亮度读取

                light_Compare(light);

                voice = GetAD(0);       //读取声音缓存

                if(voice>3000){

                    break;

                }

                if(counter >=10)        //判断计数时间,如果大于20s,关闭LED,并退出

                {

                    P1OUT &= ~BIT5;

                    P8OUT &= ~BIT1;

                    P3OUT &= ~BIT7;

                    P7OUT &= ~BIT4;

                    P6OUT &= ~BIT3;

                    P6OUT &= ~BIT4;

                    P3OUT &= ~BIT5;

                    break;

                }

            }while(counter<10);

        }

    }

}

void light_Compare(int templight){      //LED发亮的个数与光敏电阻测出亮度成反比

    P2OUT |= BIT5;                      //2.5置高

    P2OUT &= ~BIT4;                     //2.4置低

    P1OUT |= BIT5;                      //打开Nsleep,开大LED灯

    if(templight >=700)

        P8OUT |= BIT1;

    else

        P8OUT &= ~BIT1;

    if(templight >= 1200)

        P3OUT |= BIT7;

    else

        P3OUT &= ~BIT7;

    if(templight >= 1500)

        P7OUT |= BIT4;

    else

        P7OUT &= ~BIT4;

    if(templight >= 2000)

        P6OUT |= BIT3;

    else

        P6OUT &= ~BIT3;

    if(templight >= 2500)

        P6OUT |= BIT4;

    else

        P6OUT &= ~BIT4;

    if(templight >= 3000)

        P3OUT |= BIT5;

    else

        P3OUT &= ~BIT5;

}

void IO_Init(){             //六盏灯初始化,并全置零

    P1DIR|= BIT0;           //六盏灯初始化,并全置零

    P8DIR|= BIT1;

    P3DIR|= BIT7;

    P7DIR|= BIT4;

    P6DIR|= BIT3;

    P6DIR|= BIT4;

    P3DIR|= BIT5;

    P8OUT&=~BIT1;

    P3OUT&=~BIT7;

    P7OUT&=~BIT4;

    P6OUT&=~BIT3;

    P6OUT&=~BIT4;

    P3OUT&=~BIT5;

 

    P2DIR|= BIT4;           //2.4,2.5初始化

    P2DIR|= BIT5;

    P2OUT|= BIT5;

    P2OUT&= ~BIT4;

    P1DIR|= BIT5;           //大LED灯的驱动的电路开关方向

}

#pragma vector= WDT_VECTOR

__interrupt void watchdog_timer (void)

{

     counter ++;            //计时器加一

     P1OUT^=BIT0;           //信号灯

}

unsigned int  GetAD(char channel)

{

    unsigned int temp = 0;                              //设置变量

    ADC12CTL0 |= ADC12SC;                               //开始采样转换

    temp= ADC12MEM0;                                    //把结果赋给变量

      switch (channel)

      {

          case 0:temp= ADC12MEM0;       break;          //选择通道0,P6.0

            case 1:temp= ADC12MEM1;     break;          //选择通道1,P6.1

            case 2:temp= ADC12MEM2;     break;          //选择通道2,P6.2

            case 3:temp= ADC12MEM3;     break;          //选择通道3,P6.3

            case 4:temp= ADC12MEM4;     break;          //选择通道4,P6.4

            case 5:temp= ADC12MEM5;     break;          //选择通道5,P6.5  连接拨码电位器

            case 6:temp= ADC12MEM6;     break;          //选择通道6,P6.6

            case 12:temp= ADC12MEM12;    break;         //选择通道12,P7.0

            default: ;break;

        }

    return temp;

}

void InitADC()

{

    ADC12CTL0 |= ADC12MSC;                              //自动循环采样转换

    ADC12CTL0 |= ADC12ON;                               //启动ADC12模块

    ADC12CTL1 |= ADC12CONSEQ_3 ;                        //选择序列通道多次循环采样转换

    ADC12CTL1 |= ADC12SHP;                              //采样保持模式

    ADC12CTL1  |= ADC12CSTARTADD_0;

 

    ADC12MCTL0 |=ADC12INCH_0;                           //通道选择

    ADC12MCTL1 |=ADC12INCH_1;

    ADC12MCTL2 |=ADC12INCH_2;

    ADC12MCTL3 |=ADC12INCH_3;

    ADC12MCTL4 |=ADC12INCH_4;

    ADC12MCTL5 |=ADC12INCH_5+ADC12EOS;

 

    ADC12CTL0 |= ADC12ENC;

}

关键字:MSP430F5529  智能灯

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机基础知识之二