|
從經(jīng)濟實用的角度出發(fā),采用51單片機AT89S51與低功耗CMOS型E2PROM AT24C02作為主控芯片與數(shù)據(jù)存儲器單元,結(jié)合外圍的鍵盤輸入、顯示、報警、開鎖等電路,用匯編語言編寫主控芯片的控制程序,設(shè)計了一款可以多次更改密碼具有報警功能的電子密碼鎖。
只實現(xiàn)簡單通訊功能,能夠處理下位機傳上來的數(shù)據(jù)。繼電器打開(開鎖)上位機顯示1;繼電器關(guān)閉(關(guān)鎖)上位機顯示0。
本設(shè)計中的數(shù)據(jù)庫、手動發(fā)送未用到。
使用數(shù)字小鍵盤輸入六位密碼
密碼鎖在輸入密碼正確的條件下輸出開鎖電平,控制電控鎖開啟
同時顯示0【改成OK】字樣
當(dāng)輸入密碼錯誤時
發(fā)出錯誤警告聲音
同時顯示C【改成ERROR】字樣
當(dāng)六次誤碼【為簡便改成三次】輸入時產(chǎn)生報警信號
還可以實現(xiàn)對密碼的修改
修改成功后蜂鳴發(fā)出確認(rèn)音
電控鎖開啟
可以通過使步進電機轉(zhuǎn)動180度來模擬開鎖和關(guān)鎖動作
LED【改用LCD】顯示電子鎖當(dāng)前狀態(tài)
VB上位機
51hei.png (15.81 KB, 下載次數(shù): 23)
下載附件
2024-1-13 02:01 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (32.28 KB, 下載次數(shù): 28)
下載附件
2024-1-13 02:00 上傳
單片機源程序如下:
- /**************************************************************************************
- 矩陣鍵盤:
- 0 1 2 3
-
- 4 5 6 7
-
- 8 9 返回 確定
-
- [ DISCUZ_CODE_1 ]nbsp; [ DISCUZ_CODE_1 ]nbsp; [ DISCUZ_CODE_1 ]nbsp; [ DISCUZ_CODE_1 ]nbsp;
- ***************************************************************************************/
- #include "reg52.h"
- #include<intrins.h> //左右移函數(shù)
- #include "lcd.h"
- #include "key.h"
- #include "i2c.h"
- #define u16 unsigned int //對數(shù)據(jù)類型進行聲明定義
- #define u8 unsigned char
- sbit AS=P2^2; //繼電器
- sbit beep=P2^3; //蜂鳴器
- sbit MOTOA = P3^0; //步進電機
- sbit MOTOB = P3^1;
- sbit MOTOC = P3^2;
- sbit MOTOD = P3^3;
- #define SPEED 200 //步進電機脈沖
- /*****************************************************************************/
- u8 pw_num,Error_Num,Error_Num1,PassWord_Length=6;
- u8 PASSWORD[]={8,8,8,8,8,8,0,0,0,0};
- u8 INPUT_PW_Tab[10];
- u8 key_num,Step,Step5,Load_first_flag=0;
- u8 dianping;
- /*******************************************************************************/
- bit result_flag,Input_suc_flag;
- bit List1=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 CipherComparison();
- void input_password(bit m);
- void Read_Password();
- void init_serialcomm( )
- {
- EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
- ES = 1; //允許UART串口的中斷
- TMOD = 0x20; //定時器T/C1工作方式2
- SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
- TH1 = 0xF3; //定時器初值高8位設(shè)置 //12MHZ晶振,波特率為4800 0xf3
- TL1 = 0xF3; //定時器初值低8位設(shè)置 //11.0592MHZ晶振,波特率為4800 0xf4 9600 0xfa 19200 0xfd
- PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
- TR1 = 1; //定時器啟動
- TI = 1;
- }
- void sendc(u8 ch)
- {
- SBUF=ch;
- while(!TI);
- TI=0;
- }
- void main()
- {
- u8 data1,a;
- // ShowString(0x00," Pechin Science ");
- // At24c02Write(0,0); //開機顯示密碼
- init_serialcomm(); /**************串口初始化*************/
- LcdWriteCom(0x01); //清屏
- for(data1=0;data1<PassWord_Length+2;data1++)
- {
- a=At24c02Read(data1)+0x30;
- LcdWriteData(a);
- delay(1000);
- }
-
- delay(1000);
- LcdInit();
- delay(1000);
- Step=0;
- Step5=0;
- Error_Num=0x00;
- Error_Num1=0x00;
- Read_Password();
-
- //保存 密碼長度
- // for(j=0;j<10;j++)
- // {
- // At24c02Write(j,j);
- // delay(100);
- // }
- //
- while(1)
- {
- key_num=KeyDown(); //讀取輸入值
- switch(Step)
- {
- case 0:
- {Step_0();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()
- {
- LcdInit();
- ShowString(0x00," Pechin Science "); //第一行顯示Pechin Science
- ShowString(0x10," WELCOME! "); // 第二行顯示 WELCOME!
- while(KeyDown()==0xff)Step=1; // 有按鍵按下進入下一步
- }
- /*******************************************************************************/
- void Step_1()
- {
- LcdWriteCom(0x01); //清屏
- ShowString(0x00,"Unlock");
- ShowString(0x0f,"<"); //1602第一行顯示unlock
- ShowString(0x10,"Change Password");
- ShowString(0x1f," "); // 1602第二行顯示Change Password
- Step=2; //
- }
- /*******************************************************************************/
- void Step_2()
- {
- if(key_num!=0x0b)
- {
- if((key_num==0x01) ||( key_num==0x09)) //1鍵或9鍵按下
- {
- List1=~List1; //Change Password
- if(List1==0)
- {
- ShowString(0x0f,"<"); // Unlock <
- ShowString(0x1f," "); // Change Password
- }
- else
- {
- ShowString(0x0f," "); // Unlock
- ShowString(0x1f,"<"); // Change Password <
- }
- }
- }
- else //確認(rèn)鍵按下
- {
- if(List1==0){Step=3;}
- else {Step=5;List1=0;}
- }
- }
- /*******************************************************************************/
- void Step_3()
- {
- Step=4;
- pw_num=0;
- LcdInit();
- ShowString(0x00,"Pass Word: ");
- }
- /*******************************************************************************/
- void Step_4()
- {
- input_password(0); //輸入密碼并以*顯示
- if(Input_suc_flag==1){Step=6;} //密碼輸入完成進入下一步
- Input_suc_flag=0; //清除密碼輸入完成標(biāo)志
- }
- /*******************************************************************************/
- 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 Step_6()
- {
- u8 i=0;
- u8 j=0;
- CipherComparison(); //密碼比對
- if(result_flag==1) //密碼正確
- {
- LcdInit();
- ShowString(0x00," WELCOME!");
- AS=0; //開繼電器
- dianping=1;//串口數(shù)據(jù),表示鎖開
- sendc(dianping);
- delay(SPEED);
- for(;j<5;j++)
- {
- MOTOA = 1;
- MOTOB = 0;
- MOTOC = 1;
- MOTOD = 1;
- delay(SPEED);
- MOTOA = 1;
- MOTOB = 1;
- MOTOC = 1;
- MOTOD = 0;
- delay(SPEED);
- MOTOA = 0;
- MOTOB = 1;
- MOTOC = 1;
- MOTOD = 1;
- delay(SPEED);
- MOTOA = 1;
- MOTOB = 1;
- MOTOC = 0;
- MOTOD = 1;
- delay(SPEED);
- }
- delay(60000);
- AS=1; //關(guān)繼電器
- dianping=0;//串口數(shù)據(jù),表示鎖關(guān)
- sendc(dianping);
- delay(SPEED);
- for(j=0;j<5;j++) //電機反轉(zhuǎn)
- {
- MOTOA = 1;
- MOTOB = 1;
- MOTOC = 0;
- MOTOD = 1;
- delay(SPEED);
- MOTOA = 0;
- MOTOB = 1;
- MOTOC = 1;
- MOTOD = 1;
- delay(SPEED);
- MOTOA = 1;
- MOTOB = 1;
- MOTOC = 1;
- MOTOD = 0;
- delay(SPEED);
-
- MOTOA = 1;
- MOTOB = 0;
- MOTOC = 1;
- MOTOD = 1;
- delay(SPEED);
- }
- }
- else //密碼錯誤
- {
- if(Error_Num1<2) //輸出錯誤次數(shù)小于3
- {
- Error_Num1++;
- LcdInit();
- ShowString (0x00,"Error !");
- delay(20000);
- for(;i<200;i++) //密碼錯誤報警
- {
- beep=~beep;
- delay(10);
- Step=0;
- }
- else //密碼錯誤次數(shù)大于3
- {
- ShowString (0x00," Warning !");
- for(;i<250;i++) //防試探報警
- {
- beep=~beep;
- delay(50);
- }
- Error_Num1=0;
- Step=0;
- }
- }
- Step=0;
- }
- /****************************************************************************************
- 密碼輸入函數(shù),密碼長度:pw_num
- 密碼輸入完成標(biāo)志:Input_suc_flag
- *****************************************************************************************/
- void Step5_0()
- {
- LcdWriteCom(0x01); //清屏
- ShowString (0x00,"Input PassWord:"); //1602顯示:輸入密碼
- Step5=1;
- pw_num=0;
- }
- void Step5_1()
- {
- input_password(0); //輸入密碼并以*顯示
- if(Input_suc_flag==1) //密碼輸入完成
- {
- Step5=2;
- Input_suc_flag=0; //清除密碼輸入完成標(biāo)志
- }
- }
- void Step5_2()
- {
- CipherComparison(); //密碼比對
- Step5=3;
- }
- void Step5_3()
- { u8 i=0;
- if(result_flag==0) //密碼錯誤
- {
- if(Error_Num<2) //輸出錯誤次數(shù)小于3
- {
- Error_Num++;
- LcdInit();
- ShowString (0x00,"Error !");
- delay(20000);
- Step5=0;
- }
- else //密碼錯誤次數(shù)大于3
- {
- ShowString (0x00," Warning !");
- for(;i<250;i++) //防試探報警
- {
- beep=~beep;
- delay(50);
- }
- Error_Num=0;
- Step=0;
- }
- }
- else //密碼正確
- {
- LcdInit();
- ShowString (0x00,"New PassWord:");
- pw_num=0;
- Step5=4;
- }
- }
- void Step5_4()
- {
- u8 i=0;
- input_password(1); //輸入密碼并顯示
- if(Input_suc_flag==1) //輸入完成
- {
- Step5=5;
- Input_suc_flag=0;
- LcdWriteCom(0x01); //清屏
- for(;i<100;i++) //密碼修改成功提示音
- {
- beep=~beep;
- delay(10);
- }
- ShowString (0x00," OK!");
- }
- }
- void Step5_5()
- {
- unsigned char j;
- PassWord_Length=pw_num; //讀取輸入密碼長度
- At24c02Write(0,Load_first_flag);
- delay(100);
- At24c02Write(1,PassWord_Length); //保存 密碼長度
- delay(100);
- for(j=0;j<PassWord_Length;j++)
- {
- PASSWORD[j]=INPUT_PW_Tab[j]; //讀取密碼
- At24c02Write(j+2,INPUT_PW_Tab[j]); //保存密碼至EEPROM
- delay(100);
- }
- Step5=0;
- Step=0;
- }
- void Read_Password()
- {
- unsigned char j;
- Load_first_flag=At24c02Read(0x00);
- // if(Load_first_flag==0) //初次運行 初始密碼錯誤可以將此句打開重新編譯下載
- {
- Load_first_flag=1;
- At24c02Write(0,0x01);
- delay(100);
- At24c02Write(1,0x06); //寫默認(rèn)密碼長度6至EEPROM
- delay(100);
- for(j=0;j<PassWord_Length;j++)
- {
- At24c02Write(j+2,8); //寫默認(rèn)密碼888888至EEPROM
- PASSWORD[j]=INPUT_PW_Tab[j]; //讀密碼
- delay(100);
- }
- }
-
- Load_first_flag=At24c02Read(0x00);
- PassWord_Length=At24c02Read(0x01); //讀取密碼長度
- for(j=0;j<PassWord_Length;j++) //讀取密碼
- {
- PASSWORD[j]=At24c02Read(j+2);
- }
- }
- void input_password(bit m)
- {
- unsigned char j;
- if(key_num!=0x0b) //ok鍵沒有按下
- {
- if(key_num<0x0a) //1-9按下
- {
- INPUT_PW_Tab[pw_num]=key_num; //保存至輸入密碼數(shù)組
- pw_num=pw_num+1; //密碼長度+1
-
- LcdWriteCom(0xc0);
- for(j=0;j<pw_num;j++)
- {
- if(m==0) {LcdWriteData('*'); } //密碼隱藏
- else {LcdWriteData(INPUT_PW_Tab[j]+0x30);} //顯示密碼
- }
- }
- if(key_num==0x0a) //返回鍵按下
- {
- if(pw_num!=0) {pw_num=pw_num-1;}
- else {Step=0;}
-
- // ShowString (0x00,"Pass Word:");
- LcdWriteCom(0xc0);
-
- for(j=0;j<pw_num;j++)
- {
- if(m==0) {LcdWriteData('*'); } //密碼隱藏
- else {LcdWriteData(INPUT_PW_Tab[j]+0x30);} //顯示密碼
- }
- LcdWriteData(' ');
- }
- }
- else //ok鍵按下
- {
- if(pw_num==0)
- {
- Step=0;
- LcdWriteCom(0x01);
- ShowString (0x00,"Error 02!");
- delay(10000);
- }
-
- else
- {
- Input_suc_flag=1;
- }
- //AS=0;
- }
- }
- /*******************************************************
- 密碼比對
- ********************************************************/
- void CipherComparison()
- {
- u8 i,j=0;
- if(PassWord_Length==pw_num) //密碼長度比對
- {
- for(i=0;i<PassWord_Length;i++) //密碼比對
- {
-
- if(PASSWORD[i]!=INPUT_PW_Tab[i])
- {
- result_flag=0;break; //密碼錯誤
- }
- else
- {
- result_flag=1; //密碼正確
- }
- INPUT_PW_Tab[i]=0XFF; //清除密碼緩存數(shù)組
- }
- }
- else
- {result_flag=0;}
-
- }
復(fù)制代碼
所有資料51hei附件下載:
電子密碼鎖51單片機設(shè)計(實物 仿真).7z
(186.5 KB, 下載次數(shù): 27)
2024-1-13 02:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|