|
6位密碼 123123
管理員密碼 520025
電子密碼鎖原理圖如下:
矩陣鍵盤(pán)按鍵說(shuō)明
1 2 3 確認(rèn)鍵
4 5 6 手動(dòng)關(guān)閉鎖
7 8 9 修改密碼
密碼還原 0 刪除鍵 退出鍵
電子密碼鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
proteus仿真圖
制作出來(lái)的電子密碼鎖實(shí)物圖:
接電磁鎖說(shuō)明
產(chǎn)品本身是不帶電磁鎖的,買(mǎi)家可以自己外接也可以和我們聯(lián)系購(gòu)買(mǎi)。如果要接電磁鎖的話,需要外接電磁鎖的電源,我們是用的12V的電磁鎖,外接了12V的直流電源,照片和視頻里面沒(méi)有拍出來(lái)。
請(qǐng)買(mǎi)家自己要理解的是繼電器只是相當(dāng)一個(gè)開(kāi)關(guān),只是開(kāi)和關(guān),上面是沒(méi)有電壓和電流的,需要自己外接電磁鎖的電源。
買(mǎi)多少V的電磁鎖就要買(mǎi)多少V的直流電源供電。
根據(jù)設(shè)定好的密碼,采用4×4鍵盤(pán)實(shí)現(xiàn)密碼的輸入功能,當(dāng)密碼輸入正確之后,鎖就打開(kāi),如果輸入的密碼不正確,就鎖定按鍵3秒鐘,同時(shí)發(fā)出報(bào)警聲。
(1)單片機(jī)型號(hào)可選STC89C52。
(2)6位密碼的設(shè)定在程序中完成。
(3)密碼的輸入采用4×4鍵盤(pán)實(shí)現(xiàn),輸入6位數(shù)字后,按回車(chē)鍵結(jié)束。
(4)若輸入的密碼正確,鎖打開(kāi),同時(shí)用發(fā)光二極管亮1秒作為提示。
(5)報(bào)警可采用蜂鳴器或揚(yáng)聲器。
四、設(shè)計(jì)思路與方案
1.系統(tǒng)框圖
2. 組成部分
電子密碼鎖的設(shè)計(jì)主要由三部分組成:4×4矩陣鍵盤(pán)接口電路、顯示電路、報(bào)警電路。
(1)4×4矩陣鍵盤(pán)接口電路:設(shè)置6位密碼,通過(guò)鍵盤(pán)輸入密碼,若密碼正確,則鎖就打開(kāi)。密碼可以由用戶自己在程序中修改設(shè)定(只支持6位密碼)。
(2)顯示電路:當(dāng)密碼輸入時(shí),按下一個(gè)數(shù)字鍵, 一個(gè)“-”就顯示在最右邊的數(shù)碼管上,同時(shí)將先前輸入的所有“-”向左移動(dòng)一位。
(3)報(bào)警電路:由蜂鳴器和一個(gè)發(fā)光二極管組成。當(dāng)密碼輸入正確時(shí),發(fā)光二極管亮1秒鐘。若密碼輸入錯(cuò)誤,則蜂鳴器發(fā)出報(bào)警聲提示,同時(shí)鍵盤(pán)鎖定3秒鐘。
3.設(shè)計(jì)的關(guān)鍵問(wèn)題
電子密碼鎖設(shè)計(jì)的關(guān)鍵問(wèn)題是實(shí)現(xiàn)密碼的輸入、清除、確認(rèn)等功能:
(1) 密碼輸入功能:按下一個(gè)數(shù)字鍵,一個(gè)“-”就顯示在最右邊的數(shù)碼管上,同時(shí)將先前輸入的所有“-”向左移動(dòng)一位。
(2)清除功能:當(dāng)按下清除鍵時(shí),清除前面輸入的所有值,并清除所有顯示。
(3)確認(rèn)功能:當(dāng)按下確認(rèn)鍵,系統(tǒng)將輸入的密碼與內(nèi)設(shè)密碼進(jìn)行檢查核對(duì),如果正確,鎖打開(kāi),否則不打開(kāi)。
單片機(jī)源程序如下:
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
- uchar value,i; //變量
- sbit relay = P2^2; //繼電器定義
- sbit beep = P3^3; //蜂鳴器定義
- sbit beiguan = P2^3; //背光
- uint flag_time;
- uint flag_guan;
- uchar smg_i;
- uchar dis_smg[7]={0};
- uchar password[7]={6,5,4,3,2,1}; //密碼保存
- uchar password_bj[7]={1,2,3,4,5,6}; //密碼比較
- uchar code password_r[6] = {1,2,3,1,2,3} ;
- uchar code password_gl[6] = {5,2,0,0,2,5} ;
- uchar password_xg[6]; //密碼修改
- uchar flag_password; //密碼正確否
- uchar flag_password_cichu1;//密碼錯(cuò)誤次數(shù)
- bit flag_200ms=1; //200ms標(biāo)志位
- uchar key_can;
- uchar menu_1,menu_i;
- sbit scl = P2^1; //24C02 IO口定義
- sbit sda = P2^0; //24C02 IO口定義
- uchar code table_num[]="0123456789abcdefg";
- sbit rs=P2^5; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit rw=P2^6; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit e =P2^7; //片選信號(hào) 下降沿觸發(fā)
- /***********************延時(shí)函數(shù)************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /***********************lcd1602寫(xiě)命令函數(shù)************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602寫(xiě)數(shù)據(jù)函數(shù)************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /*********************光標(biāo)控制***********************/
- void lcd1602_guanbiao(uchar open_off,uchar add)
- {
- if(open_off == 1) //開(kāi)光標(biāo)
- {
- write_com(0x80+add); //將光標(biāo)移動(dòng)到秒個(gè)位
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- else
- {
- write_com(0x0c); //關(guān)光標(biāo)
- }
- }
- /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
- void write_sfm2(uchar hang,uchar add,uchar date)
- {
- uchar shi,ge;
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- shi=date%100/10;
- ge=date%10;
- write_data(0x30+shi);
- write_data(0x30+ge);
- }
- /***********************lcd1602上顯示這字符函數(shù)************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- delay_uint(50);
- }
- }
- /***********************lcd1602初始化設(shè)置************************/
- void init_1602()
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- write_string(1,0," Password Lock ");
- write_string(2,0," Input: ");
- lcd1602_guanbiao(1,7+0x40); //開(kāi)光標(biāo)
- }
- /***************啟始信號(hào) ***************************/
- void start()
- {
- sda = 1;
- scl = 1;
- sda = 0;
- scl = 0;
- }
- /****************結(jié)束信號(hào) **************************/
- void stop()
- {
- sda = 0;
- scl = 1;
- sda = 1;
- scl = 0;
- }
- /*****************檢測(cè)應(yīng)答*************************/
- void ack()
- {
- uchar i;
- sda = 1;
- scl = 1;
- while((i < 100) & (sda == 1)) i++;
- scl =0;
- }
- void ack_zhuji()
- {
- sda = 0;
- scl = 1;
- scl = 0;
- sda = 1;
- }
- /*****************非應(yīng)答*************************/
- void no_ack()
- {
- sda = 1;
- scl = 1;
- scl = 0;
- }
- /*****************寫(xiě)一個(gè)字節(jié)*************************/
- void write_iic(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- scl = 0;
- dat <<= 1 ;
- sda = CY;
- scl = 1;
- }
- scl = 0;
- }
- /*******************讀一個(gè)字節(jié)***********************/
- uchar read_iic()
- {
- uchar i,value;
- for(i=0;i<8;i++)
- {
- scl = 1;
- value <<= 1;
- if(sda == 1)
- value |= 0x01;
- scl = 0;
- }
- return value;
- }
- /*****************向24C02寫(xiě)一個(gè)字節(jié)進(jìn)去*************************/
- void write_24c02(uchar add,uchar dat)
- {
- start();
- write_iic(0xa0);
- ack();
- write_iic(add);
- ack();
- write_iic(dat);
- no_ack();
- stop();
- }
- /******************從24C02讀一個(gè)字節(jié)進(jìn)去************************/
- uchar read_24c02(uchar add)
- {
- uchar value;
- start();
- write_iic(0xa0);
- ack();
- write_iic(add);
- ack();
- start();
- write_iic(0xa1);
- ack();
- value = read_iic();
- no_ack();
- stop();
- return value;
- }
- /*****************向24C02寫(xiě)多個(gè)字節(jié)進(jìn)去*************************/
- void write_24c02_8(uchar n,uchar add,uchar *p)
- {
- uchar i;
- EA = 0;
- start();
- write_iic(0xa0);
- ack();
- write_iic(add);
- for(i=0;i<n;i++)
- {
- ack();
- write_iic(*p);
- p++;
- }
- no_ack();
- stop();
- EA = 1;
- }
- /******************從24C02讀多個(gè)字節(jié)進(jìn)去************************/
- void read_24c02_8(uchar n,uchar add,uchar *p)
- {
- uchar i;
- EA = 0;
- start();
- write_iic(0xa0);
- ack();
- write_iic(add);
- ack();
- start();
- write_iic(0xa1);
- ack();
- for(i=0;i<n;i++)
- {
- p[i] = read_iic();
- if(i == n-1)
- {
- ack();
- stop();
- }
- else
- ack_zhuji();
- }
- EA = 1;
- }
- /***********************1ms延時(shí)函數(shù)*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- void key() //獨(dú)立按鍵程序
- {
- static uchar key_new = 0, key_l;
- key_can = 20; //按鍵值還原
- P1 = 0x0f;
- if((P1 & 0x0f) != 0x0f) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動(dòng)
- if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
- { //確認(rèn)是按鍵按下
- key_new = 0;
- key_l = (P1 | 0xf0); //矩陣鍵盤(pán)掃描
- P1 = key_l;
- switch(P1)
- {
- case 0xee: key_can = 1; break; //得到按鍵值
- case 0xde: key_can = 4; break; //得到按鍵值
- case 0xbe: key_can = 7; break; //得到按鍵值
- case 0x7e: key_can = 10; break; //得到按鍵值
-
- case 0xed: key_can = 0; break; //得到按鍵值
- case 0xdd: key_can = 8; break; //得到按鍵值
- case 0xbd: key_can = 5; break; //得到按鍵值
- case 0x7d: key_can = 2; break; //得到按鍵值
-
- case 0xeb: key_can = 3; break; //得到按鍵值
- case 0xdb: key_can = 6; break; //得到按鍵值
- case 0xbb: key_can = 9; break; //得到按鍵值
- case 0x7b: key_can = 11; break; //得到按鍵值
-
- case 0xe7: key_can = 15; break; //得到按鍵值
- case 0xd7: key_can = 14; break; //得到按鍵值
- case 0xb7: key_can = 13; break; //得到按鍵值
- case 0x77: key_can = 12; break; //得到按鍵值
- }
- }
- }
- else
- {
- key_new = 1;
- }
- }
- /***************把數(shù)組清空**********************/
- void clear_shuzu(uchar *p)
- {
- for(i=0;i<7;i++)
- p[i] = 0;
- }
- /*************定時(shí)器0初始化程序***************/
- void time_init()
- {
- EA = 1; //開(kāi)總中斷
- TMOD = 0X01; //定時(shí)器0、工作方式1
- ET0 = 1; //開(kāi)定時(shí)器0中斷
- TR0 = 1; //允許定時(shí)器0定時(shí)
- }
- /******************下載程序密碼初始化**********************/
- void password_chushifa()
- {
- scl = 0;
- value = read_24c02(10) ;
- if(value != 75)
- {
- value = 75;
- beep = 0;
- write_24c02(10,value);
- delay_1ms(200);
- write_24c02_8(6,0,password_r);
- delay_1ms(200);
- read_24c02_8(6,0,password);
- beep = 1;
- }
- }
- /****************按鍵功能處理********************/
- void key_with()
- {
- static uchar value;
- if(key_can == 14) //手動(dòng)關(guān)閉密碼鎖
- relay = 1;
- if(menu_1 == 0)
- {
- if(key_can <= 9)
- if(menu_i < 6) //密碼輸入
- {
- menu_i ++;
- if(menu_i > 6)
- menu_i = 6;
- smg_i = menu_i;
- for(i=6;i>0;i--)
- password_bj[i] = password_bj[i-1];
- password_bj[0] = key_can;
- for(i=0;i<smg_i;i++)
- dis_smg[i] ='*';//0x30 + password_bj[i];
- write_string(2,7,dis_smg);
- lcd1602_guanbiao(1,7 + menu_i + 0x40); //開(kāi)光標(biāo)
- }
- if(key_can == 11) //密碼刪除
- {
- for(i=0;i<menu_i;i++)
- password_bj[i] = password_bj[i+1];
- menu_i --;
- password_bj[menu_i] = ' ';
- dis_smg[menu_i] = ' ';
- write_string(2,7,dis_smg);
- lcd1602_guanbiao(1,7 + menu_i + 0x40); //開(kāi)光標(biāo)
- }
- if(key_can == 15) //確認(rèn)鍵
- {
- value = 0;
- for(i=0;i<6;i++)
- {
- if(password_bj[i] == password_gl[i]) //判斷管理員密碼
- {
- value ++;
- if(value >= 6) //密碼正確
- {
- write_string(2,0," return ");
- beep = 0;
- delay_1ms(200);
- read_24c02_8(6,0,password);
- beep = 1;
- delay_1ms(2000);
- }
- }
- }
- if(value < 6)
- for(i=0;i<6;i++)
- {
- if(password_bj[i] == password[i])
- {
- flag_password = 1; //密碼正確
- relay = 0; //打開(kāi)密碼鎖
- for(i=0;i<6;i++)
- dis_smg[i] = 0xbf;
- }
- else
- {
- flag_password = 0;
- flag_password_cichu1 ++;
- write_string(1,0," Password error ");
- write_string(2,0," cishu: ");
- write_sfm2(2,9,flag_password_cichu1);
- delay_1ms(280);
-
- for(i=0;i<6;i++)
- {
- beep = ~beep;
- delay_1ms(200);
- }
- beep = 1;
- delay_1ms(800);
- break; //密碼不正確
- }
- }
- clear_shuzu(dis_smg);
- write_string(1,0," Password Lock ");
- write_string(2,0," Input: ");
- lcd1602_guanbiao(1,7+0x40); //開(kāi)光標(biāo)
- menu_i = 0;
- }
- }
- }
- /****************修改密碼********************/
- void xiugai_password()
- {
- if(key_can == 13) //修改密碼
- {
- if((relay == 0) && (menu_1 == 0))
- {
- menu_1 = 1; menu_i = 0;
- clear_shuzu(password_bj); //數(shù)據(jù)清空
- clear_shuzu(dis_smg);
- write_string(1,0,"Input1: ");
- write_string(2,0,"Input2: ");
- lcd1602_guanbiao(1,7); //開(kāi)光標(biāo)
- }
- }
- if(menu_1 == 1) //第一次輸入修改的密碼
- {
- if(key_can <= 9)
- {
- if(menu_i < 6)
- {
- menu_i ++;
- if(menu_i > 6)
- menu_i = 6;
- smg_i = menu_i;
- for(i=7;i>0;i--)
- password_bj[i] = password_bj[i-1];
- password_bj[0] = key_can;
- for(i=0;i<menu_i;i++)
- dis_smg[i] ='*';
- write_string(1,7,dis_smg);
- lcd1602_guanbiao(1,7 + menu_i); //開(kāi)光標(biāo)
- }
- }
- if(key_can == 11) //刪除鍵
- {
- for(i=0;i<menu_i;i++)
- password_bj[i] = password_bj[i+1];
- menu_i --;
- password_bj[menu_i] = ' ';
- dis_smg[menu_i] = ' ';
- write_string(1,7,dis_smg);
- lcd1602_guanbiao(1,7 + menu_i); //開(kāi)光標(biāo)
- }
- if(key_can == 15) //確定鍵
- {
- clear_shuzu(password_xg);
- clear_shuzu(dis_smg);
- lcd1602_guanbiao(1,8 + 0x40); //開(kāi)光標(biāo)
- menu_1 = 2;
- menu_i = 0;
- key_can = 20;
- }
- }
- if(menu_1 == 2) //第二次輸入修改的密碼
- {
- if(key_can <= 9)
- {
- if(menu_i < 6)
- {
- menu_i ++;
- if(menu_i > 6)
- menu_i = 6;
- for(i=5;i>0;i--)
- password_xg[i] = password_xg[i-1];
- password_xg[0] = key_can;
- for(i=0;i<menu_i;i++)
- dis_smg[i] ='*';//0x30 + password_xg[i];
- write_string(2,7,dis_smg);
- lcd1602_guanbiao(1,7 + menu_i + 0x40); //開(kāi)光標(biāo)
- }
- }
- if(key_can == 11) //刪除鍵
- {
- for(i=0;i<menu_i;i++)
- password_xg[i] = password_xg[i+1];
- password_xg[menu_i] = ' ';
- dis_smg[menu_i] = ' ';
- write_string(2,7,dis_smg);
- lcd1602_guanbiao(1,7 + menu_i + 0x40); //開(kāi)光標(biāo)
- }
- if(key_can == 15) //確定鍵
- {
- for(i=0;i<6;i++)
- {
- if(password_bj[i] == password_xg[i])
- {
- flag_password = 1; //兩次輸入的密碼一樣
- }
- else
- {
- flag_password = 0;
- write_string(1,0," Password Error ");
- write_string(2,0," reenter ");
- delay_1ms(300);
- for(i=0;i<6;i++)
- {
- beep = ~beep; //提示三聲
- delay_1ms(300);
- }
- beep = 1;
- delay_1ms(1000);
- break; //密碼不正確
- }
- }
- if(flag_password == 1) //兩次輸入的密碼一樣的
- {
- for(i=0;i<6;i++)
- {
- write_string(1,0," Password ");
- write_string(2,0," Succeed ");
- password[i] = password_bj[i]; //保存密碼
- }
- write_24c02_8(6,0,password);
- delay_1ms(300);
- beep = 0;
- delay_1ms(2000);
- beep = 1;
- }
- clear_shuzu(password_xg);
- clear_shuzu(dis_smg);
- write_string(1,0," Password Lock ");
- write_string(2,0," Input: ");
- lcd1602_guanbiao(1,7+0x40); //開(kāi)光標(biāo)
- menu_1 = 0;
- menu_i = 0;
- }
- }
- }
- /******************主程序**********************/
- void main()
- {
- static uint value ;
- password_chushifa();
- time_init(); //定時(shí)器初始化
- read_24c02_8(6,0,password);
- init_1602();
- beiguan = 0;
- while(1)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
單片機(jī)電子密碼鎖 1602 6位.7z
(1.21 MB, 下載次數(shù): 668)
2022-12-11 03:32 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|