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

📄 lcm16864zk.c

📁 一个基于51单片机的报警系统。包含有电路图
💻 C
📖 第 1 页 / 共 4 页
字号:
       if(k==0x01)
       {
        k=0x31;
        }
       else if((k&0x0f)==0)
       {
        k=k-0x10;
        k=k+0x09;
       }
       else {k--;}
       WritCommand(0x10);
       ShowK(k);
      }
     }

 }
}
void CalenSet4(void)                    //设置时
{
 uchar k=0;

 ShowK(k);
 while(1)
 {

   if(LKEY==0)
   {
    Delay_ms(10);
    if(LKEY==0)
    {
     while(1){if(LKEY==1)break;}
     calen[2]=k;                                              //时
     }
     break;
    }
    if(MKEY==0)                            //0~23循环显示
    {
     Delay_ms(10);
     if(MKEY==0)
      {
       while(1){if(MKEY==1)break;}
       if(k==0x23)
       {
        k=0x00;
        }
       else if((k&0x0f)==9)
       {
        k=k&0xf0;
        k=k+0x10;
       }
       else {k++;}
       WritCommand(0x10);
       ShowK(k);
       }
      }
     if(RKEY==0)                    //移动到下一位显示
     {
      Delay_ms(10);
      if(RKEY==0)
      {
       while(1){if(RKEY==1)break;}
       if(k==0x00)
       {
        k=0x23;
        }
       else if((k&0x0f)==0)
       {
        k=k-0x10;
        k=k+0x09;
       }
       else {k--;}
       WritCommand(0x10);
       ShowK(k);
      }
     }

 }
}
uchar CalenSet5(void)                          //设置分
{
   uchar k=0;
   ShowK(k);
 while(1)
 {

   if(LKEY==0)
   {
    Delay_ms(10);
    if(LKEY==0)                                //确定
    {
     while(1){if(LKEY==1)break;}
     return k;
     }
     break;
    }
    if(MKEY==0)
    {
     Delay_ms(10);
     if(MKEY==0)
      {
       while(1){if(MKEY==1)break;}          //0~59循环显示
       if(k==0x59)
       {
        k=0x00;
        }
       else if((k&0x0f)==9)
       {
        k=k&0xf0;
        k=k+0x10;
       }
       else {k++;}
       WritCommand(0x10);
       ShowK(k);
       }
      }
      if(RKEY==0)
     {                                    //移动到下一位设定
      Delay_ms(10);
      if(RKEY==0)
      {
       while(1){if(RKEY==1)break;}
       if(k==0x00)
       {
        k=0x59;
        }
       else if((k&0x0f)==0)
       {
        k=k-0x10;
        k=k+0x09;
       }
       else {k--;}
       WritCommand(0x10);
       ShowK(k);
      }
     }
 }
}
void ShowK(uchar num)
{                                   //  把十进制数num转换成BCD码显示
 uchar i;
 i=num&0xf0;
 i=i>>4;
 WritData(0x30+i);
 i=num&0x0f;
 WritData(0x30+i);

}
//////////////////////////////////////////////////////////打印程序
//////////////////////////////////////////////////////////
void FuncControl(void)
{
 ShowPart18();           //报警记录打印
 ShowPart5();            //进入  另选
 while(1)
 {
  if(LKEY==0)
    {
      Delay_ms(10);
      if(LKEY==0)
      {
       while(1){if(LKEY==1)break;}
       Print1();
      }
     break;
    }
  if(RKEY==0)
    {
      Delay_ms(10);
      if(RKEY==0)
      {
       while(1){if(RKEY==1)break;}
      }
      break;
    }
  }
}

void Print1(void)
{
 ShowPart19();          //全部打印
 ShowPart5();
 PrintInitial();
 while(1)
 {
  if(LKEY==0)
    {
      Delay_ms(10);
      if(LKEY==0)
      {
       while(1){if(LKEY==1)break;}
       ShowPart20();
       Print2();                  //进入全部打印
      }
      break;
    }
  if(RKEY==0)
   {
    Delay_ms(10);
    if(RKEY==0)
    {
     while(1){if(RKEY==1)break;}
   //  Print3();
    }
    break;
   }
 }
}
void PrintInitial(void)
{
 PrintByte(0x1b);PrintByte(0x40);PrintByte(0x1b);PrintByte(0x44);  //打印初始化
 PrintByte(0x02);PrintByte(0x05);PrintByte(0x07);PrintByte(0x09);  //设置打印方式为水平制表
 PrintByte(0x0b);PrintByte(0x0d);PrintByte(0x0f);PrintByte(0x13);PrintByte(0x00);
 PrintByte(0x09);
}
void Print2(void)                //全部打印
{
 uchar i,j;
 pdx=0x0400;
 i=*pdx;
 if(i==0) {ShowPart21(); Delay_s(1); }
 else
 {
  j=i-1;
  i=0;
 for(;j>=0;j--)
  {
    print[i]=i;i++;                     //确定打印那些报警记录 把要打印的记录号存在print[]中
  }
  Print(*pdx);
 }
}
void Print(uchar num)                    //打印记录函数 打印的顺序存在数组
{                                        //print[]中 num为需要打印的记录数
 uchar i=0,j,k;
 for(j=1;j<=num;j++,i++)
  {
                   //打印编号
    PrintWord(j);
    pdx=0x0401+11*(j-1);
    for(i=0;k<7;i++)                    //打印日期和属性码 1个编号
     {
       k=*pdx;
       PrintWord(k);
       pdx++;
     }
    pdx++;
    for(i=0;i<4;i++)              //打印复合报警的编号
    {
     if(*pdx==0x0f) break;
     else  PrintWord(*pdx);
    }
    PrintByte(0x0d);               //将BUFF中的数据打印
    PrintByte(0x0a);               //换行
   }
}
 /*
void PrintNum(uchar num)                     //按编号打印 编号为num
{
 uchar i,j=0;
 pdx=0x0400;
 i=*pdx;
 if(i==0) {ShowPart21(); Delay_s(1); }
 else
 {
  for(;i-1>=0;i--)
   {
    pdx=0x0407+i*8;
    if(num==*pdx)
     {print[j]=i;j++;}
   }
 }

Print(j+1);
}

  */
 void PrintWord(uchar k)
 {
  uchar i;
  i=k&0xf0;
  i=i>>4;
  i=i+0x30;
  PrintByte(i);
  i=k&0x0f;
  i=i+0x30;
  PrintByte(i);
 }

 void PrintByte(uchar udata)   //打印一个字节的信息
{
 while(BUSY==1) ;
 PRINTBYTE=udata;


}

//////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////报警处理处理

void sever_int1() interrupt 2 using 3
{
 EA=0;
/* P0=0XFF;
 P2=0X5F;
 _RD=0;
 ACC=P0;
 P2=0X4F;
 _RD=1;   */
 ACC=WARNBYTE;               //从PT2272接收数据WARNBYTE给ACC
 ACC=ACC&0X0F;
 status=ACC;
 flag=1;
 EA=1;
}

void WarnDeal(void)
{
 uchar j;
 if(status<8)
 {

   pdx=0x0100;       //已存向量数给j          X0100存着已发生的抢劫报警的次数
   j=*pdx;
   pdx=0x0104;         //每次发生抢劫后生成的向量从0X0104存起
   for(;j>0;j--)
   {
    if(*pdx==status)
     {
      AlarmNum[RobNum]=*pdx;       // 记录发生报警的报警器编号
            //   WarnNum=*pdx;    //记录发生报警的报警器编号
      pdx=pdx+2;
      if(*pdx==1){RobNum=0;AlarmNum[RobNum-1]=0x0f; break;}
      else {RobNum--; break;}
     }
     pdx=pdx+4;
   }
   if(RobNum==0) RobWarn();
   }
   if(status==8)
   {
   WritCommand(0x01);
   WritCommand(0x90);                               //显示盗窃
   WritData(0xb5);WritData(0xc1);
   WritData(0xc7);WritData(0xd4);
   Delay_s(2);
   send(0x02);                          //发生盗窃传输02
   StealDeal();
   }
   if(status==10)
   {
    WritCommand(0x01);
    WritCommand(0x90);                                //显示火警
    WritData(0xbb);WritData(0xf0);
    WritData(0xbe);WritData(0xaf);
    Delay_s(2);
    send(0x03);                        //发生火警传输03
    FireDeal();
    }
}

void RobWarn(void)
{
   WritCommand(0x01);
   WritCommand(0x90);                                //显示抢劫
   WritData(0xc7);WritData(0xc0);
   WritData(0xbd);WritData(0xd9);
   Delay_s(1);
   send(0x01);                                    //发生抢劫传输01
   RobDeal();                                     //抢劫处理函数
}
void StealDeal(void)                    //盗窃处理
{
 uchar i,j;
 uchar xdata * data pdx1;
 CalenWrit();                         //记录盗窃发生的时间
 pdx++;
 *pdx=0x02;
 pdx=0x0200;
 i=*pdx;
 pdx++;
 while(i>0)
 {
  pdx1=0x0202+i*2;
  j=*pdx1;
  if(status==j)
   {                                 //找到报警器的编号
   *pdx=j;break;
   }
   i--;
 }
}
void FireDeal(void)
{                                    //发生火警
 uchar i,j;
 uchar xdata * data pdx1;
 CalenWrit();                        //记录时间
 pdx++;
 *pdx=0x03;
 pdx++;
 pdx1=0x0300;
 i=*pdx1;
 while(i>=0)
 {
  pdx1=0x0302+i*2;
  j=*pdx1;
  if(status==j)
   {                                 //找到报警器编号
   *pdx=j;break;
   }
   i--;
 }
}                                    //防抢处理
void RobDeal(void)
{
 uchar i;
 uchar xdata * data pdx1;
 pdx1=0x103;
 RobNum=*pdx1;                     //恢复RobNum的值
 CalenWrit();                       //记录时间
  pdx++;
  *pdx=0x01;                        //记录报警的属性码
 pdx++;
 i=RobNum;
 while(i>=0)
 {
  if(AlarmNum[i]==0x0f)
  { break;}
  else
  {
   *pdx=AlarmNum[i];
  pdx++;
  AlarmNum[i]=0x0f;
  }
  i--;
  }
  for(i=0;i<5;i++)             //恢复数组的初始值0X0F
   AlarmNum[i]=0x0f;

}

void CalenWrit(void)             //记录时间的函数
{
 uchar i;                        //把时间存到CALEN[8]向量中
 pdx=0x0400;
 i=*pdx;
 (*pdx)++;
 pdx=0x0401+i*8;
 *pdx=calen[6];                  //年 月 日 时 分
 pdx++;
 *pdx=calen[4];
 pdx++;
 *pdx=calen[3];
 pdx++;
 *pdx=calen[2];
 pdx++;
 *pdx=calen[1];
}
 // ///////// //////////////////////////串口中断程序

void sever_es() interrupt 4 using 2
{
 EA=0;
 if(TI==0)
 {
 while(1){if(RI==1) break;}
 status=SBUF;
 flag1=1;
 }
 EA=1;
}

void send(uchar sdata)
{
  ES=0;
 SBUF=sdata;
 while (TI==0);
     TI=0;
        EA=1;
}

  //////////////////////////////////////////////////////////////////////
  //以下是用来设置报警电话的 程序 不需要就不用了
/*
void WarnTaleSet(void)
{
 while(1)
 {
 WritCommand(0x01);
 WritCommand(0x81);
 WritData(0xb1);WritData(0xa8);WritData(0xbe);WritData(0xaf);   //报警电话设置
 WritData(0xb5);WritData(0xe7);WritData(0xbb);WritData(0xb0);
 WritData(0xc9);WritData(0xe8);WritData(0xd6);WritData(0xc3);
 WritCommand(0x90);
 WritData(0xa2);WritData(0xb1);WritData(0xc9);WritData(0xe8);    //设置报警电话
 WritData(0xd6);WritData(0xc3);WritData(0xb1);WritData(0xa8);
 WritData(0xbe);WritData(0xaf);WritData(0xb5);WritData(0xe7);
 WritData(0xbb);WritData(0xb0);
 WritCommand(0x88);
 WritData(0xa2);WritData(0xb2);WritData(0xc9);WritData(0xe8);    //设置语音芯片
 WritData(0xd6);WritData(0xc3);WritData(0xd3);WritData(0xef);
 WritData(0xd2);WritData(0xfa);WritData(0xd0);WritData(0xbe);
 WritData(0xb6);WritData(0xac);
 WritCommand(0x98);
 WritData(0xa2);WritData(0xb3);WritData(0xb4);WritData(0xe6);     //存储号码查询
 WritData(0xb4);WritData(0xa2);WritData(0xba);WritData(0xc5);
 WritData(0xcc);WritData(0xeb);WritData(0xb2);WritData(0xe9);
 WritData(0xd1);WritData(0xaf);
 if(flag1)
 {
  flag1=0;
  if(status==1)
   {
    WarnTelephone();
   }
  if(status==2)
   {
 //   ChipSet();
   }
   if(status==3)
    {
  //   CheckNum();
    }
   if(status==0x0f)
    {
     break;
    }
  }
  Delay_ms(100);
 }
}

void WarnTelephone(void)
{
 while(1)
 {
 WritCommand(0x01);
 WritCommand(0x90);
 WritData(0xa2);WritData(0xb1);WritData(0xc9);WritData(0xe8);      //1.设置火警电话
 WritData(0xd6);WritData(0xc3);WritData(0xbb);WritData(0xf0);
 WritData(0xbe);WritData(0xaf);WritData(0xb5);WritData(0xe7);
 WritData(0xbb);WritData(0xb0);
 WritCommand(0x88);
 WritData(0xa2);WritData(0xb2);WritData(0xc9);WritData(0xe8);     //2.设置盗警电话
 WritData(0xd6);WritData(0xc3);WritData(0xb5);WritData(0xc1);
 WritData(0xbe);WritData(0xaf);WritData(0xb5);WritData(0xe7);
 WritData(0xbb);WritData(0xb0);
 WritCommand(0x98);                                               //3.设备备用
 WritData(0xa2);WritData(0xb3);WritData(0xc9);WritData(0xe8);
 WritData(0xb1);WritData(0xb8);WritData(0xb1);WritData(0xb8);
 WritData(0xd3);WritData(0xc3);

  if(flag1)
  {
   flag1=0;
   if(status==1)
    {
     FireTele();
     WarnTelephone();
    }
   if(status==2)
   {

    StealTele();
    WarnTelephone();
   }
   if(status==3)
   {

    SpareTele();
    WarnTelephone();
   }
   if(status==0x0f) break;

   }
   Delay_ms(100);
  }
}

void FireTele(void)
{
 uchar j;
 while(1)
 {
 WritCommand(0x01);
 WritCommand(0x91);
 WritData(0xc9);WritData(0xe8);WritData(0xd6);WritData(0xc3);         //设置火警电话
 WritData(0xbb);WritData(0xf0);WritData(0xbe);WritData(0xaf);
 WritData(0xba);WritData(0xc5);WritData(0xc2);WritData(0xeb);

  if(flag1==1)
   {
    flag1=0;
    j=status;
    if(status==0x0f)
    {
     break;
    }
    else
    {
     WritData(0xa3);
     WritData(0xb0+j);         //显示下个数
    }
   }
   Delay_ms(100);
  }
}
void StealTele(void)
{

}
void SpareTele(void)
{

}   */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -