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

📄 alarm-v3.c

📁 本程序为检测16路输入45~65HZ的信号
💻 C
📖 第 1 页 / 共 4 页
字号:
}

/*****************************************************************************
功能:从74LS166读取8位数据
用法:
执行时间:Cycles:395				Time:395us
******************************************************************************/
void HC595_Write16bit(unsigned char Data0, unsigned char Data1)
{
	unsigned char loop;
	for(loop=8;loop>0;loop--)		//送8位数据
	{
		SCLK = 0;	
		if(Data0 & 0X80)
		{				
			SER = 1;				//送数据
		}
		else
		{
			SER = 0;
		}
		Data0<<=1;					//数据移位
		SCLK=1; 					//送移位有效时钟			
	}
	for(loop=8;loop>0;loop--)		//送8位数据
	{
		SCLK=0;					
		if(Data1 & 0X80)
		{				
			SER = 1;				//送数据
		}	
		else
		{
			SER = 0;
		}
		Data1<<=1;					//数据移位
		SCLK=1; 					//送移位有效时钟			
	}	
}

/*****************************************************************************
功能:从74LS166读取8位数据
用法:
执行时间:Cycles:193				Time:193us
******************************************************************************/
void Ini_HC595(void)
{
	RCLK_LED = 0;					//输出LOCK
	RCLK_RELAY = 0;					//输出LOCK	
	HC595_Write16bit(0X00, 0X00);	//写放16位数据	
	RCLK_LED = 1;					//上升沿HC595输出黄灯数据
	RCLK_RELAY = 1;					//上升沿HC595输出红灯,继电器数据
	RCLK_LED = 0;					//输出LOCK
	RCLK_RELAY = 0;					//输出LOCK	
}

/*****************************************************************************
功能:从74LS166读取8位数据
用法:
******************************************************************************/
void Ini_System(void)
{	
	OPTION = 0X0d;					//开上拉电阻,预分频器分给看门狗,32分频
	TRISA = 0XC0;
	TRISB = 0X1F;					//高3位输出,其它位输入
	TRISC = 0X00;					//C口设置为输出
	PORTB = 0XFF;
	PORTA = 0XFF;
	PORTC = 0XD3;					//声音关,电源灯关,RCLK_LED/RCLK_RELAY输出低
									//SCLK,RER输出高电平
	Ini_HC595();					//初始化HC595
	TMR1H = 0Xf8;
	TMR1L = 0X2f;					//设置2MS中断
	PIE1 = 0X01;					//开启定时器1益出中断
	PIR1 = 0X00;					//清除中断摽志
	INTCON = 0XC0;					//开全部中断
	T1CON = 0x05;					//设置定时器1为内部时钟,并开启
	Flag.allBits = 0x00;			//初始其它标志
	InFlag.allBits = 0x0000;		//初始化输出状态标志位
	YellowLed.allBits = 0x0000;		//黄灯输出不亮
	RelayFlag.allBits = 0x0000; 	//关闭所以继电器
}

/*******************************************************************************
功能:检测输出信号状态功能及处理相关置位
用法:直接调用
执行时间:Cycles:395				Time:395us
********************************************************************************/
void Output_Dispose(void)
{
	unsigned char temp0,temp1;
	unsigned int temp;
	temp0 = RelayFlag.allBits & 0x00ff;					//取低八位
	temp = RelayFlag.allBits >> 8;
	temp1 = temp & 0x00ff;								//取高八位
	RCLK_LED = 0;										//输出LOCK
	RCLK_RELAY = 0;										//输出LOCK	
	HC595_Write16bit (temp0, temp1);					//写放16位数据	
	RCLK_RELAY = 1;										//上升沿HC595输出红灯,继电器数据
	temp0 = YellowLed.allBits & 0x00ff;					//取低八位
	temp = YellowLed.allBits >> 8;
	temp1 = temp & 0x00ff;								//取高八位
	HC595_Write16bit (temp0, temp1);					//写16位数据到HC595	
	RCLK_LED = 1;										//上升沿HC595输出黄灯数据
	RCLK_LED = 0;										//输出LOCK
	RCLK_RELAY = 0;										//输出LOCK	
}

/*******************************************************************************
功能:报警音输出处理功能
用法:直接调用
******************************************************************************/
void Output_Audio(void)
{
	if(!RelayFlag.allBits)					//如果输出全为“0”
	{
		Flag.oneBit.b0 = 0;
		BUZZER = 0;
	}
	if(Flag.oneBit.b0)							//当为“1”时报警输出
	{
		BUZZER = 1;
	}
}

/*******************************************************************************
功能:复位按键功能
用法:直接调用
******************************************************************************/
void Reset_Dispose(void)
{
	unsigned char loop1,loop2;
	Flag.oneBit.b0 = 0;				//清除声音状态标志
	InFlag.allBits = 0x0000;		//初始化输出状态标志位
	YellowLed.allBits = 0x0000;		//黄灯输出不亮
	RelayFlag.allBits = 0x0000; 	//关闭所以继电器
	Output_Dispose();				//清除继电器及黄灯为“0”
	BUZZER = 0;						//关闭声音
	for(loop2=8;loop2>0;loop2--)		//延时2S
	{
		for(loop1=250;loop1>0;loop1--)
		{
			delay_1ms(1);		
		}
	}
}

/*******************************************************************************
功能:测试按键程序,用于测试输出端
用法:直接调用
******************************************************************************/
void Test_Dispose(void)
{
	unsigned char loop,loop1,loop2;
	unsigned char temp0,temp1;
	RCLK_RELAY = 0;									//清除当除输出状态
	RCLK_LED = 0;									//输出LOCK	
	HC595_Write16bit (0x00, 0x00);					//写放16位数据全为高	
	RCLK_LED = 1;
	RCLK_RELAY = 1;
	temp0 = 0;
	temp1 = 0x01;						//合成输出后:temp0 temp1		高===低
	for(loop=0;loop<17;loop++)
	{
		RCLK_RELAY = 0;										//输出LOCK	
		HC595_Write16bit (temp0, temp1);					//写放16位数据	
		RCLK_RELAY = 1;
		for(loop2=2;loop2>0;loop2--)
		{
			for(loop1=250;loop1>0;loop1--)
			{
				delay_1ms(1);
				if(!RESET_KEY)
				{
					delay_1ms(20);
					if(!RESET_KEY)
					{
						while(!RESET_KEY);
						goto Test_back;
					}
				}			
			}
			BUZZER =! BUZZER;
		}
		if(loop<8)
		{
			temp0 = 0;
			temp1<<=1;
			if(!temp1)
			{
				temp0 = 0x01;
				temp1 = 0x00;
			}			
		}
		else 
		{
			temp0<<=1;
			temp1 = 0;
		}
	}
	temp0 = 0;
	temp1 = 0x01;						//合成输出后:temp0 temp1		高===低
	for(loop=0;loop<17;loop++)
	{
		RCLK_LED = 0;										//输出LOCK	
		HC595_Write16bit (temp0, temp1);					//写放16位数据	
		RCLK_LED = 1;
		for(loop2=2;loop2>0;loop2--)
		{
			for(loop1=250;loop1>0;loop1--)
			{
				delay_1ms(1);
				if(!RESET_KEY)
				{
					delay_1ms(20);
					if(!RESET_KEY)
					{
						while(!RESET_KEY);
						goto Test_back;
					}
				}			
			}
			BUZZER =! BUZZER;
		}
		if(loop<8)
		{
			temp0 = 0;
			temp1<<=1;
			if(!temp1)
			{
				temp0 = 0x01;
				temp1 = 0x00;
			}			
		}
		else 
		{
			temp0<<=1;
			temp1 = 0;
		}
	}
	temp0 = 0;
	temp1 = 0;
	for(loop=4;loop>0;loop--)
	{
		BUZZER =! BUZZER;
		RCLK_RELAY = 0;
		RCLK_LED = 0;										//输出LOCK	
		HC595_Write16bit (temp0, temp1);					//写放16位数据全为高	
		RCLK_LED = 1;
		RCLK_RELAY = 1;
		for(loop2=4;loop2>0;loop2--)		//延时1S
		{
			for(loop1=250;loop1>0;loop1--)
			{
				delay_1ms(1);
				if(!RESET_KEY)
				{
					delay_1ms(20);
					if(!RESET_KEY)
					{
						while(!RESET_KEY);
						goto Test_back;
					}
				}			
			}
		}
		temp0 =~ temp0;
		temp1 =~ temp1;
	}
Test_back:
	Reset_Dispose();														///重新复位处理
	for(loop2=8;loop2>0;loop2--)		//延时2S
		{
			for(loop1=250;loop1>0;loop1--)
			{
				delay_1ms(1);
				if(!RESET_KEY)
				{
					delay_1ms(20);
					if(!RESET_KEY)
					{
						while(!RESET_KEY);
						goto Test_back;
					}
				}			
			}
		}
}

/*******************************************************************************
功能:mute按键程序
用法:直接调用
******************************************************************************/
void Mute_Dispose(void)
{
	Flag.oneBit.b0 = 0;							//关闭声音开启标志
	BUZZER = 0;
}

/*******************************************************************************
功能:上电程序
用法:直接调用
******************************************************************************/
void Power_Up(void)
{
	BUZZER = 1;
	RCLK_RELAY = 0;
	RCLK_LED = 0;										//输出LOCK	
	HC595_Write16bit (0XFF, 0XFF);					//写放16位数据全为高	
	RCLK_LED = 1;
	RCLK_RELAY = 1;
	delay_1ms(200);								//延时0.2秒
	BUZZER = 0;
	RCLK_RELAY = 0;
	RCLK_LED = 0;										//输出LOCK	
	HC595_Write16bit (0X00, 0X00);					//写放16位数据全为高	
	RCLK_LED = 1;
	RCLK_RELAY = 1;
}

/*****************************************************************************
功能:中断服务程序
用法:
******************************************************************************/
void interrupt ISR (void)
{
	asm("clrwdt");							//50MS喂狗一次,18*32=576MS后复位
	if(TMR1IF)								//定时器1中断服务程序
	{
		PIR1 = 0X00;
		TMR1H = 0Xf8;
		TMR1L = 0X2f;						//设置2MS中断
		Timer1_int0();						//电源指示灯
		if(DET_ON)							//为1时表示开始检测
		{
			Timer1_int1();					//检测记录频率脉冲
			if(++SECOND_0 > 250)			//定时500MS
			{
				SECOND_0 = 0;
				if(++SECOND_1 > 0)			//定时0.5S
				{
					SECOND_1 = 0;
					DET_ON = 0;				//标志定时0.5S到
					Timer1_int2();			//判断已记录的脉冲数是否待合条件
				}
			}
		}	
	}
}

/*****************************************************************************
功能:主程序
用法:
******************************************************************************/
void main(void)
{
	unsigned char loop;
	DET_ON = 0;									//关闭检测输入
	Ini_System();								//调用系统初始化程序
	for(loop=0;loop<16;loop++)
	{
		FRE_CONT[loop]=0;
	}			
	delay_1ms(250);
	delay_1ms(250);
	Power_Up();									//调用上电测试程序
	//Test_Dispose();
	delay_1ms(250);
	delay_1ms(250);
	delay_1ms(250);
	delay_1ms(250);							
	delay_1ms(250);
	delay_1ms(250);
	delay_1ms(250);
	delay_1ms(250);							// 延时2秒后才进稳定工作
	DET_ON = 0;
	SECOND_0=0;
	SECOND_1=0;	
	while(1)
	{
		while(!DET_ON)
		{
			Output_Dispose();
			Output_Audio();
			DET_ON = 0XFF;							//开启输入信号检测		
		}
//----------------------------------RESET_KEY处理功能-------------------------//
		if(!RESET_KEY)
		{
			delay_1ms(20);							//去抖延时20MS
			if(!RESET_KEY)
			{
				Reset_Dispose();
			}
			while(!RESET_KEY)
			{
				;
				//Input_Dispose();					//检测输入信号
				//Output_Dispose();	
			}
		}
//----------------------------------MUTE_KEY处理功能-------------------------//
		if(!MUTE_KEY)
		{
			delay_1ms(20);							//去抖延时20MS
			if(!MUTE_KEY)
			{
				Mute_Dispose();
			}
			while(!MUTE_KEY)
			{
//				Input_Dispose();					//检测输入信号
				Output_Dispose();	
			}
		}
//----------------------------------TEST_KEY处理功能-------------------------//
		if(!TEST_KEY)
		{
			delay_1ms(20);							//去抖延时20MS
			if(!TEST_KEY)
			{
				Test_Dispose();
			}
			while(!TEST_KEY)
			{
//				Input_Dispose();					//检测输入信号
				Output_Dispose();	
			}
		}		
	}
}

⌨️ 快捷键说明

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