📄 interrupt.c
字号:
#include <at89x52.h>
#include "define.h"
#include "ADC.h"
#include "control.h"
#include "display.h"
extern unsigned char g_State[22]; // 各路电压输出状态 及 控制标志位g_State[0]
// 0x00:正常 0x01:偏高 0x02偏低 0x03:切断
unsigned char g_Channel; // 要手工控制的通道
void Timer_0() interrupt 1 // 自动监测中断
{
static unsigned char s_Channel = 1; // 进行自动监测的通道
unsigned int Result; // 读取的AD转换结果
T0_DISABLE;
if(s_Channel<9) // 前8个通道的自动监测
{
if(g_State[s_Channel]!=0x03) // 若该通道没有手工切断,进行自动监测
{
MUX1_Select(s_Channel); // 选择模拟开关通道
Result = ADC_CH2(); // 读取AD转换结果
UpdateVoltage_1(s_Channel, Result); // 更新数码管显示
if((Result>LIMIT_L) && (Result<LIMIT_H)) // 若输出电压在正常范围
{
if((g_State[s_Channel]==0x01) || (g_State[s_Channel]==0x02)) // 若之前不正常,则恢复
{
Reconnect_1(s_Channel);
ReturnFine(s_Channel);
g_State[s_Channel] = 0x00;
}
}
else
{
if(Result>LIMIT_H) // 若输出电压高于上限值
{
if(g_State[s_Channel]==0x00) // 若之前正常,则切断通道并使数码管闪烁
{
CutOff_1(s_Channel);
WrongAlarm(s_Channel);
g_State[s_Channel] = 0x01;
}
}
if(Result<LIMIT_L) // 若输出电压低于下限值
{
if(g_State[s_Channel]==0x00) // 若之前正常,则切断通道并使数码管闪烁
{
CutOff_1(s_Channel);
WrongAlarm(s_Channel);
g_State[s_Channel] = 0x02;
}
}
}
}
}
if((s_Channel>8) && (s_Channel<17))
{
if(g_State[s_Channel]!=0x03)
{
MUX2_Select(s_Channel);
Result = ADC_CH1();
UpdateVoltage_2(s_Channel, Result);
if((Result>LIMIT_L) && (Result<LIMIT_H))
{
if((g_State[s_Channel]==0x01) || (g_State[s_Channel]==0x02))
{
Reconnect_2(s_Channel);
ReturnFine(s_Channel);
g_State[s_Channel] = 0x00;
}
}
else
{
if(Result>LIMIT_H)
{
if(g_State[s_Channel]==0x00)
{
CutOff_2(s_Channel);
WrongAlarm(s_Channel);
g_State[s_Channel] = 0x01;
}
}
if(Result<LIMIT_L)
{
if(g_State[s_Channel]==0x00)
{
CutOff_2(s_Channel);
WrongAlarm(s_Channel);
g_State[s_Channel] = 0x02;
}
}
}
}
}
if(s_Channel>16)
{
if(g_State[s_Channel]!=0x03)
{
MUX3_Select(s_Channel);
Result = ADC_CH0();
UpdateVoltage_3(s_Channel, Result);
if((Result>LIMIT_L) && (Result<LIMIT_H))
{
if((g_State[s_Channel]==0x01) || (g_State[s_Channel]==0x02))
{
Reconnect_3(s_Channel);
ReturnFine(s_Channel);
g_State[s_Channel] = 0x00;
}
}
else
{
if(Result>LIMIT_H)
{
if(g_State[s_Channel]==0x00)
{
CutOff_3(s_Channel);
WrongAlarm(s_Channel);
g_State[s_Channel] = 0x01;
}
}
if(Result<LIMIT_L)
{
if(g_State[s_Channel]==0x00)
{
CutOff_3(s_Channel);
WrongAlarm(s_Channel);
g_State[s_Channel] = 0x02;
}
}
}
}
}
if(s_Channel==21)
{
s_Channel = 1;
}
else
{
s_Channel++;
}
T0_ENABLE;
}
void INT_0() interrupt 0 // 手工通断控制
{
INT_DISABLE;
if(g_State[0]==0x00) // 开始手工控制
{
g_Channel = 0;
ControlDisplay(0x0b00);
ControlDisplay(0x0900);
ControlDisplay(0x0800);
g_State[0] = 0xff;
}
else // 完成手工控制
{
if(g_Channel!=0)
{
if(g_State[g_Channel]==0x03)
{
if(g_Channel<9)
{
Reconnect_1(g_Channel);
}
if((g_Channel>8) && (g_Channel<17))
{
Reconnect_2(g_Channel);
}
if(g_Channel>16)
{
Reconnect_3(g_Channel);
}
g_State[g_Channel] = 0x00;
}
else
{
if(g_Channel<9)
{
CutOff_1(g_Channel);
UpdateVoltage_1(g_Channel, 0x0000);
}
if((g_Channel>8) && (g_Channel<17))
{
CutOff_2(g_Channel);
UpdateVoltage_2(g_Channel, 0x0000);
}
if(g_Channel>16)
{
CutOff_3(g_Channel);
UpdateVoltage_3(g_Channel, 0x0000);
}
g_State[g_Channel] = 0x03;
}
}
ControlDisplay(0x0812);
ControlDisplay(0x0a12);
ControlDisplay(0x0b12);
g_State[0] = 0x00;
}
INT_ENABLE;
}
void INT_1() interrupt 2 // 选择手工控制的通道,并显示其当时状态
{
unsigned char Number1 ;
unsigned char Number2;
unsigned int Data;
INT_DISABLE;
if(g_State[0]==0xff)
{
if(g_Channel==21)
{
g_Channel = 0;
}
else
{
g_Channel++;
}
if(g_Channel<10)
{
Number1 = 0;
Number2 = g_Channel;
}
else
{
if(g_Channel<20)
{
Number1 = 1;
Number2 = g_Channel - 10;
}
else
{
Number1 = 2;
Number2 = g_Channel - 20;
}
}
if(g_State[g_Channel]==0x00)
{
ControlDisplay(0x0b00);
}
if(g_State[g_Channel]==0x01)
{
ControlDisplay(0x0b17);
}
if(g_State[g_Channel]==0x02)
{
ControlDisplay(0x0b18);
}
if(g_State[g_Channel]==0x03)
{
ControlDisplay(0x0b12);
}
Data = 0x0900 | Number1;
ControlDisplay(Data);
Data = 0x0800 | Number2;
ControlDisplay(Data);
}
INT_ENABLE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -