1.“輸入”按鍵:每次需要輸入密碼必須按“輸入”按鍵,否則無法輸入密碼,若輸入密碼正確,則提示正確信息,否則提示錯誤信息并報警,10S內不允許重新輸入密碼。
2.“確認”按鍵:同于確認密碼輸入完成。
3.“修改密碼”按鍵:需要修改密碼,在輸入正確密碼后可按此按鍵進行修改。
4. 鎖的初始密碼是123456(密碼長度為6位,超過6位再次輸入則無效)。
5. 開鎖10秒后不允許更改密碼、并提示修改超時_進入初始態,需要重新輸入密碼方可再次修改密碼。
6. 系統未使用存儲器存儲密碼故掉電后密碼自動恢復為初始密碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
開機界面.png (97.76 KB, 下載次數: 82)
下載附件
開機界面
2021-12-20 17:26 上傳
輸入密碼.png (122.61 KB, 下載次數: 83)
下載附件
輸入密碼
2021-12-20 17:26 上傳
修改密碼.png (129.11 KB, 下載次數: 74)
下載附件
修改密碼
2021-12-20 17:26 上傳
程序流程圖:
主程序流程圖.png (42.22 KB, 下載次數: 68)
下載附件
2021-12-20 22:45 上傳
計時部分流程圖.png (24.74 KB, 下載次數: 76)
下載附件
2021-12-20 22:45 上傳
按鍵控制部分流程圖.png (50.93 KB, 下載次數: 105)
下載附件
2021-12-20 22:45 上傳
主程序
- #include"KeyBord.h"
- #include"LCD1602.h"
- #include"Timer.h"
- #include"string.h"
- sbit Unlock_Led = P2^1; //開鎖顯示燈
- sbit Beep = P2^2; //蜂鳴器
- unsigned char Key_Num = 0; //按鍵值
- unsigned char input_flag = 0; //輸入標志位
- unsigned char change_flag = 0; //修改密碼標志位
- unsigned char Set_password = 0; //設定密碼
- unsigned char Pass_Num[6]; //數組用于存放輸入的密碼
- unsigned char Pass_Temp[6]; //中間變量存儲數組
- unsigned char Pass_Word[6] = {1,2,3,4,5,6}; //轉換成液晶顯示的字符
- void Key_Control();
- void main()
- {
- unsigned char i,j=0,num=0,count=0;
- LCD_Init(); //顯示屏初始化
- Timer0_Init(); //定時器初始化
- LCD_Write_Cmd(0x0F); //光標閃爍
- LCD_Write_Str(0,0,"FireFly Sci&Tech"); //初始顯示界面
- LCD_Write_Str(4,1,"Welcome!");
- while(1)
- {
- Key_Num = KeyPro();
- if(time_flag) //定時器計時10S,返回初始界面
- { //關閉定時器
- TR0 = 0; //定時標志位清零
- time_flag = 0;
- change_time =10;
- Set_password = 0;
- Unlock_Led = 0;
- Beep = 0;
- LCD_Write_Cmd(0x01); //清屏,并返回初始界面
- LCD_Write_Str(0,0,"FireFly Sci&Tech");
- LCD_Write_Str(4,1,"Welcome!");
- }
- if(Key_Num >= 12) //按鍵值是否大于12
- {
- if(Key_Num == 12) //輸入按鍵是否按下
- {
- LCD_Write_Cmd(0x01); //清屏,并進入輸入界面
- DelayMs(5);
- LCD_Write_Str(1,0,"PassWord:");
- TR0 = 0; //關閉定時器,重新設定定時時間,
- time_flag = 0;
- change_time =10;
- input_flag = 1; //輸入標志位置1
- Unlock_Led = 0; //開鎖顯示燈滅
- num = 0;
- i = 0;
- }
- else if(Key_Num == 13) //確認按鍵是否被按下
- {
- if(num == 6) //輸入密碼長度是否為6位
- {
- if(change_flag) //修改密碼標志位真
- {
- change_flag = 0;
- for(j = 0; j < 6; j++) //將密碼從中間數組導入密碼存儲數組
- {
- Pass_Word[j] = Pass_Temp[j];
- }
- LCD_Write_Cmd(0x01); //清屏,并進入密碼修改成功界面
- LCD_Write_Str(2, 0, "SET Success!");
- }
- else if(input_flag)
- {
- if(memcmp(Pass_Num, Pass_Word, 6) == 0) //將輸入的密碼與設置的密碼進行比對
- {
- LCD_Write_Cmd(0x01); //清屏,并進入密碼輸入正確界面
- LCD_Write_Str(1, 0, "PassWord Right");
- LCD_Write_Str(2, 1, "Door unlock");
- Set_password = 1; //設定密碼,10秒內可修改
- Unlock_Led = 1; //開鎖顯示燈亮
- input_flag = 0;
- }
- else
- {
- LCD_Write_Cmd(0x01); //清屏,并進入密碼輸入錯誤界面
- DelayMs(5);
- LCD_Write_Str(1, 0, "PassWord Error");
- change_time =10;
- TR0 = 1;
- Unlock_Led = 0;
- while(!time_flag)
- {
- Unlock_Led = ~Unlock_Led;
- Beep = ~Beep; //板子為無源蜂鳴器
- DelayUs2x(100);
- }
- }
- }
- change_time =10; //重新賦值定時時間,開定時器,輸入計數和顯示位置計數清零
- TR0 = 1;
- num = 0;
- i = 0;
- }
- }
- else if(Key_Num == 14) //修改密碼按鍵
- {
- if(Set_password) //如果在設定密碼時間內
- {
- LCD_Write_Cmd(0x01); //清屏,進入修改密碼界面
- DelayMs(5);
- LCD_Write_Str(1, 0, "New PassWord:");
- TR0 = 0;
- time_flag = 0;
- change_time =10;
- change_flag = 1;
- input_flag = 0;
- Set_password = 0;
- num = 0;
- i = 0;
- }
- }
- else if(Key_Num == 15) //取消修改密碼
- {
- if(change_flag)
- {
- LCD_Write_Cmd(0x01);
- DelayMs(5);
- LCD_Write_Str(1, 0, "Cancel Change!");
- TR0 = 1;
- change_flag = 0;
- num = 0;
- i = 0;
- }
- }
- }
- else if(Key_Num <= 9)
- {
- if(num < PASS_NUM) //輸入密碼計數小于6
- {
- if(input_flag) //輸入密碼標志位
- {
- Pass_Num[num] = Key_Num;
- LCD_Write_Char(3 + i, 1, '*');//依次顯示輸入字符
- }
- else if(change_flag) //修改密碼標志位
- {
- Pass_Temp[num] = Key_Num;
- LCD_Write_Char(3 + i, 1, ('0' + Pass_Temp[num]));//依次顯示輸入字符
- }
- num++;
- i++;
- }
- }
- }
- }
復制代碼
Keil代碼與Proteus8.8仿真下載:
電子密碼鎖.rar
(542.69 KB, 下載次數: 294)
2021-12-20 17:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|