您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页电子密码锁-课程设计报告

电子密码锁-课程设计报告

来源:意榕旅游网


得分

微机原理与接口技术课程

考试作品报告

作品名称: 电子密码锁 姓 名: 梁其中 专业班级: 电信1103班 学 号: 1404110520

中南大学物理与电子学院

2013年下学期

目 录

第一章 系统整体概述„„„„„„„„„„„„„„„„„„„„„„4 第二章 硬件设计„„„„„„„„„„„„„„„„„„„„„„„„5 第三章 软件设计„„„„„„„„„„„„„„„„„„„„„„„„7 第四章 调试与分析„„„„„„„„„„„„„„„„„„„„„„„22 第五章 制作感受„„„„„„„„„„„„„„„„„„„„„„„„23 摘 要„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3

- 2 -

摘要

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁、报警、显示等任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比高的产品。应用较广的电子密码锁是以芯片为核心,增设外围电路,通过编程来实现的。

本设计以单片机stc89s52作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构,实现钥匙信息在主机上的初步认密码信息的加密功能。根据51单片机之间的串行通信原理,这便于对密码信息的随机加密和保护。而且采用键盘输入的电子密码锁具有较高的优势。采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,提高信号传输的抗干扰性,减少错误动作,而且功率消耗低;反应速度快、传输效率高、工作稳定可靠等。软件设计采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。测试结果表明,本系统各项功能已达到本设计的所有要求。

- 3 -

第一章 系统整体概述

以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的以下基本功能: 1.保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。

2.密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以避免因人员 的更替而使锁的密级下降。

3.误码输入保护。当输入密码3次错误时,报警系统自动启动。 4. 电子密码锁操作简单易行,一学即会。 5.干扰码功能 在输入正确密码前可输入任意码。 6.安保功能。输入错误一次警示灯会亮起。 7.双重锁定功能

外部强制锁定:在内部不能开启,适用于外出时,防止有人入侵。 内部强制锁定:在外部不能开启,让您在家时更安心、安全。 8.自动上锁功能

采用全自动锁芯,门关后6秒内自动上锁,外出更加安全。

系统框图:

矩阵键盘 警示灯 液晶显示 单 报警电路 片 机

开锁电机

- 4 -

第二章 硬件设计

硬件是一个系统的支撑核心,硬件的好坏直接关系着一个系统的效果,合理的硬件设计可以简化软件的编程。

硬件又可以分为好几个模块的集合,分别为:晶振电路、复位电路、步进电机驱动电路、1602液晶显示电路、警示灯电路和矩阵键盘。矩阵键盘为4x4,用来输入密码,模式选择等;警示灯用来提示错误;1602液晶用来显示工作的状态;步进电机驱动用来控制步进电机,完成开锁关锁等操作;报警电路用来报警,当密码连续错误三次的时候。各个电路通过STC89S52单片机耦合在一起,便可以达到设计所需达到的要求。以下是电路原理图和电路pcb图。

总电路原理图:

画电路原理图时是硬件电路的必须,务必要非常小心,合理的布局会简化pcb板的绘制,减少不必要的麻烦。画完要非常小心地检查,一处小小的错误就可能让多天的劳动拜拜付出。

- 5 -

电路Pcb图:

绘制电路pcb图的时候合理的布局是重中之重,画好pcb图之后就开始洗pcb板,pcb板的质量决定与打印的图纸、曝光时间、洗板是配置洗板溶液的浓度与掌握洗板时间等,总之一句话:小心使得万年船。

- 6 -

第三章 软件设计

一个应用系统要完成各项功能,首先必须有较完善的硬件作保证。同时还必须得到相应设计合理的软件的支持,尤其是微机应用高速发展的今天,许多由硬件完成的工作,都可通过软件编程而代替。甚至有些必须采用很复杂的硬件电路才能完成的工作,用软件编程有时会变得很简单,如数字滤波,信号处理等。因此充分利用其内部丰富的硬件资源和软件资源,采用与C51系列单片机相对应的51汇编语言和结构化程序设计方法进行软件编程。 程序设计语言有三种:机器语言、汇编语言和高级语言。机器语言是机器唯一能“懂”的语言,用汇编语言或高级语言编写的程序(称为源程序)最终都必须翻译成机器语言的程序(成为目标程序),计算机才能 “看懂”,然后逐一执行。高级语言是面向问题和计算过程的语言,它可通过于各种不同的计算机,用户编程时不必仔细了解所用的计算机的具体性能与指令系统,而且语句的功能强,常常一个语句已相当于很多条计算机指令,于是用高级语言C程序的速度比较快,也便于学习和交流,但是本系统却选用了高级语言C程序。原因在于,本系统是编制程序工作量不大、规模较小的单片机微控制系统。

- 7 -

软件设计流程图:

开始 初始化 检测按键 NO 输入密码 错误次数大于3? YES 蜂鸣器报警 密码正确? YES NO 警示灯闪烁 修改密码 选择模式 输入新密码 开锁 关锁操作 开锁操作

- 8 -

主程序:

#include #include #include\"lcd1.h\" #define GPIO_LED P3 #define uint unsigned int #define uchar unsigned char sbit a=P2^4; sbit b=P2^3; sbit c=P2^2; sbit d=P2^1; sbit buzzer=P2^0;

uchar KeyState;//用来存放按键状态 uchar yszt[]=\"* Enter Password\"; uchar xgmm[]=\" NPassword\"; uchar mmcw[]=\" Error\"; uchar bingo[]=\" Welcome\";

uchar keyword[6]=\"123456\";//原始密码 uchar keycmp[6]; uchar

xsz[17]={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;i>0;i--) for(j=135;j>0;j--); }

//======================状态显示 void ztxs() {uchar i; switch(w) { case 0:

- 9 -

}

LcdInit(); KeyState=0;

for(i=0;i<16;i++){LcdWriteData(yszt[i]);}break; KeyState=0;

for(i=0;i<10;i++){LcdWriteData(xgmm[i]);} break; KeyState=0;

for(i=0;i<10;i++){LcdWriteData(mmcw[i]);} break; KeyState=0;

for(i=0;i<10;i++){LcdWriteData(bingo[i]);}

break;

case 1:

case 2:

case 3:

}

// =====================开锁操作 void ksdianji() {

unsigned int i=1000; while (i--!=0) {

a=1;b=1;c=1;d=0; delay(1); delay(1); delay(1); delay(1);

delay(1); delay(1); delay(1);

a=1;b=1;c=0;d=0; a=1;b=1;c=0;d=1; a=1;b=0;c=0;d=1;

a=1;b=0;c=1;d=1;

a=0;b=0;c=1;d=1; a=0;b=1;c=1;d=1;

- 10 -

a=0;b=1;c=1;d=0; delay(1); } }

// ====================关锁操作 void gsdianji() {

unsigned int i=1000; while (i--!=0) {

cuo=0;

for(i=1;i<7;i++)

{LcdWriteCom(0x80+xsz[i]);LcdWriteData(' '); }

a=0;b=1;c=1;d=1;

delay(1); delay(1); delay(1); delay(1);

delay(1); delay(1); delay(1); delay(1); } }

num=0;

a=0;b=0;c=1;d=1; a=1;b=0;c=1;d=1; a=1;b=0;c=0;d=1;

a=1;b=1;c=0;d=1;

a=1;b=1;c=0;d=0; a=1;b=1;c=1;d=0; a=0;b=1;c=1;d=0;

for(i=1;i<17;i++){LcdWriteCom(0x80+xsz[i]);LcdWriteData(' '); }

//==============================报警程序

- 11 -

void alarm() {

int i,n; num=0;xs=0;

GPIO_LED=0xfe;//1111_1110->1111_1101

{ }

for(n=0;n<7;n++) //右移7次,这样子就会到达最右边 { }

GPIO_LED=0xff; if(cuo==3) {

for(n=0;n<10;n++) {

for(i=0;i<200;i++) { buzzer=0;

delay(1); buzzer=1; delay(1); }

GPIO_LED=_cror_(GPIO_LED,1); delay(100);

//将GPIO_LED右移一位

//延时

GPIO_LED=_crol_(GPIO_LED,1); //将GPIO_LED左移一位 delay(100);

//延时

for(n=0;n<7;n++) //左移7次,这样子就会到达最左边

for(i=0;i<100;i++) { buzzer=0;

delay(2); buzzer=1; delay(2); }

- 12 -

} }

for(i=1;i<7;i++){LcdWriteCom(0x80+xsz[i]);LcdWriteData(' '); }

cuo=0;

}

//==============================密码重置程序 void set() { uchar i=0,n=0; num=0;xs=0; for(i=0;i<6;i++) {

if(keyword[i]==keycmp[i]) {zd++;} } if(zd==6) {

zd=0;w=1;flg=1;ztxs(); } else {

w=2;zd=0;cuo++;alarm(); ztxs(); }

for(i=1;i<7;i++){LcdWriteCom(0x80+xsz[i]);LcdWriteData(' '); }

}

//==============================确认键程序 void ok() { uchar i=0,n=0;xs=0; if(flg==0) { for(i=0;i<6;i++) { if(keyword[i]==keycmp[i]){zd++;}

}

- 13 -

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;n<6;n++){keyword[n]=keycmp[n];}

for(i=1;i<17;i++){LcdWriteCom(0x80+xsz[i]);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)

{

- 14 -

case 0x7e: ;if(num<6){key='1';keycmp[num]=key;num++;xs++;} }

while(temp1!=0xfe)

temp1=P1; if(temp1!=0xfd) {

delay(5); //去抖 temp2=P1;

if(temp1==temp2) {

KeyState=1;

temp1=P1;//等待按键释放

P1=0xfd;//检测第2列

else

if(num!=7){alarm();} break; else

if(num!=7){alarm();}break; else

case 0xbe: if(num<6){key='2';keycmp[num]=key;num++;xs++;}

case 0xde: if(num<6){key='3';keycmp[num]=key;num++;xs++;}

if(num!=7){alarm();} break; }

}

case 0xee: if(num!=7) {alarm();} break;

switch(temp2) {

case 0x7d: if(num<6){key='4';keycmp[num]=key;num++;xs++;}

else

if(num!=7){alarm();} break; else

if(num!=7){alarm();}break; else

if(num!=7){alarm();} break;

case 0xbd: if(num<6){key='5';keycmp[num]=key;num++;xs++;}

case 0xdd: if(num<6){key='6';keycmp[num]=key;num++;xs++;}

- 15 -

case 0xed: if(num==6){set();} }

while(temp1!=0xfd)

P1=0xfb;//检测第3列 temp1=P1; if(temp1!=0xfb) }

while(temp1!=0xfb)

temp1=P1;//等待按键释放

{ {

KeyState=1; { }

}

else

if(num!=7){alarm();}break; else

if(num!=7){alarm();} break;

delay(5); //去抖 temp2=P1;

temp1=P1;//等待按键释放

}

}

else

if(num!=7) {alarm();} break;

if(temp1==temp2)

switch(temp2)

case 0x7b: if(num<6){key='7';keycmp[num]=key;num++;xs++;}

case 0xbb: if(num<6){key='8';keycmp[num]=key;num++;xs++;}

case 0xdb: if(num<6){key='9';keycmp[num]=key;num++;xs++;}

else

if(num!=7){alarm();} break;

case 0xeb: if(num==7){gsdianji();} break;

- 16 -

P1=0xf7;//检测第4列 temp1=P1; if(temp1!=0xf7)

{

delay(5); //去抖 temp2=P1; if(temp1==temp2)

{ KeyState=1;

switch(temp2) {

case 0x77: if(num<6){key='a';keycmp[num]=key;num++;xs++;} }

while(temp1!=0xf7) }

//============================主函数 main() { ztxs(); while(1)

temp1=P1;//等待按键释放

}

else

if(num!=7) {alarm();}break; else

if(num!=7){alarm();} break; else

if(num!=7){alarm();}break; else

if(num!=7) {alarm();} break;

case 0xb7: if(num<6){key='0';keycmp[num]=key;num++;xs++;}

case 0xd7: if(num<6){key='b';keycmp[num]=key;num++;xs++;}

case 0xe7: if(num==6){ok();}

}

- 17 -

{ keyscan(); if(KeyState) } 副程序:

#include\"lcd1.h\"

void Lcd1602_Delay1ms(uint c) //误差 0us {

uchar a,b; }

#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_E = 0;

//等待数据稳定

//写入时序

for (; c>0; c--) { }

for (b=199;b>0;b--) {

for(a=1;a>0;a--); }

{ KeyState=0;

LcdWriteCom(0x80+xsz[xs]);

}

LcdWriteData('*');

}

Lcd1602_Delay1ms(5); //保持时间

- 18 -

#else

void LcdWriteCom(uchar com) //写入命令 { } #endif

#ifndef LCD1602_4PINS { } #else

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;

//写入数据

void LcdWriteData(uchar dat)

LCD1602_E = 0;

//使能清零

LCD1602_RS = 0; //选择写入命令 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以Lcd1602_Delay1ms(1); LCD1602_E = 1; LCD1602_E = 0;

LCD1602_DATAPINS = com << 4; //发送低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; LCD1602_E = 0;

//写入时序

Lcd1602_Delay1ms(5);

//写入时序

Lcd1602_Delay1ms(5);

传送高四位不用改

// Lcd1602_Delay1ms(1);

- 19 -

{ }

#endif #ifndef {

LcdWriteCom(0x38); //开显示 } #else

void LcdInit() {

LcdWriteCom(0x32); LcdWriteCom(0x28);

//将8位总线转为4位总线 //在四位线下的初始化

//LCD初始化子程序

LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏

LcdWriteCom(0x80); //设置数据指针起点

LCD1602_4PINS

//LCD初始化子程序

void LcdInit()

LCD1602_E = 0;

//使能清零

LCD1602_RS = 1; //选择写入数据 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以Lcd1602_Delay1ms(1); LCD1602_E = 1; LCD1602_E = 0;

LCD1602_DATAPINS = dat << 4; //写入低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; LCD1602_E = 0;

//写入时序

Lcd1602_Delay1ms(5);

//写入时序

Lcd1602_Delay1ms(5);

传送高四位不用改

LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏

- 20 -

}

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 P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^6; sbit LCD1602_RS=P2^5;

/*在51单片机12MHZ时钟下的延时函数*/ void Lcd1602_Delay1ms(uint c); //误差 0us /*LCD1602写入8位命令子函数*/ void LcdWriteCom(uchar com); /*LCD1602写入8位数据子函数*/ void LcdWriteData(uchar dat) /*LCD1602初始化子程序*/ void LcdInit(); #endif

;

- 21 -

第四章 调试与分析

调试是耦合软件和硬件的必由之路,过程是曲折的,犹如西天取经,当然经历无数的失败最终的收获必定是丰富的。

由于时间问题,我没有经过软件仿真就直接开始了硬件的制作,绘制原理图、pcb图和习pcb板,很快就完成了初步的硬件的制作,当然追求速度的结果必将是要付出代价的,我首先调试了1602液晶,不过无论是用别人的程序还是自己写的程序烧录之后都没有显示出效果,经过艰苦的排查竟然是布局pcb的时候把封装弄反了,于是我用很多飞线纠正了过来,是pcb板变得无比难看,但至少是可以正常显示了。

然后是警示灯和电机驱动软件的调试,这部分名不是很难,进行的比较顺利,主要的是控制步进电机的速度和转动的圈数,只是花费了一些时间,效果出来还是不负我所望。

在后来就是软件的核心部分—矩阵键盘程序和密码的调试,起初只能输入密码开锁,却不能修改密码,经过很多努力和同学们的帮忙终于调好了程序,其中遇到的问题不计其数,各个击破使我们学电子的必须要做到的。

最后就是把各个写好的软件模块合拼在一起,这是让我觉得很难的地方,让我深深体会到学好c语言是多么的重要,一开始合拼之后所有的工作都不能实现了,弄得我郁闷了好久,正所谓是车到山前必有路,成功都只是时间问题,发现了好多问题,查百度、经过不懈的努力终于大功告成。

- 22 -

第五章 制作感受

紧张又繁忙的一个学期即将要结束了。在这个学期的单片机学习中,让我收获很多,也让我知道自己所学的专业必须要求自己一丝不苟,特别认真耐心完成每一条线路的连接,如果稍有大意就会使做出来的成品无法正常显示,导致功亏一篑。

我做的是电子密码锁。这个学期,需要学的东西很多,而且有些东西,比如我们新学的三项软件,并不是在短时间就能掌握的,必需靠长时间的练习去把握,理解。要完成这项工艺品,前面已经提过要用到我们新学的三项软件,我们需要先设计出电路图,用Proteus把电路图画出来,仿真电路,看电路是否能正常运行,如果不能正常运行就必须修改到正常运行为止,然后就要用到第二个软件——Keil,我们要在上面编写出我们所用的单片机C程序,之后生成HEX文件,最后就是要用到的最后一个软件,Altium Designer ,我们要用它制作PCB,这个PCB真的好难,不仅需要对这个软件足够了解,还要知道电路元器件的实际尺寸,因为我们需要对元器件做封装,为了保证元器件能插到电路板上,必须对元器件的实际尺寸有清楚的了解,这样封装才能做到位,才能保证实验的成功。然而,让我们更心酸的是在我们终于完成电路的pcb之后,自我感觉还是不错的时候,同学们给我们狠狠泼了一盆凉水,接着就是我埋头修改的身影,在此期间,我感触颇多,同时也让我学会了很多知识,尽管被同学们吵了好多次,但是正是同学们的建议与指导,才让我们的pcb更加完美。

另外,在制作过程中我深切的体会到了团队的力量和与人沟通的重要性。这次制作我体会最深的还有一个“累”字,它不仅仅是身体的疲惫,劳动的汗水;更多的是一种“苦尽甘来”的滋味,我会为我曾经“累”过而感到骄傲和满足。正是这种“累”让我发现了自身的不足,让我学会了更多的专业技能;也正是这种“累”让我懂得了责任和团队的意义。实训虽然结束了,但我们现在的学习并未结束,我们应该珍惜在学校的每一天,多学习,把自身的弱势和不足变成优势与特长,扫清我们就业道路上的绊脚石,为自己拥有一个美好的未来而加倍努力!

- 23 -

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务