基于单片机的8位密码锁.docx
《基于单片机的8位密码锁.docx》由会员分享,可在线阅读,更多相关《基于单片机的8位密码锁.docx(15页珍藏版)》请在冰豆网上搜索。
基于单片机的8位密码锁
课程设计报告
题目8位数码管显示的密码锁
课程名称单片机原理及接口技术
院部名称机电工程
专业自动化
班级09自动化
学生姓名
学号
课程设计地点C314
课程设计学时一周
指导教师
金陵科技学院教务处制
一:
概述
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机了解计算机原理与结构的最佳选择。
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。
简易电子密码锁是由89S51单片机来实现密码锁的功能的电路。
利用单片机的相关引脚,通过相关的程序,将独立式按键,移位寄存器等元器件进行组合,来达到预期的效果。
简易电子密码锁主要由89S51单片机,矩阵键盘,LED显示器,锁存器(74HC573),74HC138译码器,电阻等组成。
二:
硬件和软件介绍
1:
89S51单片机
单片机自1976年由Intel公司推出MCS-48开始,迄今已有三十多年了。
由于单片机集成度高、功能强、可靠性高、体积小、功耗低、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。
单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域,对各个行业的技术改造和产品更新换代起着重要的推动作用。
单片机有两种基本结构形式:
一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。
另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器。
目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。
本设计讨论的单片机多功能定时器的核心是目前应用极为广泛的51系列单片机,配置了外围设备,构成了一个可编程的计时定时系统,具有体积小,可靠性高,功能强等特点。
不仅能满足所需要求而且还有很多功能可供开发,有着广泛的应用领域[1]。
20世纪80年代中期以后,Intel公司以专利转让的形式把8051内核技术转让给许多半导体芯片生产厂家,如ATMEL、PHILIPS、ANALOG、DEVICES、DALLAS等。
这些厂家生产的芯片是MCS-51系列的兼容产品,准确地说是与MCS-51指令系统兼容的单片机。
这些兼容机与8051的系统结构(主要是指令系统)相同,采用CMOS工艺,因而,常用80C51系列来称呼所有具有8051指令系统的单片机,它们对8051单片机一般都作了一些扩充,使其更有特点。
其功能和市场竞争力更强,其实不该把它们直接称呼为MCS-51系列单片机,因为MCS只是Intel公司专用的单片机系列型号。
MCS-51系列及80C51单片机有多种品种。
它们的引脚及指令系统相互兼容,主要在内部结构上有些区别。
目前使用的MCS-51系列单片机及其兼容产品通常分成以下几类:
基本型、增强型、低功耗型、专用型、超8位型、片内闪烁存储器型。
其中ATMEL公司的标准型AT89单片机因其与MCS-51的完全兼容性、优良的工作性能、使用的灵活性以及较高的性能价格比,成为AT89系列单片机的主流机型,在嵌入式控制系统中获得广泛应用。
2:
LED显示器
3:
矩阵键盘
按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。
目前,微机系统中最常见的是触点式开关按键。
按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。
全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路。
这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。
非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。
由于其经济实用,较多地应用于单片机系统中。
在本套设计中由于只需要几个功能键,此时,可采用独立式按键结构
4锁存器
74hc573概述
74hc573是一款高速cmos器件,74hc573引脚兼容低功耗肖特基ttl(lsttl)系列。
74hc573包含八路d型透明锁存器,每个锁存器具有独立的d型输入,以及适用于面向总线的应用的三态输出。
所有锁存器共用一个锁存使能(le)端和一个输出使能(oe)端。
当le为高时,数据从dn输入到锁存器,在此条件下,锁存器进入透明模式,也就是说,锁存器的输出状态将会随着对应的d输入每次的变化而改变。
当le为低时,锁存器将存储d输入上的信息一段就绪时间,直到le的下降沿来临。
当oe为低时,8个锁存器的内容可被正常输出;当oe为高时,输出进入高阻态。
oe端的操作不会影响锁存器的状态。
74hc573与以下型号逻辑功能相同:
74hc563,但输出为反相
74hc373,但引脚布局不同
74hc573特性
输入输出分布在芯片封装的两侧,为微处理器简便的接口
用于微控制器和微型计算机的输入输出口
三态正相输出,用于面向总线的应用
共用三态输出使能端
5译码器
74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。
74HC138译码器可接受3位二进制加权地址输入(A0,A1和A3),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:
两个低有效(E1和E2)和一个高有效(E3)。
除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。
利用这种复合使能特性,仅需4片74HC138芯片和1个反相器,即可轻松实现并行扩展,组合成为一个1-32(5线到32线)译码器。
任选一个低有效使能输入端作为数据输入,而把其余的使能输入端作为选通端,则74HC138亦可充当一个8输出多路分配器,未使用的使能输入端必须保持绑定在各自合适的高有效或低有效状态。
74HC138与74HC238逻辑功能一致,只不过74HC138为反相输出。
74HC138功能:
CD74HC138,CD74HC238和CD74HCT138,CD74HCT238是高速硅栅CMOS解码器,适合内存地址解码或数据路由应用。
74HC138作用原理于高性能的存贮译码或要求传输延迟时间短的数据传输系统,在高性能存贮器系统中,用这种译码器可以提高译码系统的效率。
将快速赋能电路用于高速存贮器时,译码器的延迟时间和存贮器的赋能时间通常小于存贮器的典型存取时间,这就是说由肖特基钳位的系统译码器所引起的有效系统延迟可以忽略不计。
HC138按照三位二进制输入码和赋能输入条件,从8个输出端中译出一个低电平输出。
两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器,扩展成24线译码器不需外接门;扩展成32线译码器,只需要接一个外接倒相器。
在解调器应用中,赋能输入端可用作数据输入端。
6晶振电路的设计
单片机晶振电路的设计如图所示。
XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2(X2)是来自反向振荡器的输出。
按照理论上AT89C51使用的是12MHz的晶振,但实测使用11.0592MHz。
所以设计者通常用的是11.0592MHz。
7整体设计图
8protel设计图
三:
程序设计
#include
#include"24c02.h"
#include"key.h"
#defineDataPortP0
unsignedcharDuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8c,0x86,0xab,0xaf,0xff};
unsignedcharWeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsignedchartempdata[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsignedcharkey[8]={0,0,0,0,0,0,0,0};
unsignedcharinputkey[8]={0,0,0,0,0,0,0,0};
bitsureflag=0;
bitchangeflag=0;
bitchangeflag1=0;
voidSEG_Latch(void)
{
P2|=0xe0;
_nop_();
P2&=0x1f;
}
voidBIT_Latch(void)
{
P2|=0xc0;
_nop_();
P2&=0x1f;
}
voiddisplay(uchar*point)
{
unsignedchari=0;
for(i=0;i<8;i++)
{
DataPort=WeiMa[i];
BIT_Latch();
DataPort=DuanMa[*(point+i)];
SEG_Latch();
delay_50us(20);
DataPort=0xff;
SEG_Latch();
}
}
voidmain(void)
{
inti,j=0,n;
unsignedcharkeytemp;
unsignedchartemp[8]={14,14,14,14,14,14,14,14};
unsignedcharmima[8]={1,2,3,4,5,6,7,8};
P2=0xa0;
P0=0x00;
P2&=0x1f;
while
(1)
{
keytemp=keyscan();
if(keytemp!
=0xff)
{
if((keytemp<10))
{
if(changeflag1==0)
temp[i]=keytemp;
else
{
temp[i]=keytemp;
mima[i]=keytemp;
}
i++;
if(i>7)
{
i=0;
if(changeflag1)
{
changeflag=0;
changeflag1=0;
}
}
}
elseif(keytemp==11)
{
sureflag=1;
for(j=0;j<8;j++)
{
if(temp[j]!
=mima[j])
{
sureflag=0;
break;
}
}
if(sureflag)
{
if(changeflag==0)
{
temp[0]=0;
temp[1]=10;
temp[2]=11;
temp[3]=12;
for(j=4;j<8;j++)
temp[j]=14;
}
else
{
temp[0]=13;
for(j=1;j<8;j++)
temp[j]=14;
changeflag1=1;
}
}
else
{
temp[0]=11;
temp[1]=13;
temp[2]=13;
for(j=3;j<8;j++)
temp[j]=14;
}
}
elseif(keytemp==10)
{
for(j=0;j<8;j++)
temp[j]=14;
sureflag=0;
i=0;
}
elseif(keytemp==12)
{
changeflag=1;
}
elseif(keytemp==13)
{
for(j=0;j<8;j++)
temp[j]=mima[j];
}
}
display(temp);
}
}
显示程序:
#ifndef__DISPLAY_H__
#define__DISPLAY_H__
#defineucharunsignedchar
#defineuintunsignedint
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
voidSEG_Latch(void)//段码锁存子程序
{
P2|=0xe0;//P2.7~P2.5=111,Y7=0,Y7C=1,即U7的LE=1,段码数据选通
_nop_();
P2&=0x1f;//P2.7~P2.5=000,Y7=1,Y7C=0,即U7的LE=0,段码数据被锁存
}
voidBIT_Latch(void)//位码锁存子程序
{
P2|=0xC0;//P2.7~P2.5=110,Y6=0,Y6C=1,即U8的LE=1,位码数据选通
_nop_();
P2&=0x1f;//P2.7~P2.5=000,Y6=1,Y6C=0,即U8的LE=0,位码数据被锁存
}
voiddisplay(uchar*point)
{
unsignedchari=0;
for(i=0;i<8;i++)
{
DataPort=WeiMa[i];//取位码
BIT_Latch();//数据锁存
DataPort=DuanMa[*(point+i)];//取显示数据,段码
SEG_Latch();//数据锁存
delay_50us(20);//扫描间隙延时,时间太长会闪烁,太短不亮
DataPort=0xff;//关显示,消除重影
SEG_Latch();//数据锁存
}
}
#endif
矩阵键盘扫描程序:
#ifndef__KEY_H__
#define__KEY_H__
#defineucharunsignedchar
#defineuintunsignedint
#defineKEY_PORTP3
//0123
//4567
//89ab
//cdef
constunsignedcharkeytable4X4[]={
0x7e,0xbe,0xde,0xee,
0x7d,0xbd,0xdd,0xed,
0x7b,0xbb,0xdb,0xeb,
0x77,0xb7,0xd7,0xe7};//定义存到FLASH中
voiddelay_50us(uintt)//50us延时
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
ucharkeyscan(void)
{
uchartemp1,temp2,temp;
ucharj=0;//键值
KEY_PORT=0xf0;//P3.0-P3.3发全0,准备读列状态
delay_50us(20);
if((KEY_PORT&0xf0)==0xf0)
return(0xff);//如果P3.4-P3.7不全为1,有键按下
delay_50us(20);//延时10毫秒去抖动
if((KEY_PORT&0x0f0)==0xf0)//重读高4位,若还是不全为1定有键按下
return(0xff);
temp1=KEY_PORT&0xf0;//读高4位状态
KEY_PORT=0x0f;//P3.4-P3.7发为0,准备读低4位状态
temp2=KEY_PORT&0x0f;//P1.0-P1.3发为0,读P2低4位状态
temp=temp1+temp2;
while(temp2!
=0x0f)
temp2=P3;
switch(temp)
{
case0x7e:
return1;break;
case0x7d:
return4;break;
case0x7b:
return7;break;
case0x77:
return10;break;//*
case0xbe:
return2;break;
case0xbd:
return5;break;
case0xbb:
return8;break;
case0xb7:
return0;break;
case0xde:
return3;break;
case0xdd:
return6;break;
case0xdb:
return9;break;
case0xd7:
return11;break;//#
case0xee:
return12;break;
case0xed:
return13;break;
default:
return0xff;break;
}
}
//0123
//4567
//89ab
//cdef
//constunsignedcharkeytable4X4[]={
//0x7e,0xbe,0xde,0xee,
//0x7d,0xbd,0xdd,0xed,
//0x7b,0xbb,0xdb,0xeb,
//0x77,0xb7,0xd7,0xe7};//定义存到FLASH中
//123修改密码
//456
//789
//复位0确认
四:
实验总结
以上为课程设计期间所设计的电子密码锁电路,它经过多次修改和整理,以是一个比较不错的设计,,但因为水平有限,此电路中也存在一定的问题,譬如说电路的密码不能遗忘,一旦遗忘,就很难打开.
通过这一周的学习,我感觉有很大的收获:
首先,通过学习使自己对课本上的知识可以应用于实际,使的理论与实际相结合,加深自己对课本知识的更好理解,同时实习也段练了我个人的动手能力:
能够充分利用图书馆去查阅资料,增加了许多课本以外的知识。
。
对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的一个重要标准。
参考文献:
1康华光.电子技术基础(第四版)[M].北京:
高等教育出版社,1998
2梁宗善.新型集成块应用[M].武汉:
华中理工大出版社,2004
3李朝青编著.单片机原理及接口技术.北京:
航空航天大学出版社,1999.3