武汉理工大学华夏学院课程设计报告书课程名称课程设计总评成绩学生姓名、学号学生专业班级指导教师姓名课程设计起止日期一、课程设计项目名称《基于51单片机的密码锁的设计》二、项目设计要求及性能指标设计一个基于51单片机控制的密码锁,选用AT89C51单片机作为主控芯片进行设计和实现。具体任务包括项目的可行性分析,硬件电路的设计,系统软件设计,仿真调试,实际测试等。具体要求如下:1.密码的输入:采用两个按键来完成密码的输入,其中一个按键为功能键,另一个按键为数字键。在密码都已经输入完毕并且确认功能键之后,才能完成密码的输入过程。然后进入密码的判断比较处理状态并给出相应的处理过程。2.密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“90812”共5位密码。3.按键禁止功能:初始化时,允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态是在3次密码输入不正确的情况下发生的。三、项目设计方案1、系统方案设计(分析项目要求和指标,给出总的设计方案,画出项目设计的方框图,写出设计方案和工作原理。)设计的要求是要实现密码固定在ROM中,密码的输入与校对,还要在三次密码输入错误的情况下启动静止按键功能,设计的基本思路是,将密码固化,放入表中,在得到按键后,查表比较密码,如果正确,显示”good”提示,如果三次密码错误,就不调用读取按键函数,只打开警示灯,打开报警,同时屏幕闪烁以提示密码错误“error”。下图1是电子密码锁的总体框架图:电路分为五个部分,显示,键盘输入,报警输出等。图1密码锁系统总体结构框图1.1单片机系统:此次课题采用一种是用以80C51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,进行电子密码锁的设计。此次课题用单片机P1口与键盘相连,做输入口,P0口与显示器相连,做显示,P2口做显示器扫描。1.2键盘接口电路:此次课程设计采用I/O键盘,与P1口相连,采用扫描法。设有0——9十个数字密码,和一个确认键。开机显示INPUT,等待密码输入,输入5个密码,按确认键后,密码比较。1.3LCD显示:此次课程设计5密码LCD显示器,按键后即显示,液晶显示。P0口送示数据,P2口显示扫描,根据按键次数,第一位显示器显示第一次按的密码,第二位显示器显示第二次按的密码,第三位显示器显示第三次按的密码,依此第5位显示器显示第5次按的密码,按键完成后按确认键后,密码对则执行相关动作,不同则显示器清零,提示重新输入。1.4报警系统:此次课程设计,当按键三次错误后,系统报警,报警装置由一扬声器实现,从P3.0口输出脉冲,使扬声器鸣报警。2、系统硬件电路设计(给出系统的硬件电路设计,并分析其工作原理。)2.1多功能密码锁硬件设计MCS8051按键禁止指示灯蜂鸣器报警LCD显示器键盘(输入/锁定)密码锁的硬件电路主要由按键电路、指示灯及报警蜂鸣器的电路、显示电路等组成;密码锁硬件整体电路如图2所示。图2密码锁整体硬件电路2.2按键电路设计由于设计要求使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。如图3所示图3矩阵键盘电路2.3指示灯及报警蜂鸣器的电路设计指示灯及报警蜂鸣器的电路如下图所示,当输入的密码错误时,灯亮,接线如图4图4电机驱动电路2.4显示电路设计将P1与显示的数据端相连,使其它能动态的传输要显示的数据,将p3的第六位与位选通端相连,选通相应的位。接线如图5所示图5LCD显示电路3、系统软件设计(给出系统的软件设计,画出程序流程图,并给出关键部分的程序说明。)3.1主程序设计主程序主要完成初始化、检查有无按键按下、以及调用显示、指示灯、密码修改等等。具体模块包括:1、按键识别与编码设计2、显示程序设计3、密码正确返回程序设计3.2按键识别与编码设计当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。对照图4.2所示的44键盘,说明扫描法原理。首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。比如说扫描码送入01111111,前面的0111是代表此时扫描第一行P1.0列,而后面的1111是让读取的4行接脚先设高,若此时第一行的第三列按键被按下,那读取的结果就会变成01111101(注意1111变成1101),其中LSB的第三个bit会由1变成0,这是因為这个按键被按下之后,会被垂直的扫描码电位short,而把读取的LSB的bit电位拉到0,此即为扫描原理。由于这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,防抖动;为了避免让8051误判为多次输入同一按键,要加入按键是否松开,就可以让键盘的输入稳定。按键的操作面板如图图下所示。共计数字键10个,功能键6个。如图,10个数字键用来输入密码,0N/C用来修改密码,=用来进行输入密码的确认.3.3整体流程图设计图六程序流程图开始调用初始化函数显示密码正确?显示goodY报警10S显示error密码错误3次?Y输入密码NN3.4主要功能程序说明;===================================================;名称:电子密码锁;作者:cj;说明:首先显示器提示输入密码,密码在12.5S内输入有效,;输入次三次错误报警10S,输入正确后,7秒后返回初态;以上参数均可在主程序里设定,修改系统密码在程序的结尾;===================================================RSBITP2.7RWBITP2.6EBITP2.5ENTERBIT22H.0OPENBITP3.6SPEAKBITP3.7PASSBUFEQU40HKEYNUMBEREQU41H;存放识别后的按键号ORG0000HAJMPMAINORG0003HJMPKEY_INTORG000BHAJMPINTT0ORG001BHAJMPINTT1ORG0030H;==========主程序开始==============MAIN:MOV30H,#05H;输入密码为5位MOV42H,#200;设定报警的时间,42H单元里的数*50MSMOV43H,#250;设定启动时间14的倍数(实际上液晶显示器执行指令占用了时间,开门时间会比14*250MS大);44H号单元存放输入错误的次数;45H为定时器0中断次数;46H为定时器1中断次数MOV47H,#250;输入密码时间设定,50MS倍数MOVSP,#60HCLROPENCLRSPEAK;初始化输出设备CLRENTER;标志位初始化MOVTMOD,#11H;定时器工作方式2MOVTH0,#3CH;初值50MSMOVTL0,#0BHMOVTH1,#3CHMOVTL1,#0BHSETBEASETBET0SETBET1MOVTCON,#00000000B;电平触发START:MOVR0,30HMOVR1,#31HSS1:MOV@R1,#00HINCR1DJNZR0,SS1;将输入密码缓冲单元清零MOVP1,#0FH;初始化按键口MOVR1,#31H;从31号单元开始存放按建输入的密码CLR20H;报警标志清零CLR21H;密码超时标志MOV46H,#00H;超时后对定时器中断次数清零,便于下一轮重新计时INIT:ACALLSELLCD;设定液晶工作方式ACALLLINE1;在第一行显示MOVDPTR,#MES_P;显示请输入密码ACALLDISPLAYsetbEX0;开中断,允许键盘输入KEYIN:JB21H,ERR;超时转到错误程序JNBENTER,KEYIN;等待ENTER按下CLRENTERclrEX0;密码输入完后锁定键盘;当使用边沿触发时用上面的指令为什么禁止不了中断???;==========密码判断程序============COMP:MOVDPTR,#PASSMOVR4,30H;密码的长度MOVA,#0MOVR1,#31HLOOP:MOVR5,AMOVCA,@A+DPTRMOVPASSBUF,A;取出系统设定的密码MOVA,@R1;从31号单元开始取出输入的密码CJNEA,PASSBUF,ERR;比较MOVA,R5INCAINCR1;取下一位DJNZR4,LOOP;正确MATCH:MOVA,#01HACALLENABLE;清屏,光标复位ACALLLINE1;从第一行开始显示MOVDPTR,#MES_CACALLDISPLAY;显示请进ACALLLINE2MOVDPTR,#TAB_1ACALLDISPLAYSETBOPEN;开门MOV44H,#00H;输入错误次数清零MOVR6,43HACALLDELAYCLROPEN;复位JMPSTART;错误ERR:ACALLBACKMOVR6,#03HACALLDELAYACALLBACK;输错提示音,鸣两下MOVA,#01HACALLENABLEACALLLINE1MOVDPTR,#MES_EACALLDISPLAY;显示错误MOVR6,#40HACALLDELAYINC44HMOVA,44HCJNEA,#03H,EE0EE0:JCERROUT;输错不到三次返回MOV44H,#00H;清零ACALLWRANING;报警ERROUT:JMPSTART;===========按键中断服务程序==========KEY_INT:pushaccpushpswclrex0acalldelay10ms;延时消抖SETBTR1;启动定时器ACALLSMKEY;按键识别MOVA,KEYNUMBER;返回按键号ACALLBACK;按键发声MOVR3,ACJNER3,#0BH,K1;ENTER是否按下SETBENTERclrtr1;按下确认后关毕定时器mov46h,#00h;对中断次数清零AJMPKEY_RTNK1:ADDA,#30H;将按键号转换为ASCⅡ码MOV@R1,A;将输入的密码存入缓冲单元INCR1;修改地址ACALLWRDATA;输入一位显示一个*KEY_RTN:poppswpopaccsetbex0RETI;===========按键识别程序==========SMKEY:MOVA,P1ANLA,#0FHWKEY:MOVB,A;反转法查询MOVP1,#0F0HNOPMOVA,P1ANLA,#0F0HORLA,BMOVP1,#0FH;还原P1口初态CJNEA,#0EEH,WKEY1MOVKEYNUMBER,#00HAJMPRETURNWKEY1:CJNEA,#0EDH,WKEY2MOVKEYNUMBER,#01HAJMPRETURNWKEY2:CJNEA,#0EBH,WKEY3MOVKEYNUMBER,#02HAJMPRETURNWKEY3:CJNEA,#0E7H,WKEY4MOVKEYNUMBER,#03HAJMPRETURNWKEY4:CJNEA,#0DEH,WKEY5MOVKEYNUMBER,#04HAJMPRETURNWKEY5:CJNEA,#0DDH,WKEY6MOVKEYNUMBER,#05HAJMPRETURNWKE