模拟输入密码错误处理系统,用一个按键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小灯熄灭
- }
-
- }
-
- }
- }
复制代码
|