单片机数字密码锁Word下载.docx
- 文档编号:395068
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:33
- 大小:649.55KB
单片机数字密码锁Word下载.docx
《单片机数字密码锁Word下载.docx》由会员分享,可在线阅读,更多相关《单片机数字密码锁Word下载.docx(33页珍藏版)》请在冰点文库上搜索。
本系统采用4×
4矩阵键盘作为输入部分,实现数据输入功能。
本系统规定的键盘上的各按键功能如下图所示,其中的键盘与图4_1中的矩阵键盘相对应。
1
2
3
4
5
6
7
8
9
ENTRE
RET
BACK
YES
UP
SETTIME
图2.1.1_14×
4键盘各按键对应的功能
在图2.1.1_1中,各按键功能如下:
ENTER:
输入密码键。
按下此键,八个数码管上显示为“--------”,此时须键入密码。
每输入一位密码,则显示一位“F”,如已经输入前四位密码,则数码管显示为“----FFFF”。
RET:
修改密码键。
按下此键之后先输入原密码,再输入两次新密码就能成功修改密码。
ENTER:
输入密码时的确认键。
每次输入密码之后都要按确认键。
BACK:
输入密码时的退位键。
在未确定之前可以取消已输入的密码,重新输入。
SETTIME:
设置时间键。
按下此键可对显示的时间重新设置,按一下对应秒,第二下对应分,第三下对应时。
UP:
累加键。
按下此键相应的时间会在原有基础上加1,分秒到59回0,时到23回0。
YES:
时间确定键。
时间调整好后按下该键显示北京时间并开始走动。
0~9:
数字键。
用于输入密码和设置时间。
数码管模块
由于资源限制,本实验采用板上的八个数码管作为显示部分,用于显示北京时间及输入密码等操作时的显示。
当上电复位时,数码管显示时间,例如,时间是18时01分30秒,则八路LED显示如下:
’
按下输入密码键或者修改密码键,数码管上显示为“--------”,表示等待输入密码。
若中途按下取消键,则第一次退一位,第二次取消已输入密码,数码管显示“--------”,可重新输入。
按下确认键后,如果密码输入正确,则跑马灯从左至右闪,蜂鸣器响一下(清脆),输入密码错误,停顿,跑马灯从右至左闪,且蜂鸣器响一下报警提示(沙哑)。
修改密码时,第一次输入原密码如果错误,则停顿,跑马灯从右至左闪,且蜂鸣器响一下报警提示(沙哑)。
如果第一次输入原密码正确则跑马灯从左至右闪,蜂鸣器响一下(清脆),然后再输入新密码,每输入一位密码,则显示一位“F”,如已经输入前四位密码,则数码管显示为“----FFFF”。
按下确认键后显示1,代表repeat,然后再输一次新密码,如果正确则密码修改成功,返回北京时间。
如果第二次输入新密码和第一次输入的不同,则按输入密码错误处理,重新设置新密码。
计时模块
本实验为了正确显示北京时间,采用单片机中的定时器0进行定时中断,控制时间的走时。
蜂鸣器模块
本实验采用蜂鸣器实现密码输入时的提示。
当输入密码时,输入密码正确,跑马灯从左至右闪,蜂鸣器响一下(清脆),输入密码错误,停顿,跑马灯从右至左闪,且蜂鸣器响一下报警提示(沙哑)。
系统的总体流程图
图2.2.1_1系统总体流程图
定时器0中断程序流程图
图2.2.1_1定时器0中断程序流程图
3系统程序设计
#include"
aduc848.h"
#include"
ds1307.h"
keyboard.h"
#defineucharunsignedchar
voidinputkey();
//输入密码子程序
voidsetkey();
//重置密码子程序
voiddisplay();
//显示子程序
voiddelay_0(intnumb);
//延时子程序
voidKeyProcess();
//计时器操作程序
voidbee(unsignedintb);
//蜂鸣器子程序
unsignedchargetkey();
//密码锁主键盘程序
inttimecount=1000,alarmcount=0,sjflag;
//报警时用的变量
intrealkey;
//正确密码
intyourkey=0;
//用户输入密码
intkeynum=0;
//输入密码的位数
ucharokflag;
//输入密码正确标志
ucharkey;
unsignedcharpmdeng;
//跑马灯
ucharkbflag=0,purrentlock=0,mimaflag;
//键盘锁定标志,KB是总的键盘锁定标志,PURR是暂时锁定主键盘,MIMA是决定是否释放后有效
ucharshowflag=0;
//显示时用的标志位,决定显示时间还是输入密码
sbitsm0=P3^3;
//数码管的位控
sbitsm1=P3^5;
sbitsm2=P3^6;
sbitsm3=P3^7;
sbitsm4=P2^4;
sbitsm5=P2^1;
sbitsm6=P2^2;
sbitsm7=P2^3;
unsignedcharCurrentTime[3];
unsignedcharSetMode=0;
constunsignedcharcodenum[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};
//断码
//********************主模块***********************
main()
{//**********************初始化***************
inti;
realkey=8888;
TMOD=0X01;
IE=0X82;
TH0=0X38;
TL0=0X00;
PLLCON&
=0xf8;
//设置频率为12.58MHz
I2CCON=0xE8;
//配置IIC为软件主发送模式
SwitchRTC
(1);
while
(1)
{
showflag=0;
okflag=0;
key=16;
if(kbflag==0)
key=getkey();
if(key==10)//确定键定为10
{for(i=0;
i<
100;
i++)
{sm5=0;
P0=num[key%10];
sm6=1;
delay_0(888);
sm6=0;
P0=num[key/10];
sm7=1;
sm7=0;
}
inputkey();
if(key==11)//密码重置键键号为11
{for(i=0;
setkey();
display();
//********************定时中断子程序*******************
voidtime_r()interrupt1
{intn,m;
TR0=0;
timecount--;
if(timecount==0)
{
alarmcount=1;
timecount=1000;
P2&
=0xE1;
//关数码管
P3&
=0x17;
pmdeng=0xfe;
for(n=0;
n<
10;
n++)//报警,LED灯从右至左8跑马灯
{
for(m=0;
m<
8;
m++)
{
P0=pmdeng;
pmdeng=pmdeng<
<
1;
pmdeng=pmdeng+1;
if(pmdeng==0xff)pmdeng=0xfe;
delay_0(22222);
}
}
P0=0Xff;
bee
(1);
if(sjflag!
=2)//sjflag=2时关定时器
TR0=1;
else
}
//****************************密码输入子程序************************
voidinputkey()
{inti,j,m,n;
intyourkey=0;
intkeyv;
//读取键号值
keynum=0;
mimaflag=1;
//主键盘释放后有效
showflag=1;
for(i=0;
3;
{yourkey=0;
if(okflag!
=0)//是否跳出最外循环标志
break;
for(j=0;
j<
16;
j++)
{timecount=1000;
sjflag=0;
if(alarmcount==1)
{
sjflag=2;
//作为关闭定时器的标志
okflag=1;
alarmcount=0;
break;
}
do//扫描键盘
{if(kbflag==0)
keyv=getkey();
display();
if(sjflag==0)
{sjflag=1;
TR0=1;
if(alarmcount==1)
break;
}while(keyv>
=13);
TR0=0;
if(keyv==12)
{if(j==0)
{okflag=1;
//又取消键,跳出标志
break;
}
else
{
j=j-keynum;
j--;
--keynum;
yourkey=yourkey/10;
continue;
}
elseif(keyv==10)
{j=j-keynum;
j--;
keynum=0;
break;
elseif(keyv<
10&
&
keyv>
=0)
{keynum++;
yourkey=yourkey*10+keyv;
}
}
if(yourkey==realkey)//密码输入成功
{P2&
pmdeng=0x7f;
for(n=0;
n++)//密码正确,LED从左至右跑马灯
pmdeng=pmdeng>
>
pmdeng=pmdeng+0x80;
if(pmdeng==0xff)pmdeng=0x7f;
P0=0Xff;
bee(0);
okflag=8;
//成功
if(i>
=3)
{kbflag=1;
P2&
P3&
//关数码管
pmdeng=0x7f;
for(n=0;
n++)//键盘锁定标志,LED间隔从左至右跑马灯
4;
2;
pmdeng=pmdeng+0xc0;
}
mimaflag=0;
//**********************密码重置子程序**************************
voidsetkey()
{
intyourkey1=0,yourkey2=0,keyv0;
inti,m,n;
//重置时要先输入原始密码
if(okflag==8)
for(i=0;
6;
i++)//第一次输入新密码
do
{if(kbflag==0)
keyv0=getkey();
}while(keyv0>
if(keyv0==12)
{if(i==0)
{okflag=2;
//第二次密码不用输入,直接返回
{
i=i-keynum;
i--;
--keynum;
yourkey1=yourkey1/10;
elseif(keyv0==10)
{i=0;
keynum=0;
for(m=0;
500;
{P0=num[2];
sm7=1;
delay_0(555);
sm7=0;
elseif((keyv0<
10)&
(keyv0>
=0))
{keynum++;
yourkey1=yourkey1*10+keyv0;
if(okflag!
=2)
i++)//第二次输入新密码
{
{
break;
yourkey2=yourkey2/10;
yourkey2=yourkey2*10+keyv0;
if(yourkey1==yourkey2)
realkey=yourkey1;
P2&
5;
n++)//重置密码成功,LED低四位跑马灯
if(pmdeng==0xef)pmdeng=0xfe;
P0=0xff;
{
P2&
for(n=0;
n++)//重置密码失败,LED高四位跑马灯
pmdeng=pmdeng+0x80;
if(pmdeng==0xf7)pmdeng=0x7f;
else
P3&
pmdeng=0xfc;
n++)//原始密码不正确,双跑马灯,从右往左
pmdeng=pmdeng+3;
if(pmdeng==0xff)pmdeng=0xfc;
//***************************显示子程序*************************
voiddisplay()
sm0=0;
sm1=0;
sm2=0;
sm3=0;
sm4=0;
sm5=0;
sm6=0;
sm7=0;
if(showflag==1)//显示密码输入界面
if(keynum>
0)
P0=0x71;
sm0=1;
delay_0(100);
sm0=0;
if(keynum>
1)
sm1=1;
sm1=0;
2)
sm2=1;
sm2=0;
3)
sm3=1;
sm3=0;
4)
sm4=1;
sm4=0;
5)
sm5=1;
sm5=0;
}
else//显示时间界面
{if(SetMode==0)ReadTime(CurrentTime);
P0=num[CurrentTime[0]%10];
sm0=1;
sm0=0;
P0=num[CurrentTime[0]/10];
sm1=1;
sm1=0;
P0=0xfd;
sm2=1;
sm2=0;
P0=num[CurrentTime[1]%10];
sm3=1;
sm3=0;
P0=num[CurrentTime[1]/10];
sm4=1;
sm4=0;
P0=0xfd;
sm5=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 数字 密码锁