📄 cjd-1.c
字号:
/*******************************************************************************************************
海警舰灭火控制箱声音程序
------------------------------------------------------------------------------------------------------*/
#include <reg51.h>
#include<stdio.h>
#define Uchar unsigned char
#define Uint unsigned int
sfr WDTD = 0x85;
sfr WDTC = 0xC0;
/* 管脚定义 */
sbit SND=P2^3;
sbit pw=P2^4; //电源控制
//信号输入
sbit s_sd =P0^5; //试灯
sbit s_xy =P0^4; //消音
sbit s_zd =P0^7; //主电
sbit s_xl =P0^6; //泄漏
//指示灯输出
sbit l_zd =P3^3; //主电失电指示灯
sbit l_xl =P3^4; //泄漏指示灯
bit zd_diss;
bit xl_diss;
bit xl;
bit zd;
bit flash;
//单路发出
sbit s4=P0^1; //连续急调音 优先级1
sbit s2=P0^0; //单音断鸣 优先级2
sbit s3=P0^3; //连续调频 优先级3
sbit s1=P0^2; //快速双音调 优先级4
bit diss;
unsigned int data t;
unsigned char state;
void warn1(void);/* 连续急调音*/
void warn2(void);/* 单音断鸣调*/
void warn3(void);/* 连续调频音*/
void warn4(void);/* 快速双音调*/
void delay1(unsigned int);
void watchdog() //喂狗子程序
{
WDTD=0x80; //看门狗装入重装载值//
WDTC = WDTC|0x02; //执行装载指令
}
void main(void)
{
SP=0x60;
TMOD=0x11;
ET0=1; EA=1;ET1=1;
TR0=0;TR1=1;
WDTD=0x80; //装入重装载值
WDTC=0x09; //启动看门狗定时器,使能看门狗定时器复位
while(1)
{ watchdog();
switch(state)
{
case 0:
if(!s4){state=4;TH0=0xfd;TL0=0x8f;TR0=1;} /* 快速双音调*/
if(!s3){state=3;TH0=0xfb;TL0=0x1e;t=0xfb1e;TR0=1;} /* 连续调频音*/
if(!s2){state=2;TH0=0xfd;TL0=0x8f;t=0xfd8f;TR0=1;} /* 单音断鸣调 */
if((!s1&!diss)|(zd&!zd_diss)|(xl&!xl_diss)){state=1;TH0=0xfd;TL0=0x8f;t=0xfd8f;TR0=1;} /* 连续急调音*/
if(state!=0)
pw=0;
else
pw=1;
break;
case 1:
warn1();
if((s1|diss)&(!zd|zd_diss)&(!xl|xl_diss)) {state=0;TR0=0;}
break;
case 2:
warn2();
if((s2)|(!s1)){state=0;TR0=0;}
break;
case 3:
warn3();
if((s3)|(!s2)|(!s1)){state=0;TR0=0;}
break;
case 4:
warn4();
if((s4)|(!s3)|(!s2)|(!s1)) {state=0;TR0=0;}
break;
default:
TR0 = 0;
break;
}
}
}
void warn1(void) /* 连续急调音*/
{
unsigned char data k;
unsigned int data f;
f=800;
for(k=0;k<50;k++)
{
delay1(250);
f+=4;
t=-(1000000/(4*f));
}
for(k=0;k<50;k++)
{
delay1(250);
f-=4;
t=-(1000000/(4*f));
}
}
void warn2(void) /* 单音断鸣调 火警*/
{ unsigned char data k;
unsigned int data f;
f=200;
for(k=0;k<50&s1&(!s2);k++)
{
TR0=1;
delay1(350);
t=-(1000000/(4*f));
}
for(k=0;k<50&s1&(!s2);k++)
{
delay1(350);
TR0=0;
}
}
void warn3(void) /* 连续调频音 CO2报警*/
{ unsigned char data k;
unsigned int data f;
f=200;
for(k=0;k<100&s1&s2&(!s3);k++)
{
delay1(350);
f+=4;
t=-(1000000/(4*f));
}
for(k=0;k<100&&s1&s2&(!s3);k++)
{
delay1(1050);
f-=4;
t=-(1000000/(4*f));
}
}
void warn4(void) /* 快速双音调 GAS*/
{ unsigned char data k;
unsigned int data f;
f=800;
for(k=0;k<50&s1&s2&s3&(!s4);k++)
{
delay1(220);
t=-(1000000/(4*f));
}
f=1000;
for(k=0;k<50&s1&s2&s3&(!s4);k++)
{
delay1(220);
t=-(1000000/(4*f));
}
}
void intt0(void) interrupt 1
{
SND=~SND;
TH0=t/256;
TL0=t%256;
}
void intt1(void) interrupt 3
{ static unsigned char m1,m2,m3,m4;
m1++;
if(m1==7)
{flash=~flash;m1=0;}
watchdog();
if(s_zd) //主电失电
{
m2++;
if(m2>5)
{zd=1;m2=6;}
}
else
{m2=0;zd_diss=0;zd=0;}
l_zd=!zd|flash&!zd_diss;
if(!s_xl) //泄漏故障
{
m3++;
if(m3>5)
{m3=6;xl=1;}
}
else
{m3=0;}
l_xl=!xl|(!xl_diss&flash); //泄漏指示灯
if(!s_xy) //消音
{
zd_diss=zd;
xl_diss=xl;
diss=!s1;
m4++;
if((m4>6)&xl) //泄漏复位
{xl=0;m4=0;}
}
else
m4=0;
if(s1) diss=0; //单路CPU故障消音
if(!s_sd)
{l_xl=0;
l_zd=0;}
}
void delay1(unsigned int time1)
{ unsigned int data i;
for (i=0;i<time1;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -