基于MSP430F5529的智能灯设计

2020-02-14来源: eefocus关键字:MSP430F5529  智能灯

#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  智能灯 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488215.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于msp430的按键实时控制LED灯
下一篇:MSP430之点灯入门

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430F1612 第一个程序,点亮一个LED灯
I/O操作MSP430有6组IO端口,其中P1和P2具有中断功能,其他端口不具备中断功能。而点亮一个LED灯只需要控制一个引脚的高低电平即可。这里不需要用到中断功能。那在这里,我们编码涉及的寄存器只有4个,分别是PxIN、PxOUT、PxDIR和PxSEL。而且MSP430F1612的IO功能并不需要配置时钟,所以整个程序只需要配置4个IO端口的寄存器和看门狗寄存器。对4个寄存器的描述分别如下:PxSEL寄存器中的每一个位用于选择该引脚是使用外设功能还是GPIO功能.Bit = 0:选择IO功能;Bit = 1:选择外设功能例如:P4SEL |= 0x0080;    //P4.7选择外设功能,0000
发表于 2020-02-13
MSP430F1612 第一个程序,点亮一个LED灯
MSP430F5529LP+CC3000学习心得(一)——与AP的连接
设备:MSP430F5529LP+CC3000 BoosterPack EVMSDK:CC3000 SDK_V1.11 、android下smart Config APPPatch:PatchProgrammerMSP430F5529LP-7.11.7.13.19开发环境:CCS 5.4.0第一步:硬件连接。第二步:对F5529LP进行Patch programmer。导入C:tiPatchProgrammerMSP430F5529LP-7.11.7.13.19Patch Programmer SourcePatch Programmer CCS目录下的三个工程CC3000 SPi、CC3000HostDriver、Patcher
发表于 2020-02-13
MSP430F5529LP+CC3000学习心得(一)——与AP的连接
MSP-EXP430F5529LP开发板004-PWM库函数
测试了TIMER_A的PWM几种模式pwmMultipleUp2.06kHz,75%占空比#include "wdt_a.h"#include "gpio.h"#include "timer_a.h"#define TIMER_PERIOD 511#define DUTY_CYCLE1  384#define DUTY_CYCLE2  128int main( void ){  volatile unsigned int i;  WDT_A_hold(WDT_A_BASE);    //P2.0 and
发表于 2020-02-13
MSP-EXP430F5529LP开发板003-定时器库函数
430的定时器的有点类似于51单片机,利用定时器实现P1.0口LED灯1s闪烁代码如下#include "wdt_a.h"#include "gpio.h"#include "timer_a.h"#define COMPARE_VALUE 32768int main( void ){  volatile unsigned int i;  WDT_A_hold(WDT_A_BASE);    GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0); 
发表于 2020-02-12
msp430f5529串口通信
调了一天,终于通了。这个板子有点坑人,看引脚功能图UART_RXTX是P3.4P3.5,结果调了半天都不通,上网查了很久才知道USB的串口是P4.4P4.5。对于我这种初学者来说,要走的路还很长呀!#include <io430.h>void delay(int ms)        //延时函数{ for(int i=0;i<ms;i++) for(int j=0;j<240;j++);}void send_buf(unsigned char *ptr)    //发送字符串{ while(*ptr != ''
发表于 2020-02-12
MSP430F149最小系统板利用1602液晶显示的正弦波示波器程控
首先,讲一下 MSP430F149 的结构。MSP430 系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精准指令集(RISC)的混合信号处理器(Mixed Signal Processor)。单个芯片的价格在 20 元左右。MSP430F149 是最小系统板,其中自带了 12 位的ADC模块,液晶显示屏我们可以另加,采集到单片机内部也就是 4096 个不同的读数。再由单片机引脚的最高电压是2.5V,易得理论精度为 0.6 mV,也就是说ADC的位数越多,数据采集精度越高。需要什么样的ADC模块也可以根据需求另外加上。另外提示一点 MSP430F149 的RAM只有 2K。以上都是一些用的上的常识
发表于 2020-02-11
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved