基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx

上传人:b****2 文档编号:24143059 上传时间:2023-05-24 格式:DOCX 页数:30 大小:168.95KB
下载 相关 举报
基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx_第1页
第1页 / 共30页
基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx_第2页
第2页 / 共30页
基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx_第3页
第3页 / 共30页
基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx_第4页
第4页 / 共30页
基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx

《基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。

基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告.docx

基于单片机的电子密码锁设计报告单片机原理及应用课程设计报告

 

单片机原理及应用课程设计报告

 

学院:

电子信息工程学院

专业班级:

电子信息工程1班

学生姓名:

xxxxxxx

学号:

20xx40xx31xx

20xx40xx31xx

20xx40xx31xx

指导教师:

xxxx

完成时间:

2015年12月27日

成绩:

 

评阅意见:

评阅教师日期

 

基于单片机的电子密码锁设计报告

一.设计要求

1.用矩阵键盘作为输入,用LCD1602作为显示设备。

2.由矩阵键盘模块完成六位密码的输入、确认以及修改等功能。

3.由LCD1602显示模块显示密码输入的正误以及是否修改密码等信息。

4.由LCD和蜂鸣器电路完成提示密码是否输入正确和完成报警等功能。

二.设计的作用、目的

在当今社会,安全防盗已成为社会问题,而锁自古以来就是防盗的重要工具,目前国内大部分人使用的还是传统的机械锁,然而,眼下假冒伪劣的机械锁互开率非常之高,此外,即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁打开。

机械锁的这些弊端为一种新型的锁——电子密码锁,提供了很大的发展空间。

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

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

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

其性能和安全性已大大超过了机械锁。

通过课程设计,主要达到以下目的:

1.增进对单片机的感性认识,加深对单片机理论方面的理解;

2.掌握单片机的内部功能模块的应用,如定时器/计数器、中断、I/O口等;

3.了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。

三.设计的具体实现

1.系统概述

本设计从经济实用的角度出发,系统由STC89C52与低功耗CMOS型E²PROMAT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、LCD显示、报警、开锁等电路模块。

它能完成以下功能:

正确输入密码前提下,开锁;错误输入密码情况下,报警;密码可以根据用户需要更改。

用C语言编写的主控芯片控制程序与EEPROMAT24C02读写程序相结合,并用Keil软件进行编译,设计了一款可以多次更改密码,具有报警功能的电子密码控制系统。

本密码锁具有设计方法合理,简单易行,成本低,安全实用,保密性强,灵活性高等特点,具有一定的推广价值。

2.单元电路设计(或仿真)与分析

原理图中所使用的元器件功能:

2.1单片机STC89C52功能介绍

STC89C52是51系列单片机的一个型号,STC89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),片内置通用8位中央处理器和Flash存储单元。

STC89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,其引脚图如图2-1示。

图2-1STC89C52引脚分布图

2.2LCD1602显示器介绍

液晶显示模块已作为很多电子产品中都可以看到,显示的主要是数字、专用符号和图形。

1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。

1602型LCD可以显示2行16个字符,有8位数产品的通过器件,工作电压为5V,引脚功能如表2-2所示:

表2-2LCD1602引脚接口说明表

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

2.3存储芯片AT24C02介绍

AT24C02内含256×8位存储空间,具有工作电压宽(2.5~5.5V),AT24C02中带有的片内地址寄存器。

每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。

AT24C02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向,管脚图如图2-3所示。

图2-3AT24C02引脚图

2.4复位电路

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,如图2-4所示的复位电路,该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻上的电压接近电源电压,即RST为高电平,CPU能够可靠复位,增加手动复位按键是为了避免死机时无法可靠复位。

图2-4复位电路原理图

2.5晶振电路

ST89C52引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1按图2-5所示方式连接。

图2-5晶振电路原理图

2.6存储电路

AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,AT24C02有一个16字节页写缓冲器,其存储电路如图2-6所示。

图2-6掉电存储电路原理图

图中1、2、3脚是三条地址线,用于确定芯片的硬件地址,在AT89S51上它们都能接地,第5脚和第8脚分别为正、负电源。

AT24C02中带有片内地址寄存器,每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个储存单元的读写,所有字节均以单一操作方式读取。

2.7键盘输入电路

由于本设计所用到的按键数量较多而不适合用独立按键式键盘,采用的是矩阵式按键键盘,它由行线和列线组成,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口,单片机引脚接法如图2-7所示:

图2-7键盘输入原理图

2.8显示电路

本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。

当密码输入完成时,按下确认键,如果输入的密码正确的话,LCD显示“OPPEN”,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“ERROR”,电子密码锁不能被打开,通过LCD显示屏,可以清楚的判断出密码锁所处的状态。

1602型LCD基本操作程序如下表所示:

LCD1602基本操作程序

读状态

输入

RS=L,R/W=H,E=H

输出

D0—D7=状态字

写指令

输入

RS=L,R/W=L,D0—D7=指令码,E=高脉冲

输出

读数据

输入

RS=H,R/W=H,E=H

输出

D0—D7=数据

写数据

输入

RS=H,R/W=L,D0—D7=数据,E=高脉冲

输出

图2-8显示电路原理图

 

2.9报警电路

报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的P2.1引脚为低电平,三极管T3导喇叭发出噪鸣声报警。

如图3-10所示:

图2-9报警电路原理图

3.电路的安装与调试

软件调试:

软件调试主要是利用proteus仿真软件完成电路的搭建,运行以发现设计中的错误及时改正。

硬件调试:

硬件调试主要是检测硬件电路是否有短路、断路、虚焊等。

具体步骤及测试结果如下:

(1)、检查电源与地线是否全部连接上,用万用表对照电路原理图测试各导线是否完全连接,对未连接的进行修复。

(2)、参照原理图,检查各个器件之间的连接是否连接正确,是否存在虚焊,经测试,各连接不存在问题。

(3)、以上两项检查并修复完后,给该硬件电路上电,电源指示灯点亮。

系统功能调试:

通过软件仿真显示,系统基本能完成要求,由于选用电阻阻值太大,导致显示部分没有正确的做出来,后来采用了阻值较小的电阻,解决了此问题。

4.心得体会、存在问题和进一步的改进意见等

心得体会:

这次单片机课程设计历时两个星期的时间,在这次设计过程里我体验了从设计、画板、编程、焊板到调试的整个过程。

对于电子密码锁这个题目,由于以前学单片机这个课程时,做过类似相关的实验,觉得这个比较简单而且做出的东西也比较直观,在确定题目之后,查阅了大量的资料,初步完成了电路设计方案。

通过课程设计让我对单片机系统有了较详细的了解,而且触及到与其相关的很多新知识,而且随着电子技术的发展简易数字电压表也会越来越完善,作为大学生的我们应该跟上时代的步伐,时刻关注形势变化,不断充实更新自己的知识。

在设计中既应用到了基础知识,也用到了专业知识,它是对三年来所学知识的综合考察。

最重要的是我通过亲自设计,亲自绘制原理图,印制电路板以及系统调试培养了我的耐心和细心,这对我以后的工作和学习有很大的帮助。

存在问题:

在proteus仿真软件中仿真现象很理想,到了实际焊接就出了不少问题,24C02芯片不会用,布局不理想,焊接出来的电路没有现象,经过仔细检查,查出问题所在,改正错误,调试电路,符合预期的现象

程序的设计,也许是起初想的太简单,设计时到了细节处,也出了不少问题,而且很难被检查出来,但是最后经过不断努力,还是写出来正确的代码。

进一步改正:

不能根据声音来判断密码锁的状态,尝试通过修改程序来改变蜂鸣器的声音;LCD屏显示不是很稳定;蜂鸣器发声时高时低。

五.参考文献

[1]叶启明.单片机制作的新型安全密码锁[J].家庭电子.2000,第六期:

24-27

[2]胡乔木.中国大百科全书.中国大百科全书出版社.1993

[3]李明喜.新型电子密码锁的设计[J].机电产品开发与创新.2004,第八期:

77-79

[4]董继成.一种新型安全的单片机密码锁[J].电子技术.2004,第三期:

55-60

[5]王宽仁.可靠安全的智能密码锁[J].电子技术应用.2001年第2期

[6]胡汉才.单片机原理及其接口技术(第2版)[M].北京:

清华大学出版社,2004

6.附录

1、整体电路原理图

2、元器件明细表(主要用于列出本次课程设计中所用的全部元器件)

STC80C52单片机

1个

三极管(8550)

1个

LCD0602

1个

排阻(102)

1个

按键

17个

滑变(103)

1个

24C02

1个

电容

若干

蜂鸣器

1个

电阻

若干

12M晶振

1个

万用板

2块

LED

1个

杜邦线

8根

 

3、源程序

#include

#include

#include

#defineCHECK_BUSY

#defineDataPortP0

#defineKeyPortP1

sbitRS=P2^4;//液晶显示的定义端口

sbitRW=P2^5;

sbitEN=P2^6;

sbitscl=P3^0;//24c02端口定义

sbitsda=P3^1;

sbitbaojing=P2^1;//报警器

sbitjdq=P2^0;//继电器

sbitjb=P2^3;//警报灯

sbitclose=P2^2;

unsignedcharold1,old2,old3,old4,old5,old6;//原始密码000000

unsignedcharnew1,new2,new3,new4,new5,new6;//代表新密码

voiddelay1(unsignedintm)

{

unsignedintn;

for(n=0;n

}

voiddelay(unsignedintm)

{

unsignedinta;

unsignedcharb;

for(a=0;a

{for(b=0;b<125;b++);}

}

voidDelayUs2x(unsignedchart)

{

while(--t);

}

voidDelayMs(unsignedchart)

{

while(t--)

{

DelayUs2x(256);

DelayUs2x(256);

}

}

voidbaojingqi()

{

baojing=0;

DelayUs2x(256);

if(baojing==0)

{

baojing=0;

DelayUs2x(256);

}

}

bitLCD_Check_Busy(void)//判忙函数

{

#ifdefCHECK_BUSY

DataPort=0xFF;

RS=0;

RW=1;

EN=0;

_nop_();

EN=1;

return(bit)(DataPort&0x80);

#else

return0;

#endif

}

voidLCD_Write_Com(unsignedcharcom)//写入命令函数

{

//while(LCD_Check_Busy());//忙则等待

DelayMs(5);

RS=0;RW=0;EN=1;

DataPort=com;

_nop_();EN=0;

}

voidLCD_Write_Data(unsignedcharData)//写入数据函数

{

//while(LCD_Check_Busy());//忙则等待

DelayMs(5);

RS=1;RW=0;EN=1;

DataPort=Data;

_nop_();EN=0;

}

voidLCD_Clear(void)//清屏函数

{

LCD_Write_Com(0x01);

DelayMs(5);

}

voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)//写入字符函数

{

if(y==0)

{LCD_Write_Com(0x80+x);}

else

{LCD_Write_Com(0xC0+x);}

LCD_Write_Data(Data);

}

voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)//写入字符串函数

{

while(*s)

{

LCD_Write_Char(x,y,*s);

s++;x++;

}

}

voidLCD_Init(void)//液晶显示的初始化函数

{

LCD_Write_Com(0x38);//显示模式设置

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

LCD_Write_Com(0x08);//显示关闭

LCD_Write_Com(0x01);//显示清屏

LCD_Write_Com(0x06);//显示光标移动设置

DelayMs(5);

LCD_Write_Com(0x0C);//显示开及光标设置

}

unsignedcharKeyScan(void)//键盘扫描函数,使用行列反转扫描法

{

unsignedcharcord_h,cord_l;//行列值中间变量

KeyPort=0x0f;//行线输出全为0

cord_h=KeyPort&0x0f;//读入列线值

if(cord_h!

=0x0f)//先检测有无按键按下

{

DelayMs(10);//去抖

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;//10

case0xd7:

return11;break;//11

case0xee:

return12;break;//12

case0xed:

return13;break;//13

case0xeb:

return14;break;//14

case0xe7:

return15;break;//15

default:

return0xff;break;

}

}

voidinit()//24c02初始化子程序

{

scl=1;

_nop_();_nop_();

sda=1;

_nop_();_nop_();

}

voidrespons()//应答

{

unsignedchari;

scl=1;

_nop_();_nop_();

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

i++;

scl=0;_nop_();_nop_();

}

voidclock()//I2C总线时钟

{

unsignedchari=0;

scl=1;

_nop_();_nop_();

while((sda==1)&&(i<255))

i++;

scl=0;

_nop_();_nop_();

}

voidstart()//启动I2C总线

{

sda=1;

_nop_();_nop_();

scl=1;

_nop_();_nop_();

sda=0;

_nop_();_nop_();

scl=0;

_nop_();_nop_();

}

voidstop()//停止I2C总线

{

sda=0;

_nop_();_nop_();

scl=1;

_nop_();_nop_();

sda=1;

_nop_();_nop_();

}

voidwritebyte(unsignedchara)//写一个字节

{

unsignedcharb,tem;

tem=a;

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

{

tem=tem<<1;

scl=0;

_nop_();_nop_();

sda=CY;//temp左移时,移出的值放入了CY中

_nop_();_nop_();

scl=1;//待sda线上的数据稳定后,将scl拉高

_nop_();_nop_();

}

scl=0;

_nop_();_nop_();

sda=1;

_nop_();nop_();

}

unsignedcharreadbyte()//读一个字节

{

unsignedchari,j,k=0;

scl=0;

_nop_();

_nop_();

sda=1;

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

{

_nop_();

_nop_();

scl=1;_nop_();

_nop_();

if(sda==1)j=1;

elsej=0;

k=(k<<1)|j;

scl=0;

}

_nop_();

_nop_();

return(k);

}

unsignedcharread24c02(unsignedcharaddress)//从24c02的地址address中读取一个字节数据

{

unsignedchardate;

start();

writebyte(0xa0);

clock();

writebyte(address);

clock();

start();

writebyte(0xa1);

clock();

date=readbyte();

stop();

delay1(100);

return(date);

}

voidwrite24c02(unsignedcharaddress,unsignedcharinfo)//向24c02的address地址中写入一字节数据info

{

start();

writebyte(0xa0);

clock();

writebyte(address);

clock();

writebyte(info);

clock();

stop();

delay1(5000);//这个延时一定要足够长,否则会出错。

因为24c02在从sda上取得数据后,还需要一定时间的烧录过程。

}

main()

{

unsignedcharnum,i,bj,c=0;

unsignedchartemp[6];

bitFlag;

init();//初始化24C02

LCD_Init();//初始化液晶屏

DelayMs(10);//延时用于稳定,可以去掉

LCD_Clear();//清屏

LCD_Write_String(0,0,"welcome");//写入第一行信息

old1=read24c02(110);

old2=read24c02(111);

old3=read24c02(112);

old4=read24

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

当前位置:首页 > 高等教育 > 经济学

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

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