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

📄 interrupt.c

📁 基于51单片机系统
💻 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 + -