电子密码锁课程设计报告模板.docx
《电子密码锁课程设计报告模板.docx》由会员分享,可在线阅读,更多相关《电子密码锁课程设计报告模板.docx(21页珍藏版)》请在冰豆网上搜索。
![电子密码锁课程设计报告模板.docx](https://file1.bdocx.com/fileroot1/2023-1/27/09ea8af4-61cd-42e0-aadb-e9fa60e2d9d3/09ea8af4-61cd-42e0-aadb-e9fa60e2d9d31.gif)
电子密码锁课程设计报告模板
得分
微机原理与接口技术课程
考试作品报告
作品名称:
电子密码锁
******
专业班级:
电信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程序。
原因在于,本系统是编制程序工作量不大、规模较小的单片机微控制系统。
软件设计流程图:
主程序:
#include
#include
#include"lcd1.h"
#defineGPIO_LEDP3
#defineuintunsignedint
#defineucharunsignedchar
sbita=P2^4;
sbitb=P2^3;
sbitc=P2^2;
sbitd=P2^1;
sbitbuzzer=P2^0;
ucharKeyState;//用来存放按键状态
ucharyszt[]="*EnterPassword";
ucharxgmm[]="NPassword";
ucharmmcw[]="Error";
ucharbingo[]="Welcome";
ucharkeyword[6]="123456";//原始密码
ucharkeycmp[6];
ucharxsz[17]={0x00,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
ucharkey=0,num=0,flg=0,cuo=0,zd=0,xs=0,q=0,w=0;
//==============================延迟程序延时x毫秒
voiddelay(uintx)
{uinti,j;
for(i=x;i>0;i--)
for(j=135;j>0;j--);
}
//======================状态显示
voidztxs()
{uchari;
switch(w)
{
case0:
LcdInit();
KeyState=0;
for(i=0;i<16;i++){LcdWriteData(yszt[i]);}break;
case1:
KeyState=0;
for(i=0;i<10;i++){LcdWriteData(xgmm[i]);}break;
case2:
KeyState=0;
for(i=0;i<10;i++){LcdWriteData(mmcw[i]);}break;
case3:
KeyState=0;
for(i=0;i<10;i++){LcdWriteData(bingo[i]);}break;
}
}
//=====================开锁操作
voidksdianji()
{
unsignedinti=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;i<7;i++)
{LcdWriteCom(0x80+xsz[i]);LcdWriteData('');}
}
//====================关锁操作
voidgsdianji()
{
unsignedinti=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;i<17;i++){LcdWriteCom(0x80+xsz[i]);LcdWriteData('');}
}
//==============================报警程序
voidalarm()
{
inti,n;
num=0;xs=0;
GPIO_LED=0xfe;//1111_1110->1111_1101
for(n=0;n<7;n++)//左移7次,这样子就会到达最左边
{
GPIO_LED=_crol_(GPIO_LED,1);//将GPIO_LED左移一位
delay(100);//延时
}
for(n=0;n<7;n++)//右移7次,这样子就会到达最右边
{
GPIO_LED=_cror_(GPIO_LED,1);//将GPIO_LED右移一位
delay(100);//延时
}
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);
}
for(i=0;i<100;i++)
{
buzzer=0;
delay
(2);
buzzer=1;
delay
(2);
}
}
cuo=0;
}
for(i=1;i<7;i++){LcdWriteCom(0x80+xsz[i]);LcdWriteData('');}
}
//==============================密码重置程序
voidset()
{
uchari=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('');}
}
//==============================确认键程序
voidok()
{
uchari=0,n=0;xs=0;
if(flg==0)
{
for(i=0;i<6;i++)
{
if(keyword[i]==keycmp[i]){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;n<6;n++){keyword[n]=keycmp[n];}
for(i=1;i<17;i++){LcdWriteCom(0x80+xsz[i]);LcdWriteData('');}
}
ztxs();
}
//==============================键盘扫描程序
voidkeyscan()
{
uchartemp1,temp2;
P1=0xfe;//令第一列为低电平,检测第1列
temp1=P1;
if(temp1!
=0xfe)
{
delay(5);//去抖
temp2=P1;
if(temp1==temp2)
{
KeyState=1;
switch(temp2)
{
case0x7e:
;if(num<6){key='1';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xbe:
if(num<6){key='2';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xde:
if(num<6){key='3';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xee:
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)
{
case0x7d:
if(num<6){key='4';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xbd:
if(num<6){key='5';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xdd:
if(num<6){key='6';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xed:
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)
{
case0x7b:
if(num<6){key='7';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xbb:
if(num<6){key='8';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xdb:
if(num<6){key='9';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xeb:
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)
{
case0x77:
if(num<6){key='a';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xb7:
if(num<6){key='0';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xd7:
if(num<6){key='b';keycmp[num]=key;num++;xs++;}
else
if(num!
=7){alarm();}break;
case0xe7:
if(num==6){ok();}
else
if(num!
=7){alarm();}break;
}
}
}
while(temp1!
=0xf7)temp1=P1;//等待按键释放
}
//============================主函数
main()
{
ztxs();
while
(1)
{keyscan();
if(KeyState)
{KeyState=0;
LcdWriteCom(0x80+xsz[xs]);
LcdWriteData('*');
}
}
}
副程序:
#include"lcd1.h"
voidLcd1602_Delay1ms(uintc)//误差0us
{
uchara,b;
for(;c>0;c--)
{
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时
voidLcdWriteCom(ucharcom)//写入命令
{
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
voidLcdWriteCom(ucharcom)//写入命令
{
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
#ifndefLCD1602_4PINS
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_E=0;//使能清零
LCD1602_RS=1;//选择输入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//写入数据
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
#else
voidLcdWriteData(uchardat)//写入数据
{
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_4PINS
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x38);//开显示
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
}
#else
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28)