⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 386.c

📁 C开发的报警程序
💻 C
📖 第 1 页 / 共 5 页
字号:
       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 + -