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

📄 lcm16864zk.c

📁 一个基于51单片机的报警系统。包含有电路图
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <absacc.h>
#include <reg51.h>
#include "main.h"

#define WARNBYTE XBYTE[0x5FFF]         //射频报警地址
                 //#define XBYTE((char * )0x10000L)



void main(void)
{
	SP=0x30;
        IE=0X95;
        IT1=0;
      //  Delay_s(1);
        Delay_ms(2);
	SystemInitial(); 	//系统初始化
        while(1)
		{
                        //WritCommand(0x0e);
			Delay_ms(10);	//显示初始画面
                        ShowTime();
                        if(LKEY==0)
                        {
                         Delay_ms(10);
                         if(LKEY==0)
                         {
                          while(1){if(LKEY==1)break;}
                         ShScreen1();
                         DisplayInitial();

                          }
                         }

                         if(flag)
                         {
                           flag=0;
                           WarnDeal();
                           Delay_s(3);
                           DisplayInitial();
                         }

                         if(flag1)
                          {
                           flag1=0;
                          if(status==0x0f)
                           {
                            WarnTaleSet();
                           }
                          }

                }
}

void SystemInitial(void)		// 系统初始化程序
{
	uchar i;
        P3=0XFF;                          //P1,P3口的第二的功能先输出1
	for(i=0;i<=3;i++)
             CodeNum[i]=0;
        pdx=0x0100;             //防抢设置向量地址
        *pdx=0x00;              //   向量数目
        pdx=0x0200;             //防盗设置向量首地址
        *pdx=0x00;
        pdx=0x0300;             //放火设置向量首地址
        *pdx=0x00;
        pdx=0x0400;             //报警发生存储向量首地址
        *pdx=0x00;

        CalendarInitial(calen);
        BurstR1302(calen);
	ShowInitial();			//显示模块初始化
	DisplayInitial();		//显示初始画面
}

void ShowInitial(void)	//显示初始化
{
        P2=0X1F;
	Delay_ms(22);	//delay > 40ms
	               	//i=00110000B;
	WritCommand(0x30);	//function set
	Delay_us(6);	//delay > 100us

	WritCommand(0x30);	//function set
	Delay_us(3);	//delay > 37us

	WritCommand(0x0c);	  //display set D=1 C=1 B=0
	Delay_us(6);           //>100us


	WritCommand(0x01);	  //display clear
	Delay_ms(7);          //>10ms

			   //i=00000110B
	WritCommand(0x06); //enter nod set
        P2=0X0F;

}

/////////////////////////////////////////////////////

void Delay_us(uchar i)	//delay 8 * i us
{
	uchar j;
	for(j=0;j<i;j++);
}

void Delay_ms(uchar i)	// delay i * 1000 us=i  ms
{
	uchar sum=125,j,k;
	for(j=0;j<i;j++)
		for(k=0;k<sum;k++);
}

void Delay_s(uchar i)
{
   uint sum=125000,k;
   uchar j;
   for(j=0;j<i;j++)
     for(k=0;k<sum;k++);

}

///////////////////////////////////////////////////////

void WritCommand(uchar i)	//写命令
{
        P2=0X1F;
        Waitfree();
        S_RS=0;
	S_RW=0;
        E=1;         //E=1
	P0 = i;
        _WR=0;
	E=0;         //E=0
        _WR=1;
        P2=0X0F;
}
//////////////////////////////////////////////////////////

///////////////////////////////////////////////////////

void WritData(uchar i)	//写数据
{
        P2=0X1F;
        Waitfree();
	S_RS=1;
	S_RW=0;
        E=1;          //E=1
	P0=i;
        _WR=0;
	E=0;
        _WR=1;
        P2=0X0F;
}

//////////////////////////////////////////////////////////

void DisplayInitial(void)
{
        WritCommand(0x01);	                         //显示初始画面
        WritCommand(0x91);
        WritData(0xBC);WritData(0xAF);WritData(0xB3);WritData(0xc9);  //集成警务系统
        WritData(0xbe);WritData(0xaf);WritData(0xce);WritData(0xf1);
        WritData(0xcf);WritData(0xb5);WritData(0xcd);WritData(0xb3);
        WritCommand(0x98);
        WritData(0xc3);WritData(0xdc);WritData(0xc2);WritData(0xeb);    //密码门
        WritData(0xc3);WritData(0xc5);
        WritCommand(0x89);
        WritData(0xcf);WritData(0xe6);WritData(0xcc);WritData(0xb6);     //湘潭大学研制
        WritData(0xb4);WritData(0xf3);WritData(0xd1);WritData(0xa7);
        WritData(0xd1);WritData(0xd0);WritData(0xd6);WritData(0xc6);
}

/////////////////////////////////////////////////////////////

void Waitfree(void)
{
 P0=0XFF;
  S_RS=0;
  S_RW=1;
  _RD=0;
  ACC=P0;
 while(ACC7==1)
 {
  _RD=0;
  P2=0X1F;
  E=1;
  ACC=P0;
  E=0;
  }
  _RD=1;
  S_RS=0;
  S_RW=0;
}

/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////日历程序

void CalendarInitial(pcalen)//日历初始化程序
uchar pcalen[8];
{
	uchar i;
	BurstW1302(pcalen);		//读日历,并送到pcalen[]中
	i=Read1302(0x80);
	i=i&0x7f;				//ch=0
	Writ1302(0x80,i);	//起震,
}


void BurstR1302(pcalen)		// 从1302读多字节,并存入日历数组中
uchar pcalen[8];
{
	uchar i;
	T_RST=0;
	T_CLK=0;
	T_RST=1;
	RTInputByte(0xbf);		//oxbf 时钟多字节读命令
	for(i=0; i<8; i++)
		{
			*pcalen=RTOutputByte();	//读1BYTE的数据
			pcalen++ ;
		}
	T_CLK=1;
	T_RST=0;
}

////////////////////////////////////////////////////////

void RTInputByte(udata)		//to1302写入一字节的数据
uchar udata;
{
	uchar i;
	ACC=udata;
	for(i=8;i>0;i--)
	{
		T_IO=ACC0;
		T_CLK=1;
		T_CLK=0;
		ACC=ACC>>1;
	}
}

/////////////////////////////////////////////////////
uchar RTOutputByte(void)		//从1302读一字节的数据
{
	uchar i;
	for(i=8;i>0;i--)
	{
                ACC=ACC>>1;
		ACC7=T_IO;
                T_CLK=1;
                T_CLK=0;

	}
	return(ACC);
}

//////////////////////////////////////////////////////

void Writ1302(uchar uAddr,uchar udata)	//写1字节的数据入指定地址
{

	T_RST=0;
	T_CLK=0;
	T_RST=1;
	RTInputByte(uAddr);	//先输入地址
	RTInputByte(udata);	//写数据
	T_CLK=1;
	T_RST=0;
}

//////////////////////////////////////////////////////

uchar Read1302(uchar uAddr)	//从指定地址读出1字节数据
{
	uchar udata;
	T_RST=0;
	T_CLK=0;
	T_RST=1;
	RTInputByte(uAddr);	//写入地址
	udata=RTOutputByte();	//读出数据
	T_CLK=1;
	T_RST=0;
	return(udata);
}

/////////////////////////////////////////////////////

void BurstW1302(pcalen)	//写入多字节的数据
uchar pcalen[8];
{
	uchar i;
 	Writ1302(0x8e,0x00);  //WP=0,写操作
	T_RST=0;
	T_CLK=0;
	T_RST=1;
	RTInputByte(0xbe);	//0xbe ;时钟多字节写命令
	for(i=8;i>0;i--)
	{
		RTInputByte(*pcalen);
		pcalen++;
	}
	T_CLK=1;
	T_RST=0;
}

////////////////////////////////////////////////////

void ShowTime(void)
{
     uchar i;
     BurstR1302(calen);
     i=0x80;
     WritCommand(i);
     i=calen[6];
     ShowTimes(i);
     i=0x2f;
     WritData(i);
     i=calen[4];
     ShowTimes(i);
     i=0x2f;
     WritData(i);
     i=calen[3];
     ShowTimes(i);
     i=0x2f;
     WritData(i);
     i=calen[2];
     ShowTimes(i);
     i=0x3a;
     WritData(i);
     i=calen[1];
     ShowTimes(i);
     i=calen[0];
     ShowTimes(i);
}
////////////////
void ShowTimes(uchar i)
{
     uchar m,n;
     m=i>>4;
     m=m+0x30;
     n=i&0x0f;
     n=n+0x30;
     WritData(m);
     WritData(n);
}

 ////////////////////////////////////////////////////////////////// 进入系统设置画面

void ShScreen1(void)
{
     uchar i,j=0,k=0;
     uchar CodeNum1[4];
     while(1) {if(LKEY==1) break; }
                               //整体显示开  游标位置开
     WritCommand(0x0e);
     WritCommand(0x01);
     ShowPart1();
     WritCommand(0x90);
     WritData(0xcf);WritData(0xb5);WritData(0xcd);WritData(0xb3);       //显示系统密码:0
     WritData(0xc3);WritData(0xdc);WritData(0xc2);WritData(0xeb);
     WritData(0x3a);WritData(0x20);WritData(0x20);WritData(0x20);
     WritData(0x20);WritData(0x20);
     WritCommand(0x94);
     WritData(0xa3);
     WritData(0xb0);
     WritCommand(0x10);
     while(k<4)
     {
     if(LKEY==0)
        {
        Delay_ms(10);
        if(LKEY==0)
         {
          while(1){if(LKEY==1) break;}
          CodeNum1[k]=j;
          k++;
          for(i=0;i<4;i++)                     //判断密码是否正确
            {
            j=CodeNum[i];
            if(CodeNum1[i]!=j)
             {
              WritCommand(0x01);
              WritCommand(0x91);
              WritData(0xc3);WritData(0xdc);WritData(0xc2);WritData(0xeb);      //密码错误
              WritData(0xb4);WritData(0xed);WritData(0xce);WritData(0xf3);
              Delay_s(3);
              k=0;
              ShScreen1();
              break;
              }
             }
             RobSet();
             StealSet();
             FireSet();
             CalenSet();
            }
            break;
           }
          if(MKEY==0)
              {
                 Delay_ms(10);

                 if(MKEY==0)
                 {
                    j++;
                    if(j>9) j=0;
                    i=0xb0+j;
                    WritData(0xa3);
                    WritData(i);         //显示下个数
                    WritCommand(0x10);
                    while(1){ if(MKEY==1) break; }
                  }
               }
     if(RKEY==0)
              {
                Delay_ms(10);          //延时去抖动
                if(RKEY==0)
                {

                    CodeNum1[k]=j;
                    WritCommand(0x14);
                    k++;
                    if(k>3) {k=0; WritCommand(0x94);}
                    WritData(0xa3);
                    WritData(0xb0);
                    WritCommand(0x10);
                    j=0;
                    while(1)
                     {
                      if(RKEY==1) break;
                     }
                  }
                }
        ShowTime();
        WritCommand(0x94+k);
        Delay_ms(10);
      }

}
 ////////////////////////////////////////////////////////////////////////////////显示画面
void ShowPart1(void)
{
 WritCommand(0x98);
 WritData(0xc8);WritData(0xb7);WritData(0xc8);WritData(0xcf);       //显示确认 选数 移动
 WritData(0x20);WritData(0x20);WritData(0xd1);WritData(0xa1);
 WritData(0xca);WritData(0xfd);WritData(0x20);WritData(0x20);
 WritData(0xd2);WritData(0xc6);WritData(0xb6);WritData(0xaf);

}

void ShowPart2(void)
{
 WritCommand(0x90);
 WritData(0xb7);WritData(0xa2);WritData(0xc9);WritData(0xe4);         //发射器编号:0
 WritData(0xc6);WritData(0xf7);WritData(0xb1);WritData(0xe0);
 WritData(0xba);WritData(0xc5);WritData(0x3a);WritData(0x20);
 WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
 WritData(0xa3);WritData(0xb0);
}
void ShowPart3(void)
{
 WritCommand(0x90);
 WritData(0xb5);WritData(0xe7);WritData(0xbb);WritData(0xb0);         //电话报警:Y
 WritData(0xb1);WritData(0xa7);WritData(0xbe);WritData(0xaf);
 WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart4(void)
{
 WritCommand(0x98);
 WritData(0xc8);WritData(0xb7);WritData(0xc8);WritData(0xcf);           //确认   选择
 WritCommand(0x9e);
 WritData(0xd1);WritData(0xa1);WritData(0xd4);WritData(0xf1);
 }
 void ShowPart5(void)
 {
  WritCommand(0x98);
 WritData(0xbd);WritData(0xf8);WritData(0xc8);WritData(0xeb);   //进入
 WritCommand(0x9e);
 WritData(0xc1);WritData(0xed);WritData(0xd1);WritData(0xa1);   //另选
 }
 void ShowPart6(void)
 {
  WritCommand(0x91);
  WritData(0xc3);WritData(0xf9);WritData(0xbe);WritData(0xaf);
  WritData(0xb5);WritData(0xd1);                              //鸣警笛 :Y
  WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
  }
void ShowPart7(void)
{
 WritCommand(0x90);
 WritData(0xbd);WritData(0xd3);WritData(0xc1);WritData(0xa6);         //接力报警:Y
 WritData(0xb1);WritData(0xa7);WritData(0xbe);WritData(0xaf);
 WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
 }
void ShowPart8(void)
 {
 WritCommand(0x90);
 WritData(0xb7);WritData(0xe2);WritData(0xcb);WritData(0xf8);         //封锁现场:Y
 WritData(0xcf);WritData(0xd6);WritData(0xb3);WritData(0xa1);
 WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
 }
void ShowPart9(void)
{
 WritCommand(0x90);
 WritData(0xc5);WritData(0xe7);WritData(0xc9);WritData(0xe4);         //喷射眠雾:Y
 WritData(0xc3);WritData(0xdf);WritData(0xce);WritData(0xed);
 WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}

void ShowPart10(void)
{
 WritCommand(0x90);
 WritData(0xd4);WritData(0xb1);WritData(0xb9);WritData(0xa4);         //员工编码:0
 WritData(0xb1);WritData(0xe0);WritData(0xba);WritData(0xc5);
 WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
 WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
}
void ShowPart11(void)
{
 WritCommand(0x90);
 WritData(0xd7);WritData(0xee);WritData(0xc9);WritData(0xd9);         //最少与数:0
 WritData(0xd3);WritData(0xeb);WritData(0xca);WritData(0xfd);
 WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xb0);
}
void ShowPart12(void)
{
 WritCommand(0x90);
 WritData(0xc2);WritData(0xde);WritData(0xbc);WritData(0xad);           //逻辑关系:A
 WritData(0xb9);WritData(0xd8);WritData(0xcf);WritData(0xb5);
 WritData(0x3a);WritData(0x20);WritData(0xa6);WritData(0xa1);
}
void ShowPart13(void)
{
 WritCommand(0x90);
 WritData(0xd3);WritData(0xeb);WritData(0xb5);WritData(0xc8);           // 与等时间000S
 WritData(0xca);WritData(0xb1);WritData(0xbc);WritData(0xe4);
 WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xb0);
 WritData(0xa3);WritData(0xb0);WritData(0xa3);WritData(0xd3);

}
void ShowPart14(void)
{
 WritCommand(0x01);
 WritCommand(0x98);
 WritData(0xcc);WritData(0xee);WritData(0xd0);WritData(0xb4);           //填写    继续
 WritCommand(0x9b);
 WritData(0xb2);WritData(0xbb);WritData(0xcc);WritData(0xee);
 WritCommand(0x9e);
 WritData(0xbc);WritData(0xcc);WritData(0xd0);WritData(0xf8);
}
void ShowPart15(void)
{
 WritCommand(0x90);
 WritData(0xd7);WritData(0xd4);WritData(0xb6);WritData(0xaf);         //自动喷水:Y
 WritData(0xc5);WritData(0xe7);WritData(0xcb);WritData(0xae);
 WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}
void ShowPart16(void)
{
 WritCommand(0x90);
 WritData(0xd7);WritData(0xd4);WritData(0xb6);WritData(0xaf);         //自动喷沙:Y
 WritData(0xc5);WritData(0xe7);WritData(0xc9);WritData(0xb3);
 WritData(0x3a);WritData(0x20);WritData(0xa3);WritData(0xd9);
}

void ShowPart17(void)
{
  WritCommand(0x92);
 WritData(0xc8);WritData(0xd5);WritData(0xc0);WritData(0xFa);   //日历设置
 WritData(0xc9);WritData(0xe8);WritData(0xd6);WritData(0xc3);
}
/*void ShowPart18(void)
{

}
  */
////////////////////////////////////报警



//////////////////////////////////////////////////////////////////
void RobSet(void)                                                 //防抢设置
{
 WritCommand(0x01);                     //清零
 WritCommand(0x0c);
 WritCommand(0x92);
 WritData(0xb7);WritData(0xc0);WritData(0xc7);WritData(0xc0);    //防抢设置
 WritData(0xc9);WritData(0xe8);WritData(0xd6);WritData(0xc3);
 ShowPart5();                                                //进入 另选
 while(1)
 {
 if(RKEY==0)
  {
  Delay_ms(10);
  if(RKEY==0)
   {
   while(1){if(RKEY==1) break; }
   }
   break;
  }
  if(LKEY==0)
  {
   Delay_ms(10);
   if(LKEY==0)
   {
   while(1) {if(LKEY==1)break;}
   RobData=0x00;
   TeleAlarm();         //报警处警设置
   WhistleAlarm();
   AlarmRelay();
   BlankLocal();
   EjectFog();
   pdx=0x0101;
   *pdx=RobData;
   AnlTime();         //与等待时间
   AnlNum();         //最少与数
   RobSetNext();
   break;
   }
  }
  ShowTime();
 }
}
void RobSetNext(void)
{
   uchar i;
   WritCommand(0x0e);
   i=EjectorNum();         //发射器编号
   EmployeeNum();         //员工编号
   AnlSet();         //逻辑关系
   RobSet1();        //继续 填写
}
void TeleAlarm(void)
{
 bit i=1;
 WritCommand(0x01);
 WritCommand(0x0e);
 ShowPart3();              //电话报警:Y
 ShowPart4();
 while(1)
 {
  if(LKEY==0)
  {
   Delay_ms(10);
   if(LKEY==0)
   {
    while(1)
    {if(LKEY==1) break;}
    if(i==1)
    {
     RobData=RobData|0x01;
     }
     else
     {
     RobData=RobData&0xfe;
     }
   }
   break;
  }
  if(RKEY==0)
  {
   Delay_ms(10);
   if(RKEY==0)
   {
    while(1)
     {if(RKEY==1) break;}
     i=~i;
     if(i==1)
     {
     WritCommand(0x95);
     WritData(0xa3);WritData(0xd9);
     WritCommand(0x10);
      }
      else
      {
       WritCommand(0x95);
       WritData(0xa3);WritData(0xce);
       WritCommand(0x10);
      }
    }
  }
  WritCommand(0x95);
 }
}

void WhistleAlarm(void)
{
 bit i=1;
 WritCommand(0x01);
 ShowPart6();                     ////鸣警笛 :Y
 ShowPart4();
 while(1)
 {
  if(LKEY==0)
  {
   Delay_ms(10);
   if(LKEY==0)
   {
    while(1)
    {if(LKEY==1) break;}
    if(i==1)
    {
     RobData=RobData|0x02;
     }
     else
     {
      RobData=RobData&0xfd;
     }

   }
   break;
  }
  if(RKEY==0)
  {
   Delay_ms(10);

⌨️ 快捷键说明

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