?? 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 + -