1、在锁开的状态下输入密码,设置的密码共4位,矩阵键盘分别代表数字1、2、…、9、0,输入的密码用数码管显示,最后输入的密码显示在最右边的数码管上,即每输入一位数,密码在数码管上的显示左移一位。可删除输入的数字,删除的是最后输入的数字,每删除一位,密码在数码管的显示右移一位,并在左边空出的位上补充“0”。 2、用一位输出电平的状态代表锁的开闭状态,绿色发光管指示。 3、为保证密码锁主人能打开密码锁,设置一个万能密码(1111),在主人忘记密码时使用。 初始密码是1234;
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit we1 = P2^0 ;
- sbit we2 = P2^1 ;
- sbit we3 = P2^2 ;
- sbit we4 = P2^3 ;
- sbit kai_s = P2^6;
- sbit guan_s = P2^7;
- sbit beep = P2^5; //蜂鸣器
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- uchar anj=0,flag=0,mi=0;
- uchar temp,key;
- bit xiu=0;
- int anj1=0, mima = 1234,mima1=0;
- //延时子函数
- void delay1(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- void display1(int a) //显示程序
- {
- P0 = 0xff;
- we1=1;
- P0=table[a/1000];
- delay1(5);
- we1=0;
- P0 = 0xff;
- we2=1;
- P0=table[a/100%10];
- delay1(5);
- we2=0 ;
- P0=0xff;
- we3=1;
- P0=table[a/10%10];
- delay1(5);
- we3=0 ;
- P0=0xff;
- we4=1;
- P0=table[a%10];
- delay1(5);
- we4=0 ;
- }
- void display2()
- {
- P0 = 0xbf;
- we1=1;
- we2=1;
- we3=1;
- we4=1;
- }
- void anjian()
- {
- if(key<10&&mi<4)
- {
- if(xiu==0)
- {
- anj1 = anj1 * 10 + key;
- mi++;
- }
- if(xiu==1)
- {
- mima1 = mima1 * 10 + key;
- mi++;
- }
- }
- else if( key==13 && mi>0) //退格
- {
- if(xiu==0)
- {
- anj1 = anj1/10;
- mi--;
- }
- else //修改密码
- {
- mima1 = mima1/10;
- mi--;
- }
- }
- else if(key==12) //确认
- {
- if(anj1==1111 || anj1==mima)
- {
- kai_s=1;
- guan_s=0;
- mi=0;
- }
- else
- {
- beep=0;
- delay1(100);
- beep=1;
- delay1(100);
- beep=0;
- delay1(100);
- beep=1;
- delay1(100);
- }
- if(xiu==1)
- {
- mima=mima1;
- xiu=0;
- kai_s=0;
- guan_s=1;
- anj1=0;
- mi=0;
- }
- }
- else if( key==14) //关锁
- {
- kai_s=0;
- guan_s=1;
- anj1=0;
- mi=0;
- }
- else if( kai_s==1&&key==16) //修改密码
- {
- xiu = 1;
- }
- }
- /**************************矩阵键盘函数*********/
- //矩阵按键扫描子函数
- uchar keyscan()
- {
- key=0xff;
- P1=0xfe; //将第一行线置低电平
- temp=P1;//读JPJK的当前状态到 temp
- temp&=0xf0;// temp = temp & 0xf0 按位与
- if(temp!=0xf0)
- {
- delay1(10);//延时去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第一行有键被按下
- {
- temp=P1;//读被按下的键
- switch(temp)
- {
- case 0xee: key=1;
- break;
- case 0xde: key=2;
- break;
- case 0xbe: key=3;
- break;
- case 0x7e: key=100; //显示密码
- break;
- }
- while(temp!=0xf0)//等待按键释放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- if(key==100) //显示密码
- {
- flag++;
- if(flag==2)flag=0;
- }
- anjian();
- }
- }
- P1=0xfd; //将第二行线置低电平
- temp=P1;//读JPJK的当前状态到 temp
- temp&=0xf0;// temp = temp & 0xf0
- if(temp!=0xf0)
- {
- delay1(10);//延时去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第二行有键被按下
- {
- temp=P1;//读被按下的键
- switch(temp)
- {
- case 0xed: key=4;
- break;
- case 0xdd: key=5;
- break;
- case 0xbd: key=6;
- break;
- case 0x7d: key=16; //修改密码
- break;
- }
- while(temp!=0xf0)//等待按键释放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- anjian();
- }
- }
- P1=0xfb; //将第 三行线置低电平
- temp=P1;//读JPJK的当前状态到 temp
- temp&=0xf0;// temp = temp & 0xf0
- if(temp!=0xf0)
- {
- delay1(10);//延时去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第三行有键被按下
- {
- temp=P1;//读被按下的键
- switch(temp)
- {
- case 0xeb: key=7;
- break;
- case 0xdb: key=8;
- break;
- case 0xbb: key=9;
- break;
- case 0x7b: key=12; //确认
- break;
- }
- while(temp!=0xf0)//等待按键释放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- anjian();
- }
- }
- P1=0xf7; //将第四行线置低电平
- temp=P1;//读JPJK的当前状态到 temp
- temp&=0xf0;// temp = temp & 0xf0
- if(temp!=0xf0)
- {
- delay1(10);//延时去抖
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)//第四行有键被按下
- {
- temp=P1;//读被按下的键
- switch(temp)
- {
- case 0xe7: key=10; //空建
- break;
- case 0xd7: key=0;
- break;
- case 0xb7: key=13; //退格
- break;
- case 0x77: key=14; //关锁
- break;
- }
- while(temp!=0xf0)//等待按键释放
- {
- temp=P1;
- temp&=0xf0;
-
- }
- anjian();
- }
- }
- return key; //返回按下的键
- }
- /*********************************END OF LINE***************************/
- //主函数
- void main()
- {
- kai_s=0;
- guan_s=1;
- while(1)
- {
- keyscan(); //按键扫描
- if(flag&&xiu==0) display1(anj1);
- else if(flag&&xiu==1) display1(mima1);
- else display2();
- }
- }
复制代码
仿真程序资料51hei提供下载:
电子密码锁.zip
(125.84 KB, 下载次数: 145)
|