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

📄 alarm-v3.c

📁 本程序为检测16路输入45~65HZ的信号
💻 C
📖 第 1 页 / 共 4 页
字号:
/*********************************************************************
* Copyright (c) 2008
* All rights reserved.
*
* 文件名称:LS166.C
* 文件标识:/
* 摘 要:
*			本程序为检测16路输入45~65HZ的信号,并按每路状态输出各自想应路信号,具体设计
* 内容请查看其它文件中的设计要求及功能	
* 2008年6月11日修改:
* 1.增加DC输出信号检测功能
* 2.修改初次上电,当输入为高电平时不动作
* 3.修改当输入信号由高电平变为低电平时,则输入报警,由低变为高时取消报警,黄灯输出
* 当前版本:v3
* 作 者:	邱顯輝
* 完成日期:2008年6月11日
* 第一次更改时间:2008年5月12日
* 最后完成日期:2008年6月11日
* 取代版本:v2
* 原作者 :	邱顯輝
* 完成日期:2008年6月11日
* 检查和: 43f9ad1   TOPWIN编程器
***********************************************************************/

#include<pic.h>
__CONFIG(PROTECT & DEBUGDIS & WRTDIS & DPROT & LVPDIS & BOREN & PWRTEN & WDTEN & HS);
//PROTECT程序存储器保护开,DEBUGDIS在线调试关,---- , LVPDIS在线编程关
//BOREN欠压复位开(低于4V),PWRTEN上电延时开,WDTDIS看门狗开,HS高频模式
//74HC166位定义
#define CLKINH RB7
#define CLKINH_DIR TRISB7
#define CLK RB6
#define CLK_DIR TRISB6
#define SH RB5
#define SH_DIR TRISB2
#define SEROUT_0 RB4
#define SEROUT0_DIR TRISB4
#define SEROUT_1 RB3
#define SEROUT1_DIR TRISB3
//74hc595脚位定义
#define	SCLK RC0
#define SCLK_DIR TRISC0
#define	SER RC1
#define	SER_DIR TRISC1
#define RCLK_RELAY RC2
#define RCLK_RELAY_DIR TRISC2
#define RCLK_LED RC3
#define RCLK_LED_DIR TRISC3
//电源灯,声音输出位定义
#define POWER_LED RC4
#define POWER_LED_DIR TRISC4
#define BUZZER RC5
#define BUZZER_DIR TRISC5
//按键功能定义
#define RESET_KEY RB0
#define RESET_KEY_DIR TRISB0
#define TEST_KEY RB1
#define TEST_KEY_DIR TRISB1
#define MUTE_KEY RB2
#define MUTE_KEY_DIR TRISB2
//其它定义
unsigned char FRE_CONT[16]=
{
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
};
unsigned char LOW_TIME[16]=
{
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
};
unsigned char HI_TIME[16]=
{
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
};

union {				//共用体
	struct {			//结构体
	unsigned b0: 1;						//用于声音开关标志位
	unsigned b1: 1;						//用于电源灯指示闪烁控制
	unsigned b2: 1;						//1S定时标志位,当为0表示未到,当为1时表示已到1S定时
	unsigned b3: 1;						//1S输入检测标志位开关,当为0时表示不进行检测,当为1时表示开始检测
	unsigned b4: 1;
	unsigned b5: 1;
	unsigned b6: 1; 
	unsigned b7: 1;
	} oneBit;
	unsigned char allBits;
} Flag;

/*********************************************************************************
/*定义输入状态16位的变化状态
/*1.当第一次上电时16位状态标示位全部清“0”
/*2.当某位第一次发生由低电平变为高电平时,此时这位也将变为高电平
/*3.之后将一直宝持为高电平,只有当重新上电或按下RESET按键时置“0”
/*********************************************************************************/
union {				//共用体
	struct {			//结构体
	unsigned b0: 1;
	unsigned b1: 1;
	unsigned b2: 1;
	unsigned b3: 1;
	unsigned b4: 1;
	unsigned b5: 1;
	unsigned b6: 1; 
	unsigned b7: 1;
	unsigned b8: 1;
	unsigned b9: 1;
	unsigned b10: 1;
	unsigned b11: 1;
	unsigned b12: 1;
	unsigned b13: 1;
	unsigned b14: 1;
	unsigned b15: 1;
	} oneBit;
	unsigned int allBits;
} RelayFlag;

/*********************************************************************************
/*定义输入状态16位的变化状态,记录当前输入检测电平
/*当输入为低电平时,记录为“0”,当输入为高电平时,记录为“1”
/*********************************************************************************/
union {				//共用体
	struct {			//结构体
	unsigned b0: 1;
	unsigned b1: 1;
	unsigned b2: 1;
	unsigned b3: 1;
	unsigned b4: 1;
	unsigned b5: 1;
	unsigned b6: 1; 
	unsigned b7: 1;
	unsigned b8: 1;
	unsigned b9: 1;
	unsigned b10: 1;
	unsigned b11: 1;
	unsigned b12: 1;
	unsigned b13: 1;
	unsigned b14: 1; 
	unsigned b15: 1;
	} oneBit;
	unsigned int allBits;
} InFlag;

/*********************************************************************************
/*定义16黄灯输出状态
/*当记录为“1”,表示为此路已经报警一次,为“0”表示还未报警
/*********************************************************************************/
union {				//共用体
	struct {			//结构体
	unsigned b0: 1;
	unsigned b1: 1;
	unsigned b2: 1;
	unsigned b3: 1;
	unsigned b4: 1;
	unsigned b5: 1;
	unsigned b6: 1; 
	unsigned b7: 1;
	unsigned b8: 1;
	unsigned b9: 1;
	unsigned b10: 1;
	unsigned b11: 1;
	unsigned b12: 1;
	unsigned b13: 1;
	unsigned b14: 1; 
	unsigned b15: 1;
	} oneBit;
	unsigned int allBits;
} YellowLed;

/*********************************************************************************
/*定义输入状态暂存16位的变化状态,记录当前输入检测电平
/*当输入为低电平时,记录为“0”,当输入为高电平时,记录为“1”
/*********************************************************************************/
	union {				//共用体
		struct {			//结构体
		unsigned b0: 1;
		unsigned b1: 1;
		unsigned b2: 1;
		unsigned b3: 1;
		unsigned b4: 1;
		unsigned b5: 1;
		unsigned b6: 1; 		
		unsigned b7: 1;
		unsigned b8: 1;
		unsigned b9: 1;
		unsigned b10: 1;
		unsigned b11: 1;
		unsigned b12: 1;
		unsigned b13: 1;
		unsigned b14: 1; 
		unsigned b15: 1;
		} oneBit;
		unsigned int allBits;
	} InTemp0;
	

/*********************************************************************************
/*定义输入状态暂存16位的变化状态,记录当前输入检测电平
/*当输入为低电平时,记录为“0”,当输入为高电平时,记录为“1”
/*********************************************************************************/
union {				//共用体
	struct {			//结构体
	unsigned b0: 1;
	unsigned b1: 1;
	unsigned b2: 1;
	unsigned b3: 1;
	unsigned b4: 1;
	unsigned b5: 1;
	unsigned b6: 1; 
	unsigned b7: 1;
	unsigned b8: 1;
	unsigned b9: 1;
	unsigned b10: 1;
	unsigned b11: 1;
	unsigned b12: 1;
	unsigned b13: 1;
	unsigned b14: 1; 
	unsigned b15: 1;
	} oneBit;
	unsigned int allBits;
} InTemp1;
unsigned char SECOND_0,SECOND_1,DET_ON;		//定义毫秒位,秒位,输入检测开关(不为0则开始检测)

/*------------------------------------------------------------*/
unsigned int LS166_Write(void);
void HC595_Write16bit(unsigned char Data0, unsigned char Data1);
	
//74LS166的1~16位输入状态标志寄存器

/*****************************************************************************
功能:毫秒延时程序
用法:调用加延时参数:cont
******************************************************************************/
void delay_1ms(unsigned char cont)
{
	unsigned char q0;
	for(;cont>0;cont--)
	{
		q0 = 247;
		while(q0--);
	}	
}

/*****************************************************************************
功能:中断服务程序_定时器1,用于电源灯100ms闪烁两次,关500ms
用法:
******************************************************************************/
void Timer1_int0(void)
{
	static unsigned char cont=0,loop1=0;
	if(!Flag.oneBit.b1)
	{
		if(loop1<4)
		{
			if(++cont>50)				//100ms
			{
				if(++loop1>=4)
				{
					Flag.oneBit.b1 = 1;
				}
				cont = 0;
				POWER_LED =! POWER_LED;
			}			
		}
	}
	else
	{
		POWER_LED = 1;
		if(++cont>250)				//500ms
		{
			Flag.oneBit.b1 = 0;	
			cont = 0;
			loop1 = 0;
		}
	}
	//InTemp1.allBits = LS166_Write();
	
}

/*****************************************************************************
功能:中断服务程序_定时器1,用于检测45~65Hz信号
用法:
******************************************************************************/
void Timer1_int1(void)
{
	unsigned char loop;
	unsigned char INPUT0,INPUT1;
	unsigned int temp;
	CLK=0;
	CLKINH=0;
	SH=1;
	SH=0;
	CLKINH=1;
	SH=1;							//载入数据
	CLKINH=0;
	INPUT0=0X00;
	INPUT1=0X00;
	temp = 0;
	for(loop=8;loop>0;loop--)
	{
		CLK=0;
		INPUT0<<=1;					//左移一位
		INPUT1<<=1;
		SEROUT0_DIR = 1;
		if(SEROUT_0)
		{
		INPUT0=INPUT0|0x01;			//输入1
		}
		if(SEROUT_1)
		{
		INPUT1=INPUT1|0x01;			//输入1
		}
		CLK=1;
	}
	temp = temp|INPUT0;
	temp <<= 8;						//左右8位
	temp = temp|INPUT1;				//将两个8位合并成16位
	InTemp1.allBits = temp;
//-------------------------------------第1路----------------------------------//
	if(InTemp0.oneBit.b0)			//上次检测到输入为高电平
	{
		HI_TIME[0]++;				//高电平持续时间增加
		if(!InTemp1.oneBit.b0)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b0 = 0;
			FRE_CONT[0]++;	
			HI_TIME[0] = 0;			//清0
		}
	}
	else
	{
		LOW_TIME[0]++;				//低电平持续时间增加
		if(InTemp1.oneBit.b0)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b0 = 1;
			FRE_CONT[0]++;
			LOW_TIME[0] = 0;		//清0	
		}
	}
//-------------------------------------第2路----------------------------------//
    if(InTemp0.oneBit.b1)			//上次检测到输入为高电平
	{
		HI_TIME[1]++;				//高电平持续时间增加
		if(!InTemp1.oneBit.b1)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b1 = 0;
			FRE_CONT[1]++;	
			HI_TIME[1] = 0;			//清0
		}
	}
	else
	{
		LOW_TIME[1]++;				//低电平持续时间增加
		if(InTemp1.oneBit.b1)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b1= 1;
			FRE_CONT[1]++;
			LOW_TIME[1] = 0;		//清0	
		}
	}
//-------------------------------------第3路----------------------------------//
	if(InTemp0.oneBit.b2)			//上次检测到输入为高电平
	{
		HI_TIME[2]++;				//高电平持续时间增加
		if(!InTemp1.oneBit.b2)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b2 = 0;
			FRE_CONT[2]++;
			HI_TIME[2] = 0;			//清0	
		}
	}
	else
	{
		LOW_TIME[2]++;				//低电平持续时间增加
		if(InTemp1.oneBit.b2)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b2 = 1;
			FRE_CONT[2]++;	
			LOW_TIME[2] = 0;		//清0
		}
	}
//-------------------------------------第4路----------------------------------//
	if(InTemp0.oneBit.b3)			//上次检测到输入为高电平
	{
		HI_TIME[3]++;				//高电平持续时间增加
		if(!InTemp1.oneBit.b3)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b3 = 0;
			FRE_CONT[3]++;
			HI_TIME[3] = 0;			//清0
		}
	}
	else
	{
		LOW_TIME[3]++;				//低电平持续时间增加
		if(InTemp1.oneBit.b3)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b3 = 1;
			FRE_CONT[3]++;	
			LOW_TIME[3] = 0;		//清0
		}
	}
//-------------------------------------第5路----------------------------------//
	if(InTemp0.oneBit.b4)			//上次检测到输入为高电平
	{
		HI_TIME[4]++;				//高电平持续时间增加
		if(!InTemp1.oneBit.b4)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b4 = 0;
			FRE_CONT[4]++;	
			HI_TIME[4] = 0;			//清0
		}
	}
	else
	{
		LOW_TIME[4]++;				//低电平持续时间增加
		if(InTemp1.oneBit.b4)		//当前输入状态为低电平
		{
			InTemp0.oneBit.b4 = 1;
			FRE_CONT[4]++;	
			LOW_TIME[4] = 0;		//清0
		}
	}
//-------------------------------------第6路----------------------------------//

⌨️ 快捷键说明

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