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

📄 interrupt.c

📁 msp430F435做的医疗器械,包括语音模块,知识源于网络
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************************************
                  discrible:Msp430FW427中断程序

                  creat by :Ye Yun Kai

                  date     :05.04.09(yy.mm.dd)
****************************************************************************************************/
#include "msp430x42x.h"
#include "Sys_data.h"
#include "Sys_fun.h"




/***************************************************************
                discrible:PORT1外部中断

                          中断位(P1.3~P1.7)
***************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_interrupt(void)
{
    P1IFG = 0x00;         //清标志位
    IE2 |= BTIE;          // Enable BT interrupt

    LCDCTL |= 0x01;       //开启液晶
    Delay60s_num = 0;     //液晶60S关闭计数器

    Time30s_num = 0;      //30S计数器清0
}



/***************************************************************
                discrible:PORT2外部中断(用于脉冲输入口)

                          中断位(P2.1~P2.2)
***************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_interrupt(void)
{
    if((P2IFG&0x01)==0x01)     //掉电中断,要进行数据备份(掉电用通讯告知,不用掉电中断)
    {
//        LCDM10 |= 0x04;                             //点亮低压提示符
//        Interrupt_main_symbol |=PowerOff_flag;      //掉电标志
//        __bic_SR_register_on_exit(CPUOFF+SCG0+SCG1);//使其从主程序头开始执行
    }
    else if((P2IFG&0x02)==0x02)//脉冲中断,进行脉冲处理
    {
        TACCTL0 |= CCIE;        //使能比较/捕获中断
        CCR0  = (TAR+64);       //32768/64==1.9ms为时间判断电平2次(32768为时钟频率)
                                //开启比较中断的同时,CCR0  = (TAR+64);是为了使CCRO超前当前TAR 64个振荡周期
        LCDCTL |= 0x01;         //开启液晶
        Delay60s_num = 0;       //液晶60S关闭计数器

        P2IFG = 0x00;           //清标志位
    }

    P2IFG = 0x00;               //清标志位
}



/***************************************************************
                discrible:Basic Timer 定时中断

                          中断时间:7.8125ms
***************************************************************/
#pragma vector=BASICTIMER_VECTOR
__interrupt void basic_timer(void)
{
//===========通讯接收控制口处理(2S处理1次)=================================    
    if( (Disp_symbol & f2sOpen_BTIE)==f2sOpen_BTIE )//若是2S开启的7.8125mS中断,则进来处理
    {      
        ComDelay++;
        if(ComDelay>=3)
        {
            ComDelay = 0;
            Disp_symbol &= ~f2sOpen_BTIE;//清0
            IE2 &= ~BTIE; //关闭7.8125mS中断
            if( (Comm_symbol & fReceive)!=fReceive )//若没有通讯,则关闭控制口及7.8125mS中断(调试,先屏蔽)
                P1OUT |= 0x01;//关闭控制口(调试,先屏蔽)
        }
    }
    
//===============20ms进程处理=========================================    
    else if( (Disp_symbol & fcommOpen_BTIE)==fcommOpen_BTIE )//若是通讯开启的7.8125mS中断,则进来处理
    {
        if(++Count20ms > 2)             //----20ms进程(此处可能有误,因为当初调试成功时,没有关闭IE2 &= ~BTIE;)
        {
            Disp_symbol &= ~fcommOpen_BTIE;//清0 
            Count20ms = 0;
            Process_20ms();
        }
    }
      
//=============普通按键处理===========================================
    else
    { 
//---------P1.3为高电平(轮显按键)-------------------
        if( (P1IN & 0x08)==0x08 )
        {
            key_timers++;
            if(key_timers>=3)
            {
                key_timers = 0;
                IE2 &= ~BTIE;          //disable BT interrupt,马上关闭,避免按一下时显示几下
                Disp_Mod();            //轮显程序
            }
        }
        else
        {
            key_timers = 0;
        }
//-----------P1.7(key1)为高电平-------------------
        if( (P1IN & 0x80)==0x80 )
        {
           key1_timers++;
           if(key1_timers>=3)
           {
               key1_timers = 0;
               Key_symbol |= key1_flag;  //key1键正按着
               IE2 &= ~BTIE;             //disable BT interrupt
           }
       }
       else
       {
          key1_timers =0;
       }
//-------------P1.5(key2)为高电平-------------------
       if( (P1IN & 0x20)==0x20 )
       {
          key2_timers++;
          if(key2_timers>=3)
          {
              key2_timers = 0;

              Key_symbol |= key2_flag;    //key2键正按着
              IE2 &= ~BTIE;               //disable BT interrupt

              if( (Key_symbol & key1_flag) == key1_flag ) //判断key1_flag和key2_flag都置位时,即进入校准状态
              {
                  Key_symbol &= ~key1_flag;
                  Key_symbol &= ~key2_flag;
                  Key_symbol |= adjust_flag;//开始校准采样
              }
          }
      }
      else
      {
         key2_timers =0;
      }
//---------------P1.4(key34)为高电平-------------------
      if( (P1IN & 0x10)==0x10 )
      {
          key34_timers++;
          if(key34_timers>=3)
          {
              key34_timers = 0;

              Key_symbol |= key34_flag;   //key34键正按着
              IE2 &= ~BTIE;               //disable BT interrupt

              if( (Key_symbol & key1_flag) == key1_flag ) //判断key1_flag和key34_flag都置位时,即进入5度校准状态
              {
                  Key_symbol &= ~key1_flag;
                  Key_symbol &= ~key34_flag;
                  Key_symbol |= Loadjust_flag;//开始低温校准
              }
          }
      }
      else
      {
         key34_timers =0;
      }
//-----------------P1.6(key36)为高电平-------------------
      if( (P1IN & 0x40)==0x40 )
      {
          key36_timers++;
          if(key36_timers>=3)
          {
              key36_timers = 0;

              Key_symbol |= key36_flag;   //key36键正按着
              IE2 &= ~BTIE;               //disable BT interrupt

              if( (Key_symbol & key1_flag) == key1_flag ) //判断key1_flag和key36_flag都置位时,即进入95度校准状态
              {
                  Key_symbol &= ~key1_flag;
                  Key_symbol &= ~key36_flag;
                  Key_symbol |= Hiadjust_flag;//开始高温校准
              }
          }
      }
      else
      {
         key36_timers = 0;
      }
    }
}
/***************************************************************************************
           定时器A 定时中断(xxms,用于脉冲检测,检测完关闭通道0比较中断)
***************************************************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_ACCR0(void)
{
    TACCTL0 &= ~CCIFG;               //清标志位
    CCR0  += 64;                     //每次定时到使CCRO超前TAR 64个振荡周期(即64*(1/32768)==1.95mS)

//-------------------P2.1为高电平(脉冲口)--------------------
    if( (P2IN & 0x02)==0x02 )
    {
        pluseLO_timers++;
        if(pluseLO_timers>=2)
        {
            pluseLO_timers = 0;
            TACCTL0 &= ~CCIE;        //关闭比较/捕获中断(判断完一个正确脉冲后,应马上关闭中断,以免多计)
            Add_Heat();              //增加1个脉冲的热量

//          if( (Display_symbol & flux_symbol) !=flux_symbol )
//              LCDM9 |= 0x08;       //点亮流量提示符
            LCDM9 |= 0x08;           //点亮流量提示符
        }
    }
    else
    {
        pluseLO_timers = 0;
    }
}

/***************************************************************
           定时器A 溢出中断(2S一次中断)
***************************************************************/
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
    unsigned long int temp_power;             //实时功率
    unsigned char L_power,H_power,M_power;    //实时功率高,中,低三字节
    unsigned long int temp_flux;              //实时流速
    unsigned char L_flux,H_flux;              //实时流速高,低二字节

    TACTL &= ~TAIFG;                      //清标志位
    
//======通讯控制==================================================    
    P1OUT &= ~0x01;                       //置低(以接收数据)
    IE2 |= BTIE;                          // Enable BT interrupt(开启7.8125mS中断)
    Disp_symbol |=f2sOpen_BTIE;           //置2S开启7.8125mS中断标志

//============闪烁"*"符号处理=====================================
/*    if((Display_symbol&flux_symbol)==flux_symbol)
      Display_symbol &= ~flux_symbol;//取反,2S将flux_symbol取反一次,为了"*"符号2S亮一下,2S灭一下
    else
      Display_symbol |= flux_symbol;

    if( ((LCDM9 & 0x08) ==0x08) && ((Display_symbol & flux_symbol) !=flux_symbol) )
    {
        LCDM9 &= ~0x08;                     //若2S到时"*"亮着,则将之关闭
        if((Display_symbol&flux_symbol)==flux_symbol)//再取一次反
          Display_symbol &= ~flux_symbol;//取反,2S将flux_symbol取反一次,为了"*"符号2S亮一下,2S灭一下
        else
          Display_symbol |= flux_symbol;
    }
*/
    if( (LCDM9 & 0x08) ==0x08 )
        LCDM9 &= ~0x08;
//===========系统时间处理========================================

    Sys_TimeCal();                        //系统时间计算

//===========计算实时功率,实时流速的时间=========================

    TestFlux_time++;                      //实时流量测试时间,为算实时流量用
//    TestPower_time++;                     //实时功率测试时间,为算实时功率用

//---------------实时流速和功率计算---------------------------------------------------------------------
    if(TestFlux_time>=10)                          //Constant/1000 为了防止10S内Flux_test_add超出65535
    {
//---------------实时流速计算----------------------------------------------------------------------------
        MPY=(Flux_test_add/1000);                  ///1000为了使数据为两个字节长度
        OP2=3600/(TestFlux_time+TestFlux_time);     //TestFlux_time为5时应是10S(2S定时)
        temp_flux =(RESHI*65536 + RESLO)/1000;      ///1000后是L/h

        L_flux =temp_flux%100;                      //实时流速低字节(十时制数)
        H_flux =temp_flux/100;                      //实时流速高字节(十时制数)

        L_flux =(L_flux/10)*16+(L_flux%10);         //实时流速高字节(BCD码)
        H_flux =(H_flux/10)*16+(H_flux%10);         //实时流速高字节(BCD码)

        FluxSpeed_test[0] =L_flux;
        FluxSpeed_test[1] =H_flux;
        if(test_index_Disp==0x02)
        {
            Up_Datebuffer(FluxSpeed_test,4);        //实时功率(000.000KW)
            Up_test_Promptbuffer(test_index_Disp);  //提示符更新
            Lcd_buffer_update(Data_buffer);         //更新LCD
        }

        TestFlux_time =0;
        Flux_test_add =0;

//---------------实时功率计算------------------------------------------------------------------------------
        if( (In_Temp[1]!=0x0E) && (Out_Temp[1] !=0x0E) && (Sub_Temp[1] !=0x0E) )//若温度出错,则不算功率
        {
            MPY=temp_flux;//流速 如5000L/h
            OP2=((Sub_Temp[1]&0xF0)>>4)*1000+(Sub_Temp[1]&0x0F)*100+((Sub_Temp[0]&0xF0)>>4)*10+(Sub_Temp[0]&0x0F);//温差 如3.89度
                                                                                              //放大100倍 为389
            temp_power =(RESHI*65536 + RESLO)/1000;//除1000后,是将其实际值缩小10倍,为了再乖上 1.166(1.166=4.20*0.27778)

            MPY=temp_power; //缩小10倍
            OP2=1166;       //放大1000倍
            temp_power=(RESHI*65536 + RESLO)/100;//除100后是其真实值

            L_power =temp_power%100;              //实时功率低字节(十进制数)
            H_power =(temp_power/100)%100;        //实时功率中字节(十进制数)
            M_power =temp_power/10000;            //实时功率高字节(十进制数)

            L_power =(L_power/10)*16+(L_power%10);//实时功率低字节(BCD码)
            H_power =(H_power/10)*16+(H_power%10);//实时功率中字节(BCD码)
            M_power =(M_power/10)*16+(M_power%10);//实时功率高字节(BCD码)

            Power_test[0] =L_power;
            Power_test[1] =H_power;
            Power_test[2] =M_power;

            if(test_index_Disp==0x01)
            {
                Up_Datebuffer(Power_test,4);            //实时功率(000.000KW)
                Up_test_Promptbuffer(test_index_Disp);  //提示符更新
                Lcd_buffer_update(Data_buffer);         //更新LCD
            }
        }
        else//-------若温度出错,则功率为0
        {
            Power_test[0] =0x00;
            Power_test[1] =0x00;
            Power_test[2] =0x00;
        }
    }

//---------------实时功率计算-------------------------------------
/*    if(TestPower_time>=5)//----------------------10S测算一次实时功率
    {
        MPY=Power_test_WHadd;
        OP2=3600/(TestPower_time+TestPower_time);
        temp_power =(RESHI*65536 + RESLO)/100; //除100,才是其实际值

        L_power =temp_power%100;              //实时功率低字节(十进制数)
        H_power =(temp_power/100)%100;        //实时功率中字节(十进制数)
        M_power =temp_power/10000;            //实时功率高字节(十进制数)

        L_power =(L_power/10)*16+(L_power%10);//实时功率低字节(BCD码)
        H_power =(H_power/10)*16+(H_power%10);//实时功率中字节(BCD码)
        M_power =(M_power/10)*16+(M_power%10);//实时功率高字节(BCD码)

        Power_test[0] =L_power;
        Power_test[1] =H_power;
        Power_test[2] =M_power;

        if(test_index_Disp==0x01)
        {
            Up_Datebuffer(Power_test,4);            //实时功率(000.000KW)
            Up_test_Promptbuffer(test_index_Disp);  //提示符更新
            Lcd_buffer_update(Data_buffer);         //更新LCD
        }

        TestPower_time =0;
        Power_test_WHadd =0;
    }
*/
//===========60S不动作关液晶=====================================
    if( (Display_symbol & seclayer_flag) != seclayer_flag )//在测试层,液晶不休眠
        Delay60s_num+=2;                 //液晶120S关闭计数器
    if(Delay60s_num>=120)
    {

⌨️ 快捷键说明

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