密码锁控制器的设计毕业设计.docx

上传人:b****3 文档编号:10286319 上传时间:2023-05-24 格式:DOCX 页数:39 大小:238.60KB
下载 相关 举报
密码锁控制器的设计毕业设计.docx_第1页
第1页 / 共39页
密码锁控制器的设计毕业设计.docx_第2页
第2页 / 共39页
密码锁控制器的设计毕业设计.docx_第3页
第3页 / 共39页
密码锁控制器的设计毕业设计.docx_第4页
第4页 / 共39页
密码锁控制器的设计毕业设计.docx_第5页
第5页 / 共39页
密码锁控制器的设计毕业设计.docx_第6页
第6页 / 共39页
密码锁控制器的设计毕业设计.docx_第7页
第7页 / 共39页
密码锁控制器的设计毕业设计.docx_第8页
第8页 / 共39页
密码锁控制器的设计毕业设计.docx_第9页
第9页 / 共39页
密码锁控制器的设计毕业设计.docx_第10页
第10页 / 共39页
密码锁控制器的设计毕业设计.docx_第11页
第11页 / 共39页
密码锁控制器的设计毕业设计.docx_第12页
第12页 / 共39页
密码锁控制器的设计毕业设计.docx_第13页
第13页 / 共39页
密码锁控制器的设计毕业设计.docx_第14页
第14页 / 共39页
密码锁控制器的设计毕业设计.docx_第15页
第15页 / 共39页
密码锁控制器的设计毕业设计.docx_第16页
第16页 / 共39页
密码锁控制器的设计毕业设计.docx_第17页
第17页 / 共39页
密码锁控制器的设计毕业设计.docx_第18页
第18页 / 共39页
密码锁控制器的设计毕业设计.docx_第19页
第19页 / 共39页
密码锁控制器的设计毕业设计.docx_第20页
第20页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

密码锁控制器的设计毕业设计.docx

《密码锁控制器的设计毕业设计.docx》由会员分享,可在线阅读,更多相关《密码锁控制器的设计毕业设计.docx(39页珍藏版)》请在冰点文库上搜索。

密码锁控制器的设计毕业设计.docx

密码锁控制器的设计毕业设计

成绩:

 

课程设计任务书

 

所属课程名称单片机原理与接口技术

题目密码锁控制器的设计

分院机电学院

 

 

辽东学院

1.课程设计任务书

课程设计题目:

基于Proteus的单片机密码锁控制器的设计

课程设计时间:

自2013年7月8日起至2013年7月15日。

课程设计要求:

要求设计的电子密码锁的密码用键盘上的数字按键产生的6位数字码构成的密码,如果输入密码正确开锁(发光二极管亮),如果密码不正确,发出报警信号。

(1)显示位数:

6位密码显示

(2)键盘设计密码

学生签名:

2013年07月15日

课程设计评阅意见

项目

课程设计态度评价

10%

出勤情况评价10%

任务难度

、量评价10%

创新性评价

10%

综合设计

能力评价20%

报告书写规范评价20%

答辩

20%

成绩

综合评定等级

评阅教师:

2013年07月15日

2.摘要

随着社会的发展,单片机市场已经形成一个规格齐全、品种繁多的大家族,用户有非常大的选择余地。

单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、计算机外部设备,特别是机电一体化产品中,都有非常重要的用途。

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。

现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。

设计包括系统硬件的设计和软件的设计,硬件设计主要是对CPU的选用,本设计选用的是型号为AT89C51的单片机,其次是各种扩展模块的选用,如74LS273、74LS244等扩展模块,还有各种电子元件的选用。

【关键字】单片机密码锁报警功能

3.绪论

计算机系统已明显地朝巨型化、单片化、网络化三个方向发展。

巨型化发展的目的在于不断提高计算机的运算速度和处理能力,以解决复杂系统计算和高速数据处理,比如系统仿真和模拟、实时运算和处理。

单片化是把计算机系统尽可能集成在一块半导体芯片上,其目的在于计算机微型化和提高系统的可靠性,这种单片计算简称单片机。

单片机的内部硬件结构和指令系统主要是针对自动控制应用而设计的所以单片机又称微控制器MCU(Micro Controller Unit)。

用它可以很容易地将计算机嵌入到各种仪器和现场控制设备中,因此单片机又叫做嵌入式微控制器(Embedded MCU)。

单片机自20世纪70年代问世以来,以其鲜明的特点得到迅猛发展,已广泛应用于家用电器、智能玩具、智能仪器仪表、工业控制、航空航天等领域,经过30多年的发展,性能不断提高,品种不断丰富,已经形成自动控制的一支中坚力量。

据统计,我国的单片机年容量已达1~3亿片,且每年以大约16%的速度增长,但相对于国际市场我国的占有率还不到1%。

这说明单片机应用在我国有着广阔的前景。

对于从事自动控制的技术人员来讲,掌握单片机原理及其应用已经成为必不可少的学习任务。

随着人们生活水平的提高,日常生活和工作中的住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存等一系列安全防盗问题变的尤其突出。

传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,且人们常需携带多把钥匙,使用极不方便,一旦钥匙丢失安全性即大打折扣。

为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。

密码锁因具有安全性高、成本低、功耗低、易操作等优点,受到了广大用户的青睐。

据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。

但当时多半是配合机械锁一起作用且存在着诸如体积较大,成本较高,可靠性较低等缺点一时难以普及。

20世纪80年代后,随着信息技术、集成电路、半导体技术的发展,电子密码锁的设计也取得了快速的进步。

现今常见的密码锁设计主要有两种方案,一种是中规模集成电路控制的方案,另一种是单片机控制的方案。

对于采用集成电路控制的方案,其中的编码电子锁电路分为编码电路、控制电路、复位电路、解码电路、防盗报警电路、门铃电路,而电子锁主要由输入元件、电路(包括电源)以及锁体三部分组成。

显然此种方案的物理实现结构较为复杂且重新设置密码、输入密码的操作过程也会给用户带来一定的不方便;而利用单片机控制的方案,由于单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加掉电存储、声光提示甚至添加遥控控制功能,但其也有一定的局限性,就在于其控制原理的复杂以及要求设计人员具有更加良好的程序设计能力,调试较为繁琐,否则程序一旦跑飞将造成意想不到的损失。

4.设计方案分析

4.1课程设计目的

采用MCS-51系列单片机AT89S52作为主控芯片,结合外围电路,设计密码锁控制系统,能够实现:

如果输入密码正确开锁(绿色发光二极管亮),如果密码不正确,发出报警信号(红色发光二极管亮)。

4.2方案的确立

1.为了实现密码的保密性,采用一个4×4的矩阵式键盘可以任意设置用户密码,从而提高了密码的保密性。

2.采用LCD显示单元,提高了可读性,提供良好的人机界面。

4.3硬件电路方框图

电路由两大部分组成:

AT89S51单片机及其外围电路和密码锁电路。

图4-1系统结构框图

5.模块介绍

5.1复位电路

图5-1复位电路

5.2时钟电路

图5-2时钟电路

5.3LCD显示电路

图5-3LCD显示电路

5.4矩阵键盘

图5-4矩阵键盘

5.5报警电路

图5-5报警电路

6.Proteus硬件仿真

6.1硬件模拟软件介绍

Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。

在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。

运行界面如下图:

图6-1Proteus运行界面

在Proteus绘制好原理图后,调入已编译好的目标代码文件:

*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。

Proteus不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。

前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。

它的元器件、连接线路等却和传统的单片机实验硬件高度对应。

这在相当程度上替代了传统的单片机实验教学的功能,例:

元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。

实践证明,在使用Proteus进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。

因此,Proteus有较高的推广利用价值。

6.2程序流程图

图6-2程序流程图

6.3软件编译与调试

图6-3编译与调试

6.4Proteus图

图6-4Proteus图

6.5芯片引脚功能介绍

AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器,俗称单片机。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P0口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为低八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如:

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3口同时为闪烁编程和编程校验接收一些控制信号。

7.源程序及注释

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineKEYP1//键盘输入端口

#defineNo_key20//无按键时的返回值

#definelcddataP0//1602的数据输入端口

sbitlcden=P2^2;

sbitlcdrs=P2^0;

sbitlcdrw=P2^1;

sbitlight=P3^0;

sbitlight1=P3^1;

ucharj;//用来统计输入个数的全局变量

ucharaa;//用来在定时器中计数的全局变量

 

ucharcodetable[]="Hello!

";

ucharcodetable1[]="OK!

";

ucharcodetable2[]="Enterplease:

";

ucharcodekey_table[16]=

{

1,2,3,10,

4,5,6,11,

7,8,9,12,

0,13,14,15

};

ucharpassword[]={9,2,0,6,0,1};//设定初始密码

ucharsave[6];//保存输入的数据

ucharconflag;//确认标志

ucharlockflag;//锁键盘标志

ucharstartflag;//开始标志

voiddelay(uintz);//延时子函数

voidwright_com(ucharcom);//写指令函数

voidwright_data(uchardate);//写数据函数

voidinit();//初始化

voiddisplay_OK();//显示OK

voiddelete();//删除输入的最后一个数

ucharkeyscan();//带返回值的键盘扫描程序

 

voidenter_code(uchart);//输入密码函数,把输入的数据存入数组中并在屏幕上显示相应的东西,

voidconfirm();//确认密码对不对,把输入的数据与密码逐一对比,完全一样刚正确,

voidsucceed_an();//输入密码成功时的响应,

voidfail_an();//输入密码失败时响应

voidlockkey();//锁键盘三秒

voidreset();//复位函数

voiddisplay_enter();//显示输入

voidmain(void)

{

uchartemp;

init();

while

(1)

{

if(lockflag)

{

temp=keyscan();//锁键期间也要进行键盘扫描

if(temp!

=No_key)//重新记时三秒

{

aa=0;//重新在定时器中计数

}

}

else

{

temp=keyscan();//反复扫描输入,等待随时输入

if(temp!

=No_key)//有按键按下才进行下面的操作

{

if(temp==10)

{

reset();

startflag=1;//开始标志置位

}

if(startflag)

{

enter_code(temp);//每扫描一次键盘就要进行一次处理,保存输入的数值

if(temp==13)//按下确认键盘就要进行密码确认

{

confirm();//进行确认判断

if(conflag)//密码确认为正确

{

succeed_an();//密码正确,作出相应的反应

}

else

{

fail_an();//密码错误,作相应反应

}

}

if(temp==14)

{

delete();//作删除操作

}

}

}

}

}

}

/******显示enter********/

voiddisplay_enter()

{

ucharnum;

wright_com(0x80);

for(num=0;num<13;num++)

{

wright_data(table2[num]);

}

}

/******显示OK********/

voiddisplay_OK()

{

ucharnum;

wright_com(0x80);

for(num=0;num<13;num++)

{

wright_data(table1[num]);

}

}

/******删除最后一个********/

voiddelete()

{

wright_com(0x80+0x40+j);//确定删除对象

wright_data('');//显示空格即为删除

save[--j]=0;//删除后数据清零

wright_com(0x80+0x40+j);//为下次输入数据时写好位置,必须是在最后一个后面

}

/******对各种变量进行复位********/

voidreset()

{

ucharnum;

display_enter();

wright_com(0x80+0x40);//擦除屏幕上的显示

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

{

save[num]=0;//对输入的数值进行清零

wright_data('');//显示的是空格

}

wright_com(0x80+0x40);//下次再输入时可以又从起始位置输入

lockflag=0;//各种变量要清零回起始状态

conflag=0;

j=0;

}

/******输入密码正确进行响应********/

voidsucceed_an()

{

light=0;//灯亮

display_OK();//显示成功

delay(5000);

light=1;//灯灭

}

/******输入密码错误进行响应********/

voidfail_an()

{

lockkey();

}

 

/******锁键盘三秒************/

voidlockkey()

{

lockflag=1;

}

/******输入密码并在屏幕上显示星号******/

voidenter_code(uchart)

{

if(t>=0&&t<10)

{

if(j==0)

{

wright_com(0x80+0x40);//第一输入时要先写入地址指令,否则无法显示

wright_data('*');

}

else

{

wright_data('*');//不是第一个输入则不用再写地址

}

save[j++]=t;//保存输入的数据

}

}

 

/******校对密码以确定是不是正确的**********/

voidconfirm()

{

uchark;

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

{

if(password[k]!

=save[k])//对数组中的内容进行逐一比较,一旦有数据不对马上退出循环

{

break;

}

}

if(k==6)//要是条件退出的话说明六个数全对密码

{

conflag=1;//进行标志密码正确

}

}

 

/******中断服务程序**********/

voidtimer0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;//重装初值

if(lockflag)

{

aa++;

light1=0;

if(aa>=60)//三秒到了

{

aa=0;//清零可以方便下次再使用

light1=1;//关闭警报

lockflag=0;//标志清零解除键锁,方便下次使用

}

}

}

/******初始化***********/

voidinit()

{

ucharnum;

/*****定时器初始化****/

TMOD=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

EA=1;//开启总中断

TR0=1;//把定时器关闭

 

/****1602初始化******/

lcdrw=0;//这个必须要置零,否则无法正常显示

lcden=0;

wright_com(0x38);//初始化

wright_com(0x0c);//打开光标0x0c不显示光标0x0e光标不闪,0x0f光标闪

wright_com(0x01);//清显示

wright_com(0x80);

for(num=0;num<9;num++)

{

wright_data(table[num]);

delay

(1);

}

 

}

/******1602写入指令************/

voidwright_com(ucharcom)

{

lcdrs=0;

lcddata=com;

delay

(1);

lcden=1;

delay

(1);

lcden=0;

}

/******1602写入数据***********/

voidwright_data(uchardate)

{

lcdrs=1;

lcddata=date;

delay

(1);

lcden=1;

delay

(1);

lcden=0;

}

/******延时函数************/

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

 

/**********4x4矩阵键盘扫描函数*********/

 

ucharkeyscan()

{

uchartemp,num=No_key;//num的初值要为无键盘按下时的返回值

/*********扫描第一行****************/

KEY=0xfe;

temp=KEY;

temp=temp&0xf0;//读出高四位

while(temp!

=0xf0)

{

delay(5);//延时消抖

temp=KEY;

temp=temp&0xf0;

while(temp!

=0xf0)//确认确实有按键按下

{

temp=KEY;

switch(temp)//根据这八个电平可以确定是哪个按键按下

{

case0xee:

num=1;

break;

case0xde:

num=2;

break;

case0xbe:

num=3;

break;

case0x7e:

num=10;

break;

}

while(temp!

=0xf0)//等待松手

{

temp=KEY;

temp=temp&0xf0;

}

}

}

/*********扫描第二行***************/

KEY=0xfd;

temp=KEY;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(5);

temp=KEY;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=KEY;

switch(temp)

{

case0xed:

num=4;

break;

case0xdd:

num=5;

break;

case0xbd:

num=6;

break;

case0x7d:

num=11;

break;

}

while(temp!

=0xf0)

{

temp=KEY;

temp=temp&0xf0;

}

}

}

/*********扫描第三行****************/

KEY=0xfb;

temp=KEY;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(5);

temp=KEY;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=KEY;

switch(temp)

{

case0xeb:

num=7;

break;

case0xdb:

num=8;

break;

case0xbb:

num=9;

break;

case0x7b:

num=12;

break;

}

while(temp!

=0xf0)

{

temp=KEY;

temp=temp&0xf0;

}

}

}

/*********扫描第四行****************/

KEY=0xf7;

temp=KEY;

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

当前位置:首页 > 求职职场 > 简历

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

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