|
在此分享一個自己原創制作的基于51單片機的電子密碼設計此電子密碼鎖的功能有:
(1)六位密碼輸入(如需修改密碼位數,請看注釋);
(2)不同的密碼權限,管理員有修改密碼,保持鎖常開,手動關鎖的功能,一般用戶沒有這些功能;
(3)定時關鎖(附件里的定時了五秒,如需修改,請看注釋);
(4)蜂鳴器報警;
(5)LCD1602顯示(有一般的并口驅動,和IIC驅動);
嗯,應該就這些。
如圖為Proteus仿真圖
X}]IBX`FAH[K65`6X0`FG13.png (51.38 KB, 下載次數: 65)
下載附件
2019-1-18 18:37 上傳
嗯,電磁鎖的原理跟繼電器的差不多(我也不是太懂),仿真中就用繼電器模擬電磁鎖的開關了,亮燈表示通電,門鎖上,滅燈表示斷電,門打開。
仿真中沒有斷電保護,也就是說,斷電后,密碼回到初始狀態,修改的密碼無效。我沒有用外部的存儲器保存數據,用的是51單片機自帶的EEPROM。實現斷電保護的程序一起打包了,不過注釋掉了,因為會影響仿真,燒到硬件上的恢復一下就好。具體怎么實現斷電保護有蠻多方式,可以在51hei論壇里找找。
這是部分程序,為了方便使用,我把驅動程序分成了.c和.h文件。修改一下對應的管腳就可以使用了。- #include "MAIN.h"
- int main(void){
-
- LOCK = 0; //關鎖
- BUZ = 1; //關蜂鳴器
- // ISP_Password_Read(); //從Flash或EEPROM中讀出密碼,進行初始化
- init_timer(); //初始化定時器
- LCD_init(); //顯示初始
- delayms(10);
- LCD_printf(0,0,"Please input");
- LCD_printf(1,0,"Password:");
- BUZ_time(5); //響鳴提示可以輸入密碼
- while(1){
- KEY_read(); //按鍵值讀取
- DISPLAY(); //顯示
- BUZ_cmd(); //蜂鳴器響應
- PassTiem(); //繼電器響應
- }
- }
- /****************************************
-
- 定時計數器初始化子程序
-
- *****************************************/
-
- void init_timer() {
-
- TMOD = 0X01; //設置T0為定時器,工作方式為1,16位定時/計數器
- TH0 = TH; //設置定時器0初值,定時50ms
- TL0 = TL;
- EA = 1; //中斷使能開
- ET0 = 1; //定時器0中開
- TR0 = 0; //定時器0關
- }
- /****************************************
- *
- * 定時器0中斷子程序
- *
- *****************************************/
- void timer_irs_0() interrupt 1{
-
- if(time < hold_time) { //這里設置定時為hold_time*50ms
- TH0 = TH; //重新賦值50
- TL0 = TL;
- time++;
- if(((hold_time - time) % 20) == 0){ //顯示剩余時間
- count[0] = '0' + ((hold_time - time) / 20) /10;
- count[1] = '0' + ((hold_time - time) / 20) %10;
- LCD_printf(1,9,count);
- BUZ_time(50);
- time++; //由于響鈴50ms,計時補償
- }
- }
- else {
- TR0 = 0; //定時器0關
- time = 0; //溢出標志清零
- LCD_WriteCommand(0X01); //清屏
- delayms(10);
- LCD_printf(0,0,"Closing!");
- BUZ_time(50); //響鳴提示已關鎖
- delayms(200);
- CLEAR(); //清空數據
-
- }
-
- }
- /****************************************
- LCD顯示程序
-
- 顯示操作信息,給用戶操作提示
- *****************************************/
- uchar DISPLAY(void){
- uchar t;
- if(flag_pass && flag_a){ //通過且為管理員,顯示Adm和剩余時間
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Welcome,Adm!");
- LCD_printf(1,0,"Passtime:");
- return 0x00;
- }
- if(flag_pass && !flag_a){ //通過但非管理員,顯示User和剩余時間
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Welcome,User!");
- LCD_printf(1,0,"Passtime:");
- return 0x00;
- }
- if(flag_error){ //不通過,錯誤顯示,顯示錯誤次數
- t = '0' + flag_error_time;
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Input,error!");
- LCD_printf(1,0,&t);
- return 0x00;
- }
- if(flag_m1){ //管理員按下M1/M2,顯示常開
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Passing!");
- LCD_printf(1,0,"Hold on!");
- return 0x00;
- }
- if(flag_m2){
- LCD_WriteCommand(0X01); //清屏
- delayms(10);
- LCD_printf(0,0,"Password Change");
- LCD_printf(1,0,"First :");
- return 0x00;
- }
- if(flag_lock){
- LCD_WriteCommand(0X01); //管理員按下LOCK,顯示準備關鎖
- delayms(10);
- LCD_printf(0,0,"Closing!");
- LCD_printf(1,0,"Attention!");
- return 0x00;
- }
- return 0x00;
- }
復制代碼
嗯。我也不是什么大神,寫的東西不是那么完美,如果有什么錯誤的地方,請多多包涵,打包的文件里有程序、仿真、硬件效果圖(都是用現成的模塊制作的,非自己做板,請別嫌棄)。如何修改程序以達到相應的效果,請看注釋的內容(我能注釋的都注釋了)。
0.png (47.7 KB, 下載次數: 62)
下載附件
2019-1-19 02:44 上傳
全部資料51hei下載地址:
電子密碼鎖制作.7z
(1.11 MB, 下載次數: 17)
2019-1-19 02:46 上傳
點擊文件名下載附件
仿真及程序,硬件效果圖 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|