📄 386.c
字号:
if(Check_bit==1) //如果出错,从新启动总线
goto startWrite;
STOP24C02(); //执行完后,scl=0,sda=1
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//--------------------------------------主程序开始--------------------------------------//
//
//
//
//
//
//
//
//--------------------------------------------------------------------------------------//
void main(void)
{
/* 定义一些标志变量和中转存储变量 */
Begin: _nop_();
FLAG_ZJ=0; //是否处于摘机状态标志
FLAG_BJ=0; //初始状态报警标志=0,不报警
FLAG_BF=0; //初始状态布防标志=0,不布防
j=0;
Time_DU=0;
FLAG_BB=0;
FLAG_366=0;
JISHUMORE=0; //借用来记录1.5分钟延时
/* 对片内数据存储器128字节SFR中的21字节共18个特殊功能寄存器初始化 */
//SP=2FH;//51复位后SP=07H,改令堆栈从片内RAM中的数据缓冲区首址30H开始存放数据
//DPL= //数据指针低字节不初始化
//DPH= //数据指针高字节不初始化
//TCON=0;复位后令定时器/计数器0,1以及2个外部中断不工作,并清中断标志
//TMOD=0;定时器/计数器工作方式
//TL0=0; 定时器/计数器0低字节
//TL1=0;
//TH0=0;
//TH1=0;
//PCON= 电源控制
//SCON= 串行口控制寄存器
//SBUF= 串行数据缓冲器
//IE=0; 复位后中断控制系统禁止工作
//IP= 中断优先级控制器
//T2CON=0;//定时器/计数器2
//PSW=0; 程序状态字,复位后单片机选择工作寄存器0组
//A=0; //累加器清零
//B=0; //B寄存器清零
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
LS164_CP=0; //不给时钟信号
LS164_AB=0; //7段全不点亮
//MT8880_CP2=1; //给8880系统时钟信号
LOCK_JS=0;
FLASH_DY=0;
FLAG_COMMOND=0;
MT8880_ControlRegister_Initialize();
LED_DISPLAY();
FLAG_LOCK=Read24C02_139();
FLAG_FIRST=Read24C02_FIRST();
DY=0; //点亮电源灯
if(FLAG_FIRST!=138)
{
initinize1();
initinize2();
initinize3();
initinize4();
initinize5();
initinize6();
initinize7_0();
initinize7_1();
initinize7_2();
initinize7_3();
initinize7_4();
initinize8_0();
initinize8_1();
Write24C02_FIRST();
}
while(1)
{
CIRCLE: if(FLAG_LOCK==139)
{
goto LOCK;
}
if(FLAG_BF_YS!=1)
{
if(FLASH_DY!=255)
{FLASH_DY=FLASH_DY+1;}
else
{FLASH_DY=0;
if(DY==0)DY=1;
else
DY=0;
}
}
else
{
// if(FLASH_DY!=1)
// {FLASH_DY=FLASH_DY+1;}
// else
// {
//FLASH_DY=0;
if(DY==0)DY=1;
else
DY=0;
// }
}
if(ISD1420_REC_ZJ==0) /////测试
{
Make_Program();
if(FLAG_BF==1)LED_DRIVER(0,0,1,0,0,0,0,0);
}
if(HX2272_VT==1) /////处理遥控器输入
{
if(HX2272_D0==1){ //撤防 D0=1;
LED_DRIVER(0,0,0,0,0,0,0,0); //令所有数码管和BF灯灭
FLAG_BF=0; //清布防标志
FLAG_BF_YS=0;
KD9561_START=1; //清报警状态留下的内容
KD9561_START=0; //驱动发短声
DELAY_20ms();
DELAY_025ms(60);
KD9561_START=1;
}
if(HX2272_D1==1){ //紧急按钮 D1=1;
FLAG_BJ=1; //置报警标志
FLAG_COMMOND=0;
FLAG_BF_YS=0;
goto BeginBJ;
}
if(HX2272_D3==1){ //布防 D3=1;
LED_DRIVER(0,0,1,0,0,0,0,0); //打开BF布防灯
FLAG_BF_YS=1; //置布防延时标志
KD9561_START=0; //驱动发短声
DELAY_20ms();
DELAY_025ms(60);
KD9561_START=1;
}
}
if(FLAG_BF_YS==1)
{
JISHUMORE=JISHUMORE+1;
DELAY_50ms();
if(JISHUMORE>=500)
{FLAG_BF=1;FLAG_BF_YS=0;}
}
if(FQ4_NC_IN==1) /////检查有无紧急按钮报警信号,处理报警标志
{
FLAG_BJ=1;
FLAG_COMMOND=0;
goto BeginBJ;
}
if(FQ123_NC_IN==1) /////检查有无非紧急按钮外部报警信号,处理报警标志
{
if(FLAG_BF==1)
{
FLAG_BJ=1;
FLAG_COMMOND=1;
}
}
if(LINE_ALARM==1) /////外线故障,启动现场报警
{
KD9561_START=0;
//DELAY(5);
BJ=0; //点亮报警灯
}
else{
KD9561_START=1;
BJ=1;
}
if(ToneTest==0) //检测到铃流脉冲低周期,检查是否在设定铃流数内没有用户摘机。如果是,进入异地电话控制主机状态
{
DELAY_025ms(20);
if(ToneTest==0)
{
READARRAY=Read24C02_Array(8); //读振铃次数
if(READARRAY.Number24[2]==0)READARRAY.Number24[2]=5;
ToneTime_XUNHUAN3=(READARRAY.Number24[2]-1)*25;
DELAY(ToneTime_XUNHUAN3);
FLAG_YHZJ=0;
for(jj=1;jj<=50;jj++)
{
for(j=1;j<=200;j++)
{
if(ToneTest==0)
{FLAG_YHZJ=1;break;}
DELAY_025ms(1);
}
if(FLAG_YHZJ==1)break;
}
if(FLAG_YHZJ==1)
{
//DELAY(3);
J_LineToPhone=0; //模拟摘机
for(Time_DU=0;Time_DU<600;Time_DU++)
{
if(Sound_Du==1)
{Sound_Du=0;DELAY_025ms(1);}
else {Sound_Du=1;DELAY_025ms(1);}
}
Sound_Du=1;
Remote_Program();
}
}
}
BeginBJ:
if(FLAG_BJ==1)
{
ToneTime_XUNHUAN3=1;
KD9561_START=0; //输出报警声
MT8880_ControlRegister_Write(); //令8880处于输出,BURST,双音状态
for(ToneTime_XUNHUAN3=1;ToneTime_XUNHUAN3<=3;ToneTime_XUNHUAN3++) //3次循环
{
for(j=1;j<=6;j++) //1次循环处理6个电话号码
{
if(HX2272_VT==1) //
{
if(HX2272_D0==1)
{
LED_DRIVER(0,0,0,0,0,0,0,0); //令所有数码管和BF灯灭
FLAG_BF=0; //清布防标志
FLAG_BF_YS=0;
BJ=1;
KD9561_START=1;
FLAG_BJ=0;
J_LineToPhone=1;
goto CIRCLE;
}
}
OneForSix: _nop_();
READARRAY=Read24C02_Array(j);
BJ=0; //点亮报警灯,同时输出一个控制
J_LineToPhone=0; //首先切断本地电话和外线的联系,同时模拟摘机
DELAY(2);
if(READARRAY.Number24[1]!=0) //一个电话号码一次拨号处理开始
{
if(HX2272_VT==1)
{
if(HX2272_D0==1)
{
LED_DRIVER(0,0,0,0,0,0,0,0); //令所有数码管和BF灯灭
FLAG_BF=0; //清布防标志
FLAG_BF_YS=0;
BJ=1;
J_LineToPhone=1;
FLAG_BJ=0;
KD9561_START=1;
goto CIRCLE;
}
}
//开始双音多频拨号
for(k=0;k<READARRAY.Number24[1];k++) //组的序号放在[0]位置,组成员个数放在[1]位置;先一次性把一个电话号码拨完
{
if(READARRAY.Number24[k+2]==12) //遇到#,等待366发来握手信号,设置示例: 1**811#12322** 即12栋3单元22号,2个*号占位,注意结束不要用#号占位
{
FLAG_366=1; //设置向366报警的标志为置位
if(FLAG_COMMOND==0) //判断处理是紧急报警还是一般报警
{READARRAY.Number24[k+8]=1;}
if(FLAG_COMMOND==1)
{READARRAY.Number24[k+8]=10;}
JISHUMORE=0;
for(JISHUMORE=0;JISHUMORE<16000;JISHUMORE++)
{
MT8880_StatusRegister_READ(); //等待366发来握手信息
if(MT8880_D2==1) //是否有键值生成
{
MT8880_CP2=0; //停动8880总线
MT8880_CS=1; //停动8880总线
_nop_();
MT8880_DataRegister_READ(); //读入的一个值出现在MT8880_D0-D3
if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1) //判断握手信息是否为"*"
{
MT8880_CP2=0; //停动8880总线
MT8880_CS=1; //停动8880总线
LED_DRIVER(1,0,0,1,1,1,0,1); //显示"b"表示收到366发来握手信号"*"
JISHUMORE=0;
DELAY_50ms();//因为366发送2次握手信号,如果收到的是第1次发的,这为等待第二次握手信号错过的措施
goto handsakeOK;
}
}
else
{
MT8880_CP2=0; //停动8880总线
MT8880_CS=1; //停动8880总线
}
}//循环等待检测366发送的握手信号的反括号
handsakeOK: _nop_();
} //"遇到#,等待366发来握手信号"的反括号
else //如果存储的不是'#'或者已经跳过了'#',则发送双音多频信号
{
MT8880_WriteOne(READARRAY.Number24[k+2]);
if(READARRAY.Number24[k+2]==11) //首位遇到*,即播打内线时,延时200ms
{
DELAY_50ms();DELAY_50ms();DELAY_50ms();DELAY_50ms();
}
DELAY_50ms();
}
}//处理一个电话拨打结束
for(k=0;k<READARRAY.Number24[1];k++) //显示拨出的号码
{
if(HX2272_VT==1) //
{
if(HX2272_D0==1)
{
LED_DRIVER(0,0,0,0,0,0,0,0);//令所有数码管和BF灯灭
FLAG_BF=0; //清布防标志
FLAG_BF_YS=0;
BJ=1;
J_LineToPhone=1;
FLAG_BJ=0;
KD9561_START=1;
goto CIRCLE;
}
}
switch(READARRAY.Number24[k+2])
{
case 1: LED_DRIVER(0,0,0,0,0,1,1,0); //显示“1”
DELAY(1);break;
case 2: LED_DRIVER(1,1,0,1,1,0,1,0); //显示“2”
DELAY(1);break;
case 3: LED_DRIVER(1,1,0,0,1,1,1,0); //显示“3”
DELAY(1);break;
case 4: LED_DRIVER(1,0,0,0,0,1,1,1); //显示“4”
DELAY(1);break;
case 5: LED_DRIVER(1,1,0,0,1,1,0,1); //显示“5”
DELAY(1);break;
case 6: LED_DRIVER(1,1,0,1,1,1,0,1); //显示“6”
DELAY(1);break;
case 7: LED_DRIVER(0,1,0,0,0,1,1,0); //显示“7”
DELAY(1);break;
case 8: LED_DRIVER(1,1,0,1,1,1,1,1); //显示“8”
DELAY(1);break;
case 9: LED_DRIVER(1,1,0,0,1,1,1,1); //显示“9”
DELAY(1);break;
case 10: LED_DRIVER(0,1,0,1,1,1,1,1); //显示“0”
DELAY(1);break;
case 11: LED_DRIVER(1,0,0,1,1,1,0,1); //显示“*”="b"
DELAY(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -