|
- //-----------------------------------------------
- //-----------------密碼鎖程序--------------------
- //-----------------芯片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;//確認(rèn)密碼
- 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]; //常規(guī)密碼存儲器
- //------------------------------
- void delayx(uint i)
- {
- uint w;
- for(w=0;w<i;w++);
- }
- //------------------------------
- void beepo()
- {
- beep=0;
- delayx(5000);
- beep=1;
- }
- //------------------------------數(shù)據(jù)鍵盤掃描并返回鍵值
- 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”數(shù)據(jù)到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(); //數(shù)據(jù)鍵盤掃描
- if(b!=15) //如果b不等于15說明有鍵按下
- {
- tablee2[c++]=b; //密碼存儲器
- LCD1602_0(15,c);
- if(c==4)c=0;
- b=15;
- } //通過計(jì)算一下將密碼確認(rèn)復(fù)雜化,這樣可以解決密碼重復(fù)按下后確認(rèn)為錯誤碼密碼,
- //如當(dāng)設(shè)置密碼為222時,當(dāng)按下2222或更多22222的密碼后,可以保證這些是錯誤密碼。
- h=((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+tablee2[3]);
- //========================================
- if(!K3) //確認(rèn)輸入鍵 P0.3
- {
- c=0; //消除密碼累加的現(xiàn)象
- 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; //長嗚一聲音表示確認(rèn)密碼正確并開鎖
- tablee2[0]=0;
- tablee2[1]=0;
- tablee2[2]=0; //將密碼重置一下
- LED_OPEN=1; //關(guān)鎖
- 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; //清除一下該存儲器中的錯誤數(shù)據(jù)避免下次持續(xù)報(bào)錯
- LCD1602_1(0); //顯示PleasePassword
- }
- if(r==4) //如果錯誤3次密碼則報(bào)警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();//數(shù)據(jù)鍵盤掃描 --先輸入舊密碼確認(rèn)主人身份
- if(b!=15) //如果b不等于15說明有鍵按下
- {
- u++;
- tablee2[c++]=b; //常規(guī)密碼存儲器
- 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(); //數(shù)據(jù)鍵盤掃描
- 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]); //寫入數(shù)據(jù)到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; //長嗚一聲音表示確認(rèn)已輸入數(shù)據(jù)
- 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()//應(yīng)答信號,等待或者發(fā)送一個應(yīng)答信號
- {
- 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)//寫一字節(jié)
- {
- uchar i;
- SCL=0;
- for(i=0;i<8;i++)
- {
- date=date<<1;
- SDA=CY;
- SCL=1;
- delay();
- SCL=0;
- delay();
- }
- }
- //------------------------------------------------
- uchar read_byte()//讀數(shù)據(jù)(也就是接收從器件傳來的數(shù)據(jù))
- {
- 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)//寫數(shù)據(jù)
- {
- start();
- write_byte(0xa0); //器件地址
- respons();
- write_byte(address);//器件內(nèi)存地址 address
- respons();
- write_byte(date);//數(shù)據(jù) date
- respons();
- stop();
- }
- //////////////////////////////////////////////////
- //==============AT24C01讀操作====================//
- uchar R_AT24C01(uchar address)
- {
- uchar date;
- start();
- write_byte(0xa0);//寫器件地址和寫指令0XA0=10100000B最后一個零表示寫,低電平有效
- respons();
- write_byte(address);////器件內(nèi)存地址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; //顯示設(shè)定兩行
- delay2();
- P2=0x0f; //打開顯示和光標(biāo)
- delay2();
- P2=0x06; //光標(biāo)右移
- delay2();
- P2=0x80; //光標(biāo)回到第一行的開頭
- delay2();
- }
- /******************************LCD1602液晶顯示****************************/
- void LCD1602_0(uchar dd0,uchar jj0)//dd是整數(shù)
- {
- 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指令是光標(biāo)回到第二行的開頭
- for(i=0;i<jj0;i++)
- {
- delay2();
- P2=table3[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
- //==========================================================================
- void LCD1602_1(uchar dd1)//dd是整數(shù)
- {
- 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指令是光標(biāo)回到第二行的開頭
- for(i=0;i<16;i++)
- {
- delay2();
- P2=table4[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
- //==========================================================================
- void LCD1602_2()//dd是整數(shù)
- {
- 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指令是光標(biāo)回到第二行的開頭
- for(i=0;i<16;i++)
- {
- delay2();
- P2=table4[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
復(fù)制代碼
|
|