0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何实现电子密码锁的设计

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-07-26 10:35 次阅读

1.实验任务

根据设定好的密码,采用二个按键实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的三次的密码不正确,就锁定按键3秒钟,同时发现报警声,直到没有按键按下3种后,才打开按键锁定功能;否则在3秒钟内仍有按键按下,就重新锁定按键3秒时间并报警。

2.系统板上硬件连线

(1).把“单片机系统”区域中的P0.0/AD0用导线连接到“音频放大模块”区域中的SPK IN端子上;

(2).把“音频放大模块”区域中的SPK OUT端子接喇叭和;

(3).把“单片机系统”区域中的P2.0/A8-P2.7/A15用8芯排线连接到“四路静态数码显示”区域中的任一个ABCDEFGH端子上;

(4). 把“单片机系统“区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L1端子上;

(5). 把“单片机系统”区域中的P3.6/WR、P3.7/RD用导线连接到“独立式键盘”区域中的SP1和SP2端子上;

3.程序设计内容

(1). 密码的设定,在此程序中密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。

(2). 密码的输入问题:

由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。

(3).按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。

5.C语言源程序

#i nclude

unsigned char code ps[]={1,2,3,4,5};

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

unsigned char pslen=9;

unsigned char templen;

unsigned char digit;

unsigned char funcount;

unsigned char digitcount;

unsigned char psbuf[9];

bit cmpflag;

bit hibitflag;

bit errorflag;

bit rightflag;

unsigned int second3;

unsigned int aa;

unsigned int bb;

bit alarmflag;

bit exchangeflag;

unsigned int cc;

unsigned int dd;

bit okflag;

unsigned char oka;

unsigned char okb;

void main(void)

{

unsigned char i,j;

P2=dispcode[digitcount];

TMOD=0x01;

TH0=(65536-500)/256;

TL0=(65536-500)%6;

TR0=1;

ET0=1;

EA=1;

while(1)

{

if(cmpflag==0)

{

if(P3_6==0) //function key

{

for(i=10;i》0;i--)

for(j=248;j》0;j--);

if(P3_6==0)

{

if(hibitflag==0)

{

funcount++;

if(funcount==pslen+2)

{

funcount=0;

cmpflag=1;

}

P1=dispcode[funcount];

}

else

{

second3=0;

}

while(P3_6==0);

}

}

if(P3_7==0) //digit key

{

for(i=10;i》0;i--)

for(j=248;j》0;j--);

if(P3_7==0)

{

if(hibitflag==0)

{

digitcount++;

if(digitcount==10)

{

digitcount=0;

}

P2=dispcode[digitcount];

if(funcount==1)

{

pslen=digitcount;

templen=pslen;

}

else if(funcount》1)

{

psbuf[funcount-2]=digitcount;

}

}

else

{

second3=0;

}

while(P3_7==0);

}

}

}

else

{

cmpflag=0;

for(i=0;i

{

if(ps[i]!=psbuf[i])

{

hibitflag=1;

i=pslen;

errorflag=1;

rightflag=0;

cmpflag=0;

second3=0;

goto a;

}

}

cc=0;

errorflag=0;

rightflag=1;

hibitflag=0;

a: cmpflag=0;

}

}

}

void t0(void) interrupt 1 using 0

{

TH0=(65536-500)/256;

TL0=(65536-500)%6;

if((errorflag==1) && (rightflag==0))

{

bb++;

if(bb==800)

{

bb=0;

alarmflag=~alarmflag;

}

if(alarmflag==1)

{

P0_0=~P0_0;

}

aa++;

if(aa==800)

{

aa=0;

P0_1=~P0_1;

}

second3++;

if(second3==6400)

{

second3=0;

hibitflag=0;

errorflag=0;

rightflag=0;

cmpflag=0;

P0_1=1;

alarmflag=0;

bb=0;

aa=0;

}

}

if((errorflag==0) && (rightflag==1))

{

P0_1=0;

cc++;

if(cc《1000)

{

okflag=1;

}

else if(cc《2000)

{

okflag=0;

}

else

{

errorflag=0;

rightflag=0;

hibitflag=0;

cmpflag=0;

P0_1=1;

cc=0;

oka=0;

okb=0;

okflag=0;

P0_0=1;

}

if(okflag==1)

{

oka++;

if(oka==2)

{

oka=0;

P0_0=~P0_0;

}

}

else

{

okb++;

if(okb==3)

{

okb=0;

P0_0=~P0_0;

}

}

}

}

1.实验任务

用4×4组成0-9数字键及确认键。

用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。

2.电子密码锁电路原理

图4.33.1

3.系统板上硬件连线

(1)。把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。

(2)。把“单片机系统“区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。

(3)。把“单片机系统”区域中的P3.0-P3.7用8芯排线连接到“4×4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。

(4)。把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。

(5)。把“单片机系统”区域中的P1.7用导线连接到“音频放大模块”区域中的SPK IN端子上。

(6)。把“音频放大模块”区域中的SPK OUT接到喇叭上。

4.程序设计内容

(1).4×4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。

(2).8位数码显示,初始化时,显示“P”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。在输入密码过程中,显示器只显示“8.”。当数字输入超过6个时,给出报警信息。在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。

(3).4×4行列式键盘的按键功能分布图如图4.33.2所示:

图4.33.2

5.电子密码锁C语言源程序

#i nclude

unsigned char ps[]={1,2,3,4,5};

unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71,

0x00,0x40,0x73,0xff};

unsigned char dispbuf[8]={18,16,16,16,16,16,16,16};

unsigned char dispcount;

unsigned char flashcount;

unsigned char temp;

unsigned char key;

unsigned char keycount;

unsigned char pslen=5;

unsigned char getps[6];

bit keyoverflag;

bit errorflag;

bit rightflag;

unsigned int second3;

unsigned int aa,bb;

unsigned int cc;

bit okflag;

bit alarmflag;

bit hibitflag;

unsigned char oka,okb;

void main(void)

{

unsigned char i,j;

TMOD=0x01;

TH0=(65536-500)/256;

TL0=(65536-500)%6;

TR0=1;

ET0=1;

EA=1;

while(1)

{

P3=0xff;

P3_4=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=10;i》0;i--)

for(j=248;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=7;

break;

case 0x0d:

key=8;

break;

case 0x0b:

key=9;

break;

case 0x07:

key=10;

break;

}

temp=P3;

P1_1=~P1_1;

if((key》=0) && (key《10))

{

if(keycount《6)

{

getps[keycount]=key;

dispbuf[keycount+2]=19;

}

keycount++;

if(keycount==6)

{

keycount=6;

}

else if(keycount》6)

{

keycount=6;

keyoverflag=1;//key overflow

}

}

else if(key==12)//delete key

{

if(keycount》0)

{

keycount--;

getps[keycount]=0;

dispbuf[keycount+2]=16;

}

else

{

keyoverflag=1;

}

}

else if(key==15)//enter key

{

if(keycount!=pslen)

{

errorflag=1;

rightflag=0;

second3=0;

}

else

{

for(i=0;i

{

if(getps[i]!=ps[i])

{

i=keycount;

errorflag=1;

rightflag=0;

second3=0;

goto a;

}

}

errorflag=0;

rightflag=1;

a: i=keycount;

}

}

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

keyoverflag=0;//?????????

}

}

P3=0xff;

P3_5=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=10;i》0;i--)

for(j=248;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=4;

break;

case 0x0d:

key=5;

break;

case 0x0b:

key=6;

break;

case 0x07:

key=11;

break;

}

temp=P3;

P1_1=~P1_1;

if((key》=0) && (key《10))

{

if(keycount《6)

{

getps[keycount]=key;

dispbuf[keycount+2]=19;

}

keycount++;

if(keycount==6)

{

keycount=6;

}

else if(keycount》6)

{

keycount=6;

keyoverflag=1;//key overflow

}

}

else if(key==12)//delete key

{

if(keycount》0)

{

keycount--;

getps[keycount]=0;

dispbuf[keycount+2]=16;

}

else

{

keyoverflag=1;

}

}

else if(key==15)//enter key

{

if(keycount!=pslen)

{

errorflag=1;

rightflag=0;

second3=0;

}

else

{

for(i=0;i

{

if(getps[i]!=ps[i])

{

i=keycount;

errorflag=1;

rightflag=0;

second3=0;

goto a4;

}

}

errorflag=0;

rightflag=1;

a4: i=keycount;

}

}

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

keyoverflag=0;//?????????

}

}

P3=0xff;

P3_6=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=10;i》0;i--)

for(j=248;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=1;

break;

case 0x0d:

key=2;

break;

case 0x0b:

key=3;

break;

case 0x07:

key=12;

break;

}

temp=P3;

P1_1=~P1_1;

if((key》=0) && (key《10))

{

if(keycount《6)

{

getps[keycount]=key;

dispbuf[keycount+2]=19;

}

keycount++;

if(keycount==6)

{

keycount=6;

}

else if(keycount》6)

{

keycount=6;

keyoverflag=1;//key overflow

}

}

else if(key==12)//delete key

{

if(keycount》0)

{

keycount--;

getps[keycount]=0;

dispbuf[keycount+2]=16;

}

else

{

keyoverflag=1;

}

}

else if(key==15)//enter key

{

if(keycount!=pslen)

{

errorflag=1;

rightflag=0;

second3=0;

}

else

{

for(i=0;i

{

if(getps[i]!=ps[i])

{

i=keycount;

errorflag=1;

rightflag=0;

second3=0;

goto a3;

}

}

errorflag=0;

rightflag=1;

a3: i=keycount;

}

}

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

keyoverflag=0;//?????????

}

}

P3=0xff;

P3_7=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=10;i》0;i--)

for(j=248;j》0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=0;

break;

case 0x0d:

key=13;

break;

case 0x0b:

key=14;

break;

case 0x07:

key=15;

break;

}

temp=P3;

P1_1=~P1_1;

if((key》=0) && (key《10))

{

if(keycount《6)

{

getps[keycount]=key;

dispbuf[keycount+2]=19;

}

keycount++;

if(keycount==6)

{

keycount=6;

}

else if(keycount》6)

{

keycount=6;

keyoverflag=1;//key overflow

}

}

else if(key==12)//delete key

{

if(keycount》0)

{

keycount--;

getps[keycount]=0;

dispbuf[keycount+2]=16;

}

else

{

keyoverflag=1;

}

}

else if(key==15)//enter key

{

if(keycount!=pslen)

{

errorflag=1;

rightflag=0;

second3=0;

}

else

{

for(i=0;i

{

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二极管
    +关注

    关注

    144

    文章

    8942

    浏览量

    160902
  • 密码锁
    +关注

    关注

    6

    文章

    249

    浏览量

    34532
  • C语言
    +关注

    关注

    180

    文章

    7511

    浏览量

    124048
收藏 人收藏

    评论

    相关推荐

    【毕设】51单片机的6位密码锁,矩阵键盘设计,代码原理图仿真论文

    ERROR,输入密码时显示INPUT PASSWORD; (4)实现输入密码错误超过限定的三次电子密码锁定; (5)4×4的矩阵键盘其中包
    发表于 03-15 16:37

    基于51单片机的电子密码锁设计

    电子发烧友网站提供《基于51单片机的电子密码锁设计.rar》资料免费下载
    发表于 01-03 11:20 0次下载

    hbs密码锁管理模式详解

    hbs密码锁管理模式详解  HBS密码锁是一种智能化电子锁具,通过密码、指纹、密码+指纹等认证方式来实现
    的头像 发表于 12-29 14:01 1041次阅读

    【每周一练】盘古1K开发板 练习四:密码锁实验学习记录

    参考资料见练习一: 主要参考“MES2KG.rar”中MES2KG\\\\demo中教程“MES2KG开发板实验指导.pdf”,本次实验主要参照 5. 序列检测器和6. 密码锁。另还需
    发表于 12-11 15:44

    【每周一练】盘古1K开发板 练习四:密码锁

    实验目的: 利用按键、拨码开关以及数码管实现一种简单的密码锁 实验要求: 拨码开关SW1-SW4 设置 2 位数密码,每两位设置一位密码,BM[0:1]设置第一位对应 BM1和 BM2
    发表于 12-10 16:47

    基于单片机的指纹密码锁设计

    利用单片机和指纹识别模块实现指纹密码锁,通过指纹模块采集识别指纹,4*4矩阵键盘输入密码,能够进入管理系统,进入管理后能修改密码、注册指纹,删除指纹等操作。
    的头像 发表于 11-30 09:29 520次阅读
    基于单片机的指纹<b class='flag-5'>密码锁</b>设计

    【每周一练】盘古1K开发板 练习四:密码锁实验

    实验目的:利用按键、拨码开关以及数码管实现一种简单的密码锁 实验要求:拨码开关SW1-SW4 设置 2 位数密码,每两位设置一位密码,BM[0:1]设置第一位对应 BM1和 BM2,B
    发表于 11-29 13:52

    51单片机实现电子密码锁

    电子发烧友网站提供《51单片机实现电子密码锁.zip》资料免费下载
    发表于 10-11 09:21 1次下载
    51单片机<b class='flag-5'>实现</b><b class='flag-5'>电子</b><b class='flag-5'>密码锁</b>

    使用单片机设计电子密码锁

    本课程设计题目是基于单片机的电子密码锁,由单片机控制程序结合LCD1602显示器实现密码输入、密码显示、
    发表于 09-26 07:52

    基于STM32的矩阵电子密码锁protues仿真设计

    基于STM32的矩阵电子密码锁protues仿真设计
    的头像 发表于 08-31 14:50 917次阅读
    基于STM32的矩阵<b class='flag-5'>电子</b><b class='flag-5'>密码锁</b>protues仿真设计

    基于单片机多功能蓝牙电子密码锁设计

    随着人们生活水平和工作水平的不断提高,人们对于居住地、工作地的安全意识不断提高。电子密码锁凭借其价格亲民、安全系数高、容易上手、能源消耗低、只需记住密码即可的优点正在逐渐取代安全系数低、钥匙易丢失
    的头像 发表于 07-21 09:09 912次阅读
    基于单片机多功能蓝牙<b class='flag-5'>电子</b><b class='flag-5'>密码锁</b>设计

    基于STM32+华为云IOT实现动态口令密码锁

    随机密码锁是一种常见的电子锁系统,它使用数字密码代替传统的物理钥匙来进行身份验证和门锁控制。该项目基于STM32微控制器实现一个安全可靠的随机密码锁
    的头像 发表于 07-13 11:46 4372次阅读
    基于STM32+华为云IOT<b class='flag-5'>实现</b>动态口令<b class='flag-5'>密码锁</b>

    基于FPGA的电子按键密码锁设计

    电子密码锁与传统密码锁相比,具有安全性高、成本低、易操作等诸多优点。正因如此,电子密码锁近年来发展迅速,诸如按键式
    的头像 发表于 07-12 16:03 709次阅读

    基于模拟电路的电子密码锁设计

    随着科技的不断发展和进步,电子密码锁已经成为了人们日常生活中必不可少的一种安全防护措施。传统的机械密码锁存在着许多缺陷,例如使用不便、易损坏、安全性差等问题。因此,研究开发一种基于模拟电路的
    的头像 发表于 06-09 16:13 574次阅读
    基于模拟电路的<b class='flag-5'>电子</b><b class='flag-5'>密码锁</b>设计

    基于单片机双机串行通信的电子密码锁设计

    到l0000,每增加l位,密码组合就增加l0倍;同时,在内部的单片机可以显示密码和设置新密码。 本设计是单片机之间的串行通信应用于电子密码锁
    发表于 04-20 15:02 0次下载