基于AT89C52的电子密码锁
时间:10-02
整理:3721RD
点击:
用4*3组成0-9数字键及确认键、删除键;用8位数码管组成显示电路提示信息,当输入密码时,只显示“—”,当密码位数输入完毕按下“确定”键时,对输入的密码与设定的密码进行比较,若密码正确,则开锁,此处用LED发光二极管亮1s作为提示;若密码不正确,禁止按键输入3s,同时发出“嘀、嘀”报警声。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar smg[16]; //存放数字;
uchar code key[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管位选
char num,k,x;
void display();
void key_scan();
int a,b,c,d,e,f,g,h,mima; //密码初值
sbit fmq=P3^6; //蜂鸣器输入端
sbit led=P3^0;// 密码正确,灯亮
void delay(uint i) //延时函数
{
uint j;
while(i--)
{
for(j=0;j<120;j++);
}
}
void beep() //蜂鸣器滴滴响;
{
uint i;
for(i=0;i<5;i++) //蜂鸣器响五次(无源蜂鸣器)
{
fmq=0;
delay(300);
fmq=1;
delay(300);
P2=0xff;
P0=0x00;
}
fmq=1;
}
void key_scan()//按下一次按键K加1,X加1,将按下的数存入数组smg[];
{
uchar temp;
P1=0xf0;
temp=P1;
if(temp!=0xf0)
{
delay(25);
P1=0xf0;
temp=P1;
if(temp!=0xf0)
{
P1=0xfe;
temp=P1;
switch(temp)
{
case(0xee):P0=0x40;smg[x]=num;num=0;k++;x++;delay(200);break;
case(0xde):P0=0x40;smg[x]=num;num=1;k++;x++;delay(200);break;
case(0xbe):P0=0x40;smg[x]=num;num=2;k++;x++;delay(200);break;
case(0x7e):P0=0x40;smg[x]=num;num=3;k++;x++;delay(200);break;
}
P1=0xfd;
temp=P1;
switch(temp)
{
case(0xed):P0=0x40;smg[x]=num;num=4;k++;x++;delay(200);break;
case(0xdd):P0=0x40;smg[x]=num;num=5;k++;x++;delay(200);break;
case(0xbd):P0=0x40;smg[x]=num;num=6;k++;x++;delay(200);break;
case(0x7d):P0=0x40;smg[x]=num;num=7;k++;x++;delay(200);break;
}
P1=0xfb;
temp=P1;
switch(temp)
{
case(0xeb):P0=0x40;smg[x]=num;num=8;k++;x++;delay(200);break;
case(0xdb):P0=0x40;smg[x]=num;num=9;k++;x++;delay(200);break;
case(0xbb):P0=0x40; //确认键,密码正确灯亮,密码错误,蜂鸣器响
if((mima==1)&(k==6))
{
led=1;
delay(1000);
led=0;
k=0;
}
else
{
beep();
k=0;
}break;
case(0x7b):P0=0x40; k--;delay(200);mima=1;x--;num=smg[x]; break;//删除键按下,删除-,将上一次按下的数字赋给num
}
}
}
}
void display()//k等于几,代表按下几次按键,显示几个-;
{
if(k==1)
{
P2=key[0];
if(a==num)
{
mima=1;
}
else
{
mima=0;
}
}
while(k==2)
{
P2=key[0];
delay(1);
P2=0xff;
P2=key[1];
delay(1);
P2=0xff;
if(b==num)
{
mima=1&mima;
}
else
{
mima=0;
}
key_scan();
}
while(k==3)
{
P2=key[0];
delay(1);
P2=0xff;
P2=key[1];
delay(1);
P2=0xff;
P2=key[2];
delay(1);
P2=0xff;
if(c==num)
{
mima=1&mima;
}
else
{
mima=0;
}
key_scan();
}
while(k==4)
{
P2=key[0];
delay(1);
P2=0xff;
P2=key[1];
delay(1);
P2=0xff;
P2=key[2];
delay(1);
P2=0xff;
P2=key[3];
delay(1);
P2=0xff;
if(d==num)
{
mima=1&mima;
}
else
{
mima=0;
}
key_scan();
}
while(k==5)
{
P2=key[0];
delay(1);
P2=0xff;
P2=key[1];
delay(1);
P2=0xff;
P2=key[2];
delay(1);
P2=0xff;
P2=key[3];
delay(1);
P2=0xff;
P2=key[4];
delay(1);
P2=0xff;
if(e==num)
{
mima=1&mima;
}
else
{
mima=0;
}
key_scan();
}
while(k>=6)
{
P2=key[0];
delay(1);
P2=0xff;
P2=key[1];
delay(1);
P2=0xff;
P2=key[2];
delay(1);
P2=0xff;
P2=key[3];
delay(1);
P2=0xff;
P2=key[4];
delay(1);
P2=0xff;
P2=key[5];
delay(1);
P2=0xff;
k=6;
if(f==num)
{
mima=1&mima;
}
else
{
mima=0;
}
key_scan();
}
while(k<=0)
{
P2=0xff;
P0=0x00;
k=0;
mima=0;
key_scan();
}
}
void main()
{
a=6;b=5;c=4;d=3;e=2;f=1;
k=0;
led=0;
fmq=1;
x=0;
while(1)
{
key_scan();
display();
}
}
不错,很实用。
这个真是大好的小编呀!
谢谢小编热心分享,我有同学正用得到
谢谢小编分享,学习学习
学习了~~~~~~~~~~~~~~~
支持一个!
不错,很实用。
吱吱吱吱吱吱吱吱吱吱吱吱吱吱吱吱吱吱吱吱