基于单片机控制电子密码锁报告.docx

上传人:b****4 文档编号:5986960 上传时间:2023-05-09 格式:DOCX 页数:27 大小:28.40KB
下载 相关 举报
基于单片机控制电子密码锁报告.docx_第1页
第1页 / 共27页
基于单片机控制电子密码锁报告.docx_第2页
第2页 / 共27页
基于单片机控制电子密码锁报告.docx_第3页
第3页 / 共27页
基于单片机控制电子密码锁报告.docx_第4页
第4页 / 共27页
基于单片机控制电子密码锁报告.docx_第5页
第5页 / 共27页
基于单片机控制电子密码锁报告.docx_第6页
第6页 / 共27页
基于单片机控制电子密码锁报告.docx_第7页
第7页 / 共27页
基于单片机控制电子密码锁报告.docx_第8页
第8页 / 共27页
基于单片机控制电子密码锁报告.docx_第9页
第9页 / 共27页
基于单片机控制电子密码锁报告.docx_第10页
第10页 / 共27页
基于单片机控制电子密码锁报告.docx_第11页
第11页 / 共27页
基于单片机控制电子密码锁报告.docx_第12页
第12页 / 共27页
基于单片机控制电子密码锁报告.docx_第13页
第13页 / 共27页
基于单片机控制电子密码锁报告.docx_第14页
第14页 / 共27页
基于单片机控制电子密码锁报告.docx_第15页
第15页 / 共27页
基于单片机控制电子密码锁报告.docx_第16页
第16页 / 共27页
基于单片机控制电子密码锁报告.docx_第17页
第17页 / 共27页
基于单片机控制电子密码锁报告.docx_第18页
第18页 / 共27页
基于单片机控制电子密码锁报告.docx_第19页
第19页 / 共27页
基于单片机控制电子密码锁报告.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机控制电子密码锁报告.docx

《基于单片机控制电子密码锁报告.docx》由会员分享,可在线阅读,更多相关《基于单片机控制电子密码锁报告.docx(27页珍藏版)》请在冰点文库上搜索。

基于单片机控制电子密码锁报告.docx

基于单片机控制电子密码锁报告

单片机原理与应用技术

课程设计报告(论文)

基于单片机控制的电子密码锁

专业班级:

应用电子技术教育151班

姓  名:

黄永进

时间:

2017

指导教师:

孔晓红邵锋_张素君

2017年11月24日

基于单片机控制的电子密码锁课程设计任务书

1.设计目的与要求

设计出一个基于单片机控制的电子密码锁。

准确地理解有关要求,独立完成系统设计,要求所设计的电路具有以下功能:

(一)基本功能

(1)状态显示功能:

锁定状态时系统用3位数码管显示OFF,用3位数码管显示成功开锁次数;成功开锁时用3位数码管显示888,用3位数码管显示成功开锁次数。

(2)密码设定功能:

通过一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),同时系统掉电后能自动记忆和存储密码在系统中。

(3)报警和加锁功能:

密码的输入时间超过12秒或者连续3次输入失败,声音报警同时锁定系统,不让再次输入密码。

此时只有使用管理员密码方能对系统解锁。

(二)扩展功能

实现电机的正反转状态指示及速度快慢指示。

(二)扩展功能

可增加遥控控制功能

2.设计内容

(1)画出电路原理图,正确使用逻辑关系;

(2)确定元器件及元件参数;

(3)进行电路模拟仿真;

(4)SCH文件生成与打印输出;

(5)硬件及程序综合调试;

3.编写设计报告

写出设计的全过程,附上有关资料和图纸,有心得体会

4.答辩

在规定时间内,完成叙述并回答问题。

 

基于单片机控制的电子密码锁

应教151班黄永进

摘要:

设计是采用STC89C52芯片控制一个三位一体的数码管,通过4x4矩阵按键来控制密码输入以及不同的系统指令来完成密码锁的密码输入和修改等,同时使用AT24C04芯片来实现掉电密码数据存储的功能。

系统的核心控制主要是通过编写C语言来控制单片机实现。

关键词:

单片机矩阵I2C蜂鸣器数码管

1引言

随着科技的进步和社会的发展,安全隐患层出不穷,人们的安全意识逐渐提高,对锁的要求也随之提高。

电子密码锁采用键盘输入密码,在具备传统锁的基础作用的同时,有更方便更安全的作用。

本文对基于单片机的电子密码锁进行具体的介绍。

该电子密码锁包含显示模块、按键举证、采用1到16位数密码,正确输入密码开锁,三次输错密码报警,修改密码这些功能。

该设计具有成本低、易操作、功耗低、效率高等优点。

2总体设计方案

设计思路

2.1.1方案确立

(1)方案内容

该设计方案采用STC89C52芯片作为核心,配合数码管、矩阵按键、蜂鸣器等外围电路进行组合,组成电子密码锁系统。

其中矩阵按键用来设置系统的密码和输入密码,数码管用于显示开锁状态和成功开锁的次数,最后用C语言程序控制其逻辑功能。

设计方框图

(1)设计框图如图

 

图1设计框图

3设计原理分析

单片机最小系统的设计

复位电路

单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。

单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。

在本设计中也不例外,如图中复位电路由电容串联电阻构成,并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且这个高电平持续的时间由电路的RC值来决定。

典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。

晶振电路

每个单片机系统里都有晶振(如图中器件Y1),全称是叫晶体震荡器,在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。

本设计中晶振取12MHz,因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合,12MHz产生精确的uS级时歇,方便定时操作。

图2最小系统

显示电路的设计

本设计中的密码输入显示及系统状态的显示都是采用一个共阳极的三位一体的数码管实现。

图3数码管图4三极管驱动

在电路中将三位一体数码管(如图)的abcdefg脚通过分别串接一个电阻之后与单片机~连接,另外为了实现位选控制将三位一体数码管的DG1、DG2与DG3引脚通过三极管驱动(如图)与单片机、、连接。

矩阵按键的设计

图5矩阵按键电路

表1按键说明表

按键

键名

功能

0-9

数字键

密码输入

OP

开锁键

开启输入密码请求

DE

退格键

删除已输入的内容

SE

设置键

用户密码修改重置

EN

确定键

输入内容确定

AD

管理键

用于开启管理员权限

当无按键闭合时,~与~之间开路。

当有键闭合时,与闭合键相连的两条I/O口线之间短路。

判断有无按键按下的方法是:

第一步,置列线~为输入状态,从行线~输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。

第二步,行线轮流输出低电平,从列线~读入数据,若有某一列为低电平,则对应行线上有键按下。

综合一二两步的结果,可确定按键编号。

但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。

I2C电路的设计

在本设计中应用I2C总线的EEPROM做存储设备(24C04芯片如图所示)。

为了驱动I2C总线,在单片机向总线送数据程序时则可以在SCL还在低电平时,把数据电平送到SDA,然后拉高SCL,这时SDA不应有电平跳变,延时后拉低SCL,再进行下一位的数据传送直到完成。

在总线上读数据时也是只有在SCL为高时,SDA为有效数据。

图6I2C电路图

报警电路的设计

图7报警电路

设计中报警电路如图所示,蜂鸣器使用三极管驱动,通过一个限流电阻之后与单片机连接。

因此,我们可以通过程序控制脚的电平来使蜂鸣器发出声音和关闭,从而实现系统报警。

4结束语

在这次实习的过程中,从选题到定稿,从理论到实践,可以说得是苦多于甜,但是可以学到很多的的东西,不仅巩固了以前学过的知识,还学到了很多在书本上没有学到过的知识。

通过这次课程设计使我懂得了理论与实践同等重要,只有将理论和实践相结合才能提高自己的实际动手能力和独立思考的能力。

当然这次实习能够那么顺利的完成,除了自己的努力外,离不开院方为我们制定的严格的计划,离不开指导老师的严格的督查和耐心的教导指点,离不开班级同学的帮助与支持。

参考文献

[1] 谭浩强.c语言程序设计.北京:

清华大学出本社,2010

[2] 李建忠.单片机原理及应用.西安:

西安电子科技新大学出版社,2013

附录1电路原理图

附录2电路PCB图

附录3程序流程图

附录4程序代码

#include<>

#defineuintunsignedint

#defineucharunsignedchar

#defineKeyPortP1

ucharDD_F=0,DM_F=0;

ucharR[16];//用户密码

ucharM[16];//芯片密码

ucharG[6]={6,6,6,6,6,6};

ucharcodeDIS_SEG7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

//ucharcodeDIS_BIT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

sbitfmq=P3^0;

sbitwei1=P3^1;

sbitwei2=P3^2;

sbitwei3=P3^3;

sbitscl=P3^4;//24c08SCL

sbitsda=P3^5;//24c08SDA

sbitLED=P3^7;

chardis[3]={0};

unsignedcharnum=1,num1=0,num2=0;

charTime_temp=0;

charDIG_C1=0;

charDIG_C2=0;

charDIG_C3=0;

ucharflag=1,adm=0,flagg=1,adm1=1,flagb=0;

uintscs=0,ecs=0;

charTim_flog=0;

intTim_temp1=0;

charTim_CNT=0;

voiddelay()//delay5us

{;;}

voidDelay10ms(unsignedintc)

{

unsignedchara,b;

for(;c>0;c--)

{

for(b=15;b>0;b--)

{

for(a=130;a>0;a--);

}

}

}

voiddisplay(uinti,uintj,uintk)

{

dis[0]=i;

dis[1]=j;

dis[2]=k;

}

unsignedcharKeyScan(void)

{

unsignedcharcord_h,cord_l;

KeyPort=0x0f;

cord_h=KeyPort&0x0f;

if(cord_h!

=0x0f)

{

Delay10ms

(1);

if((KeyPort&0x0f)!

=0x0f)

{

cord_h=KeyPort&0x0f;

KeyPort=cord_h|0xf0;

cord_l=KeyPort&0xf0;

while((KeyPort&0xf0)!

=0xf0);

return(cord_h+cord_l);

}

}return(0xff);

}

unsignedcharKeyPro(void)

{

switch(KeyScan())

{

case0x7e:

return0;break;//0

case0x7d:

return1;break;//1

case0x7b:

return2;break;//2

case0x77:

return3;break;//3

case0xbe:

return4;break;//4

case0xbd:

return5;break;//5

case0xbb:

return6;break;//6

case0xb7:

return7;break;//7

case0xde:

return8;break;//8

case0xdd:

return9;break;//9

case0xdb:

return10;break;//a

case0xd7:

return11;break;//b

case0xee:

return12;break;//c

case0xed:

return13;break;//d

case0xeb:

return14;break;//e

case0xe7:

return15;break;//f

default:

return0xff;break;

}

}

voidTim_Iint(void)

{

TMOD&=0XF0;

TMOD|=0X01;

TL0=(65535-1000)%256;

TH0=(65535-1000)/256;

ET0=1;

TR0=1;

EA=1;

}

voidClose_DIG(chari,chark,charj)

{

if(i==1)

{

DIG_C1=1;

}

if(i==0)

{

DIG_C1=0;

}

if(k==1)

{

DIG_C2=1;

}

if(k==0)

{

DIG_C2=0;

}

if(j==1)

{

DIG_C3=1;

}

if(j==0)

{

DIG_C3=0;

}

}

voidTime0(void)interrupt1using1

{

chari;

TL0=(65535-1000)%256;

TH0=(65535-1000)/256;

if(Tim_flog==1)

{

Tim_temp1++;

if(Tim_temp1>1000)

{

Tim_temp1=0;

Tim_CNT++;

}

}

if(Time_temp==0)

{

if(DIG_C1==1)

{

P2=DIS_SEG7[dis[0]];

wei1=0;

wei3=1;

wei2=1;

}

if(DIG_C1==0)

{

wei1=1;

wei3=1;

wei2=1;

}

Time_temp=1;

gotoend;

}

if(Time_temp==1)

{

if(DIG_C2==1)

{

P2=DIS_SEG7[dis[1]];

wei1=1;

wei2=0;

wei3=1;

}

if(DIG_C2==0)

{

wei1=1;

wei3=1;

wei2=1;

}

Time_temp=2;

gotoend;

}

if(Time_temp==2)

{

if(DIG_C3==1)

{

P2=DIS_SEG7[dis[2]];

wei1=1;

wei2=1;

wei3=0;

}

if(DIG_C3==0)

{

wei1=1;

wei2=1;

wei3=1;

}

Time_temp=0;

gotoend;

}

end:

i=0;

}

voidstart()//开始信号

{

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

voidstop()//停止信号

{

sda=0;

delay();

scl=1;

delay();

sda=1;

delay();

}

voidrespons()//应答

{

uchari;

scl=1;

delay();

while((sda==1)&&(i<250))i++;

scl=0;

delay();

}

voidinit_24c08()//初始化24C02

{

sda=1;

delay();

scl=1;

delay();

}

voidwrite_byte(uchardate)

{

uchari,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

scl=0;

delay();

sda=CY;

delay();

scl=1;

delay();

//scl=0;

//delay();

}

scl=0;

delay();

sda=1;

delay();

}

ucharread_byte()

{

uchari,k;

scl=0;

delay();

sda=1;

delay();

for(i=0;i<8;i++)

{

scl=1;

delay();

k=(k<<1)|sda;

scl=0;

delay();

}

returnk;

}

voidwrite_24c08(ucharaddress,ucharshuju)//给指定地址中写入数据

{

start();

write_byte(0xa0);//最低位为0写,1读

respons();

write_byte(address);

respons();

write_byte(shuju);

respons();

stop();

Delay10ms

(1);

}

ucharread_24c08(ucharaddress)//从24c08指定地址中读出数据

{

uchardate;

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

start();

write_byte(0xa1);

respons();

date=read_byte();

stop();

Delay10ms

(1);

returndate;

}

voidmain(void)

{

chartemp1=0,temp2=0,temp3=0;

chari=0,j=0,k=0,m=0;

chardis_temp=0;

ucharcnt1=0,cnt2=0,cnt3=0;

//chara,b,c;

init_24c08();

Tim_Iint();

Close_DIG(1,1,1);

for(m=1;m<=16;m++)

{

M[m-1]=read_24c08(m);

cnt1=read_24c08(20);

}

while

(1)

{

num=KeyPro();

Close_DIG(1,1,1);

display(0,15,15);

//判断管理员标志位adm

if(adm==0)

{

if(adm1==0)

{

if(num==14)

{

Close_DIG(0,0,0);

cnt1=0;

while

(1)

{

num=KeyPro();

if(num<10)

{

Close_DIG(1,1,1);

M[cnt1]=num;

while(num==KeyPro());

temp1++;

cnt1++;

if(temp1==4)

temp1=1;

}

if(num==13)

{

cnt1--;

if(cnt1<=0)

cnt1=0;

temp1--;

if(temp1==0)

temp1=3;

}

if(temp1==1)

{

display(M[cnt1-1],16,16);

}

if(temp1==2)

{

display(16,M[cnt1-1],16);

}

if(temp1==3)

{

display(16,16,M[cnt1-1]);

}

if(num==15)

{

for(k=1;k<=cnt1;k++)

{

write_24c08(k,M[k-1]);

write_24c08(20,cnt1);

}

}

adm1=1;

break;

}

Delay10ms

(1);

}

}

}

if(num==12)

{

Close_DIG(0,0,0);

cnt2=0;

while

(1)

{

Tim_flog=1;

num=KeyPro();

if(num<10)

{

Close_DIG(1,1,1);

R[cnt2]=num;

while(num==KeyPro());

temp2++;

cnt2++;

if(temp2==4)

temp2=1;

}

if(num==13)

{

cnt2--;

if(cnt2<=0)

cnt2=0;

temp2--;

if(temp2==0)

temp2=3;

}

if(temp2==1)

{

display(R[cnt2-1],16,16);

}

if(temp2==2)

{

display(16,R[cnt2-1],16);

}

if(temp2==3)

{

display(16,16,R[cnt2-1]);

}

if(num==15)

{

Tim_CNT=0;

Tim_flog=0;

if(cnt1==cnt2)

{

for(j=0;j

{

//判断密码是否正确

flag=flag&&(M[j]==R[j]);

}

if(flag)

{

scs++;

display(8,8,8);

Delay10ms(800);

cnt2=0;

temp2=0;

display(0,(scs/10),(scs%10));

Delay10ms(800);

break;

}

else

{

ecs++;

Close_DIG(0,0,0);

cnt2=0;

temp2=0;

flag=1;

Tim_flog=0;

Tim_CNT=0;

}

}else

{ecs++;

Close_DIG(0,0,0);

cnt2=0;

temp2=0;

flag=1;

Tim_flog=0;

Tim_CNT=0;

}

}

Delay10ms

(1);

if(Tim_CNT==12)

{

adm=1;

fmq=0;

flagb=1;

Tim_flog=0;

Tim_CNT=0;

break;

}

if(ecs>=3)

{

adm=1;

fmq=0;

flagb=1;

Tim_flog=0;

Tim_CNT=0;

break;

}

}

}

}

if(num==10){

Close_DIG(0,0,0);

}

if(num==11)

{

Close_DIG(0,0,0);

cnt3=0;

while

(1)

{

num=KeyPro();

if(num<10)

{Close_DIG(1,1,1);

R[cnt3]=num;

while(num==KeyPro());

temp3++;

cnt3++;

if(temp3==4)

temp3=1;

}

if(num==13)

{

cnt3--;

if(cnt3<=0)

cnt3=0;

temp3--;

if(temp3==0)

temp3=3;

}

if(temp3==1)

{

display(R[cnt3-1],16,16);

}

if(temp3==2)

{

display(16,R[cnt3-1],16);

}

if(temp3==3)

{

display(16,16,R[cnt3-1]);

}

if(num==15)

{

Tim_CNT=0;

Tim_flog=0;

if(cnt3==6)

{

for(j=0;j<6;j++)

{

flagg=flagg&&(G[j]==R[j]);

}

if(flagg&&flagb==0)

{

ecs=0;

fmq=1;

adm=0;

adm1=0;

Tim_flog=0;

Tim_CNT=0;

break;

}

elseif(flagg&&flagb==1)

{Tim_flog=0;

Tim_CNT=0;

ecs=0;

fmq=1;

adm=0;

adm1=1;

flagb=0;

break;

}

else

{

Tim_flog=0;

Tim_CNT=0;

flagg=1;

}

}

}

Delay10ms

(1);

}

}

Delay10ms

(1);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2