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

{

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

    关注

    147

    文章

    9653

    浏览量

    166657
  • 密码锁
    +关注

    关注

    6

    文章

    249

    浏览量

    35026
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136994
收藏 人收藏

    评论

    相关推荐

    智能门锁触摸芯片_门锁感应芯片_指纹密码锁芯片

    ,通过触摸式操作,可以快速、精准地开启门锁;使用触摸芯片,不论是普通的指纹,还是高端的智能,都可以实现快速的开门操作,提高安全系数。 此外,智能门锁触摸芯片具有超高的安全性能;它采用了高级的加密技术,可
    的头像 发表于 09-26 14:57 415次阅读
    智能门锁触摸芯片_门锁感应芯片_指纹<b class='flag-5'>密码锁</b>芯片

    智能密码、指纹语音芯片ic方案 可存放40s语音内容 NVD语音芯片

    随着科技的飞速发展,智能家居安全领域迎来了前所未有的变革。智能密码与指纹作为现代家庭安全防护的重要一环,其背后的语音芯片IC开发更是这一变革中的关键技术突破。智能密码、指纹语音芯片
    的头像 发表于 09-25 08:01 292次阅读
    智能<b class='flag-5'>密码</b>、指纹<b class='flag-5'>锁</b>语音芯片ic方案 可存放40s语音内容 NVD语音芯片

    支持Wi-Fi®的电子智能

    电子发烧友网站提供《支持Wi-Fi®的电子智能.pdf》资料免费下载
    发表于 08-30 11:20 0次下载
    支持Wi-Fi®的<b class='flag-5'>电子</b>智能<b class='flag-5'>锁</b>

    D存器的基本实现

    在Verilog HDL中实现存器(Latch)通常涉及对硬件描述语言的基本理解,特别是关于信号如何根据控制信号的变化而保持或更新其值。存器与触发器(Flip-Flop)的主要区别在于,
    的头像 发表于 08-30 10:45 815次阅读

    互斥和自旋实现原理

    保护共享资源不被多个线程同时访问。它的实现原理主要包括以下几个方面: 1. 的初始化 互斥锁在创建时需要进行初始化,通常包括设置的状态为“未锁定”。在某些实现中,还需要初始化
    的头像 发表于 07-10 10:07 505次阅读

    鸿蒙开发系统基础能力:ohos.screenLock 屏管理

    屏管理服务是OpenHarmony中系统服务,为屏应用提供注册亮屏、灭屏、开启屏幕、结束休眠、退出动画、请求解锁结果监听,并提供回调结果给屏应用。屏管理服务向三方应用提供请求解
    的头像 发表于 06-27 11:41 771次阅读
    鸿蒙开发系统基础能力:ohos.screenLock <b class='flag-5'>锁</b>屏管理

    鸿蒙ArkTS声明式组件:PatternLock

    图案密码锁组件,以九宫格图案的方式输入密码,用于密码验证场景。手指在PatternLock组件区域按下时开始进入输入状态,手指离开屏幕时结束输入状态完成密码输入。
    的头像 发表于 06-27 09:59 473次阅读
    鸿蒙ArkTS声明式组件:PatternLock

    基于51单片机密码锁数码管显示设计

    本资源内容概要:       这是基于51单片机密码锁数码管显示设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件清单(excel表格打开
    发表于 06-25 10:05 4次下载

    【紫光同创盘古PGX-Nano教程】——(盘古PGX-Nano开发板/PG2L50H_MBG324第八章)密码锁实验例程

    灯、按键、拨码开关等。 二:实验目的 利用盘古 PGX-Nano 板卡上的按键,拨码开关以及数码管实现一种简单的密码锁; 三:实验要求 利用拨码开关设置密码,使用按键输入开锁密码
    发表于 06-13 17:55

    14键触摸触控芯片-智能感应密码锁解决方案

    智能感应密码锁作为一种高科技产品,正逐渐取代传统的机械密码锁,成为人们家居安全的新选择。而要实现智能感应密码锁的功能,关键在于其内部的触摸触控芯片。本文将介绍一种应用于智能感应
    的头像 发表于 03-18 10:17 785次阅读
    14键触摸触控芯片-智能感应<b class='flag-5'>密码锁</b>解决方案

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

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

    PLC的点动与自设计功能实现

    我们通过加装一个中间继电器M0.0来实现与点动功能。
    的头像 发表于 03-11 14:06 1459次阅读
    PLC的点动与自<b class='flag-5'>锁</b>设计功能<b class='flag-5'>实现</b>

    典型密码锁电路图分享

    密码锁是一种通过输入密码来解锁或上锁的安全锁具。它广泛应用于各种场合,如家庭、酒店、公寓、商业场所等,以保护个人和物品的安全。
    的头像 发表于 02-18 14:49 5056次阅读
    典型<b class='flag-5'>密码锁</b>电路图分享

    通过Python脚本实现WIFI密码的自动猜解

    本文将记录学习下如何通过 Python 脚本实现 WIFI 密码的自动猜解。
    的头像 发表于 01-25 10:46 3486次阅读
    通过Python脚本<b class='flag-5'>实现</b>WIFI<b class='flag-5'>密码</b>的自动猜解

    基于51单片机的蓝牙密码锁设计

    电子发烧友网站提供《基于51单片机的蓝牙密码锁设计.rar》资料免费下载
    发表于 01-12 10:14 4次下载