📄 interrupt.c
字号:
/****************************************************************************************************
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 + -