51單片機的電子密碼鎖的設計與仿真
看看效果圖
- 簡介
(1)CPU使用51單片機。
(2)用4x4矩陣鍵盤作爲操作信息輸入。
(3)用LCM1602液晶顯示模塊作爲信息顯示。
(4)用蜂鳴器及發光二極管作爲錯誤報警及狀態顯示。
- 功能
(1)輸入密碼功能。
輸入密碼時,用“★”號或“-”代替真實的密碼以防密碼泄露。在
輸入密碼時,具有清除前一位/或多位的密碼功能(用清除鍵)。
密碼輸入完畢,按(確認/開鎖鍵)確認並生效。
(2)上鎖功能。
在鎖開狀態下,通過上鎖鍵上鎖。
(3)在鎖合的狀態下,通過輸入密碼開鎖功能。
開鎖時,先按確認/開鎖鍵後,再在鍵盤上輸入六位密碼,然後按
確認/開鎖鍵,如果密碼正確,進入鎖開狀態。
(4)在鎖開狀態下,設置新密碼功能。
按設置新密碼鍵,在鍵盤上輸入六位新的密碼,按(確認/開鎖)
鍵確認,代替舊密碼。
(5)在開鎖時,如果輸入密碼三次錯誤,產生聲、光報警功能。
每錯誤一次,告警一次, 若連續三次錯誤,則系統屏蔽輸入功能,
直到系統復位後重新開始。
程序設計
定義LCD管腳以及led燈以及蜂鳴器管腳
定義LCD顯示的字符串以及初始化變量
矩陣鍵盤掃描
/*
* @description : 矩陣鍵盤掃描
* @param :無
* @return : 無
*/
void KeyDown(void)
{
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(3);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{ //TR1=0;
//測試列
//LED=~LED;
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while(GPIO_KEY!=0xf0); //檢測按鍵鬆手檢測
return ;
}
}
KeyValue = 0xff;
}
```掃描按鍵
```c
/*
* @description : 按鍵掃描 並且執行相應的操作
* @param :無
* @return : 無
*/
void Input_Key()
{
//刷新按鍵的值若沒有按鍵按下則返回0xff
KeyDown();
if(KeyValue == 0xff||pw_errnum>=3)return;//檢測是否有按鍵按下,或者是否有
//當1-9按下時
if(KeyValue>=0&&KeyValue<=9)
{
if((flag == 0 || flag ==2)&&pw_count<6)
{
pw_count++;//密碼下標
temp_pw[pw_count] = KeyValue;//保存按鍵值
show_pw(pw_count); //屏幕顯示*
}
}
else if(KeyValue == 12)//上鎖鍵
{
if(flag == 1) //如果設備在開鎖時按下
{
flag = 0;
show_Status(&input_pw);//顯示請輸入密碼
}
}
else if(KeyValue == 13)//按下了清除鍵
{
if(pw_count>0)pw_count--;//下標左移
show_pw(pw_count); //刷新屏幕密碼
}
else if(KeyValue == 14)//按下了確定鍵
{
if(pw_count == 6) //判斷數量是否有6位
{
if(flag == 0) //鎖關閉狀態
{
if(temp_pw[0] == pw[0]&&temp_pw[1] == pw[1]&&temp_pw[2] == pw[2]&&temp_pw[3] == pw[3]&&temp_pw[4] == pw[4]&&temp_pw[5] == pw[5])//校驗密碼
{
show_Status(&welcome);//顯示歡迎您
flag = 1; //切換狀態
pw_count = 0; //密碼清0
pw_errnum = 0; //錯誤密碼次數清0
show_pw(pw_count); //刷新屏幕密碼
open(); //執行開門時的回調函數
}
else{
pw_errnum++; //錯誤次數+1
pw_count = 0; //密碼清0
show_pw(pw_count); //刷新屏幕密碼
show_Status(&pw_error); //顯示密碼錯誤
alarm(); //發出警告
if(pw_errnum>=3) //當密碼錯誤達到3次時
{
show_Status(&Lock); //顯示設備鎖了
Lock_Device(); //報警 轟炸模式
}
}
}
else if(flag == 1)//鎖打開狀態,按下確定鍵無反應
{
}
else if(flag == 2)//設置密碼狀態 保存新密碼
{
//保存密碼
pw[0] = temp_pw[0];
pw[1] = temp_pw[1];
pw[2] = temp_pw[2];
pw[3] = temp_pw[3];
pw[4] = temp_pw[4];
pw[5] = temp_pw[5];
show_Status(&welcome); //顯示歡迎你
flag = 1; //標誌位置位
pw_count = 0; //密碼清0
show_pw(pw_count); //刷新屏幕密碼
}
}else{//密碼未到6位不能操作
// LED = 0;
}
}
else if(KeyValue == 15)//按下了設置密碼鍵
{
if(flag == 1) //判斷鎖是否已經打開,打開才能設置密碼
{
show_Status(set_pw);//顯示新的標題
flag = 2; //標誌位改成設置密碼
}
}
}
需要的可以自己去下載哦!
需要該源碼的可以關注公衆號:智慧小巷
回覆:電子密碼鎖
即可!