|
- //-----------------------------------------------
- //-----------------密码锁程序--------------------
- //-----------------芯片STC89C52RC--晶振11.0592M--
- //***********************************************
- #include <reg52.h>
- #include "AT24C01.C"
- #include "LCD1602.C"
- //---------------------------
- #define uchar unsigned char
- #define uint unsigned int
- static uchar c=0;
- //---------------------------
- sbit K0=P0^0;//0
- sbit K1=P0^1;//1
- sbit K2=P0^2;//2
- sbit K3=P0^3;//确认密码
- sbit K4=P0^4;//修改密码
- //---------------------------
- sbit LE_LED=P3^4;
- sbit LED_LDEOKK=P1^3;
- sbit LED_LEDOK=P1^4;
- sbit LED_OPEN=P1^5;
- sbit beep=P3^3;
- //---------------------------
- uchar tablee [3]; //键值存储器
- uchar tablee2[4]; //常规密码存储器
- //------------------------------
- void delayx(uint i)
- {
- uint w;
- for(w=0;w<i;w++);
- }
- //------------------------------
- void beepo()
- {
- beep=0;
- delayx(5000);
- beep=1;
- }
- //------------------------------数据键盘扫描并返回键值
- shuju_jianpan()
- {
- uchar a=15;
- uchar KEY; //
- if(!K0) //0
- {
- delayx(500);
- while(K0==0);
- beepo();
- a=0;
- }
- //----------------------
- if(!K1) //1
- {
- delayx(500);
- while(K1==0);
- beepo();
- a=1;
- }
- //----------------------
- if(!K2) //2
- {
- delayx(500);
- while(K2==0);
- beepo();
- a=2;
- }
- switch (a)
- {
- case 0: KEY=0; break;
- case 1: KEY=1; break;
- case 2: KEY=2; break;
- case 15:KEY=15;break;
- }
- return (KEY);
- }
- //***********************************************************//
- //***********************************************************//
- void main()
- {
- uchar b;
- uchar u=0;
- uchar e=30;
- uchar f=31;
- uchar y=32;
- uchar nem0=0,nem1=0,nem2=0;
- uchar nem3=0,nem4=0,nem5=0;
- uchar r=0;
- uchar j;
- uchar q=0;
- uchar h=0;
- LE_LED=0;
- LCD1602_0(15,0); //显示PleasePassword
- //---------------------------------------------------------
- //-----------------------------------------置入初始出厂密码
- if(q==0)
- {
- init(); //24c01初始化
- W_AT24C01(e,2); //写入初始密码“111”数据到AT24C01存储器中保存
- delayx(500);
- //------------------
- init();
- W_AT24C01(f,2);
- delayx(500);
- //------------------
- init();
- W_AT24C01(y,2);
- delayx(500);
- q=1;
- }
- //--------------------------------------------------------------------
- tablee2[3]=0;
- //--------------------------------------------------------------------
- while(1)
- {
- b=shuju_jianpan(); //数据键盘扫描
- if(b!=15) //如果b不等于15说明有键按下
- {
- tablee2[c++]=b; //密码存储器
- LCD1602_0(15,c);
- if(c==4)c=0;
- b=15;
- } //通过计算一下将密码确认复杂化,这样可以解决密码重复按下后确认为错误码密码,
- //如当设置密码为222时,当按下2222或更多22222的密码后,可以保证这些是错误密码。
- h=((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+tablee2[3]);
- //========================================
- if(!K3) //确认输入键 P0.3
- {
- c=0; //消除密码累加的现象
- delayx(500);
- while(K3==0);
- beepo();
- //----------------开始密码比较------------
- init();//AT24C01初始化
- nem0=R_AT24C01(e);
- init();
- nem1=R_AT24C01(f);
- init();
- nem2=R_AT24C01(y);
- delayx(500); //延迟一下
- //----------------------------------------
- if(nem0==tablee2[0]&&nem1==tablee2[1]&&nem2==tablee2[2]&&h==((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+0))
- {
- LED_OPEN=0; //开锁
- beep=0;
- delayx(20000);
- beep=1; //长呜一声音表示确认密码正确并开锁
- tablee2[0]=0;
- tablee2[1]=0;
- tablee2[2]=0; //将密码重置一下
- LED_OPEN=1; //关锁
- delayx(600);
- LCD1602_2(); //welcomeBack
- delayx(60000);
- delayx(60000);
- delayx(60000);
- LCD1602_1(15); //显示PleasePassword
- }
- else
- {
- beepo();
- delayx(5000);
- beepo();
- delayx(5000);
- beepo();
- delayx(5000); //短响3声音表示密码错误
- r++;
- tablee2[3]=0; //清除一下该存储器中的错误数据避免下次持续报错
- LCD1602_1(0); //显示PleasePassword
- }
- if(r==4) //如果错误3次密码则报警2分钟
- {
- for(j=0;j<30;j++)
- {
- beepo();
- delayx(5000);
- }
- r=0;
- }
- }
- //====================================================================
- if(!K4) //修改密码键 P0.4
- {
- delayx(500);
- while(K4==0);
- beepo();
- //------------------------
- while(u<3)
- {
- b=shuju_jianpan();//数据键盘扫描 --先输入旧密码确认主人身份
- if(b!=15) //如果b不等于15说明有键按下
- {
- u++;
- tablee2[c++]=b; //常规密码存储器
- LCD1602_0(15,c);
- if(c==4)c=0;
- b=15;
- }
- }
- u=0;
- h=((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+tablee2[3]);
- //----------------开始密码比较----------------------------
- init();//AT24C01初始化
- nem3=R_AT24C01(e);
- init();
- nem4=R_AT24C01(f);
- init();
- nem5=R_AT24C01(y);
- delayx(500); //延迟一下
- //---------------------------------------------------------
- if(nem0==tablee2[0]&&nem1==tablee2[1]&&nem2==tablee2[2]&&h==((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+0))
- {
- c=0;
- beep=0;
- delayx(20000);
- beep=1; //长呜一声音表示开始修改密码
- LED_LEDOK=0; //灯亮表示密码正确
- delayx(20000);
- LED_LEDOK=1; //灯亮表示密码正确
- LCD1602_1(0); //显示PleasePassword
- //---------------------------------------------------------
- while(c<3) //密码长度必须为3位
- {
- b=shuju_jianpan(); //数据键盘扫描
- if(b!=15)
- {
- tablee2[c++]=b;
- LCD1602_0(15,c);
- b=15;
- }
- }
- c=0;
- //---------------------------------------------------------
- while(K3==1);
- LCD1602_2(); //welcomeBack
- delayx(500);
- while(K3==0);
- delayx(500);
- while(K3==0);
- init(); //24c01初始化
- W_AT24C01(e,tablee2[0]); //写入数据到AT24C01存储器中保存
- delayx(500);
- //------------------
- init();
- W_AT24C01(f,tablee2[1]);
- delayx(500);
- //------------------
- init();
- W_AT24C01(y,tablee2[2]);
- delayx(500);
- //------------------
- LED_LDEOKK=0; //灯亮表示密码正确
- beep=0;
- delayx(10000);
- beep=1; //长呜一声音表示确认已输入数据
- LED_LDEOKK=1;
- u=0;
- delayx(50000);
- beep=0;
- delayx(50000);
- beep=1; //长呜一声音表修改密码OK
- LCD1602_0(15,0); //显示PleasePassword
- }
- } //修改密码的if语句
- } //总的while(1)语句
- }
- //======================================================
- //---IIC AT24C01存储器读写操作程序-----------
- #include <reg52.h>
- #define uchar unsigned char
- sbit SDA=P3^6;
- sbit SCL=P3^7;
- ///------------------------------------------
- void delay()
- { ; ; }
- ///////////////////////
- void start()//起始信号
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- SDA=0;
- delay();
- }
- ///////////////////////
- void stop()//终止信号
- {
- SDA=0;
- delay();
- SCL=1;
- delay();
- SDA=1;
- delay();
- }
- //////////////////////////////////////////////////
- //////////////////////////////////////////////////
- void respons()//应答信号,等待或者发送一个应答信号
- {
- uchar i;
- SCL=1;
- delay();
- while((SDA==1)&&(i<250))i++;
- SCL=0;
- delay();
- }
- /*************************************************/
- void init()//初始化
- {
- SDA=1;
- SCL=1;
- }
- //////////////////////////////////////////////////
- void write_byte(uchar date)//写一字节
- {
- uchar i;
- SCL=0;
- for(i=0;i<8;i++)
- {
- date=date<<1;
- SDA=CY;
- SCL=1;
- delay();
- SCL=0;
- delay();
- }
- }
- //------------------------------------------------
- uchar read_byte()//读数据(也就是接收从器件传来的数据)
- {
- uchar i,k;
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay();
- k=(k<<1)|SDA;
- SCL=0;
- delay();
- }
- return k;
- }
- //////////////////////////////////////////////////
- //=============AT24C01写操作=====================//
- void W_AT24C01(uchar address,uchar date)//写数据
- {
- start();
- write_byte(0xa0); //器件地址
- respons();
- write_byte(address);//器件内存地址 address
- respons();
- write_byte(date);//数据 date
- respons();
- stop();
- }
- //////////////////////////////////////////////////
- //==============AT24C01读操作====================//
- uchar R_AT24C01(uchar address)
- {
- uchar date;
- start();
- write_byte(0xa0);//写器件地址和写指令0XA0=10100000B最后一个零表示写,低电平有效
- respons();
- write_byte(address);////器件内存地址address
- respons();
- start();
- write_byte(0xa1);//写器件地址和读指令0XA1=10100001B,最后一个1表示读,高电平有效
- respons();
- date=read_byte();
- stop();
- return date;
- }
- //======================================================
- //------------------LCD1602显示程序(模块)--------------------
- #include <reg52.h>
- #define uchar unsigned char
- ///////////////LCD1602/////////////
- sbit RS=P0^5;
- sbit RW=P0^6;
- sbit YE=P0^7;
- /////////////////////////////////////////////////////////////
- uchar code table1[] ={" Welcome Back"};
- uchar code table2[] ={" PleasePassword"};
- uchar code table3[] ={"****"};
- uchar code table4[] ={" "};
- /////////////////////////////////////////////////////////////
- void delayy(unsigned int us)
- {
- while(us--);
- }
- /////////////////////////////////////////////////////////////
- void delay2()
- {
- RS=0;
- RW=0;
- YE=0;
- delayy(5);
- YE=1;
- }
- //------------------------------------------
- void LCD1602_START()
- {
- //////////////////////////////////////LCD屏初始化
- P2=0x01; //清屏
- delay2();
- P2=0x38; //显示设定两行
- delay2();
- P2=0x0f; //打开显示和光标
- delay2();
- P2=0x06; //光标右移
- delay2();
- P2=0x80; //光标回到第一行的开头
- delay2();
- }
- /******************************LCD1602液晶显示****************************/
- void LCD1602_0(uchar dd0,uchar jj0)//dd是整数
- {
- uchar i,nem;
- LCD1602_START();
- /////////////////////////////////////////////////////////////
- for(nem=0;nem<dd0;nem++)//温度英文字PleasePassword显示
- {
- P2=table2[nem];
- RS=1;
- RW=0;
- YE=0;
- delay2();
- }
- ////////////////////////////////////////////////////////////
- delay2();
- P2=0xc0; //换行显示***0xc0指令是光标回到第二行的开头
- for(i=0;i<jj0;i++)
- {
- delay2();
- P2=table3[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
- //==========================================================================
- void LCD1602_1(uchar dd1)//dd是整数
- {
- uchar i,nem;
- LCD1602_START();
- for(nem=0;nem<dd1;nem++)//温度英文字PleasePassword显示
- {
- P2=table2[nem];
- RS=1;
- RW=0;
- YE=0;
- delay2();
- }
- /////////////////////////////////////////////////
- delay2();
- P2=0xc0; //换行显示***0xc0指令是光标回到第二行的开头
- for(i=0;i<16;i++)
- {
- delay2();
- P2=table4[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
- //==========================================================================
- void LCD1602_2()//dd是整数
- {
- uchar i,nem;
- LCD1602_START();
- for(nem=0;nem<15;nem++)//温度英文字welcomeback显示
- {
- P2=table1[nem];
- RS=1;
- RW=0;
- YE=0;
- delay2();
- }
- /////////////////////////////////////////////////
- delay2();
- P2=0xc0; //换行显示***0xc0指令是光标回到第二行的开头
- for(i=0;i<16;i++)
- {
- delay2();
- P2=table4[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
复制代码
|
|