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

{

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

    关注

    149

    文章

    10499

    浏览量

    180063
  • 密码锁
    +关注

    关注

    6

    文章

    250

    浏览量

    36841
  • C语言
    +关注

    关注

    183

    文章

    7649

    浏览量

    146420
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    智能电子锁语音芯片怎么选?这三款方案成行业热门之选

    你能想象吗——站在家门口,智能不是靠冰冷指示灯闪烁来回应你,而是用清晰温润的声音说“验证成功,欢迎回家”。从“能用”到“好用”再到“懂你”,智能电子锁的升级之路,语音交互正是那道绕不过的坎。可一到
    的头像 发表于 05-20 09:29 213次阅读
    智能<b class='flag-5'>电子锁</b>语音芯片怎么选?这三款方案成行业热门之选

    S32k33 板的安全启动实现使用哪种 AES 密码类型?

    S32k33 板的安全启动实现使用哪种 AES 密码类型?
    发表于 05-20 08:21

    国芯科技新一代云安全PCI-E密码卡产品在多领域实现应用导入

    近期,国芯科技基于超高性能云安全芯片CCP917T研发的PCI-E密码卡产品CCUPH2H01和CCUPH3H01 在多领域实现应用导入。目前该系列产品已经送样10余家头部客户,应用领域包括网络安全、云密码服务、可信计算等。
    的头像 发表于 03-05 15:07 2121次阅读
    国芯科技新一代云安全PCI-E<b class='flag-5'>密码</b>卡产品在多领域<b class='flag-5'>实现</b>应用导入

    曙光云密码服务管理平台正式荣获商用密码产品认证证书

    近日,曙光云密码服务管理平台正式荣获商用密码产品认证证书,表明曙光云密码服务管理平台(以下简称“平台”)严格满足GM/T 0028《密码模块安全技术要求》二级要求。
    的头像 发表于 02-24 17:21 1469次阅读
    曙光云<b class='flag-5'>密码</b>服务管理平台正式荣获商用<b class='flag-5'>密码</b>产品认证证书

    面试必看:排队自旋之MCS实现原理与关键考点

    在并发编程面试中,“” 是绕不开的核心话题,而自旋作为轻量级的代表,其优化方案更是高频考点。
    的头像 发表于 02-09 16:51 899次阅读
    面试必看:排队自旋<b class='flag-5'>锁</b>之MCS<b class='flag-5'>锁</b>的<b class='flag-5'>实现</b>原理与关键考点

    霍尔元件在电子锁里是如何应用的?用几颗?

    霍尔元件在电子锁中主要通过感知磁场变化实现状态检测、自动控制、防撬报警等功能,其应用数量取决于具体设计需求,通常为1-3颗,复杂系统可能更多。以下是对其应用原理和具体数量的详细分析: 霍尔元件在
    的头像 发表于 11-25 15:01 643次阅读

    广州唯创电子WTV380C-8S语音芯片:流式传输重塑电子锁语音提示新体验

    在智能电子锁日益普及的今天,清晰、即时的语音提示功能已成为提升用户体验与产品价值的关键。然而,实现高质量的语音播放,对于传统方案而言却是一项复杂的工程挑战。广州唯创电子,作为深耕音频技术领域的专业
    的头像 发表于 11-14 11:19 920次阅读
    广州唯创<b class='flag-5'>电子</b>WTV380C-8S语音芯片:流式传输重塑<b class='flag-5'>电子锁</b>语音提示新体验

    屏显智能电子锁语音芯片方案新选择

    在智能家居迅猛发展的当下,电子锁已然从单纯的物理安防设备,摇身一变成为家庭智能交互的关键入口。随着消费者对生活品质要求的不断提高,对电子锁的功能期待也日益增长。高清显示、流畅动态交互以及便捷的语音
    的头像 发表于 07-25 17:57 948次阅读
    屏显智能<b class='flag-5'>电子锁</b>语音芯片方案新选择

    什么是电磁控制板?24路控板的使用步骤概述

    电磁控制板是一种专用于控制电磁工作状态的电子装置,它可以接收指令并对电磁进行通断电操作,从而实现对相关设备的锁定和解锁控制。电磁
    的头像 发表于 07-14 16:26 1005次阅读
    什么是电磁<b class='flag-5'>锁</b>控制板?24路<b class='flag-5'>锁</b>控板的使用步骤概述

    产品拆解 康佳7.4V智能电子防盗

    技术、生物识别技术、物联网技术等多种高科技元素,实现了多种便捷的开锁方式,如指纹识别、密码输入、手机蓝牙开锁、智能卡开锁等,用户无需携带传统钥匙,即可轻松进出家门。 作为家居领域知名品牌,康佳推出的康佳智能电子锁
    的头像 发表于 07-11 15:27 4862次阅读
    产品拆解  康佳7.4V智能<b class='flag-5'>电子</b>防盗<b class='flag-5'>锁</b>

    联世界,智启万家,华普微蓝牙智能解决方案

    密码锁、指纹、刷卡与多模组合等主流门锁形态,支持与手机APP、小程序、智能中控网关等多终端互联,助力客户快速实现智能门锁产品的量产落地
    的头像 发表于 06-26 15:46 1120次阅读
    <b class='flag-5'>锁</b>联世界,智启万家,华普微蓝牙智能<b class='flag-5'>锁</b>解决方案

    电子密码锁1602液晶显示资料

    发表于 06-10 15:09

    串行通信的电子密码锁论文资料

    发表于 06-06 15:10

    八位数字密码锁设计资料

    发表于 06-05 16:14

    WT3000A,电子锁 AI 智慧语音方案强势来袭!

    在智能家居飞速发展的当下,智能市场竞争愈发激烈。各位客户工程师们,是不是正在为寻找一款功能强大、易于二次开发的电子锁语音方案而发愁?别担心,深圳唯创知音电子有限公司近日推出的WT3000A无线语音
    的头像 发表于 05-28 15:52 980次阅读
    WT3000A,<b class='flag-5'>电子锁</b> AI 智慧语音方案强势来袭!