📄 liu.c
字号:
//###############################################
/* 人员报警控制器
// personnel alarm
// data: 2008/4/19
// by: jamesliu */
//###############################################
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar tcount,second,min,key,m,n,keybuf,i;
uchar pre_alarm_flag,main_alarm_flag,AC_flag;
uchar MUTE_AC_flag,MUTE_DC_flag,AC_count;
uchar MUTE_key_down,check_AC,check_DC,AN1_rest;
uchar mute_key_flag,AN1_rest_flag;
uchar AC_DC_num,key_AC_DC_stime_ok;
uchar alarm_num,key_alarm_stime_ok;
uchar code table[]={0X02,0X05,0X0A,0X0F,0X19};
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit DOG=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
//#######################################################
void delay(uint dat) //延时dat*5ms,
{
uchar i,j,k;
for(k=0;k<dat;k++)
{
for(i=0;i<10;i++)
{
for(j=0;j<248;j++);
}
}
}
//#######################################################
keyback()
{
if(P1_5==0);
{
delay(1); //5ms
if(P1_5==0)
{
if(++key==5)
{
key=0;
}
while(P1_5==0);
}
}
return (key);
}
//###########################################
//#define key_input P1^0
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
//###########################################
unsigned char read_key(uchar dat)
{
static unsigned char key_state=0;
unsigned char key_press,key_return=0;
key_press=dat;
switch(key_state)
{
case key_state_0:
if(!key_press) key_state=key_state_1;
break;
case key_state_1:
if(!key_press)
{
key_return=1;
key_state=key_state_2;
}
else
key_state=key_state_0;
break;
case key_state_2:
if(key_press)key_state=key_state_0;
break;
}
return key_return;
}
//############################################
void timechooseled()
{
uint i=0;
i=keybuf;
switch(i)
{
case 0:P2_7=0;
P3_4=1;
P3_5=1;
P3_6=1;
P3_7=1;
break;
case 1:P3_4=0;
P2_7=1;
P3_5=1;
P3_6=1;
P3_7=1;
break;
case 2:P3_5=0;
P2_7=1;
P3_4=1;
P3_6=1;
P3_7=1;
break;
case 3:P3_6=0;
P2_7=1;
P3_4=1;
P3_5=1;
P3_7=1;
break;
case 4:P3_7=0;
P2_7=1;
P3_4=1;
P3_5=1;
P3_6=1;
break;
}
}
//####################################################
void alarm()
{
uchar k,l;
if(pre_alarm_flag==1)
{
P3_1=1;
P2_6=0;
P3_3=0;
delay(100);
P3_3=1;
if(key_alarm_stime_ok)
{
key_alarm_stime_ok=0;
if(read_key(P1_3))
{
P2_4=0;
delay(100);
P2_4=1;
P3_1=0;
P2_6=1;
P3_3=1;
tcount=0;
second=0;
min=0;
pre_alarm_flag=0;
}
}
}
if(main_alarm_flag==1)
{
P3_0=1;
P2_5=0;
P3_3=0;
delay(100);
P3_3=1;
if(key_alarm_stime_ok)
{
key_alarm_stime_ok=0;
if(read_key(P1_3))
{
P2_4=0;
delay(200);
P2_4=1;
P3_0=0;
P3_1=0;
P3_3=1;
P2_5=1;
P2_6=1;
tcount=0;
second=0;
min=0;
pre_alarm_flag=0;
main_alarm_flag=0;
}
}
}
}
//###########################################################################
// main_alarm、pre_alarm time
// 2min,5min,10min,15min,25min.
/*This function is an interrupt service routine for TIMER 0. It should never
//be called by a C or assembly function.It will be executed automatically
//when TIMER 0 overflows.*/
//###########################################################################
void timer0() interrupt 1 using 1 /* 10ms timer 0 overflows */
{
if(P1_4==0)
{
if(++tcount==100)
{
tcount=0;
if(++second==60)
{
second=0;
if(++min==table[keybuf]-1)
{
pre_alarm_flag=1;
}
if(min==table[keybuf])
{
main_alarm_flag=1;
}
}
}
}
else
{
tcount=second=min=0;
pre_alarm_flag=0;
main_alarm_flag=0;
}
TH0=0X0D8; //10MS
TL0=0X0F0;
}
//#####################################################
// AC_FLAG:
// DOG:1s(4060-Q10:T=2.252s)
//#####################################################
void timer1() interrupt 3 using 3/* 5ms timer 1 overflows */
{
TH1=0X0F8; //2MS
TL1=0X30;
AC_DC_num++;
if(AC_DC_num==1)
{
AC_DC_num=0;
key_AC_DC_stime_ok=1;
}
/*----------------------------------*/
alarm_num++;
if(alarm_num==4)
{
alarm_num=0;
key_alarm_stime_ok=1;
}
/*----------------------------------*/
if(P1_0==0)
{
AC_count=0;
AC_flag=0;
}
else if(P1_0==1)
{
if(++AC_count==20)
{
AC_flag=1;
AC_count=0;
}
}
/*----------------------------------*/
if(++m==100) //1s到,
{
m=0;
DOG=1;
DOG=0;
}
}
/*********************初始化*******************************/
void init()
{
P1=0xff;
P2=0xff;
P3=0XF8;
pre_alarm_flag=0;
main_alarm_flag=0;
MUTE_AC_flag=0;
MUTE_DC_flag=0;
AC_count=0;
AC_flag=0;
MUTE_key_down=0;
AN1_rest=0;
mute_key_flag=0;
AN1_rest_flag=0;
AC_DC_num=0;
key_AC_DC_stime_ok=0;
alarm_num=0;
key_alarm_stime_ok=0;
m=0;
n=0;
i=0;
key=0;
keybuf=0;
tcount=0;
second=0;
min=0;
TMOD=0X11; //T0,T1都选择方式1;
TH0=0X0D8; //10MS
TL0=0X0F0;
TH1=0X0F8; //2MS
TL1=0X30;
IP=0X08; /* set high priority for timer 1 */
ET0=1; /* enable timer 0 interrupt */
ET1=1; /* enable timer 1 interrupt */
TR0=1; /* start timer 0 */
TR1=1; /* start timer 1 */
EA=1; /* enable interrupts */
}
/************************交流直流检查**************************/
void AC_DC_check()
{
uchar k;
if(AC_flag==1)
{
AC_flag=0;
if(MUTE_AC_flag==0)
{
P2_0=1;
P3_2=1;
P3_3=0;
P2_2=0;
delay(100);
P2_2=1;
P3_3=1;
DC_check();
if(key_AC_DC_stime_ok)
{
key_AC_DC_stime_ok=0;
if(read_key(P1_6))
{
P2_2=0;
P3_3=1;
MUTE_AC_flag=1;
}
}
}
else
{
P2_0=1;
P3_2=1;
P2_2=0;
P3_3=1;
}
}
delay(6); /*****同步-交流P10*****/
if(AC_flag==0)
{
P2_0=0;
P3_2=0;
P3_3=1;
P2_2=1;
DC_check();
MUTE_AC_flag=0;
}
}
/**********************直流检测**************************/
DC_check()
{
uchar l;
if(P1_1==0)
{
MUTE_DC_flag=0;
delay(1);
if(P1_1==0)
{
P2_1=0;
}
}
else if(MUTE_DC_flag==0)
{
P2_1=1;
P3_2=1;
P3_3=0;
P2_2=0;
delay(100);
P2_2=1;
P3_3=1;
if(key_AC_DC_stime_ok)
{
key_AC_DC_stime_ok=0;
if(read_key(P1_6))
{
P2_2=0;
P3_3=1;
MUTE_DC_flag=1;
}
}
}
else
{
P2_2=0;
P3_3=1;
P2_1=1;
P3_2=1;
}
}
/*****************直接报警************************/
void directness_alarm()
{
if(P1_2==0)
{
delay(1);
if(P1_2==0)
{
do
{
P3_0=1;
P3_1=1;
P2_5=0;
P2_6=0;
P3_3=0;
}while(P1_3==1); /*复位键闭合跳出*/
P2_4=0;
delay(80);
P2_4=1;
}
}
P3_0=0;
P3_1=0;
P3_3=1;
P2_5=1;
P2_6=1;
}
//###############################################
void main2()
{
while(P1_4==0)
{
P2_3=0;
alarm();
main1();
}
P2_3=1;
}
//###############################################
main1()
{
AC_DC_check();
directness_alarm();
}
//###############################################
// main主函数
//###############################################
void main()
{
init();
while(1)
{
main1();
keybuf=keyback();
timechooseled();
main2();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -