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

📄 interrupt.c

📁 msp430F435做的医疗器械,包括语音模块,知识源于网络
💻 C
📖 第 1 页 / 共 2 页
字号:
        Delay60s_num =0;
        LCDCTL &= ~0x01;                 //关闭液晶
    }

//=========================长按键功能===============================

    if( (P1IN & 0x08)==0x08 )
    {
        display_timers++;                  //显示层切换计数器
        clr_timers++;                      //清测试项数据
    }
    else                      //---没有这个else切换就会有bug,按键几十次后,再按键一下就有可能切换显示层
    {
        display_timers = 0;
        clr_timers = 0;
    }

    if( (clr_timers>=3) && ((test_index_Disp==0x04)||(test_index_Disp==0x05)||(test_index_Disp==0x06)) )//清"测试热量"或"测试流量"
    {
        clr_timers =0;
        Flux_test[0] =0;          //清测试数据项
        Flux_test[1] =0;
        Flux_test[2] =0;
        Flux_test[3] =0;

        Heat_test[0] =0;
        Heat_test[1] =0;
        Heat_test[2] =0;
        Heat_test[3] =0;
          
        Cool_test[0] =0;
        Cool_test[1] =0;
        Cool_test[2] =0;
        Cool_test[3] =0;  

        if(test_index_Disp==0x04)//-------及时刷新测试热量屏幕
            Up_Datebuffer(Heat_test,4);       //当前测试热量(单位:1WH)
        else                    //-------及时刷新测试流量屏幕
            Up_Datebuffer(Flux_test,4);       //当前测试流量(单位:0.001L)
        Up_test_Promptbuffer(test_index_Disp);//提示符更新
        Lcd_buffer_update(Data_buffer);       //更新LCD
    }
    if( (clr_timers>=3) && (test_index_Disp==0x03) )//开始或停止测试
    {
        clr_timers =0;
        Display_symbol ^=test_off;//停止或开始测试(异或)
        if((Display_symbol & test_off)==test_off)
        {
            Up_test_off();                  //往Data_buffer寄存器内直接写段码值"TESTOFF"
            Lcd_buffer_update(Data_buffer); //更新LCD
            if((SVSCTL&0x01)==0x01)                     //MCU内置电源管理模块检测工作电压2.8V,则亮低压提示符
              LCDM10 |= 0x04;                         //点亮低压提示符
        }
        else
        {
            Up_test_on();                   //往Data_buffer寄存器内直接写段码值"TESTON"
            Lcd_buffer_update(Data_buffer); //更新LCD
            if((SVSCTL&0x01)==0x01)                     //MCU内置电源管理模块检测工作电压2.8V,则亮低压提示符
              LCDM10 |= 0x04;                         //点亮低压提示符
        }
    }
    if( (clr_timers>=3) && (hisHeatdata_index_Disp==0x03) )//开启或关闭测试层
    {
        clr_timers =0;
        if( (Display_symbol & testlayer_off) ==testlayer_off)
            Display_symbol &= ~testlayer_off;
        else
            Display_symbol |= testlayer_off;
    }

    if(display_timers>=5)//------------------主显示层与测试显示层切换
    {
        display_timers =0;
        if((Display_symbol & firlayer_flag)==firlayer_flag)     //若当前是第1层,则切换到第2层
        {
            Display_symbol &= ~firlayer_flag;
            if( (Display_symbol & testlayer_off) != testlayer_off)//若没关闭,则进入测试层
                Display_symbol |= seclayer_flag;
            else
                Display_symbol |= thilayer_flag;                  //测试层已关闭,则进入第3层,第2层被回避
        }
        else if((Display_symbol & seclayer_flag)==seclayer_flag)//若当前是第2层,则切换到第3层
        {
            Display_symbol &= ~seclayer_flag;
            Display_symbol |= thilayer_flag;
        }
        else if((Display_symbol & thilayer_flag)==thilayer_flag)//若当前是第3层,切换到第4层
        {
            Display_symbol &= ~thilayer_flag;
            Display_symbol |= foulayer_flag;
        }
        else  if((Display_symbol & foulayer_flag)==foulayer_flag)//若当前是第4层,切换到第5层                                                   //当前是第4层,切换到第1层
        {
            Display_symbol &= ~foulayer_flag;
            Display_symbol |= fivlayer_flag;
        }
        else//若当前是第5层,切换到第1层
        {
            Display_symbol &= ~fivlayer_flag;
            Display_symbol |= firlayer_flag;
        }

        Disp_Mod();
    }

//====================30S自动回首屏功能===========================
    if( ((Display_symbol & firlayer_flag) ==firlayer_flag)||((Display_symbol & thilayer_flag) ==thilayer_flag)||
        ((Display_symbol & foulayer_flag) ==foulayer_flag)||((Display_symbol & fivlayer_flag) ==fivlayer_flag) )//在第1层,第3层,第4层无条件50S后回首屏
        Time30s_num +=2;
    else if( ((Display_symbol & seclayer_flag) ==seclayer_flag)&&((Display_symbol & test_off)==test_off) )
        Time30s_num +=2;                                    //在第2层,必须"TEST OFF"时,不动作50S后回首屏
    if(Time30s_num>=60)
    {
        Time30s_num =0;
        if((Display_symbol & firlayer_flag) !=firlayer_flag)//不在主层,肯定不在首屏
        {
            Display_symbol &= 0xF0;                       //保持高4位,使其不受影响
            Display_symbol |= firlayer_flag;              //使其在主层

            if(In_Temp[1] ==0x0E)//-------------------入口E01
            {
                turn_index_Disp = 2;
                Disp_Mod();
            }
            else if(Out_Temp[1] ==0x0E)//------------出口E02
            {
                turn_index_Disp = 3;
                Disp_Mod();
            }
            else if(Sub_Temp[1] ==0x0E)//------------温差E03
            {
                turn_index_Disp = 4;
                Disp_Mod();
            }
            else//----------------------------------正常则显示热量值项
            {
                turn_index_Disp = 0;
                Disp_Mod();
            }
        }
        else                                                //在主层
        {
            if(In_Temp[1] ==0x0E)//-------------------入口E01
            {
                turn_index_Disp = 2;
                Disp_Mod();
            }
            else if(Out_Temp[1] ==0x0E)//------------出口E02
            {
                turn_index_Disp = 3;
                Disp_Mod();
            }
            else if(Sub_Temp[1] ==0x0E)//------------温差E03
            {
                turn_index_Disp = 4;
                Disp_Mod();
            }
            else//----------------------------------正常则显示热量值项
            {
                turn_index_Disp = 0;
                Disp_Mod();
            }
        }
    }

//================温度采样次数(校准采样30次,并保持6分钟;若不是校准采样,为30次)============
    if((Key_symbol&adjust_flag)==adjust_flag)//若为校准采样
    {
        BasicSamps = 50;                //基准采样次数设为50次(基准次数不能乱改,只能与普通时采样次数一样,否则校不准
        Smaple_timers++;                //校准取100次求平均与普通采样采50次去头去尾所得的SD值不一致
        if(Smaple_timers >=180)
        {
            Smaple_timers = 0;               //校准采样时间清0
            Key_symbol &= ~adjust_flag;      //结束校准采样标志
        }
    }
    else                                     //若不是校准采样,则基准采样次数设为10次
        BasicSamps = 50;

//================30S温度处理===============================================================
    Minters++;
    if(Minters>=15)                           //30S查1次温度,并计算焓值差及1个脉冲的质量
    {
        Minters = 0;
        Interrupt_main_symbol |=Samp_Temp30S_flag;  //置起标志位,到主程序死循环中去处理,减小中断时间
        __bic_SR_register_on_exit(CPUOFF+SCG0+SCG1);//使其从主程序头开始执行
    }
}


/***************************************************************
                SD模数转换中断
***************************************************************/
#pragma vector=SD16_VECTOR
__interrupt void SD_Conver(void)
{
    SD16CCTL0 &= ~0x0004;     //清中断标志
    SD16CCTL1 &= ~0x0004;     //清中断标志
    SD16CCTL2 &= ~0x0004;     //清中断标志

    if(BasicSamps>=100)//校准时采样到SD值求平均处理
    {
        Sum_samp0 += SD16MEM0;    //从转换存储寄存器0中读出转换结果
        Sum_samp1 += SD16MEM1;    //从转换存储寄存器1中读出转换结果
        Sum_samp2 += SD16MEM2;    //从转换存储寄存器2中读出转换结果
    }
    else//不是校准时采样,对SD值做去头去尾处理
    {
        BasicSD_value[Samp_times] = SD16MEM0;
        InSD_value[Samp_times] = SD16MEM1;
        OutSD_value[Samp_times] = SD16MEM2;
    }
      
    Samp_times++;
    if( Samp_times >= BasicSamps )
    {
        Samp_times = 0;                             //采样次数清0

        SD16CCTL0 &= ~0x0002;                       //SC三位
        SD16CCTL1 &= ~0x0002;                       //SC三位
        SD16CCTL2 &= ~0x0002;                       //SC三位

        SD16CTL &= ~0x0008;                          //关闭bit.3:即Vmin (bit.3影响功耗)

//        if( (Key_symbol & AdjustTemp_flag)==AdjustTemp_flag)//已经校过温度,采完后关闭恒流源
        P2OUT &= ~0x08;                                 //关闭温度测试电路电源
/*
        if(BasicSamps>=100)//校准采样
        {
            Value_Mem0 = Sum_samp0/BasicSamps;           //BasicSamps次求平均
            Value_Mem1 = Sum_samp1/BasicSamps;           //BasicSamps次求平均
            Value_Mem2 = Sum_samp2/BasicSamps;           //BasicSamps次求平均            
        }
        else
        {
            Queue_SDvalue();//对3个SD数组中的SD值进行排序,并取中间30个值累加        
            Value_Mem0 = Sum_samp0/(BasicSamps-20);      //BasicSamps次求平均
            Value_Mem1 = Sum_samp1/(BasicSamps-20);      //BasicSamps次求平均
            Value_Mem2 = Sum_samp2/(BasicSamps-20);      //BasicSamps次求平均
        }

        Sum_samp0 = 0;                               //清0
        Sum_samp1 = 0;                               //清0
        Sum_samp2 = 0;                               //清0
*/
        if((SVSCTL&0x01)==0x01)                     //MCU内置电源管理模块检测工作电压2.8V,则亮低压提示符
            LCDM10 |= 0x04;                         //点亮低压提示符
        SVSCTL &= 0x0F;//关闭掉电监测模块
    }
}




























/*********************************************************************************
			discrible:   485接收\发送处理
			
			attention:  用UART硬件来完成
			
			date:  	    05-06-01				
**********************************************************************************/		
	
/**********************************************************
	485串口接收处理(包括协议解析,若解析正确,置收完标志)
***********************************************************/	
#pragma vector=USART0RX_VECTOR
__interrupt void Sci_reccive(void)
{
    unsigned char temp1;
    IFG1 &= ~URXIFG0;                        //清接收标志位		
		
    if( (Comm_symbol & fReceiveComplete) == fReceiveComplete )
    {
	temp1 = U0RXBUF;		     //SCDR寄存器收到的字节
    }
    else
    {
	Comm_symbol |= fReceive;             //为保证每次通讯receive_length都是0
	Count_SCI_receive =0;                //(和函数Process_20ms()第一部分结合)
	
	SCI_buf[receive_length]=U0RXBUF;     //SCDR寄存器收到的字节
	receive_length++;
	
	if(receive_length == 1)     //0x10
	{
	    if( (SCI_buf[0]!=0x10) && (SCI_buf[0]!=0x68) )	  
		receive_length =0;	 
        }      
        else if(receive_length == 5)//0x16 
        {
            if( (SCI_buf[4] != 0x16) &&	(SCI_buf[4] != 0x73))
		receive_length =0;
            else//握手成功
            {
//                IE2 |= BTIE;                          // Enable BT interrupt(开启7.8125mS中断)
//                Disp_symbol |=fcommOpen_BTIE;         //置通讯接收好后开启7.8125mS中断标志
                if(SCI_buf[1] == 0x40)//握手帧,发回0xE5
                {
                    sci_send();//关收,开发
                    U0TXBUF =0xE5;//返回E5H
                    receive_length =0;//接收长度归0
                    Delay(1);//延时4ms(否则最后一个字节被自己收进)
                    sci_receive();//关发,开发 ================只是写命令时用到的处理,读命令这里不进来
                }
                else if(SCI_buf[1] == 0x7B)//读命令,发回读内容 
                {
                    receive_length =0;//接收长度归0
                    sci_send();//关收,开发
                    Read_data();//返回读数据内容
                }
            }
	}
        else if(receive_length==22)//写命令收完(个数暂定6个)
        {
            receive_length =0;//接收长度归0
            Comm_symbol &= ~fReceive;//关闭接收标志
            Write_data();
        }
    }
}

/*************************************************
	发送处理(红外及485)		
*************************************************/	
#pragma vector=USART0TX_VECTOR
__interrupt void Sci_send(void)
{
    IFG1 &= ~UTXIFG0;           //清发送标志位

    if (sending_length)         //发送数据长度控制(12+数据域长度+前导符)
    {		
  	sending_length--;
        sending_ptr++;
	U0TXBUF = *sending_ptr;
	
    }
    else
    {	
	Comm_symbol |= fSendComplete;	//发完标志        
        Delay(1);//延时4ms(否则最后一个字节被自己收进)
        sci_receive();//关发,开发 ================只是写命令时用到的处理,读命令这里不进来
        Comm_symbol &= ~fReceive;//关闭接收标志
    }
}





⌨️ 快捷键说明

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