⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_c.c

📁 用MSP430做的超低功耗光照应急灯 可以对他低功耗的功能练练手
💻 C
字号:
//<#####################光感应急灯2007-10-7修改#############################1
//当无光照时候,程序从休眠状态激活,
//led亮起,led显示器从99秒开始显示剩余秒数,当剩余10秒时
//led变暗,并每秒闪烁一次,且伴有警告音,到0秒时,关闭LED进入休眠状态,
//在倒计时过程中,如恢复光照,则关闭led和led显示器,进入休眠 如无光照,程序休眠激活,又点亮LED,100秒后休眠,以此循环。
//在运行时,按下*号后 暂停倒数,并恢复到99秒,按任意键继续倒数,按#号则程序从19秒开始倒数,按8强行关灯
//p1.5的82号线与GND间接一光敏电阻(可用按键3松开与按下代替),在p5.1与GND间接LED,蜂鸣器直接并联在LED两端即可


#include <msp430x44x.h>
#include "keyboard12.c"
#include "led.c"


void Init_Timer_A(void)                                      //*设置TIMEA定时器,用来产生1秒基准中断
                        {
                        TACTL = TASSEL0 + TACLR;           // ACLK, clear TAR
                        CCTL0 = CCIE;                     // CCR0 中断使能
                        CCR0=32768;                      //*定时1秒
                        TACTL|=MC0;                     //*增增计数模式
                        }
                                              
void y()                                           //*延时子程序,主要产生报警音频率
     {
       unsigned long tmp;
      for(tmp=50;tmp>0;tmp--);
        
     }
     

void light_LED(void)                           //*点亮LED子程序
     {  
       P5DIR |= 0x02; 
       P5OUT |= 0x02; 
     }
void quench_LED(void)                       //*关闭led子程序
     {
       P5DIR |= 0x02;        
       P5OUT &= 0xfd;  
     } 
     
void LED_PRINT(void)                        //*LED数字显示子程序 
     {
      tmp=0x01;                             //*只使用后两只数码LED管
      P3OUT  = ~(tmp<<led_Ctrl);            // 设置那只LED显示 
      P4OUT  |= 0x01;                       // 打开控制锁存
      P4OUT  &= 0XFE;                       // 关闭控制锁存
      P3OUT  = NUM_LED[led_Buf[led_Ctrl]];  // 设置显示值
      P4OUT |= 0x02;                        // 打开数据锁存器 
      P4OUT &= 0XFD;                        // 关闭数据锁存
      led_Ctrl= (led_Ctrl +1) % 7;         // 设置下一个要显示的LED,写7是去除“阴影”
     } 
     
     
     
     
     
//@@@@@@@@@@@@@@@@@@@@@@@@@@@主程序开始@@@@@@@@@@@@@@@@@@@@@
void main()
{

     WDTCTL = WDTHOLD + WDTPW;  //关闭看门狗
     Init_Timer_A();            //*初始化timeA中断
     init_Keyboard();           //初始化键盘
     init_LED();                //初始化LED
     P1IE=0x20;                 //*打开P1.5中断
     P1IES=0x00;               //*上升沿中断模式
     light_LED();              //*打开LED
     _EINT();                   //*开启所有中断中断


     while (1)                 
      {
                LED_PRINT();
                key_Event();                        
        if (key_val == 3)//*当有光照时(按下3号键)关闭LED进入低功耗,
           {          
              quench_LED();//*关闭LED
              
               led_Buf[5]= 11;
               led_Buf[4]= 11;
               LED_PRINT();
               key_val = 0;                 //*对key_val清空,即自动开始倒数
               _BIS_SR(LPM3_bits);          //*进入低功耗模式3(有光照)
           }
             
        if (key_val == 11)                 //*当按下*时,置位为99秒,不对key_val清空,所以一直会置位为99秒,实现暂停
           {        
              led_Buf[5]= 9;
              led_Buf[4]= 9;
              led_tmp[4]= 0;
              led_tmp[5]= 0;
              light_LED();
           }
           
        if (key_val == 10)             //*安下为#号键,跳到19秒开始倒数
           {        
              led_Buf[5]= 9;
              led_Buf[4]= 1;
              led_tmp[4]= 8;
              led_tmp[5]= 0;
              light_LED();
              key_val = 0;
           }
           
        if (key_val == 8)             //*安下为9号键,强行关闭系统
           {        
               quench_LED();
               led_Buf[5]= 11;
               led_Buf[4]= 11;
               LED_PRINT();
               key_val = 0;
               _BIS_SR(LPM3_bits);          //*进入低功耗模式3(有光照)
           }
           
        if ((led_Buf[4]==0)&(led_Buf[5]%2==1)) //*在10s~0s之间每隔1秒闪灯和警报一次。
           {
            light_LED();
             y();
            quench_LED();
           }
           
       if (led_Buf[5]==0&(led_Buf[4]==0))    //*在0s时候关闭LED和LED显示器
            {
             led_Buf[5]= 11;
             led_Buf[4]= 11;
             LED_PRINT();
             quench_LED();
             _BIS_SR(LPM3_bits);           //*进入低功耗模式3(无光照)
           }  

     }
}




#pragma vector=TIMERA0_VECTOR//*TIMEA中断,每1秒运行一下程序一遍
 __interrupt void TimerA0()
{         

          
             
         if (key_Pressed == 0)//*以下是让LED显示从99到0每运行一次,减一。 
          {  
             led_Buf[5]=0;                   
             led_tmp[5]=(led_tmp[5]+1)%10;
             led_Buf[5]=9-led_tmp[5];
              
            if (led_Buf[5]==9)
            {
             led_Buf[4]=0;
             led_tmp[4]=(led_tmp[4]+1)%10;
             led_Buf[4]=9-led_tmp[4];             
            }
         }
}



#pragma vector=PORT1_VECTOR//*P1口中断程序,为低功耗设计,当光照由亮变暗时激活以下程序。
__interrupt void P1_ISR(void)
{         
       LPM3_EXIT;//*退出低功耗模式3
       P1IFG = 0x00;//*恢复中断标志
       led_Buf[5]= 9;
       led_Buf[4]= 9;
       led_tmp[4]= 0;
       led_tmp[5]= 0;
       light_LED();
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -