模擬輸入密碼錯誤處理系統,用一個按鍵K3模擬密碼字符的輸入
用一個按鍵K4模擬密碼輸入確認,用一個LED來模擬報警,此時默認K3輸入的密碼都是錯的,想要去自己去另外設計密碼的可以自己去加功能,這里只是拋磚引玉,
基本要求:(1)當輸入密碼錯誤5次,則回收報警指示燈D0點亮20秒;
(2)在回收報警指示燈D0亮起的20秒鐘內,不接收按鍵上輸入的密碼信息。
(3)20秒以后,可以重復之前的操作
說明:(1)本實驗的每一次按鍵都寫了松手檢測,導致篇幅很長,有好的算法的朋友請告訴我有什么辦法可以直接寫一個函數就直接把十次按鍵都按下和松手都確定了,
(2)本實驗已經在硬件上測試過,穩定無誤。
由于篇幅所限,下面只貼部分代碼,具體代碼請看附件
單片機源程序如下:
- #include<reg52.h>
- sbit K3 = P3^2; //外部中斷0對應的按鍵變量
- sbit K4 = P3^3; //外部中斷?對應的按鍵變量
- sbit led = P2^0;
- unsigned int Timercnt;
- unsigned char smguan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7c,0x39,0x5E,0x79,0x71};
- unsigned char daojishigewei;
- unsigned char daojishishiwei;
- void MimaFun( );
- unsigned char JishuFun();
- unsigned int TouchTimeK3;
- unsigned int TouchTimeK4;
- unsigned int i;
- unsigned int signal1,signal2,signal3,signal4,signal5;
- unsigned int signal6,signal7,signal8,signal9,signal10;
- void delay8(unsigned int t)
- {
- while (--t);
- }
- void IntFun() interrupt 1 //中斷函數
- {
- Timercnt ++; //計數次數
- TH0=0xFC; //重裝定時器初始值
- TL0=0x17;
- if(Timercnt == 1000) //1000*1000us=1s
- {
-
- JishuFun();
-
- Timercnt = 0;
- }
- }
- unsigned char JishuFun() //20秒時間倒計時程序
- {
- if((daojishigewei==0)&&(daojishishiwei!=0))
- {
- daojishishiwei--;
- daojishigewei=9;
- return 0;
- }
- if(daojishigewei!=0)
- {
- daojishigewei--;
- }
- if(daojishigewei==0&&(daojishishiwei==0))
- {
- P0=0xfe;
-
- }
- }
- void main( )
- {
- /*中斷系統的定義*/
- IT0 = 1; //外部中斷0的邊沿信號
- EX0 = 1; //外部中斷0的中斷允許
- EA = 1; //CPU的中斷總允許
- TR0 = 0; //定時器0的開啟
- ET0 = 1; //定時器0的中斷允許
- EA = 1; //CPU的中斷總允許
- TMOD=0x01; //定時器T0,方式一,16位
- TH0=0xFC; //計1000次,每次1000微秒,計數初始值64535
- TL0=0x17;
- daojishigewei=9; //倒計時初始化,此處從19開始是因為0~1也算是一秒
- daojishishiwei=1;
- TouchTimeK3=0;
- TouchTimeK4=0;
-
- while(1) //動態停機,等待中斷信號
- {
- //第一次按下K3,K4按鍵
- if(TouchTimeK3==0 && K3==0) //第一次按下K3按鍵
- {
- delay8(1000); //消抖
- if(K3==0) //確認第一次K3按鍵已經按下
- {
-
- signal1=1;
-
- }
- }
- if(signal1==1 && K3==1) //第一次K3按鍵松手
- {
- delay8(1000);
- if(K3==1) //確認第一次K3按鍵已經松手
- {
- TouchTimeK3=1; //第一次按鍵成功,按鍵次數記為1
-
- signal1=0; //標志位回0,以免誤操作
- }
- }
- if(TouchTimeK4==0 && K4==0) //第一次按下K4按鍵
- {
- delay8(1000); //消抖
- if(K4==0) //確認第一次K4按鍵已經按下
- {
-
- signal2=1;
-
- }
- }
- if(signal2==1 && K4==1) //第一次K4按鍵松手
- {
- delay8(1000);
- if(K4==1) //確認第一次K4按鍵已經松手
- {
- TouchTimeK4=1; //第一次K4按鍵成功,按鍵次數記為1
-
- signal2=0; //標志位回0,以免誤操作
- }
- }
-
- //第二次按下K3,K4按鍵
- if(TouchTimeK3==1 && K3==0) //第二次按下K3按鍵
- {
- delay8(1000); //消抖
- if(K3==0) //確認第二次K3按鍵已經按下
- {
-
- signal3=1;
-
- }
- }
- if(signal3==1 && K3==1) //第二次K3按鍵松手
- {
- delay8(1000);
- if(K3==1) //確認第二次K3按鍵已經松手
- {
- TouchTimeK3=2; //第二次按鍵成功,按鍵次數記為1
-
- signal3=0; //標志位回0,以免誤操作
- }
- }
- if(TouchTimeK4==1 && K4==0) //第二次按下K4按鍵
- {
- delay8(1000); //消抖
- if(K4==0) //確認第二次K4按鍵已經按下
- {
-
- signal4=1;
-
- }
- }
- if(signal4==1 && K4==1) //第一次K4按鍵松手
- {
- delay8(1000);
- if(K4==1) //確認第一次K4按鍵已經松手
- {
- TouchTimeK4=2; //第一次K4按鍵成功,按鍵次數記為1
-
- signal4=0; //標志位回0,以免誤操作
- }
- }
- //第三次按下K3,K4按鍵
- if(TouchTimeK3==2 && K3==0) //第三次按下K3按鍵
- {
- delay8(1000); //消抖
- if(K3==0) //確認第三次K3按鍵已經按下
- {
-
- signal5=1;
-
- }
- }
- if(signal5==1 && K3==1) //第三次K3按鍵松手
- {
- delay8(1000);
- if(K3==1) //確認第三次K3按鍵已經松手
- {
- TouchTimeK3=3; //第三次按鍵成功,按鍵次數記為1
-
- signal5=0; //標志位回0,以免誤操作
- }
- }
- if(TouchTimeK4==2 && K4==0) //第三次按下K4按鍵
- {
- delay8(1000); //消抖
- if(K4==0) //確認第一次K4按鍵已經按下
- {
-
- signal6=1;
-
- }
- }
- if(signal6==1 && K4==1) //第一次K4按鍵松手
- {
- delay8(1000);
- if(K4==1) //確認第一次K4按鍵已經松手
- {
- TouchTimeK4=3; //第一次K4按鍵成功,按鍵次數記為1
-
- signal6=0; //標志位回0,以免誤操作
- }
- }
- //第四次按下K3,K4按鍵
- if(TouchTimeK3==3 && K3==0) //第四次按下K3按鍵
- {
- delay8(1000); //消抖
- if(K3==0) //確認第四次K3按鍵已經按下
- {
-
- signal7=1;
-
- }
- }
- if(signal7==1 && K3==1) //第四次K3按鍵松手
- {
- delay8(1000);
- if(K3==1) //確認第四次K3按鍵已經松手
- {
- TouchTimeK3=4; //第四次K3按鍵成功,按鍵次數記為1
-
- signal7=0; //標志位回0,以免誤操作
- }
- }
- if(TouchTimeK4==3 && K4==0) //第四次按下K4按鍵
- {
- delay8(1000); //消抖
- if(K4==0) //確認第四次K4按鍵已經按下
- {
-
- signal8=1;
-
- }
- }
- if(signal8==1 && K4==1) //第四次K4按鍵松手
- {
- delay8(1000);
- if(K4==1) //確認第四次K4按鍵已經松手
- {
- TouchTimeK4=4; //第四次K4按鍵成功,按鍵次數記為1
-
- signal8=0; //標志位回0,以免誤操作
- }
- }
- //第五次按下K3,K4按鍵
- if(TouchTimeK3==4 && K3==0) //第五次按下K3按鍵
- {
- delay8(1000); //消抖
- if(K3==0) //確認第五次K3按鍵已經按下
- {
-
- signal9=1;
-
- }
- }
- if(signal9==1 && K3==1) //第五次K3按鍵松手
- {
- delay8(1000);
- if(K3==1) //確認第五次K3按鍵已經松手
- {
- TouchTimeK3=5; //第五次按鍵成功,按鍵次數記為1
-
- signal9=0; //標志位回0,以免誤操作
- }
- }
- if(TouchTimeK4==1 && K4==0) //第五次按下K4按鍵
- {
- delay8(1000); //消抖
- if(K4==0) //確認第五次K4按鍵已經按下
- {
-
- signal10=1;
-
- }
- }
- if(signal10==1 && K4==1) //第五次K4按鍵松手
- {
- delay8(1000);
- if(K4==1) //確認第五次K4按鍵已經松手
- {
- TouchTimeK4=5; //第五次K4按鍵成功,按鍵次數記為1
-
- signal10=0; //標志位回0,以免誤操作
- }
- }
-
- if(K3!=0 && K4!=0 && TouchTimeK3==5 && TouchTimeK4==5) //k3和k4都分別已經按下5次
- {
- TR0=1; //k3、k4都分別已經按下5次之后就使定時器T0開啟,開始計時
-
- for(i=0;i<=19;i++) //循環語句使數碼管從19到0都點亮
- {
- led=0; // 輸出的指示小燈,用來模擬回收報警
- P2=0x18; //數碼管顯示從19倒數到0的20s倒計時
- P0=smguan[daojishigewei];
- delay8(500);
- P2=0x1c;
- P0=smguan[daojishishiwei];
- delay8(500);
-
- P0=smguan[0x00];
-
- }
- if(i>19)
- {
- led=1; //20s結束,LED小燈熄滅
- }
-
- }
-
- }
- }
復制代碼
|