基于单片机控制电子密码锁报告.docx
《基于单片机控制电子密码锁报告.docx》由会员分享,可在线阅读,更多相关《基于单片机控制电子密码锁报告.docx(28页珍藏版)》请在冰豆网上搜索。
基于单片机控制电子密码锁报告
单片机原理与应用技术
课程设计报告(论文)
基于单片机控制的电子密码锁
专业班级:
应用电子技术教育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.答辩
在规定时间内,完成叙述并回答问题。
1引言1
2总体设计方案1
2.1设计思路1
2.1.1方案确立1
2.2设计方框图1
3设计原理分析1
3.1单片机最小系统的设计2
3.1.1复位电路2
3.1.2晶振电路2
3.2显示电路的设计2
3.3矩阵按键的设计3
3.3.1矩阵按键电路图3
3.3.2矩阵按键说明3
3.3.3矩阵按键原理3
3.4I2C电路的设计3
4结束语4
参考文献4
附录1电路原理图5
附录2电路PCB图6
附录3程序代码7
基于单片机控制的电子密码锁
应教151班黄永进
摘要:
设计是采用STC89C52芯片控制一个三位一体的数码管,通过4x4矩阵按键来控制密码输入以及不同的系统指令来完成密码锁的密码输入和修改等,同时使用AT24C04芯片来实现掉电密码数据存储的功能。
系统的核心控制主要是通过编写C语言来控制单片机实现。
关键词:
单片机矩阵I2C蜂鸣器数码管
1引言
随着科技的进步和社会的发展,安全隐患层出不穷,人们的安全意识逐渐提高,对锁的要求也随之提高。
电子密码锁采用键盘输入密码,在具备传统锁的基础作用的同时,有更方便更安全的作用。
本文对基于单片机的电子密码锁进行具体的介绍。
该电子密码锁包含显示模块、按键举证、采用1到16位数密码,正确输入密码开锁,三次输错密码报警,修改密码这些功能。
该设计具有成本低、易操作、功耗低、效率高等优点。
2总体设计方案
2.1设计思路
2.1.1方案确立
(1)方案内容
该设计方案采用STC89C52芯片作为核心,配合数码管、矩阵按键、蜂鸣器等外围电路进行组合,组成电子密码锁系统。
其中矩阵按键用来设置系统的密码和输入密码,数码管用于显示开锁状态和成功开锁的次数,最后用C语言程序控制其逻辑功能。
2.2设计方框图
(1)设计框图如图1.1
图1设计框图
3设计原理分析
3.1单片机最小系统的设计
3.1.1复位电路
单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。
单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。
在本设计中也不例外,如图1.2中复位电路由电容串联电阻构成,并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且这个高电平持续的时间由电路的RC值来决定。
典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。
3.1.2晶振电路
每个单片机系统里都有晶振(如图1.2中器件Y1),全称是叫晶体震荡器,在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。
本设计中晶振取12MHz,因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合,12MHz产生精确的uS级时歇,方便定时操作。
图2最小系统
3.2显示电路的设计
本设计中的密码输入显示及系统状态的显示都是采用一个共阳极的三位一体的数码管实现。
图3数码管图4三极管驱动
在电路中将三位一体数码管(如图1.3)的abcdefg脚通过分别串接一个电阻之后与单片机P2.0~P2.7连接,另外为了实现位选控制将三位一体数码管的DG1、DG2与DG3引脚通过三极管驱动(如图1.4)与单片机P3.1、P3.2、P3.3连接。
3.3矩阵按键的设计
图5矩阵按键电路
表1按键说明表
按键
键名
功能
0-9
数字键
密码输入
OP
开锁键
开启输入密码请求
DE
退格键
删除已输入的内容
SE
设置键
用户密码修改重置
EN
确定键
输入内容确定
AD
管理键
用于开启管理员权限
当无按键闭合时,P1.0~P1.3与P1.4~P1.7之间开路。
当有键闭合时,与闭合键相连的两条I/O口线之间短路。
判断有无按键按下的方法是:
第一步,置列线P1.4~P1.7为输入状态,从行线P1.0~P1.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。
第二步,行线轮流输出低电平,从列线P1.4~P1.7读入数据,若有某一列为低电平,则对应行线上有键按下。
综合一二两步的结果,可确定按键编号。
但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。
3.4I2C电路的设计
在本设计中应用I2C总线的EEPROM做存储设备(24C04芯片如图1.6所示)。
为了驱动I2C总线,在单片机向总线送数据程序时则可以在SCL还在低电平时,把数据电平送到SDA,然后拉高SCL,这时SDA不应有电平跳变,延时后拉低SCL,再进行下一位的数据传送直到完成。
在总线上读数据时也是只有在SCL为高时,SDA为有效数据。
图6I2C电路图
3.5报警电路的设计
图7报警电路
设计中报警电路如图1.7所示,蜂鸣器使用三极管驱动,通过一个限流电阻之后与单片机P3.0连接。
因此,我们可以通过程序控制P3.0脚的电平来使蜂鸣器发出声音和关闭,从而实现系统报警。
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&&