电子密码锁课程设计报告模板_第1页
电子密码锁课程设计报告模板_第2页
电子密码锁课程设计报告模板_第3页
电子密码锁课程设计报告模板_第4页
电子密码锁课程设计报告模板_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

得分 微机原理与接口技术课程考试作品报告作品名称: 电子密码锁 姓 名: 梁其中 专业班级: 电信1103班 学 号: 中南大学物理与电子学院2013年下学期目 录摘 要3 第一章 系统整体概述4第二章 硬件设计5第三章 软件设计7第四章 调试与分析22第五章 制作感受23摘要电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁、报警、显示等任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比高的产品。应用较广的电子密码锁是以芯片为核心,增设外围电路,通过编程来实现的。本设计以单片机stc89s52作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构,实现钥匙信息在主机上的初步认密码信息的加密功能。根据51单片机之间的串行通信原理,这便于对密码信息的随机加密和保护。而且采用键盘输入的电子密码锁具有较高的优势。采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,提高信号传输的抗干扰性,减少错误动作,而且功率消耗低;反应速度快、传输效率高、工作稳定可靠等。软件设计采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。测试结果表明,本系统各项功能已达到本设计的所有要求。第一章 系统整体概述以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的以下基本功能:1保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。2密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以避免因人员 的更替而使锁的密级下降。3误码输入保护。当输入密码3次错误时,报警系统自动启动。4. 电子密码锁操作简单易行,一学即会。5.干扰码功能 在输入正确密码前可输入任意码。6.安保功能。输入错误一次警示灯会亮起。7.双重锁定功能外部强制锁定:在内部不能开启,适用于外出时,防止有人入侵。内部强制锁定:在外部不能开启,让您在家时更安心、安全。8.自动上锁功能采用全自动锁芯,门关后6秒内自动上锁,外出更加安全。系统框图: 报警电路 矩阵键盘 单 片 机 警示灯 开锁电机 液晶显示第二章 硬件设计硬件是一个系统的支撑核心,硬件的好坏直接关系着一个系统的效果,合理的硬件设计可以简化软件的编程。硬件又可以分为好几个模块的集合,分别为:晶振电路、复位电路、步进电机驱动电路、1602液晶显示电路、警示灯电路和矩阵键盘。矩阵键盘为4x4,用来输入密码,模式选择等;警示灯用来提示错误;1602液晶用来显示工作的状态;步进电机驱动用来控制步进电机,完成开锁关锁等操作;报警电路用来报警,当密码连续错误三次的时候。各个电路通过STC89S52单片机耦合在一起,便可以达到设计所需达到的要求。以下是电路原理图和电路pcb图。总电路原理图:画电路原理图时是硬件电路的必须,务必要非常小心,合理的布局会简化pcb板的绘制,减少不必要的麻烦。画完要非常小心地检查,一处小小的错误就可能让多天的劳动拜拜付出。电路Pcb图:绘制电路pcb图的时候合理的布局是重中之重,画好pcb图之后就开始洗pcb板,pcb板的质量决定与打印的图纸、曝光时间、洗板是配置洗板溶液的浓度与掌握洗板时间等,总之一句话:小心使得万年船。第三章 软件设计一个应用系统要完成各项功能,首先必须有较完善的硬件作保证。同时还必须得到相应设计合理的软件的支持,尤其是微机应用高速发展的今天,许多由硬件完成的工作,都可通过软件编程而代替。甚至有些必须采用很复杂的硬件电路才能完成的工作,用软件编程有时会变得很简单,如数字滤波,信号处理等。因此充分利用其内部丰富的硬件资源和软件资源,采用与C51系列单片机相对应的51汇编语言和结构化程序设计方法进行软件编程。程序设计语言有三种:机器语言、汇编语言和高级语言。机器语言是机器唯一能“懂”的语言,用汇编语言或高级语言编写的程序(称为源程序)最终都必须翻译成机器语言的程序(成为目标程序),计算机才能 “看懂”,然后逐一执行。高级语言是面向问题和计算过程的语言,它可通过于各种不同的计算机,用户编程时不必仔细了解所用的计算机的具体性能与指令系统,而且语句的功能强,常常一个语句已相当于很多条计算机指令,于是用高级语言C程序的速度比较快,也便于学习和交流,但是本系统却选用了高级语言C程序。原因在于,本系统是编制程序工作量不大、规模较小的单片机微控制系统。软件设计流程图: 开始初始化检测按键YESNO错误次数大于3?蜂鸣器报警 输入密码NO密码正确?警示灯闪烁YES修改密码选择模式输入新密码开锁关锁操作开锁操作主程序:#include #include#includelcd1.h#define GPIO_LED P3#define uint unsigned int#define uchar unsigned charsbit a=P24; sbit b=P23;sbit c=P22;sbit d=P21;sbit buzzer=P20;uchar KeyState;/用来存放按键状态uchar yszt=* Enter Password;uchar xgmm= NPassword;uchar mmcw= Error;uchar bingo= Welcome;uchar keyword6=;/原始密码uchar keycmp6;uchar xsz17=0x00,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f;uchar key=0,num=0,flg=0,cuo=0,zd=0,xs=0,q=0,w=0;/=延迟程序 延时x毫秒void delay(uint x) uint i,j; for(i=x;i0;i-) for(j=135;j0;j-); /=状态显示void ztxs()uchar i; switch(w) case 0:LcdInit();KeyState=0;for(i=0;i16;i+)LcdWriteData(yszti);break; case 1:KeyState=0;for(i=0;i10;i+)LcdWriteData(xgmmi); break; case 2:KeyState=0;for(i=0;i10;i+)LcdWriteData(mmcwi);break; case 3:KeyState=0;for(i=0;i10;i+)LcdWriteData(bingoi);break; / =开锁操作void ksdianji() unsigned int i=1000; while (i-!=0) a=1;b=1;c=1;d=0; delay(1); a=1;b=1;c=0;d=0; delay(1); a=1;b=1;c=0;d=1; delay(1); a=1;b=0;c=0;d=1; delay(1); a=1;b=0;c=1;d=1; delay(1); a=0;b=0;c=1;d=1; delay(1); a=0;b=1;c=1;d=1; delay(1); a=0;b=1;c=1;d=0; delay(1); cuo=0;for(i=1;i7;i+) LcdWriteCom(0x80+xszi);LcdWriteData( ); / =关锁操作void gsdianji() unsigned int i=1000; while (i-!=0) a=0;b=1;c=1;d=1; delay(1); a=0;b=0;c=1;d=1; delay(1); a=1;b=0;c=1;d=1; delay(1); a=1;b=0;c=0;d=1; delay(1); a=1;b=1;c=0;d=1; delay(1); a=1;b=1;c=0;d=0; delay(1); a=1;b=1;c=1;d=0; delay(1); a=0;b=1;c=1;d=0; delay(1); num=0;for(i=1;i1111_1101 for(n=0;n7;n+) /左移7次,这样子就会到达最左边GPIO_LED=_crol_(GPIO_LED,1); /将GPIO_LED左移一位delay(100); /延时for(n=0;n7;n+)/右移7次,这样子就会到达最右边GPIO_LED=_cror_(GPIO_LED,1);/将GPIO_LED右移一位delay(100);/延时GPIO_LED=0xff;if(cuo=3) for(n=0;n10;n+) for(i=0;i200;i+) buzzer=0;delay(1);buzzer=1;delay(1); for(i=0;i100;i+) buzzer=0;delay(2);buzzer=1;delay(2); cuo=0;for(i=1;i7;i+)LcdWriteCom(0x80+xszi);LcdWriteData( ); /=密码重置程序void set() uchar i=0,n=0;num=0;xs=0;for(i=0;i6;i+) if(keywordi=keycmpi) zd+; if(zd=6) zd=0;w=1;flg=1;ztxs(); else w=2;zd=0;cuo+;alarm(); ztxs(); for(i=1;i7;i+)LcdWriteCom(0x80+xszi);LcdWriteData( ); /=确认键程序void ok() uchar i=0,n=0;xs=0; if(flg=0) for(i=0;i6;i+) if(keywordi=keycmpi)zd+;if(zd=6) ksdianji();num=7;zd=0;w=3; else zd=0;cuo+;alarm();w=2; if(flg=1) flg=0;num=0;for(n=0;n6;n+)keywordn=keycmpn; for(i=1;i17;i+)LcdWriteCom(0x80+xszi);LcdWriteData(); ztxs(); /=键盘扫描程序void keyscan() uchar temp1,temp2; P1=0xfe;/令第一列为低电平,检测第1列 temp1=P1; if(temp1!=0xfe) delay(5);/去抖 temp2=P1;if(temp1=temp2) KeyState=1; switch(temp2) case 0x7e: ;if(num6)key=1;keycmpnum=key;num+;xs+;else if(num!=7)alarm(); break;case 0xbe: if(num6)key=2;keycmpnum=key;num+;xs+;else if(num!=7)alarm();break;case 0xde: if(num6)key=3;keycmpnum=key;num+;xs+;else if(num!=7)alarm(); break;case 0xee: if(num!=7) alarm(); break; while(temp1!=0xfe)temp1=P1;/等待按键释放 P1=0xfd;/检测第2列 temp1=P1; if(temp1!=0xfd) delay(5);/去抖 temp2=P1;if(temp1=temp2) KeyState=1; switch(temp2) case 0x7d: if(num6)key=4;keycmpnum=key;num+;xs+;else if(num!=7)alarm(); break;case 0xbd: if(num6)key=5;keycmpnum=key;num+;xs+;else if(num!=7)alarm();break;case 0xdd: if(num6)key=6;keycmpnum=key;num+;xs+;else if(num!=7)alarm(); break;case 0xed: if(num=6)set(); else if(num!=7) alarm(); break;while(temp1!=0xfd)temp1=P1;/等待按键释放P1=0xfb;/检测第3列temp1=P1;if(temp1!=0xfb) delay(5);/去抖 temp2=P1;if(temp1=temp2)KeyState=1; switch(temp2)case 0x7b: if(num6)key=7;keycmpnum=key;num+;xs+;else if(num!=7)alarm();break;case 0xbb: if(num6)key=8;keycmpnum=key;num+;xs+; else if(num!=7)alarm(); break;case 0xdb: if(num6)key=9;keycmpnum=key;num+;xs+; else if(num!=7)alarm(); break;case 0xeb: if(num=7)gsdianji(); break; while(temp1!=0xfb)temp1=P1;/等待按键释放P1=0xf7;/检测第4列 temp1=P1;if(temp1!=0xf7)delay(5);/去抖temp2=P1;if(temp1=temp2) KeyState=1;switch(temp2) case 0x77: if(num6)key=a;keycmpnum=key;num+;xs+; else if(num!=7) alarm();break;case 0xb7: if(num6)key=0;keycmpnum=key;num+;xs+; else if(num!=7)alarm(); break;case 0xd7: if(num0; c-) for (b=199;b0;b-) for(a=1;a0;a-); #ifndef LCD1602_4PINS /当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能LCD1602_RS = 0; /选择发送命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com; /放入命令Lcd1602_Delay1ms(1);/等待数据稳定LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#else void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能清零LCD1602_RS = 0; /选择写入命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;/Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com 4; /发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif #ifndef LCD1602_4PINS void LcdWriteData(uchar dat)/写入数据LCD1602_E = 0;/使能清零LCD1602_RS = 1;/选择输入数据LCD1602_RW = 0;/选择写入LCD1602_DATAPINS = dat; /写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#elsevoid LcdWriteData(uchar dat)/写入数据LCD1602_E = 0; /使能清零LCD1602_RS = 1; /选择写入数据LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = dat;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat 4; /写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif #ifndefLCD1602_4PINSvoid LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#elsevoid LcdInit() /LCD初始化子程序LcdWriteCom(0x32); /将8位总线转为4位总线LcdWriteCom(0x28); /在四位线下的初始化LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#endif副程序头文件:#ifndef _LCD1_H_#define _LCD1_H_#define LCD1602_4PINS#include#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif#define LCD1602_DATAPINS P0sbit LCD1602_E=P27;sbit LCD1602_RW=P26;sbit LCD1602_RS=P25;/*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); /误差 0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat);/*LCD1602初始化子程序*/void LcdInit(); #endif第四章 调试与分析调试是耦合软件和硬件的必由之路,过程是曲折的,犹如西天取经,当然经历无数的失败最终的收获必定是丰富的。由于时间问题,我没有经过软件仿真就直接开始了硬件的制作,绘制原理图、pcb图和习pcb板,很快就完成了初步的硬件的制作,当然追求速度的结果必将是要付出代价的,我首先调试了1602液晶,不过无论是用别人的程序还是自己写的程序烧录之后都没有显示出效果,经过艰苦的排查竟然是布局pcb的时候把封装弄反了,于是我用很多飞线纠正了过来,是pcb板变得无比难看,但至少是可以正常显示了。然后是警示灯和电机驱动软件的调试,这部分名不是很难,进行的比较顺利,主要的是控制步进电机的速度和转动的圈数,只是花费了一些时间,效果出来还是不负我所望。在后来就是软件的核心部分矩阵键盘程序和密码的调试,起初只能输入密码开锁,却不能修改密码,经过很多努力和同学们的帮忙终于调好了程序,其中遇到的问题不计其数,各个击破使我们学电子的必须要做到的。最后就是把各个写好的软件模块合拼在一起,这是让我觉得很难的地方,让我深深体会到学好c语言是多么的重要,一

温馨提示

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

评论

0/150

提交评论