智能密码锁设计.doc_第1页
智能密码锁设计.doc_第2页
智能密码锁设计.doc_第3页
智能密码锁设计.doc_第4页
智能密码锁设计.doc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本设计采用at89s52单片机为主控芯片,结合外围电路,通过软件程序组成电子密码锁系统,能够实现:1 正确输入密码前提下,开锁提示;2 错误输入密码情况下,蜂鸣器报警;3 密码可以根据用户需要更改。 第二章 系统方案论证2.1 主控部分的选择选用单片机作为系统的核心部件,实现控制与处理的功能。单片机具有资源丰富、速度快、编程容易等优点。利用单片机内部的随机存储器(ram)和只读存储器(rom)及其引脚资源,外接液晶显示(lcd),键盘输入等实现数据的处理传输和显示功能,基本上能实现设计指标,因此综合考虑,本系统采用方案二。方案二:矩阵键盘输入识别 由各按键组成的矩阵键盘每条行线和列线都对应一条i/o口线,键位设在行线和列线的交叉点,当一个键按下就会有某一条行线与某一条列线接触,只要确定接触的是哪两条线,即哪两个i/o口线,就可以确定哪一个键被触动。 行线设计成上拉口线,初始时被置高电位,列线悬空,初始置低。通过不断读行线口线,或者中断方式触发键位扫描。当发现有键按下,将列线逐一置低,其他列线置高,读行线口线。当某条列线置低时,某条行线也被拉低,则确定这两条线的交点处的按钮被按下。每个按键都可通过程序赋予功能,从而完成密码识别8。本方案简单易行,故采用。第三章 系统总体设计和主要芯片介绍3.1 系统总体设计本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可。系统整体框图如图3-1所示。显示模块键盘输入模块 at89s52报警电路复位电路开锁电路密码存储模块 图3-1 系统结构框图各模块功能如下:1键盘输入模块:分为密码输入按键与几个功能按键,用于完成密码锁输入功能。2显示模块:用于完成对系统状态显示及操作提示功能。3复位电路:完成系统的复位。4报警电路:用于完成输错密码时候的警报功能。5密码存储模块:用于完成掉电存储功能,使修改的密码断电后仍能保存。6开锁电路:应用继电器及发光二极管模拟开锁,完成开锁及开锁提示。3.2 主要芯片介绍3.2.1 at89s52 at89s52单片机是一个低功耗,高性能cmos 8位单片机,片内含8k bytes isp(in-system programmable)的可反复擦写1000次的flash只读程序存储器,器件采用atmel公司的高密度、非易失性存储技术制造,兼容标准mcs-51指令系统及80c51引脚结构,芯片内集成了通用8位中央处理器和isp flash存储单元,功能强大的微型计算机的at89s52可为许多嵌入式控制应用系统提供高性价比的解决方案10。at89s52具有以下标准功能: 8k字节flash,256字节ram,32 位i/o 口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,at89s52可降至0hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,cpu停止工作,允许ram、定时器/计数器、串口、中断继续工作。掉电保护方式下,ram内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。at89s52的管脚分布如图3-2所示。 图3-2 at89s52芯片管脚p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p3口作为at89s52的一些特殊功能管脚备选功能,p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 /int0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(记时器0外部输入)p3.5 t1(记时器1外部输入)p3.6 /wr(外部数据存储器写选通)p3.7 /rd(外部数据存储器读选通)at89s52主要特性如表3-1所示。表3-1 at89s52主要特性兼容mcs-51指令系统8k可反复擦写(1000次)isp flash rom32个双向i/o口4.5-5.5v工作电压3个16位可编程定时/计数器时钟频率0-33mhz全双工uart串行中断口线256x8bit内部ram2个外部中断源低功耗空闲和省电模式中断唤醒省电模式3级加密位看门狗(wdt)电路软件设置空闲和省电功能灵活的isp字节和分页编程双数据寄存器指针3.2.2 存储芯片at24c02 at24c02是美国atmel公司的低功耗cmos型eprom,内含2568位存储空间,具有工作电压宽(2.55.5 v)、擦写次数多(大于10000次)、写入速度快(小于10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且他是采用了ic总线式进行数据读写的串行器件,占用很少的资源和i/o线,并且支持在线编程,进行数据实时的存取十分方便。at24c02中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。i2c总线是一种用于ic器件之间连接的二线制总线。他通过sda(串行数据线)及scl(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。 at24c02正是运用了ic规程,使用主/从机双向通信,主机(通常为单片机)和从机(at24c02)均可工作于接收器和发送器状态。主机产生串行时钟信号(通过scl引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ack。at24c02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。管脚描述:scl 为串行时钟:串行时钟输入管脚用于产生器件所有数据发送或接收的时钟这是一个输入管脚。sdl 为串行数据/地址:双向串行数据/地址管脚用于器件所有数据的发送或接收sdl,是一个开漏输出管脚可与其它开漏输出或集电极开路输出进行线或。a0、a1、a2 为器件地址输入端:当使用24c02 时最大可级联8个器件,如果只有一个24c02被总线寻址,这三个地址输入脚a0、a1、a2可悬空或连接到vss。wp为写保护:如果wp 管脚连接到vcc 所有的内容都被写保护只能读当wp, 管脚连接到vss 或悬空,允许器件进行正常的读/写操作12。管脚图如图3-3所示。 图3-3 at24c02引脚图3.2.2 lcd1602显示器 现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型lcd显示模块具有体积小,功耗低,显示内容丰富等特点。1602型lcd可以显示2行16个字符,有8位数据总线d0d7和rs,r/w,en三个控制端口,工作电压为5v,并且具有字符对比度调节和背光功能。接口信号说明:1602型lcd的接口信号说明如表3-2所示。表3-2 1602型lcd的接口信号说明第1脚vss 电源地第9脚d2双向数据线第2脚vdd +5v电源第10脚d3双向数据线第3脚vee 液晶显示偏压信号第11脚d4双向数据线第4脚rs 数据/命令选择端第12脚d5双向数据线第5脚r/ w 读/写 选择端第13脚d6双向数据线第6脚e 使能端第14脚d7双向数据线第7脚d0双向数据线第15脚bla 背光源正极第8脚d1 双向数据线第16脚blk 背光源负极主要技术参数:1602型lcd的主要技术参数如表3-3所示。 表3-3 1602型lcd的主要技术参数显示容量162个字符芯片工作电压4.55.5v工作电流2.0ma(5.0v)模块最佳工作电压5.0v字符尺寸2.954.35(wxh)mm基本操作程序:读状态:令rs=l,rw=l, e=h 输出:d0d7=状态字读数据:令rs=h,rw=h, e=h 输出:无写指令:令rs=l,rw=l,d0d7=指令码,e=高脉冲 输出:d0d7=数据写数据:令rs=h,rw=l, d0d7=数据, e=高脉冲 输出:无 第四章 硬件设计本系统外围电路包括键盘输入部分、密码存储部分、复位部分、显示部分、报警部分、开锁部分组成,根据实际情况键盘输入部分选择44矩阵键盘,显示部分选择字符型液晶显示lcd1602,密码存储部分选用at24c02芯片来完成。其原理图如图4-1所示。图4-1 电路原理图4.1 键盘输入模块由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行和列组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多i/o口。本设计中使用的这个44键盘不但能完成密码的输入还能作特别功能键使用。键盘的每个按键功能在程序设计中设置。它与单片机的连接如图4-2所示。图4-2 键盘输入模块4.2 密码存储模块图4-3所示at24c02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。在at89s51试验开发板上它们都接地,第5脚和第8脚分别为正、负电源。第8脚sdl为串行数据输入/输出,数据通过这条双向ic总线串行传送,在at89s52试验开发板上和单片机的p3.6连接。第6脚scl为串行时钟输入线,在at89s52试验开发板上和单片机的p3.7连接。sdl和scl都需要和正电源间各接一个5.1k的电阻上拉。第6脚接p3.5。at24c02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。图4-3 密码存储电路4.3 复位部分单片机复位是使cpu和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容c1上的电压很小,复位下拉电阻上的电压接近电源电压,即rst为高电平,在电容充电的过程中rst端电压逐渐下降,当rst端的电压小于某一数值后,cpu脱离复位状态,由于电容c1足够大,可以保证rst高电平有效时间大于24个振荡周期,cpu能够可靠复位。增加手动复位按键是为了避免死机时无法可靠复位。当复位按键按下后电容c1通过r5放电。当电容c1放电结束后,rst端的电位由r5与r6分压比决定。由于r5 提示输入密码gotoxy(0,0);count=0;print(code: );count1=1;count2=1;count6=1;sk15=0; sk14=0;m=0;cp0=1;if(count!=0)&(count1=1) /lcd上显示* if(count=1)gotoxy(0,0); print(code:* );if(count=2)gotoxy(0,0); print(code:* ); if(count=3)gotoxy(0,0); print(code:* ); if(count=4)gotoxy(0,0); print(code:* );if(count=5)gotoxy(0,0); print(code:* ); if(count=6)gotoxy(0,0); print(code:* ); if(count6)gotoxy(0,0); print(code:* );count1=0;if(sk14=1)&(count6=1) /按下确认,刚进入较验/密码正确if(password0=cq0)&(password1=cq1)&(password2=cq2)&(password3=cq3)&(password4=cq4)&(password5=cq5)&(count=6 )gotoxy(0,0); print(door open! );sk14=0; count=0;count2=0; m=0; count4=1;delayms(1000); count6=1; p2_0=0;delayms(500);p2_0=1;/密码错误 lcd_initial(); cp0=0;else gotoxy(0,0); print(code wrong! );delayms(1000);sk14=0; count=0; count2=0; count6=0; m=0; p3_6=0;delayms(100);delayms(3000);p3_6=1; lcd_initial(); cp0=0; /密码错误5.2.2 按键扫描子程序 void check_key(void)unsigned int row,col,tmp1,tmp2;tmp1 = 0x10; /tmp1用来设置p1口的输出,取反后使p1.4p1.7中有一个为0for(row=0;row4;row+) / 行检测p1 = 0x0f; / 先将p1.0p1.3置高p1 =tmp1; / 使p1.4p1.7中有一个为0tmp1*=2; / tmp1左移一位if (p1 & 0x0f) 0x0f) / 检测p1.0p1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测delayms(30);if (p1 & 0x0f) 0x0f) / 检测p1.0p1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 tmp2 = 0x01; / tmp2用于检测出哪一列为0for(col =0;col按键盘认键,较验旧密码/旧密码输入正确if(password0=cq0)&(password1=cq1)&(password2=cq2)&(password3=cq3)&(password4=cq4)&(password5=cq5)&(pass=1)&(count=6)gotoxy(0,0); print(new code: );pass0=1;pass=0;sk14=0;count=0;count7=0;n=0;m=0;elsegotoxy(0,0); print(old code wrong! ); /旧密码输入错误sk14=0;count2=0;count7=0;pass=0;m=0;if(pa!=10)&(pass0=1)if(n=7)&(count=6)gotoxy(0,0); print(set over! ); /旧密码输入正确,存新密码cq0=co1;cq1=co2;cq2=co3;cq3=co4;cq4=co5;cq5=co6;n=0;pass0=0;pass1=1;sk14=0;count=0;count2=0;m=0;count7=0;elsegotoxy(0,0); print(set wrong! ); /密码过多或过少,报错sk14=0;count2=0;count=0;count7=0;m=0; 附录一 总电路原理图附录二 实物图附录三 元器件清单序号元件名称型号与规格单位数量1电阻1k个6470个15.1k个210k个12三极管8550个23发光二极管个14晶振12m个15电容10uf个120pf个26按钮开关个177芯片at24c02块1at89s52块18蜂鸣器5v个19继电器5v个110液晶显示器1602块111实验板块1附录四 系统总体程序#include #include #include #include #define uchar unsigned char;#define uint unsigned int;/port definitions*sbit p3_6=p21;sbit lcdrs= p32;sbit lcdrw= p31;sbit lcden = p30;sfr dbport = 0x80;/p0=0x80,p1=0x90,p2=0xa0,p3=0xb0.数据端口sbit p2_0=p20;uint key_val=16;uint m=0,count=0,count2=0;uint pass=0,pass0=0,pass1=0,pass2=0,o=0,n=0;uint co6=0,0,0,0,0,0;uint cp1=0;uint cq7=0,0,0,0,0,0,0; uchar sk16=0,0,0,0,0,0,0,0,0,0,0,0,0,0,pa=10; uchar password6;void delayms(unsigned int n) unsigned int i,j; for(i=0;in;i+) for(j=0;j120;j+); /*按键扫描*/ void check_key(void)unsigned int row,col,tmp1,tmp2;tmp1 = 0x10; /tmp1用来设置p1口的输出,取反后使p1.4p1.7中有一个为0for(row=0;row4;row+) / 行检测p1 = 0x0f; / 先将p1.0p1.3置高p1 =tmp1; / 使p1.4p1.7中有一个为0tmp1*=2; / tmp1左移一位if (p1 & 0x0f) 0x0f) / 检测p1.0p1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测delayms(30);if (p1 & 0x0f) 0x0f) / 检测p1.0p1.3中是否有一位为0,只要有,则说明行有键按下,进入列检测 tmp2 = 0x01; / tmp2用于检测出哪一列为0for(col =0;col6)m=0;if(count2=1)if(key_val=0) / delay(1000) ;sk0=1 ;count+;pa=0;passwordm=0;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16;if(key_val=1)/delay(1000) ;sk1=1 ;count+;pa=1;passwordm=1;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=2)/delay(1000) ;sk2=1 ;count+;pa=2;passwordm=2;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=3)/delay(1000) ;sk3=1 ;count+;pa=3;passwordm=3;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=4)/delay(1000) ;sk4=1 ;count+;pa=4;passwordm=4;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16;if(key_val=5)/delay(1000) ;sk5=1 ;count+;pa=5;passwordm=5;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=6)/delay(1000) ;sk6=1 ;count+;pa=6;passwordm=6;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=7)/delay(1000) ;sk7=1 ;count+;pa=7;passwordm=7;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=8)/delay(1000) ;sk8=1 ;count+;pa=8;passwordm=8;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=9)/delay(1000) ;sk9=1 ;count+;pa=9;passwordm=9;m+;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16;if(m9)m=0;if(key_val=10)/delay(1000) ;sk10=1 ;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16; if(key_val=11)/delay(1000) ;sk11=1 ;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16;if(key_val=12)/delay(1000) ;sk12=1 ;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16;if(key_val=13)/delay(1000) ;sk13=1 ;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16;if(key_val=14)/delay(1000) ;sk14=1 ;delayms(10);p3_6=0;delayms(200);p3_6=1;key_val=16;if(key_val=15)/delay(1000) ;sk15=1;delayms(10);p3_6=0;delayms(100);p3_6=1;key_val=16;if(m10)m=0; /内部等待函数*unsigned char lcd_wait(void)lcden=0;lcdrs=0;lcdrw=1;_nop_();lcden=1;_nop_();lcden=0;_nop_();while(dbport&0x80)/在用proteus仿真时,注意用屏蔽此语句,在调用gotoxy()时,会进入死循环,/可能在写该控制字时,该模块没有返回写入完备命令,即dbport&0x80=0x80/实际硬件时打开此语句return dbport;/向lcd写入命令或数据*#define lcd_command0 / command#define lcd_data1 / data#define lcd_clear_screen0x01 / 清屏#define lcd_homing 0x02 / 光标返回原点void lcd_write(bit style, unsigned char input) lcd_wait();lcden=0;lcdrs=style;lcdrw=0;_nop_();dbport=input;_nop_();/注意顺序lcden=1;_nop_();/注意顺序lcden=0;_nop_();/设置显示模式*#define lcd_show0x04 /显示开#define lcd_hide0x00 /显示关 #define lcd_cursor0x02 /显示光标#define lcd_no_cursor0x00 /无光标 #define lcd_flash0x01 /光标闪动#define lcd_no_flash0x00 /光标不闪动void lcd_setdisplay(unsigned char displaymode)lcd_write(lcd_command, 0x08|displaymode);/设置输入模式*#define lcd_ac_up0x02#define lcd_ac_down0x00 / default#define lcd_move0x01 / 画面可平移#define lcd_no_move0x00 /defaultvoid lcd_setinput(unsigned char inputmode)lcd_write(lcd_command, 0x04|inputmode);/移动光标或屏幕*/*#define lcd_cursor0x02 #define lcd_screen0x08#define lcd_left0x00#define lcd_right0x04void lcd_move(unsigned char object, unsigned char direction) if(object=lcd_cursor)lcd_write(lcd_command,0x10|direction);if(object=lcd_screen)lcd_write(lcd_command,0x18|d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论