基于单片机的密码锁.docx
- 文档编号:23512795
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:16
- 大小:17.45KB
基于单片机的密码锁.docx
《基于单片机的密码锁.docx》由会员分享,可在线阅读,更多相关《基于单片机的密码锁.docx(16页珍藏版)》请在冰豆网上搜索。
基于单片机的密码锁
基于52单片机的密码锁程序
C语言版
/*初始密码为四位,1,2,3,4如果想修改密码的长度,可将程序中的密码长度4改为你想设置的长度值
初始密码1,2,3,4也可在函数init_main()函数中修改
密码锁上电后,锁合灯亮,初始密码为1,2,3,4。
当输入的四位密码按确定键后,密码正确时锁开灯亮,锁合灯灭。
当不正确时,锁合灯继续亮,蜂鸣器短报警
累计有三次密码输入错误时,蜂鸣器一直叫,键盘会自动锁定
在输入密码的过程中可以按取消键重新输入密码
在锁开的状态下按下修改密码键可以修改密码,红灯闪三下后可以输入四位新密码,然后按确定键修改成功,锁合灯亮
若输入的新密码不为四位,红灯快闪三下,提醒没有修改成功,可以重新输入四位新密码
--------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------密码锁硬件简要说明-----------------------------------------------------------------------------
黄灯接P2.7,绿灯接P2.5,蓝灯接P2.3,红灯P2.1,蜂鸣器接P2.0都是低电平时工作
键盘接法行P3.2P3.1P3.0P3.3
列P3.4P3.5P3.6P3.7
键盘分布
123确定
456取消
789修改密码
0
---------------------------------------------------------------------------------------------------------------------------------------------------------*/
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcount;//密码位计数
ucharpw[4];//初始密码存储区
ucharpwbuf[4];//输入密码存储区
ucharselfdefinebuf[4];//自定义密码存储区
ucharerror_cnt;//错误次数计数器
bitenterflag;//确认键按下与否标志
bitpwflag;//密码正确与否标志
bitlast_pwflag;//前一次密码输入正确与否标志
sbitopen=P1^5;//锁开指示灯,绿灯。
低电平亮
sbitbeep=P2^3;//蜂鸣器,低电平叫
sbitred=P1^1;//红灯,低电平亮
sbitclose=P1^7;//锁合指示灯,黄色。
低电平亮
sbityouxiao=P1^3;//蓝灯,按键有效指示。
低电平亮
voidflashred_L(void);//闪红灯,表示可输入自定义密码
voidflashred_S(void);//快闪红灯,重新输入自定义密码
voidflashall(void);//三盏灯全亮,不能继续输入
/*键消抖延时函数*/
voiddelay(void)
{
uinti;
for(i=8000;i>0;i--);
}
//蓝灯亮一下,再灭,用来表示按键按下有效
voidyouxiaoled()
{
youxiao=0;
delay();
youxiao=1;
}
//蜂鸣器短叫报警
voidbaojing()
{
beep=0;
delay();
beep=1;
delay();
beep=0;
delay();
beep=1;
}
/*键扫描函数*/
ucharkeyscan()//键盘扫描函数
{
uchartemp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();//键盘去抖,
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{youxiaoled();//按键有效指示灯亮,即蓝灯亮
temp=P3;
switch(temp)
{
case0xee:
return1;break;
case0xde:
return2;break;
case0xbe:
return3;break;
case0x7e:
return11;break;//确定键11
}
while(temp!
=0xf0)//按键抬起检测
{
temp=P3;
temp=temp&0xf0;
}
}
elsereturn0;//无键按下返回0
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{youxiaoled();
temp=P3;
switch(temp)
{
case0xed:
return4;break;
case0xdd:
return5;break;
case0xbd:
return6;break;
case0x7d:
return12;break;//取消键12
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
elsereturn0;
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{youxiaoled();
temp=P3;
switch(temp)
{
case0xeb:
return7;break;
case0xdb:
return8;break;
case0xbb:
return9;break;
case0x7b:
return13;break;//重设密码键13
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
elsereturn0;
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{youxiaoled();
temp=P3;
switch(temp)
{
case0xe7:
return10;break;//数字0
default:
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
elsereturn0;
}
}
/*密码比较函数*/
bitpwcmp(void)
{
bitflag;
uchari;
for(i=0;i<4;i++)
{
if(pw[i]==pwbuf[i])
flag=1;
else
{
flag=0;
i=4;
error_cnt++;//错误次数加1
}
}
return(flag);
}
//初始化设置函数
voidinit_main()
{
count=0;//初始没有输入密码,计数器设为0
error_cnt=0;//错误次数归0
enterflag=0;//没有按下确认键
pwflag=0;//密码标志先置为0
last_pwflag=0;
close=0;//锁合灯亮,其它灯灭
open=1;
beep=1;
red=1;
/*假设内定密码为1234,修改初始密码可在这里改*/
pw[0]=1;
pw[1]=2;
pw[2]=3;
pw[3]=4;
}
//长闪红灯,表示可输入自定义密码
voidflashred_L(void)
{
red=0;
delay();
delay();
delay();
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
}
//快闪红灯,重新输入自定义密码
voidflashred_S(void)
{
red=0;
delay();
delay();
red=1;
delay();
delay();
red=0;
delay();
delay();
red=1;
delay();
delay();
red=0;
delay();
delay();
red=1;
}
voidflashall(void)
{
beep=0;
open=0;
red=0;
delay();
delay();
beep=1;
open=1;
red=1;
}
/*主程序*/
voidmain()
{
ucharj,key;
uchartempkey;
init_main();
while
(1)
{
if(error_cnt<3)//错误次数小于3
{
key=keyscan();//调用键盘扫描函数
if(key>0&&key<=10)//用户输入密码
{
if(key==10)
key=0;
if(count<4)
{
pwbuf[count]=key;
count++;
}
}
elseif(key==11)//确认键按下
{
enterflag=1;//确认键按下
if(count==4)//只有输入4个密码后按确认键才作密码比较
{
delay();
pwflag=pwcmp();
}
else
{
pwflag=0;//否则直接pmflag赋0
error_cnt++;//错误次数加一
}
last_pwflag=pwflag;//前一次密码输入正确与否标志
enterflag=0;//标志位置回0
count=0;//密码位计数器清零
delay();
if(pwflag==1)
{open=0;close=1;red=1;beep=1;}//密码正确时,绿灯亮,其它灯灭
else
{open=1;close=0;red=1;baojing();}//密码错误时,黄灯亮并短报警
}
elseif(key==12)//取消键按下
{
count=0;//密码计数清零
}
elseif(key==13)//重设密码键按下
{open=1;
if(last_pwflag==1)//判断上次用户输入密码正确与否
{
flashred_L();//闪红灯表示可输入自定义密码
while(last_pwflag)
{
tempkey=keyscan();
if(tempkey>0&&tempkey<=10)//用户输入密码
{
if(tempkey==10)
tempkey=0;
if(count<4)
{
selfdefinebuf[count]=tempkey;//保存用户自定义密码
count++;
}
}
elseif(tempkey==11)//确认键按下
{
enterflag=1;
if(count==4)
{close=0;open=1;beep=1;
for(j=0;j<4;j++)
pw[j]=selfdefinebuf[j];//修改密码存储数组
last_pwflag=0;
enterflag=0;
count=0;
}
else//如果输入数据不足四位或大于四位,输入作废,重新输入
{
flashred_S();//快闪红灯,重新输入自定义密码
count=0;//密码计数清零
}
}
}
}
}
}
else
{
while
(1)//错误次数超过三次,停止工作蜂鸣器一直叫
beep=0;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 密码锁