|
2、測試數(shù)據(jù)(表格) 輸入數(shù)字 | | | | 000000(初始密碼) | | | | 10000 | | | | 30000 | | | |
12345 | | | code wrong! wrong 3 times lock the screen |
3、數(shù)據(jù)分析和結(jié)論
從實驗的數(shù)據(jù)來看,當(dāng)密碼正確時,LED燈全部亮,蜂鳴器不響,液晶顯示屏上顯示“code correct!”。當(dāng)密碼不正確時,LED燈不亮,蜂鳴器響,液晶顯示屏上顯示“code wrong!”。當(dāng)三次輸錯密碼時,LED燈順次亮滅,蜂鳴器響,液晶顯示屏上顯示“code wrong! wrong 3 times lock the screen”屏幕上鎖。
綜上所述此簡易密碼鎖完成了密碼設(shè)置功能、密碼輸入開鎖功能、輸入錯誤報警功能、輸入錯誤鎖屏功能。
五、系統(tǒng)使用說明
1、系統(tǒng)外觀及接口說明(實物照片)
程序?qū)懭牒螅螺d程序到單片機,要給單片機斷電(約1 秒即可),然后給單片機上電,上電之后,會把程序燒寫到單片機內(nèi)部。兩條數(shù)據(jù)線把單片機和電腦USB接口連接。下面為系統(tǒng)外觀及接口實物圖。
2、系統(tǒng)操作使用說明
獨立按鍵S1:選擇按鈕,可實現(xiàn)光標(biāo)左右移動進而設(shè)置密碼。
獨立按鍵S2:選擇按鈕,可實現(xiàn)光標(biāo)左右移動進而設(shè)置密碼。
獨立按鍵S3:確定按鈕,以確定密碼。
獨立按鍵S4:加法按鈕,可設(shè)置密碼。
獨立按鍵S5:減法按鈕,可設(shè)置密碼。
簡易密碼鎖的初始密碼為000000,用戶可以對其進行重新設(shè)置。當(dāng)用戶輸入密碼時,若密碼正確,LED燈全部亮,蜂鳴器不響,液晶顯示屏上顯示“code correct!”。當(dāng)密碼不正確時,LED燈不亮,蜂鳴器響,液晶顯示屏上顯示“code wrong!”。當(dāng)三次輸錯密碼時,LED燈順次亮滅,蜂鳴器響,液晶顯示屏上顯示“code wrong! wrong 3times lock the screen”屏幕上鎖。
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Key1 = P3^7;
- sbit Key2 = P3^6;
- sbit Key3 = P3^5;
- sbit Key4 = P3^4;
- sbit Key5 = P3^3;
- sbit Key6 = P3^2;
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^2;
- uchar K1num = 0; //控制主界面選項
- uchar K2num = 0; //控制密碼位數(shù)
- uchar wrong_num = 0; //記錄密碼錯誤次數(shù)
- uchar interface = 0; //各個界面的標(biāo)志位 1.主界面2.輸入密碼3.設(shè)置密碼4.重置密碼
- uchar code main1[] = {"1.input code"};
- uchar code main2[] = {"2.reset code"};
- uchar code input[] = {"input your code:"};
- uchar code reset[] = {"input new code:"};
- uchar code code_correct[] = {"code correct!"};
- uchar code code_wrong[] = {"code wrong!"};
- uchar code lockscreen1[] = {"wrong 3 times"};
- uchar code lockscreen2[] = {"lock the screen"};
- uchar code_display[] = {"000000"};
- uchar code_true[] = {"000000"};
- void keyscan(); //按鍵掃描函數(shù)
- void KeyInit(); //按鍵初始化
- void codeinit(); //顯示密碼初始化函數(shù)
- void savecode(); //保存密碼函數(shù)
- char judgecode(); //判斷密碼函數(shù)
- void delay(unsigned int ms); //延時函數(shù)
- void write_date(unsigned char date); //寫數(shù)據(jù)函數(shù)
- void write_com(unsigned char com); //寫指令函數(shù)
- void LCD_init(); //屏幕初始化函數(shù)
- void LCD_main(); //顯示主界面
- void LCD_inputcode(); //顯示輸入密碼界面
- void LCD_resetcode(); //顯示重置密碼界面
- void LCD_setcode(); //顯示設(shè)置密碼界面
- void LCD_codeture(); //顯示密碼正確界面函數(shù)
- void LCD_codewrong(); //顯示密碼錯誤界面函數(shù)
- void LCD_lockscreen(); //顯示鎖屏界面函數(shù)
- //***************延時函數(shù)********************************
- void delay(uint ms)
- {
- int i,j;
- for(i = 0;i < ms; i++)
- for(j = 0;j < 110;j++);
- }
- //***************顯示密碼初始化函數(shù)**********************
- void codeinit()
- {
- int i;
- for(i = 0; i < 6; i++)
- code_display[i] = '0';
- }
- //***************保存密碼函數(shù)**********************
- void savecode()
- {
- int i;
- for(i = 0; i < 6; i++)
- code_true[i] = code_display[i];
- }
- //***************判斷密碼函數(shù)**********************
- char judgecode()
- {
- int i;
- for(i = 0; i < 6;i++)
- {
- if(code_true[i] != code_display[i])
- break;
- }
- if(i < 6)
- return '0';
- else
- return '1';
- }
- //***************按鍵初始化函數(shù)**********************
- void KeyInit()
- {
- Key1 = 1; //給全部按鍵的io口賦高電平,等待檢測
- Key2 = 1;
- Key3 = 1;
- Key4 = 1;
- Key5 = 1;
- Key6 = 1;
- }
- //***************按鍵掃描函數(shù)**********************
- void keyscan()
- {
- char x;
- if(Key1 == 0 ) //Key1,菜單欄上下翻動按鍵
- {
- delay(5);
- if(Key1 == 0)
- {
- K1num++;
- while(!Key1);
- if(K1num == 1) //當(dāng)K1按鍵第一次被按下,菜單1閃爍
- {
- write_com(0x80); //設(shè)置光標(biāo)位置,1
- write_com(0x0f); //光標(biāo)閃爍
- // P2 = 0x0f; //測試用,下同
- }
- if(K1num == 2) //當(dāng)K1按鍵第二次被按下,菜單2閃爍
- {
- write_com(0x80+0x40); //設(shè)置光標(biāo)位置,2
- write_com(0x0f);
- // P2 = 0xf0;
- }
- if(K1num == 3) //當(dāng)K1按鍵第三次被按下,計數(shù)清零
- {
- K1num = 0;
- write_com(0x0c); //關(guān)閉光標(biāo)閃爍
- // P2 = 0xff;
- }
- }
- }
- if(Key2 == 0) //Key2,選擇鍵
- {
- delay(10);
- if(Key2 == 0)
- {
- while(!Key2);
- switch(interface) //判斷當(dāng)前處于哪一個界面
- {
- case 1 : //主界面
- {
- if(K1num == 1)
- {
- K1num = 0; //key1計數(shù)清零
- codeinit();
- LCD_inputcode(); //進入輸入密碼界面
- }
- if(K1num == 2)
- {
- K1num = 0;
- codeinit();
- LCD_resetcode(); //進入重置密碼界面
- }
- break;
- }
- case 2 : //輸入密碼界面
- case 3 : //設(shè)置密碼界面
- case 4 : //重置密碼界面
- {
- K2num ++;
- if(K2num == 6)
- K2num = 0;
- write_com(0x80+0x40+K2num); //設(shè)置光標(biāo)位置
- write_com(0x0f);
- break;
- }
-
- default:break;
- }
- }
- }
- if(Key3 == 0) //Key3,返回主界面鍵(確認鍵)
- {
- delay(10);
- if(Key3 == 0)
- {
- while(!Key3); //等待按鍵釋放
- K2num = 0; //重置K2按鍵次數(shù)
- if(interface == 2) //若處于輸入密碼界面
- {
- x = judgecode();
- if(x == '1') //需判斷密碼是否正確
- {
- LCD_codeture();
- P2 = 0; //燈亮代表門開
- delay(2000);
- P2 = 0xff;
- LCD_main(); //返回主界面
- }
- else
- {
- LCD_codewrong();
- delay(2000);
- codeinit();
- LCD_inputcode();
- if(wrong_num >= 3) //錯誤三次鎖死屏幕并報警
- {
- LCD_lockscreen();
- while(wrong_num >= 3)
- {
- P2 = 0xf0;
- delay(300);
- P2 = 0x0f;
- delay(300);
- }
- }
- }
- }
-
- if(interface == 4) //若處于重置密碼界面
- {
- savecode(); //需保存重置密碼
- codeinit();
- write_com(0xc0); //關(guān)閉光標(biāo)閃爍
- LCD_main(); //返回主界面
- }
- }
- }
- if(Key4 == 0) //Key4,數(shù)值+1
- {
- delay(10);
- if(Key4 == 0)
- {
- while(!Key4);
- code_display[K2num] ++;
- if( code_display[K2num] > '9' )
- code_display[K2num] = '0';
- if( code_display[K2num] < '0')
- code_display[K2num] = '9';
- if(interface == 2) //輸入密碼界面
- LCD_inputcode();
- if(interface == 4) //重置密碼界面
- LCD_resetcode();
- }
- }
- if(Key5 == 0) //Key5,數(shù)值-1
- {
- delay(10);
- if(Key5 == 0)
- {
- while(!Key5);
- code_display[K2num] --;
- if( code_display[K2num] > '9' )
- code_display[K2num] = '0';
- if( code_display[K2num] < '0')
- code_display[K2num] = '9';
- if(interface == 2) //輸入密碼界面
- LCD_inputcode();
- if(interface == 4) //重置密碼界面
- LCD_resetcode();
- }
- }
- if(Key6 == 0)
- {
- delay(10);
- if(Key6 == 0)
- {
- while(!Key6);
- }
- }
- }
- //***************寫數(shù)據(jù)函數(shù)**********************
- void write_date(uchar date)
- {
- RS = 1; //確認為寫數(shù)據(jù)模式
- delay(2);
- P0 = date;
- EN = 1;
- delay(5);
- EN = 0;
- }
- //***************寫指令函數(shù)**********************
- void write_com(uchar com)
- {
- RS = 0; //確認為寫指令模式
- delay(2);
- P0 = com;
- EN = 1;
- delay(5);
- EN = 0;
- }
- //***************LCD初始化函數(shù)**********************
- void LCD_init()
- {
- RW = 0; //只用到寫模式
- EN = 0; //使能口賦低電平
- write_com(0x38); //0011 1000 設(shè)置顯示模式:16*2顯示,八位數(shù)據(jù)接口
- write_com(0x0c); //0000 1100 開顯示,不顯示光標(biāo)
- // write_com(0x0f); //0000 1111 開顯示,顯示光標(biāo),光標(biāo)閃爍
- write_com(0x06); //0000 0110 寫一個字符地址指針+1
- write_com(0x01); //0000 0001 清屏
- }
- //***************顯示主界面函數(shù)**********************
- void LCD_main()
- {
- int i;
- interface = 1;
- LCD_init();
- write_com(0x80); //設(shè)定顯示位置為第一行首
- for(i = 0;i < 12;i++)
- write_date(main1[i]);
-
- write_com(0x80+0x40); //設(shè)定顯示位置為第二行首
- for(i = 0;i < 12;i++)
- write_date(main2[i]);
- }
- //***************顯示輸入密碼界面函數(shù)**********************
- void LCD_inputcode()
- {
- int i;
- interface = 2;
- write_com(0x80); //設(shè)定顯示位置為第一行首
- write_com(0x01); //清屏
- for(i = 0;i < 16;i++)
- write_date(input[i]);
-
- write_com(0x80+0x40); //地址指針指向第二行
- for(i = 0;i < 6;i++)
- write_date(code_display[i]);
- write_com(0x80+0x40+K2num); //地址指針指向第二行
- write_com(0x0f); //開光標(biāo)閃爍
- }
- //***************顯示重置密碼界面函數(shù)**********************
- void LCD_resetcode()
- {
- int i;
- interface = 4;
- write_com(0x80); //設(shè)定顯示位置為第一行首
- write_com(0x01); //清屏
- for(i = 0;i < 15;i++)
- write_date(reset[i]);
-
- write_com(0x80+0x40); //地址指針指向第二行
- for(i = 0;i < 6;i++)
- write_date(code_display[i]);
- write_com(0x80+0x40+K2num);
- write_com(0x0f); //開光標(biāo)閃爍
- }
- //***************顯示設(shè)置密碼界面函數(shù)**********************
- void LCD_setcode()
- {
- // int i;
- interface = 3;
- }
- //***************顯示密碼正確界面函數(shù)**********************
- void LCD_codeture()
- {
- int i;
- write_com(0x01);
- write_com(0x0c); //關(guān)閉光標(biāo)閃爍
- write_com(0x80);
- for(i = 0; i < 13;i++)
- write_date(code_correct[i]);
- }
- //***************顯示密碼錯誤界面函數(shù)**********************
- void LCD_codewrong()
- {
- int i;
- wrong_num ++;
- write_com(0x01);
- write_com(0x0c); //關(guān)閉光標(biāo)閃爍
- write_com(0x80);
- for(i = 0; i < 11;i++)
- write_date(code_wrong[i]);
- }
- //***************顯示鎖屏界面函數(shù)**********************
- void LCD_lockscreen()
- {
- int i;
- write_com(0x01);
- write_com(0x0c); //關(guān)閉光標(biāo)閃爍
- write_com(0x80);
- for(i = 0; i < 13;i++)
- write_date(lockscreen1[i]);
- write_com(0x80+0x40);
- for(i = 0; i < 15;i++)
- write_date(lockscreen2[i]);
- }
復(fù)制代碼
所有程序51hei提供下載:
密碼鎖.zip
(39.13 KB, 下載次數(shù): 42)
2019-12-28 11:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|