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

📄 lcm16864zk.c

📁 一个基于51单片机的报警系统。包含有电路图
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <absacc.h>
#include <reg51.h>                         //声明了各种寄存器 和变量
#include "main.h"                          //声明了所有的函数
#define PRINTBYTE XBYTE[0x9FFF]         //打印地址
#define WARNBYTE XBYTE[0x5FFF]         //射频报警地址
#define LEDBYTE XBYTE[0X1FFF]          //显示芯片地址
sbit BUSY=P3^2;
void main(void)
{
	SP=0x30;

        Delay_ms(2);
	SystemInitial(); 	//系统初始化
        while(1)
		{

			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;
                     /*      TH0=0X3C;
                           TL0=0XB0;
                           TMOD=0X01;

                                           */
                           WarnDeal();
                           Delay_s(1);
                           DisplayInitial();
                         }

                }
}

void SystemInitial(void)		// 系统初始化程序
{
	uchar i;

        IE=0X95;                        //中断控制初始化
        PCON=0Xa0;
        SCON=0X90;                      //串行口波特率加倍
        REN=1;
        IT1=0;
        P3=0XFF;                        //P1,P3口的第二的功能先输出1
	for(i=0;i<=3;i++)               //密码初始化为0000
             CodeNum[i]=0;
                                //报警数据初始化
        pdx=0x0100;             //防抢设置向量地址
        *pdx=0x00;              //   向量数目
        pdx=0x0200;             //防盗设置向量首地址
        *pdx=0x00;
        pdx=0x0300;             //放火设置向量首地址
        *pdx=0x00;
        pdx=0x0400;             //报警发生存储向量首地址
        *pdx=0x00;

        RobDataInitial();
        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 RobDataInitial(void)
{
 pdx=0x0100;
 *pdx=6;
 pdx=0x0102;
 *pdx=100;
 pdx=0x0103;
 *pdx=2;
 RobNum=2;      //最少与数
 pdx++;*pdx=0x07; pdx++;*pdx=0x00;   // 0111      高级
 pdx++;*pdx=0x01;pdx++;*pdx=0x01;
 pdx++;*pdx=0x04; pdx++;*pdx=0x00;   // 0100      高级
 pdx++;*pdx=0x02;pdx++;*pdx=0x01;
 pdx++; *pdx=0x08; pdx++;*pdx=0x00;   // 1000      高级
 pdx++;*pdx=0x03;pdx++;*pdx=0x01;
 pdx++; *pdx=0x02; pdx++;*pdx=0x00;   // 0010      低级
 pdx++;*pdx=0x04;pdx++;*pdx=0x00;
 pdx++; *pdx=0x01; pdx++;*pdx=0x00;   // 0001      低级
 pdx++;*pdx=0x05;pdx++;*pdx=0x00;
 pdx++; *pdx=0x0a; pdx++;*pdx=0x00;   // 1010      低级
 pdx++;*pdx=0x06;pdx++;*pdx=0x00;
 pdx=0x0302;*pdx=0x0a;pdx=0x0300;*pdx=0x01;
}
/////////////////////////////////////////////////////延时程序 us  ms  s

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++);

}

///////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////LED显示程序
void WritCommand(uchar i)	//写命令
{
    //    P2=0X1F;
        Waitfree();
        S_RS=0;
	S_RW=0;
        E=1;         //E=1
/*	P0 = i;
        _WR=0;

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

        _WR=1;  */
        LEDBYTE=i;
        E=0;
     //   P2=0X0F;
}

void Waitfree(void)      //送数据入LED芯片的等待程序,判断数据线是否忙
{
 P0=0XFF;
  S_RS=0;
  S_RW=1;
  _RD=0;
  ACC=P0;
 while(ACC7==1)
 {
  _RD=0;
  P2=0X1F;
  E=1;
  ACC=P0;
 // ACC=LEDBYTE;
  E=0;
  }
 _RD=1;
  S_RS=0;
  S_RW=0;
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////

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 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)		//向1302写入一字节的数据
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)            //时间显示 能自动从DS1302中读取时间数据显示在第一行
{
     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)        //数字到BCD码的转换   因为LED显示的是BCD码
{
     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();
             FuncControl();
            }
            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)
{
  WritCommand(0x91);
 WritData(0xb1);WritData(0xa7);WritData(0xbe);WritData(0xaf);   //报警记录打印
 WritData(0xbc);WritData(0xc7);WritData(0xc2);WritData(0xbc);
 WritData(0xb4);WritData(0xf2);WritData(0xd3);WritData(0xa1);

}
void ShowPart19(void)
{
  WritCommand(0x92);
 WritData(0xc8);WritData(0xab);WritData(0xb3);WritData(0xbf);   //全部打印
 WritData(0xb4);WritData(0xf2);WritData(0xd3);WritData(0xa1);

}
void ShowPart20(void)

⌨️ 快捷键说明

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