单片机课设密码锁Word格式.docx

上传人:b****5 文档编号:19754004 上传时间:2023-01-09 格式:DOCX 页数:24 大小:202.21KB
下载 相关 举报
单片机课设密码锁Word格式.docx_第1页
第1页 / 共24页
单片机课设密码锁Word格式.docx_第2页
第2页 / 共24页
单片机课设密码锁Word格式.docx_第3页
第3页 / 共24页
单片机课设密码锁Word格式.docx_第4页
第4页 / 共24页
单片机课设密码锁Word格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

单片机课设密码锁Word格式.docx

《单片机课设密码锁Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课设密码锁Word格式.docx(24页珍藏版)》请在冰豆网上搜索。

单片机课设密码锁Word格式.docx

时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。

本次课程设计我们用的是12MHz的晶振与电容并联形成一个稳定的自激振荡器。

电路图如图2.2所示。

 

图2.1时钟电路

2.2.3键盘电路

本次设计采用4X4矩阵式键盘嵌在在单片机P1口上,矩阵式键盘电路图2-2:

图2.2键盘电路

2.2.4复位电路

复位电路采用按键复位方式,当按下复位键时,单片机复位,恢复初始状态,各寄存器清零。

当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。

RST引脚是单片机复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡周期(即2个机器周期)以上,使用频率为12MHz的晶振,则复位信号持续时间应超过2us才能完成复位操作。

复位电路如下图2.3所示。

图2.3复位电路

2.2.5数码管驱动电路与显示电路

本次课程设计我们采用的是共阴极的数码管,位选与单片机P2口相连,单片机P0口控制段选。

电路图如下图2.5所示。

图2.4数码管驱动及显示电路图

3.设计课题软件系统的设计

3.1单片机资源分配的情况

选择设计课题使用单片机资源的情况如下:

P0口输出数码管段选信号,P2口输出数码管位选信号;

初始密码12345678存储单元,oldpassw[8]数组作为存储初始密码,newpass[8]用来存放用户设置的密码;

tab1[]与tab[]为数码管显示内容做成表格供查询。

3.2软件系统各函数功能简要介绍

本程序通过以下各函数实现:

数码管显示函数、定时50ms函数、延时xms函数、数码管显示函数、判断密码函数、设置密码函数、按键扫描和错误处理函数。

数码管显示函数:

主要是用于对于密码锁不同状态显示不同内容,例如,当初始化时显示“0”,当开锁状态显示“8.”,当报警状态显示“-”等。

延时xms子程序:

用于数码管显示和延时键扫去抖动。

定时50ms子程序:

用于定时蜂鸣器响的时间。

3.3程序设计思路与流程图

本密码锁设计采用4X4矩阵式键盘来输入数字密码0-9,初始的密码存入int型数组oldpassw[8]中,与用户输入的密码比较,相等则开锁,不等则显示错误并报警1s,当3次输入错误就一直报警并锁死系统。

同时仅开锁状态下用户才可以修改密码。

软件系统流程图:

(1)软件总体设计流程图:

3.1软件设计总流程图

(2)判断密码是否正确流程图:

N

Y

图3.2判断密码是否正确流程图

4设计仿真结果及误差分析

4.1设计课题使用说明

本设计为基于单片机的密码锁的设计。

设计成功实现了以下功能:

(1)本设计用4X4矩阵式键盘输入密码,完成了密码可以为数字0-9的要求。

(2)2个四位一体的共阴数码管做为显示器;

在锁开时显示开锁者显示8个“8.”;

在输入错误后提示错误信息,即显示8个“-”并且蜂鸣器报警响1s。

(3)3次输入错误后将进入报警死循环,指示灯全亮。

(4)仅在开锁状态下才能修改密码,若没有开锁直接按Set键,则会显示错误信息,但是此错误不计入输入错误里,为了使用户更容易记忆密码,采用实际密码显示。

(5)万能密码即为初始密码,当用户忘记设置的密码时可以使用万能密码解锁,并且重新设置密码。

(6)4X4矩阵按键还有OK键,用来判断密码是否正确;

Clear按键用来清除输入的数据;

Left键和Right用来向左向右调整输入,Set键用来设置密码。

这样的结果与设计要求完全相符,本设计成功完成了设计任务。

4.2设计课题的仿真结果

在Proteus中的模拟仿真,系统仿真结果如图4.1-图4.8所示。

4.1系统初始化状态

4.2输入密码状态

4.3密码输入正确

4.4密码输入错误

4.3误差分析与调整

对于智能密码锁的设计,我们使用proteus软件来仿真,Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。

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

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

仿真之前我们得先做一些准备工作。

首先,根据密码锁设计所需,使用编程软件keil3写一个程序,这里既可以用C语言来编写也可用伟福软件来编写汇编语言。

现在我们用所熟悉的C语言来编写,程序编写完了,进行程序的编译,正确后软件部分完成。

然后进行原理图的制作,先打开protues软件,将所需要的元件找到放置好,调整合理,然后依次连上线。

将各个线进行网络编号。

完毕后,进行电气规则检查,检查正确后就可以加载程序了。

打开工具栏中源代码项的添加源文件,选择编好的程序。

首先本密码锁增加了密码输入错误次数。

在密码输入错误时能够后退,即可以擦除已知错误密码。

但是该密码锁运行过程存在一些小问题的,首先,8个数码管的显示感觉刷新时第一个数码管有点闪,此外,本密码锁虽然符合设计要求,但与实用生活中密码锁的性能相比有很大差距。

比如密码的修改只是一次性输入确认,这将很大程度上造成重新设定的密码不是用户想要的密码。

另外密码锁进入死循环后,任何键不起作用,这将防止小偷再套密码,但同时也使在外的主人打不开锁。

5课程设计总结

通过连续两周的课程设计,我学到了许多书本上无法学到的知识,也深刻体会到单片机技术应用领域的广泛。

不仅让我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生了更大的兴趣。

本设计让我对专业知识有了更深的理解。

在本次课程设计过程中,我学会了在网络上查找有关本设计的各硬件的资源,其中包括:

AT89S52单片机及其引脚说明、键盘扫描程序的编写等,为本次课程设计提供了一定的资料。

在做课程设计的初期阶段,难度较大。

在设计基本完成时密码的修改还是不能实现,通过求助于老师、查找了问题的所在。

最后经过指导老师的耐心指点和连续的奋战才基本设计出来。

感谢老师的无私的帮助!

本次设计我能独立完成,算是有了很大的收获。

不但对单片机有了更为深入的了解,对一个课题如何实现模拟仿真及编写汇编程序等,有了一定的认识。

进一步加强了自己的动手能力和运用专业知识的能力,从中学习到如何去思考和解决问题,以及如何灵活地改变方法去实现设计方案;

特别是深刻体会到的是软件和硬件结合的重要性,以及两者的联系和配合作用。

同时明白了办事只要有信心,有毅力,找对方法,就会成功!

通过本次课程设计,让我了解到智能化技术对当今人们生活的重要性。

同时这次做课程设计的经历也使我受益匪浅。

让我知道做任何事情都应脚踏实地,刻苦努力地去做。

只有这样,才能做好。

在这次课程设计中,我既巩固了专业知识,又学到了在设计过程中的许多流程和该注意的事项,增强了电子产品开发的意识。

本次经历将是我在大学时期很好的一次实践和锻炼机会。

参考文献

[1]李广弟等.单片机基础[M].北京:

北京航空航天大学出版社,2007.6

[2]马忠梅等.单片机的C语言应用程序设计[M].北京:

北京航空航天大学出版社,2006.11.

[3]曹巧媛.单片机原理及应用[M].北京:

电子工业出版社,1997.7.

[4]《单片机原理及及应用》王迎旭编机械工业出版社2001

[5]彭伟.单片机C语言程序设计实训100例——基于8051+Proteus仿真.电子工业出版社.2009

[6]何桥.单片机原理及应用.中国铁道出版社.2008

附录

附录A电路仿真图

附录B源程序清单

#include<

reg52.h>

#defineucharunsignedchar

ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x00};

//对应数码管0~9以及错误-和正确8.显示

ucharcodetab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0x00};

//小数点亮的0-9以及错误-和正确8.显示

uchartemp;

sbitp=P3^6;

//蜂鸣器

unsignedintt=0;

intN=0,num;

//N错误数次

intflag=0;

//标记密码是否输入正确

intflag1=0;

//标记是否设置过新密码

intoldpassw[8]={1,2,3,4,5,6,7,8};

//初始密码也是万能密码

intpassw[8];

intnewpass[8];

//存放输入密码

intlr;

//位设置位置

voiderror();

intkeyscan();

voidsetpass();

voiddelay_ms(intx)//延时xms

{

intj;

while(--x!

=0)

for(j=0;

j<

120;

j++);

}

voiddisplay()//数码管显示

{

inti;

P2=0x80;

for(i=0;

i<

8;

i++)

{

if(0==i)

{

if(i==(7-lr))

P0=tab1[passw[7]];

else

P0=tab[passw[7]];

}

if(1==i)

P0=tab1[passw[6]];

P0=tab[passw[6]];

}

if(2==i)

P0=tab1[passw[5]];

P0=tab[passw[5]];

}

if(3==i)

P0=tab1[passw[4]];

P0=tab[passw[4]];

if(4==i)

P0=tab1[passw[3]];

P0=tab[passw[3]];

}

if(5==i)

P0=tab1[passw[2]];

P0=tab[passw[2]];

if(6==i)

P0=tab1[passw[1]];

P0=tab[passw[1]];

if(7==i)

P0=tab1[passw[0]];

P0=tab[passw[0]];

delay_ms

(2);

P2>

>

=1;

}

voidinit()//初始化定时器中断

TMOD=0x01;

//本程序采用mode1模式

TH0=0x3C;

//定时50ms

TL0=0x0B0;

ET0=1;

//打开定时器中断

TR0=0;

//不启动定时器,等待按键启动

EA=1;

//打开总中断开关

voidjudge()//判断密码是否正确

inti,m=0;

if(flag1==1)

i++)

if(passw[i]!

=newpass[i])

break;

m++;

if(m!

=8)//密码错误

m=0;

for(i=0;

i++)//判断新密码是否正确

if(passw[i]!

=oldpassw[i])

break;

m++;

if(m!

{

for(i=0;

passw[i]=0;

N++;

//统计错误次数

flag=0;

error();

lr=0;

}

if(m==8)//密码正确

{

passw[i]=11;

}

flag=1;

N=0;

m=0;

display();

if(m==8)//密码正确

for(i=0;

passw[i]=11;

flag=1;

N=0;

display();

}

else

=oldpassw[i])//

m++;

if(m!

passw[i]=0;

N++;

flag=0;

error();

lr=0;

m=0;

voidsetpass()//设置密码

if(flag==1)

newpass[i]=passw[i];

passw[i]=0;

lr=0;

display();

flag=0;

flag1=1;

passw[i]=10;

intkeyscan()//按键扫描

P1=0xef;

temp=P1;

temp=temp&

0x0f;

while(temp!

=0x0f)

{

temp=P1;

temp=temp&

while(temp!

temp=P1;

switch(temp)

case0xe7:

num=1;

passw[lr]=1;

break;

case0xeb:

num=2;

passw[lr]=2;

break;

case0xed:

num=3;

passw[lr]=3;

break;

case0xee:

num=4;

passw[lr]=4;

}

lr++;

if(lr>

=8)

while(temp!

{

temp=P1;

temp=temp&

P1=0xdf;

case0xd7:

num=5;

passw[lr]=5;

case0xdb:

num=6;

passw[lr]=6;

case0xdd:

num=7;

passw[lr]=7;

case0xde:

num=8;

passw[lr]=8;

P1=0xbf;

case0xb7:

num=9;

passw[lr]=9;

lr++;

if(lr>

lr=0;

case0xbb:

num=10;

passw[lr]=0;

case0xbd:

num=11;

//ok

judge();

case0xbe:

num=12;

//clear

for(i=0;

passw[i]=0;

lr=0;

{

P1=0x7f;

case0x77:

num=13;

//left

lr--;

if(lr<

0)

lr=7;

case0x7b:

num=14;

//set

setpass();

case0x7d:

num=15;

//空

case0x7e:

num=16;

//right

returnnum;

voiderror()//密码错误处理

inti;

TR0=1;

p=1;

//开启蜂鸣器

if(N==3)

{

while

(1)

i++)//数码管显示字符-

passw[i]=10;

}

while(t<

=20)//定时1s

{

i++)//数码管显示字符-

p=0;

t=0;

TR0=0;

lr=0;

passw[i]=0;

voidmain(vo

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

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1