|
根據(jù)設(shè)定好的密碼, 采用六個(gè)按鍵實(shí)現(xiàn)密碼的輸入功能
當(dāng)密碼輸入完后,按確認(rèn)鍵驗(yàn)證,正確之后,鎖就打開
如果輸入的三次的密碼不正確, 就鎖定按鍵 3 秒鐘
同時(shí)發(fā)出報(bào)警聲,直到?jīng)]有按鍵按下 5秒后
才打開按鍵鎖定功能否則在 5 秒鐘內(nèi)仍有按鍵按下,就重新鎖
電路原理圖如下:
TIM圖片20200531233900.png (65.04 KB, 下載次數(shù): 26)
下載附件
2020-5-31 23:40 上傳
單片機(jī)源程序如下:
- #include "lcd1602.h"
- #include "delay.h"
- #include "eeprom.h"
- #include "keyboard.h"
- #include "code.h"
- #include<intrins.h>
- #include<string.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar Timer=0; //中斷計(jì)數(shù)器
- #define uchar unsigned char
- /********************按鍵處理函數(shù)***********************/
- uchar Count=0; //開鎖次數(shù)
- uchar k=0; //數(shù)組累加
- uchar Wrong=0; //錯(cuò)誤次數(shù)
- uchar Sure_temp,Cancel_temp;//保存按下確認(rèn)鍵和取消鍵P1的值
- uchar num=0; //按鍵次數(shù)
- //確認(rèn)鍵處理 按鍵檢測(cè)
- uchar code Key_Table[]={0xee,0xde,0xbe,0x7e,
- 0xed,0xdd,0xbd,0x7d,
- 0xeb,0xdb,0xbb,0x7b,
- 0xe7,0xd7,0xb7,0x77};
- uchar Buffer[]={0,0,0,0,0,0}; //按鍵數(shù)值緩存數(shù)組
- uchar Buffer_Reset[]={0,0,0,0,0,0}; //重置密碼緩存
- uchar Passedword[]={0,0,0,0,0,0};//密碼數(shù)組 (這里開始出廠密碼為比賽日期201657)
- uchar code Count_Table[]="123456789";
- //聲光報(bào)警
- void Alarm()
- {
- uchar i;
- Red=0;
- for(i=0;i<120;i++)
- {
- Beep=~Beep;
- Delay(2);
- }
- }
- //警報(bào)
- void Warning()
- { uchar i;
- for(i=0;i<2;i++)
- { for(i=0;i<20;i++)
- {
- Beep=~Beep;
- Delay(20);
- }
- }
- }
- void Sure_Key()
- {
- uchar flag;
- uchar i;
- write_com(0x80); //第一行0x80+0x00
- write_data(Count_Table[Count++]); //顯示輸入次數(shù)
- Delay(200);
- if(Count>=10){P0=0XC0;Count=0;}
- for(i=0;i<6;i++)
- {
- if(Buffer[i]==Passedword[i]){flag=1;continue;}
- else {flag=0;break;}
- }
- //結(jié)果處理
- if(flag==1){k=0;Green=0;Wrong=0;Lamp=0;Red=1;write_com(0x80+0x40);for(i=0;i<16;i++)write_data('\0');Delay(200);} //正確綠燈亮,鎖打開
- else {k=0;Alarm();Wrong++;Green=1;Lamp=1;write_com(0x80+0x40);for(i=0;i<16;i++)write_data('\0');Delay(200);} //錯(cuò)誤則聲光報(bào)警
- if(Wrong==3) {Sure_temp=P1;TR0=1;Wrong=0;} //錯(cuò)誤三次則鎖定鍵盤3秒鐘
- }
- //取消鍵處理
- void Cancel_Key()
- {
- uchar i;
- k=0;
- for(i=0;i<6;i++)Buffer[i]=0;Delay(100);
- write_com(0x80+0x40);
- for(i=0;i<16;i++)write_data('\0');
- }
- //鎖定鍵
- void Lock()
- {
- uchar i;
- k=0;Alarm();Green=1;Lamp=1;Delay(200);
- Cancel_Key();
- }
- //清屏鍵
- void Clear_Lcd()
- {
- k=0;Cancel_Key();
- write_com(0x01);
- }
- //重置鍵
- void Reset_Key()
- {
- uchar i;
- k=0;
- write_com(0x10);
- write_string("Input Passedword:");
- }
- //重置確認(rèn)鍵
- void Reset_Sure_Key()
- {
- uchar i,flag;
- for(i=0;i<6;i++){if(Buffer[i]==Passedword[i]){flag=1;continue;} else {flag=0;break;}}//輸入老密碼并判斷
- if(flag==1) {write_com(0x01);write_string("Input Newword:");Cancel_Key();}
- else {Reset_Key();}
- }
- //重置保存
- void Reset_Save()
- {
- uchar i;
- k=0;
- for(i=0;i<6;i++) Write_Random_Address_Byte(i,Buffer[i]); //老密碼正確再保存新密碼
- for(i=0;i<6;i++)Passedword[i]=Random_Read(i);
- write_com(0x01);write_string("Succeed!");Delay(1000);write_com(0x01);
-
-
- }
- /**************************按鍵掃描函數(shù)***********************************/
- //按鍵掃描
- void Key_Play()
- {
- uchar i=0;
- uchar num;
- uchar temp;
- uchar Key,c;
- P1=0xf0;
- if(P1!=0xf0)
- {
- Delay(5);
- if(P1!=0xf0)
- {
- temp=P1;
- P1=0x0f;
- Key=temp|P1;
- for(i=0;i<16;i++)
- if(Key==Key_Table[i]) {num=i;break;}
- Buffer[k++]=num;
- switch(num)
- {
- case 10:Sure_Key();break; //確認(rèn)
- case 11:Cancel_Key();break; //取消
- case 12:Reset_Key();break; //重置
- case 13:Reset_Sure_Key();break;//重置確認(rèn)
- case 14:Reset_Save();break; //上鎖
- case 15:Lock();; //清屏
- }
- write_com(0x80+0x40); //第二行0x80+0x40
- for(i=0;i<k;i++)
- write_data('*');
- }
- do{ //等待按鍵抬起
- temp=P1;
- temp=temp&0x0f;
- }
- while(temp!=0x0f);
- }
- }
-
- //************************主函數(shù)************************//
- void main()
- {
- uchar i;
- lcd_initial();
- write_com(0x10);
- write_string(" XM:MaZhuang ");
- //write_com(0x80); //第一行0x80+0x00
- write_data(Count_Table[1]);
- write_data(Count_Table[2]);
- Delay(1000);
- P0=0x3f;//次數(shù)默認(rèn)為0 0011 1111
- P2=0XFF;//初始全關(guān) 1111 1111
- TMOD=0X01;//0000 0001
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1; //密碼錯(cuò)誤定時(shí)器中斷0
- for(i=0;i<6;i++)Passedword[i]=Random_Read(i);
- while(1)
- {
- Key_Play();
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
源程序下載,注意不含仿真圖,暫時(shí)不公開:
密碼鎖(終極).zip
(78.06 KB, 下載次數(shù): 42)
2020-5-31 23:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|