PIC单片机电子密码锁实验_第1页
PIC单片机电子密码锁实验_第2页
PIC单片机电子密码锁实验_第3页
PIC单片机电子密码锁实验_第4页
PIC单片机电子密码锁实验_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

2010211123班10211048号郑威2012年小学期单片机设计实验报告题目:电子密码锁班级:2010211123班学号:10211048班内序号:33学生姓名:郑威指导老师:葛老师

电子密码锁实验摘要在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。本次我们制作的电子密码锁仅当用户输入正确的密码后才能进行下一步操作,达到了保密的要求。除此之外,这款可以多次修改密码而且具有报警功能的电子密码锁还有一个附加功能:测温计基于以上思路,本次设计使用Microchip公司的PIC32实现一基于单片机的电子密码锁的设计,其主要具有如下功能:(1)密码通过键盘输入,若密码正确,则将锁打开。(2)报警、锁定键盘功能。密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。(3)可以修改密码锁的密码电子密码锁的设计主要由三部分组成:4×4矩阵键盘接口电路,LCD1602液晶显示。另外系统还有LED提示灯,报警蜂鸣器等。系统设计思想总述:本系统电子密码锁的设计主要由三部分组成:pic32单片机,4×4矩阵键盘接口电路,LCD1602液晶显示,DS18B20测温模块。另外系统还有LED提示灯,报警蜂鸣器等。本实验的核心是编写程序,实验中采用c语言,通过软件MPLAB进行程序的烧写,将一块块的子程序进行嵌套最终融合起来成为整个项目的完整程序。关键词:PIC32单片机,电子密码锁,4*4矩阵键盘,LCD1602液晶显示,DS18B20系统框图与硬件图本系统电子密码锁的设计主要由以下部分组成:pic32单片机,4×4矩阵键盘接口电路,LCD1602液晶显示,DS18B20测温模块。另外系统还有LED提示灯,报警蜂鸣器等。LLCD1602显示LLCD1602显示CD4*4矩阵键盘PPIC32蜂鸣器报警蜂鸣器报警DS18B20DS18B20测温开锁电路开锁电路 4*4矩阵键盘模块:VCC行线RE4第四行 1 2 3 4RE3第三行 5 6 7 8RE2第二行 9 0 A RE2第二行RE0RE0第一行列线RB13第四列RB12第三列RF5第二列RF4第一列列线RB13第四列RB12第三列RF5第二列RF4第一列

键盘上16个键的功能表如下1234567890A(开锁)B(设置密码)C(查看摄氏度温度&确定键)D(查看华氏度温度)E(退出)F(删除)说明:0-9用做密码输入和密码设置等。A键为开锁键,按下后可以输入密码进行开锁。B键为修改密码键,按下后需要先输入原有密码,密码输入正确后可以进行密码修改。C键为双用键,在刚进入电子锁时,直接按C键可以查看当前的温度(摄氏度),当进入开锁或者设置密码功能时,C键为确定键。D键为查看华氏度温度键。E键为退出键,当在进行开锁或者设置密码功能时,按下退出键可以返回到主菜单。F键为删除键,当输入密码不小心输错时可以清除输入密码重新输入LCD1602液晶显示模块:Gnd+5V+5VGnd+5V+5VRD12RD13RD4RD5RD6RD7RF0RF1RG1RG0RA1+5VGndVSSVDDV0RSRWEDB0DB1DB2DB3DB4DB5DB6DB7BLABLK

说明:LCD通过RS,RW,E三个控制线来控制显示屏的读写命令,由于本实验中只需要写命令与写数据两种方式,以下是两种方式下三个引脚的电平状态写命令RSRWDB0DB1DB2DB3DB4DB5DB6DB700数据写数据RSRWDB0DB1DB2DB3DB4DB5DB6DB710数据DS18B20测温模块:RF12RF12系统总体设计系统模块总体框图设置密码退出判断按键错误三次报警开锁输入密码查看温度判断按键初始化设置密码退出判断按键错误三次报警开锁输入密码查看温度判断按键初始化

主程序流程图液晶屏初始化主程序液晶屏初始化主程序检测是否有按键按下检测是否有按键按下No判断按下的键值Yes判断按下的键值 按下B测温模块Readtemperature()设置密码模块Set_测温模块Readtemperature()设置密码模块Set_code()开锁程序Users_开锁程序Users_code()各子程序流程图键盘扫描子程序keyboard()Keyboard()Keyboard()子程序行线列线拉高列线设为输出,行线设为输入第一列拉低,其他列为高检测行线电平第二列拉低,其他列为高检测行线电平第三列拉低,其他列为高检测行线电平第一行为低return15 第三行为低return8第二行为低return11 第四行为低return4else 第一行为低return14 第三行为低return7第二行为低return10 第四行为低return3 elseelse第一行为低return13 第三行为低return6 第二行为低return0 第四行为低return2第四列拉低,其他列为高检测行线电平第四列拉低,其他列为高检测行线电平return17else第一行为低return12 第三行为低return5第二行为低return9 第四行为低return1 (2)LCD显示模块流程图LCD模块子程序LCD模块子程序LCD写数据RS=1,RW=0LCD初始化LCD写数据RS=1,RW=0LCD初始化LCD写命令RS=0,RW=0DS18B20子程序(3)DS18B20测温模块流程图:DS18B20子程序复位跳过ROM温度AD转换复位跳过ROM读取温度温度数值转化结束

复位跳过ROM温度AD转换复位跳过ROM读取温度温度数值转化结束(4)开锁子程序user_code()流程图:开锁子程序开锁子程序user_code()密码识别子程序密码识别子程序m=identify()开锁return开锁return判断返回值m m=1 m=0判断返回值m(5)修改密码子程序change_code()流程图:修改密码子程序change_code()密码识别子程序m=identify()判断返回值m修改密码子程序change_code()密码识别子程序m=identify()判断返回值mreturn设置密码子函数Shezhi()设置密码子函数Shezhi()m=1

(6)密码识别子程序identify()流程图:密码识别子程序密码识别子程序identify()按下删除键按下删除键输入密码键盘扫描输入密码键盘扫描显示屏输出FRReturn0 按下退出键E 输入0-9数字键 按下确定键判断密码正确性错误判断密码正确性错误蜂鸣器报警right=蜂鸣器报警right=0return0times++ times<3times<3Ifright=1Ifright=1再次输入一遍按下退出键E扫描键盘按下退出键E扫描键盘right++按下确定键Dreturn1Ifright=2按下确定键Dreturn1Ifright=2right=0right=0return0

(6)密码设置子函数流程图:密码识别子程序she_zhi()输入密码键盘扫描显示屏输出F密码识别子程序she_zhi()输入密码键盘扫描显示屏输出F按下退出键E按下退出键E按下删除键Freturnreturn输入0-9数字键 按下确定键newnew++IIfnew=1再次输入一遍 Ifnew=2Ifnew=2判断两次输入新密码是否一样判断两次输入新密码是否一样returnreturn 一样按下确定键按下确定键new=0键盘扫描 不一样new=0键盘扫描按下退出键按下退出键returnreturn

部分软件分析一.LCD1602的显示:LCD存在对数据的读写操作,这些操作是通过函数来对LCD进行写入各种指令来实现的,本实验中由于只需要显示屏完成字符及数字的显示,因此只需要完成LCD的写数据操作以及对显示屏的初始化操作。写操作LCD的写操作包括两个步骤,写命令和写数据操作,以下是LCD写操作的时序图由时序图可知,当对LCD进行写命令操作时,要先令RS控制信号为低电平,RW信号为低电平,然后把数据在DB0-DB7准备好之后,令使能控制信号E为高电平,然后等待一段时间,之后将E再拉低为低电平,这样就完成了对LCD的写命令操作。当对LCD进行写数据操作时,要先令RS控制信号为高电平,RW信号为低电平,然后把数据在DB0-DB7准备好之后,令使能控制信号E为高电平,然后等待一段时间,之后将E再拉低为低电平,这样就完成了对LCD的写数据操作。LCD的初始化操作主要是通过写入一些特定的指令来实现的,LCD的一般初始化过程如下:(1)写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置LCD模块相关代码如下:/*LCD写命令*/voidwrite_com(ucharcom){rs=0;DB0=(com)%2;DB1=(com/2)%2;DB2=((com/2)/2)%2;DB3=(((com/2)/2)/2)%2;DB4=((((com/2)/2)/2)/2)%2;DB5=(((((com/2)/2)/2)/2)/2)%2;DB6=((((((com/2)/2)/2)/2)/2)/2)%2;DB7=(((((((com/2)/2)/2)/2)/2)/2)/2)%2;delay_ms(150);E=1;delay_ms(150);E=0; }/*LCD写数据*/voidwrite_date(uchardate){rs=1;DB0=(date)%2;DB1=(date/2)%2;DB2=((date/2)/2)%2;DB3=(((date/2)/2)/2)%2;DB4=((((date/2)/2)/2)/2)%2;DB5=(((((date/2)/2)/2)/2)/2)%2;DB6=((((((date/2)/2)/2)/2)/2)/2)%2;DB7=(((((((date/2)/2)/2)/2)/2)/2)/2)%2;delay_ms(150);E=1;delay_ms(150);E=0;delay_ms(150);}/*LCD初始化*/voidInit_LCD(){E=0;write_com(0x38);//显示模式设置delay_ms(150);write_com(0x08);//关闭显示delay_ms(150);write_com(0x01);//显示清屏delay_ms(150);write_com(0x06);//显示光标移动设置delay_ms(150);write_com(0x0c);//显示清屏:数据指针清零;所有显示清零delay_ms(150);write_com(0x80);//数据指针初始化}二.矩阵式键盘用行列扫描法判断键盘是否有按键按下以及按键的位置,具体扫描过程为:四根列线外部拉高,然后将第一根列线拉低为低电平,其他三根列线还为高电平,然后分别检测四根行线的电平状态,若第一行为低电平说明按下了F键,若第二行为低电平说明按下了B键,若第三行为低电平说明按下了8键,若第四行为低电平说明按下了4键,然后将四根列线拉高,然后只将第二根列线拉低,同理扫描四根行线,这样就能把所有键都扫描出来。以下是扫描第一列四个键的代码。line1=0;line2=1;line3=1;line4=1;delay_ms(100); if(row1==0) {delay_ms(50); if(row1==0) {while(!(row1));return15;} } if(row2==0) {delay_ms(50); if(row2==0) {while(!(row2));return11;}} if(row3==0) {delay_ms(50); if(row3==0) {while(!(row3));return8;} } if(row4==0) {delay_ms(50);if(row4==0) {while(!(row4));return4;} }三.DS18B20测温模块DS18B20模块测温功能的实现主要通过向其读写一些指令来完成温度转换,温度读取等功能来实现的。而要实现这些功能,主要包括初始化,以及读写操作来完成。初始化18B20的初始化操作的时序图如下DS18B20初始化时序主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答,若无低电平出现一直都是高电平说明总线上无器件应答。作为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备,若没有检测到就一直在检测等待。对DS18B20的写和读操作接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程,因此首先要搞清楚主机是如何进行写0、写1、读0和读1的。写周期最少为60微秒,最长不超过120微秒,写周期一开始作为主机先把总线拉低1微秒表示写周期开始,随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平;若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而作为从机的DS18B20则在检测到总线被拉低后等待15微秒然后从15μs到45μs开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。DS18B20写操作对于读数据操作时序也分为读0时序和读1时序两个过程,读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0,采样期内总线为高电平则确认为1,完成一个读时序过程,至少需要60μs才能完成。DS18B20读操作调试过程及相关问题硬件调试硬件调试在初期我们主要是在面包板上完成的,在面包板上实现之后才开始焊板子,但是后面发现焊完板子之后又出现新的问题,于是又要重新开始调试。以下是硬件调试过程中出现的一些问题:(1)在调节LCD的时候,在将程序正确的烧入实验板后,发现LCD显示字符时出现了问题,显示屏本来该显示B,却显示的是C,本来该显示D,却显示成E,发现每隔一个字符就显示错误一个字符。后来经过仔细分析,查找字符码和字符关系对照表,发现字符码的最后一位始终是1,即本来是0的也变成了1,DB0线上的信号没有给到液晶屏上。于是发现时连接显示屏DB0和单片机的连线断了,导致显示屏DB0上悬空始终为高电平。最后换了一根线后显示正常。(2)在初期我们是用插面包板的方式调节显示屏的,在面包板上我们把显示屏和键盘模块调好之后,我们将其焊到板子上,发现显示屏显示字符又不正常了,开始以为又是连线的问题,在反复拆连了电路之后还是没用,最后发现是LCD插座有一个引脚虚焊,没有焊牢,重焊了之后才正常(3)到最后快做完的时候,发现显示屏总是不稳定,有时候稍微一碰它就显示乱码,必须要用力压着单片机才能稳定下来。最后发现这是因为与单片机相连的针座与单片机接触不良,换了一个针座后才稳定了。我想针座在一开始做实验时没有接触不良,到最后为什么会接触不良?后来觉得应该是电路拆连了太多遍,才会出现这种情况。这也提醒我下次做实验时不要盲目的拆电路,要找到原因后对症下药,否则会对电路产生不好的影响(4)在调试18B20时,一开始连好电路之后,发现却始终显示的温度是0度,一开始以为是程序的问题,修改了一天程序后,发现还是没有改观,后来搭档在检查电路的时候发现测温电路没有外接电源,接上后就正确显示了温度。这也更加告诉我以后一定要注意一些细节问题,否则会给实验造成一些不必要的困难,费时费力。二.软件调试软件调试主要是通过设置断点,结合硬件一起进行调试。有时候也会运用一些小技巧来帮助调试,比如要看一个语句有没有执行,可以在语句后面加一句让单片机上的RD0亮的语句,这样可以通过看灯亮了没有就可以判断语句执行了没有,以下是软件调试时遇到的问题(1)调键盘时,一开始键盘调出来之后,发现存在一点问题,就是如果按一个键的时间太久了会显示出来好多个字符,后来在程序里加了一个防抖动的程序,问题得到了解决。(2)键盘一开始出不来,后来改来改去发现改哪都不管用,最后发现在检测按键函数之间的延时函数没有改动过,就尝试去改动了延时的时间,惊喜的发现竟然好了,后面调18B20时候也是如果延时时间有的不对的话也出不来,时间合适才能出来。现在觉得延时这个东西其实真的很重要,刚开始的时候觉得延时可有可无,现在才知道任何一个细节都是很重要的(3)一开始写程序没有仔细考虑,把所有模块的代码

温馨提示

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

评论

0/150

提交评论