輸入密碼時以*號代替,連續輸入錯誤三次蜂鳴器響,LED燈閃爍。
制作出來的實物圖如下:
51hei圖片_20220309140635.jpg (273.04 KB, 下載次數: 51)
下載附件
開機界面
2022-3-9 14:07 上傳
51hei圖片_20220309140622.jpg (225.74 KB, 下載次數: 51)
下載附件
修改密碼或輸入密碼開鎖
2022-3-9 14:08 上傳
51hei圖片_20220309140646.jpg (219.5 KB, 下載次數: 53)
下載附件
輸入密碼界面
2022-3-9 14:08 上傳
51hei圖片_20220309140639.jpg (212.94 KB, 下載次數: 53)
下載附件
密碼錯誤
2022-3-9 14:09 上傳
51hei圖片_20220309140652.jpg (224.75 KB, 下載次數: 44)
下載附件
2022-3-9 14:10 上傳
51hei圖片_20220309140658.jpg (236.48 KB, 下載次數: 43)
下載附件
2022-3-9 14:10 上傳
單片機源程序如下:
- #include<reg52.h>
- sbit AS=P2^2;
- sbit LED=P1^0;
- sbit Buzz=P1^1;
- bit enBuzz=0;
- bit enLED=0;
- extern void LCDshowstr(unsigned char x,unsigned char y,unsigned char *str);
- extern void E2read(unsigned char *buf,unsigned char addr,unsigned char len);
- extern void E2write(unsigned char *buf,unsigned char addr,unsigned char len);
- extern void keydriver();
- extern void LCDwritedat(unsigned char dat);
- extern void InitLCD1602();
- extern void keyscan();
- extern void LCDwritecmd(unsigned char cmd);
- void configtimer0(unsigned char ms);
- void keyaction(unsigned char keycode);
- void oprtkey(unsigned char number);
- unsigned char T0RH=0;
- unsigned char T0RL=0;
- unsigned char pw_num;
- unsigned char PassWord_Length=6;
- unsigned char result_flag=0;
- unsigned char Tad[10];
- unsigned char buf[6]={6,6,6,6,6,6};
- unsigned char step;
- unsigned char keynumbers;
- unsigned char Error_Num=0;
- bit Input_suc_flag=0;
- bit fanhui=0;
- bit List1=0;
- bit keynumber=0;
- bit key0=0;
- bit key1=0;
- bit key2=0;
- bit key3=0;
- bit key4=0;
- bit key5=0;
- bit key6=0;
- bit key7=0;
- bit key8=0;
- bit key9=0;
- bit start=0;
- unsigned char baojing=0;
- unsigned char step5=0;
- void step_0();
- void step_1();
- void step_2();
- void step_3();
- void step_4();
- void step_5();
- void step5_0();
- void step5_1();
- void step5_2();
- void step5_3();
- void step5_4();
- void step5_5();
- void step_6();
- void input_password(bit m);
- void CipherComparison();
- void delay(unsigned long i)
- {
- while(i--);
- }
- void main()
- {
- EA=1;
- InitLCD1602();
- E2write(buf,0x00,sizeof(buf));
- //InitLCD1602();
- configtimer0(1);
- step=0;
- while(1)
- { keydriver();
- switch(step)
- {
- case 0:{step_0();
- if(keynumber==0)
- step=0;
- else
- {keynumber=0;
- step=1; }
- break;}
- case 1:step_1();break;
- case 2:step_2();break;
- case 3:step_3();break;
- case 4:step_4();break;
- case 5:step_5();break;
- case 6:step_6();break;
- }
- }
- }
- void step_0()
- {
- LCDshowstr(0,0,"Pechin Science");
- LCDshowstr(1,1,"welcome");
- }
- void step_1()
- {
- LCDwritecmd(0x01);
- LCDshowstr(0,0,"Unlock");
- LCDshowstr(15,0,"<");
- LCDshowstr(0,1,"ChangePassword");
- step=2;
- }
- void step_2()
- {
- if(start==0)
- {
- if((key1==1) ||( key9==1)) //1鍵或9鍵按下
- {
- key1=0;
- key9=0;
- List1=~List1; //Change Password
- if(List1==0)
- {
- LCDshowstr(15,0,"<"); // Unlock <
- LCDshowstr(15,1," "); // Change Password
- }
- else
- {
- LCDshowstr(15,0," "); // Unlock
- LCDshowstr(15,1,"<"); // Change Password <
- }
- }
- }
- else //確認鍵按下
- { start=0;
- if(List1==0)
- {step=3;}
- else
- {step=5;List1=0;}
- }}
-
- void step_3()
- {
- step=4;
- pw_num=0;
- InitLCD1602();
- LCDshowstr(0,0,"Pass Word: ");
- }
- void step_4()
- {
- input_password(0);
- if(Input_suc_flag==1){step=6;}
- Input_suc_flag=0;
- }
- void step_5() //修改密碼
- {
- switch(step5)
- {
-
- case 0: {step5_0();} break;
- case 1: {step5_1();} break;
- case 2: {step5_2();} break;
- case 3: {step5_3();} break;
- case 4: {step5_4();} break;
- case 5: {step5_5();} break;
- }
- }
- void step5_0()
- {
- LCDwritecmd(0x01);
- LCDshowstr(0,0,"Input PassWord:");
- step5=1;
- pw_num=0;
- }
- void step5_1()
- {
- input_password(0);
- if(Input_suc_flag==1)
- {
- step5=2;
- Input_suc_flag=0;
- }
- }
- void step5_2()
- {
- CipherComparison();
- step5=3;
- }
- void step5_3()
- {
- if(result_flag==0)
- {
- if(Error_Num<=3)
- {
- Error_Num++;
- InitLCD1602();
- LCDshowstr(0,0,"Error 01");
- delay(50000);
- step5=0;
- }
- else
- {
- Error_Num=0;
- step=0;
- }
-
- }
- else
- {
- InitLCD1602();
- LCDshowstr(0,0,"New PassWord:");
- pw_num=0;
- step5=4;
- }
-
-
- }
- void step5_4()
- {
- input_password(1);
- if(Input_suc_flag==1)
- {
- step5=5;
- Input_suc_flag=0;
- LCDwritecmd(0x01);
- LCDshowstr(0,0,"OK!nice!");
- delay(500000);
- }
- }
- void step5_5()
- {
- unsigned char x;
- PassWord_Length=pw_num;
-
- for(x=0;x<pw_num;x++)
- {
- buf[x]=Tad[x];
- }
- E2write(buf,0x00,PassWord_Length);
- step5=0;
- step=0;
- }
- void step_6()
- {
- static unsigned char k=1; //錯誤次數
- static unsigned char n=30;
- unsigned char numberbuf[2];
- CipherComparison();
- if(result_flag==1) //密碼正確
- { k=0;
- InitLCD1602();
- LCDshowstr(0,0," WELCOME!");
- AS=0; //開繼電器
- delay(60000);
- delay(60000);
- AS=1; //關繼電器
- }
- else //密碼錯誤
- {
- if(k<3)
- { k++;
- InitLCD1602(); //
- LCDshowstr(0,0,"Error 01!"); //
- delay(100000);
- }
- else
- {
- while(n>0)
- {
- InitLCD1602();
- numberbuf[0]=(n/10)+0x30;
- numberbuf[1]=(n%10)+0x30;
- LCDshowstr(12,1,numberbuf);
- enBuzz=1; //
- enLED=1;
- if(baojing==1)
- {
- baojing=0;
- n--;
- }}
- n=30;
- enLED=0;
- enBuzz=0;
- /* enBuzz=1; //
- enLED=1; //
- delay(600000); //
- enLED=0; //
- enBuzz=0; */
- } //
- }
-
- step=0;
-
- }
- void input_password(bit m)
- {
- unsigned char j;
- if(start==0) //ok鍵沒有按下
- {
- if((key0==1)||(key1==1)||(key2==1)||(key3==1)||(key4==1)||(key5==1)||(key6==1)||(key7==1)||(key8==1)||(key9==1)) //1-9按下
- {
-
- key0=0,key1=0,key2=0,key3=0,key4=0,key5=0,key6=0,key7=0,key8=0,key9=0;
- Tad[pw_num]=keynumbers;
- pw_num++;
- LCDwritecmd(0xc0);
- for(j=0;j<pw_num;j++)
- {
- if(m==0)
- {LCDwritedat('*'); } //密碼隱藏
- else
- {LCDwritedat(Tad[j]+0x30);} //顯示密碼
- }}
- if(fanhui!=0) //返回鍵按下
- {
- fanhui=0;
- if(pw_num!=0)
- {pw_num--;}
- else
- {step=0;}
- // ShowString (0x00,"Pass Word:");
- LCDwritecmd(0x01);
- LCDshowstr(0,0,"Pass Word: ");
- LCDwritecmd(0xc0);
- for(j=0;j<pw_num;j++)
- {
- if(m==0) {LCDwritedat('*'); } //密碼隱藏
- else {LCDshowstr(0,1,Tad);} //顯示密碼
- }
- //LCDwritedat(' ');
- }
- }
- else //ok鍵按下
- {
- start=0;
- if(pw_num==0)
- {
- step=0;
- LCDwritecmd(0x01);
- LCDshowstr(0,0,"Error 02!");
- delay(600000);
- }
-
- else{
- Input_suc_flag=1;
- }
- //AS=0;
- }
- }
- void keyaction(unsigned char keycode)
- {
- if((keycode>=0x30)&&(keycode<=0x39))
- {
- keynumbers=keycode-0x30;
- }
-
-
- }
-
-
- void oprtkey(unsigned char number)
- {
- if(number==1)
- keynumber=1;
- else if(number==2)
- key1=1;
- else if(number==3)
- key9=1;
- else if(number==4)
- start=1;
- else if(number==5)
- key2=1;
- else if(number==6)
- key3=1;
- else if(number==7)
- key4=1;
- else if(number==8)
- key5=1;
- else if(number==9)
- key6=1;
- else if(number==10)
- key7=1;
- else if(number==11)
- key8=1;
- else if(number==12)
- key0=1;
- else if(number==13)
- fanhui=1;
- }
- void CipherComparison()
- {
- unsigned char i=0,j=0;
- if(PassWord_Length==pw_num) //密碼長度比對
- {
- for(i=0;i<PassWord_Length;i++) //密碼比對
- {
-
- if(buf[i]!=Tad[i])
- {
- result_flag=0;break; //密碼錯誤
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (5.11 KB, 下載次數: 48)
下載附件
2022-3-9 17:17 上傳
Keil代碼下載:
智能門鎖代碼.7z
(39.88 KB, 下載次數: 38)
2022-3-9 17:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|