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