51單片機的電子密碼鎖的設計與仿真

51單片機的電子密碼鎖的設計與仿真

看看效果圖
在這裏插入圖片描述

  1. 簡介

(1)CPU使用51單片機。
(2)用4x4矩陣鍵盤作爲操作信息輸入。
(3)用LCM1602液晶顯示模塊作爲信息顯示。
(4)用蜂鳴器及發光二極管作爲錯誤報警及狀態顯示。

  1. 功能
    (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;         //標誌位改成設置密碼
				}
		}
}

需要的可以自己去下載哦!
需要該源碼的可以關注公衆號:智慧小巷
回覆:電子密碼鎖
即可!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章