课程设计报告
设计题目: 基于单片机的密码锁设计 学 号: 姓 名: 墨小染Shawn 指导教师:
信息与电气工程学院 二零一三年七月
目 录
引言 ....................................................................................................................................................... 1 第1章 设计任务 ........................................................................................................................... 3 第2章 系统整体方案设计 ....................................................................................................... 4 第3章 硬件系统设计 ................................................................................................................. 5 3.1单片机最小系统 ........................................................................................................................ 5 3.2 键盘电路 ..................................................................................................................................... 6 3.3 数码管显示电路 ....................................................................................................................... 6 3.4 报警电路 ..................................................................................................................................... 7 第4章 系统程序设计 ................................................................................................................... 8 4.1 主程序流程图 ............................................................................................................................ 9 4.1.1 锁住状态 .................................................................................................................................. 9 4.1.2 报警状态 ................................................................................................................................ 10 4.1.3 密码输入正确状态 ............................................................................................................. 10 4.1.4 解锁完成状态 ...................................................................................................................... 10 4.1.5 修改密码状态 ...................................................................................................................... 11 4.2 键盘扫描流程图 ..................................................................................................................... 11 第 5 章 系统仿真、调试及结论 ......................................................................................... 12 5.1 Proteus软件简介 .................................................................................................................. 12 5.2 进入 Proteus ISIS ................................................................................................................ 13 5.3 工作界面 ................................................................................................................................. 14 5.4 软件仿真 ................................................................................................................................. 14 5.5 硬件调试 ................................................................................................................................. 15 第 6 章 程序清单 ...................................................................................................................... 16 第 7 章 小 结 ............................................................................................................................. 30
哈尔滨工业大学(威海)课程设计报告 基于单片机的密码锁设计
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。
1. 设计任务
结合实际情况,基于AT89C52单片机设计一个密码锁系统。该系统应满足的功能要求为:
(1)总共可设置8位密码,每位密码值范围为1-8; (2)可自行设定和修改密码;密码按键时有声音提示;
(3)键入密码错误报警5秒,连续三次键入错误报警1分钟,报警期间输入密码无效;
(4)输入密码正确,有1秒的开锁提示音;
(5)密码设定完毕后有2秒提示音。开锁后5秒内未进入,自动锁闭。 主要硬件设备:单片机实验开发系统:矩阵键盘,开关量输入模块,LED输出模块,数码管(LED)显示器,液晶显示器,点阵显示模块
哈尔滨工业大学(威海)课程设计报告 2. 整体方案设计
本设计采用STC89C52单片机为主控芯片,结合外围电路矩阵键盘、数码管和蜂鸣器等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到报警电路控制是否报警。
系统的整体设计方案设计图如图所示。
89C52 单片机 矩阵 键盘 控制 蜂鸣器 数码管
系统的整体方案设计图
哈尔滨工业大学(威海)课程设计报告 3. 系统硬件电路设计 3.1单片机最小系统
晶振电路和复位电路
3.2 键盘电路
使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。如图所示。
哈尔滨工业大学(威海)课程设计报告 。
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
3.3数码管显示电路
本系统设计的显示电路是为了给使用者以提示而设置的。本系统的显示采用数码管动态扫描的方式,只使用单片机的一个串行口,利用两个74HC573实现对数码管位选信号和段选信号的控制,就可以完成单片机的显示功能,显示电路的电路原理图如图所示。
哈尔滨工业大学(威海)课程设计报告 用P2.6和P2.7分别接两个74HC573的控制端,P0口接两个74HC573的输入端;第一个74HC573的输出口提供段选信号,第二个74HC573的输出口提供位选信号。
用74HC573的锁存功能,实现对段选信号和位选信号的控制,其逻辑功能表如表如下: 输入 输出 OE LE D Q(HC573) Q(HC573) H X X Z Z L L X NO CHANGE * NO CHANGE * L H L L H L H H H L 3.4 报警电路
报警模块由蜂鸣器、三极管和单片机组成。选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。蜂鸣器电路如图所示,当89C51的P2.3口输出为低电平时,蜂鸣器产生蜂鸣音,89C51输出为高电平时,蜂鸣器不发声。
哈尔滨工业大学(威海)课程设计报告 4. 系统程序设计
4.1 主程序流程图
1. 锁住状态
设定的初始密码是“11111111”,程序刚开始运行的时候是处于锁住状态,此时数码管显示“LOCK”,等待矩阵键盘输入密码,密码输入正确后才能进行解锁或者修改密码操作。
哈尔滨工业大学(威海)课程设计报告
2. 报警状态
密码输入错误时,蜂鸣器会发出声音,进入报警状态,此时蜂鸣器会报警5S,连续输入密码错误3次,会报警60S,报警期间键盘输入无效,报警结束后自动进入锁住状态,重新输入密码。
3. 密码输入正确状态
密码输入正确时,数码管显示COOL,此时等待按键操作,如果5秒内无按键操作则自动进入锁住状态,如果有按键操作,进入解锁完成状态。
哈尔滨工业大学(威海)课程设计报告 4. 解锁完成状态
密码输入正确后,有按键操作,则进入解锁完成状态,此时数码管显示OPEN,并且可以通关按键操作,选择进入修改密码状态或者返回锁住状态。
5. 修改密码状态
进入密码修改状态,数码管显示CODE,此时可以通过矩阵键盘设定8位1-8的密码,密码修改成功后数码管显示COOL,同时蜂鸣器响2S,然后重新回到锁住状态。
4.2 键盘扫描程序流程图
哈尔滨工业大学(威海)课程设计报告
哈尔滨工业大学(威海)课程设计报告 5. 系统调试
5.1Proteus软件简介
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和数字电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和电路分析于一身的仿真软件,功能极其强大。
5.2进入 Proteus ISIS
双击桌面上的ISIS 6 Professional图标或者单击屏幕左下方的“开始”→“程序”→“Proteus 7.1 Professional” →“ISIS 7.1 Professional”,出现如图5-1所示
5.3工作界面
Proteus ISIS的工作界面是一种标准的Windows界面,如图5-2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
哈尔滨工业大学(威海)课程设计报告
图5- 1 Proteus ISIS的工作界面
运行Proteus程序后,进入软件的主界面。通过左侧工具栏中的P(从库中选择元件命令)命令,在Pick Devices 左侧窗口中选择所需元件的关键字,然后放置元件并调整方向和位置以及参数设置,进行连线。最后载入hex文件后可以进行模拟仿真,可以全速运行也可以单步调试运行。
Proteus运行按键
5.4 Proteus软件仿真
我在用Proteus进行仿真时遇到提示说找不到HEX文件,经过查阅相关资料,发现只要双击单片机那个原件,重新加载一下HEX文件所在的路径就能解决问题,如图所示:
哈尔滨工业大学(威海)课程设计报告
5.5硬件调试
晶振电路,复位电路,STC89C52单片机,数码管,74HC573锁存器,6位数码管,蜂鸣器,矩阵键盘,排阻(使用P0口时需要接上拉电阻)
6. 程序清单
#include //包含头文件 哈尔滨工业大学(威海)课程设计报告 #define uchar unsigned char #define uint unsigned int sbit beep=P2^3; sbit dula=P2^6; sbit wela=P2^7; //定义特殊功能寄存器的位变量 uint num,time,led,set,back,key; //定义全局变量 uint shi,ge; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0xff,0x7c, 0x39,0x5e,0x79,0x71}; //数码管显示“0~F”对应的编码 uchar code lock[]={0x38,0x3f,0x39,0x78};//数码管显示“LOCK”的编码 uchar code open[]={0x3f,0x73,0x79,0x37};//数码管显示“OPEN”的编码 uchar code setcode[]={0x39,0x3f,0x5e,0x79}//数码显示“CODE”的编码 uchar code complete[]={0x39,0x3f,0x3f,0x38};//数码管显示\"COOL\"的编码 uint tablecod[]={1,1,1,1,1,1,1,1}; //初始密码为11111111 uint tempcod[]={1,1,1,1,1,1,1,1}; //输入的密码存放的数表 void delayms(uint xms)//延时函数 { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void di(uint xms) //蜂鸣器报警函数 { beep=0; delayms(xms); beep=1; } void keyscan1() //矩阵键盘输入密码 { uchar temp; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; 哈尔滨工业大学(威海)课程设计报告 switch(temp) { case 0xed: tempcod[num]=1; key=1; num++; di(10); break; case 0xdd: tempcod[num]=2; key=2; num++; di(10); break; case 0xbd: tempcod[num]=3; key=3; num++; di(10); break; case 0x7d: tempcod[num]=4; key=4; num++; di(10); break; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) 哈尔滨工业大学(威海)课程设计报告 { temp=P3; switch(temp) { case 0xeb: tempcod[num]=5; key=5; num++; di(10); break; case 0xdb: tempcod[num]=6; key=6; num++; di(10); break; case 0xbb: tempcod[num]=7; key=7; num++; di(10); break; case 0x7b: tempcod[num]=8; key=8; num++; di(10); break; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; 哈尔滨工业大学(威海)课程设计报告 if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: set=1; di(10); break; case 0xd7: set=2; di(10); break; default : break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } } } void keyscan2() //矩阵键盘修改密码 { uchar temp; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: tablecod[num]=1; key=1; 哈尔滨工业大学(威海)课程设计报告 num++; di(10); break; case 0xdd: tablecod[num]=2; key=2; set=1; num++; di(10); break; case 0xbd: tablecod[num]=3; key=3; num++; di(10); break; case 0x7d: tablecod[num]=4; key=4; num++; di(10); break; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { 哈尔滨工业大学(威海)课程设计报告 case 0xeb: tablecod[num]=5; key=5; num++; di(10); break; case 0xdb: tablecod[num]=6; key=6; num++; di(10); break; case 0xbb: tablecod[num]=7; key=7; num++; di(10); break; case 0x7b: tablecod[num]=8; key=8; num++; di(10); break; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; 哈尔滨工业大学(威海)课程设计报告 switch(temp) { case 0xe7: di(10); break; case 0xd7: di(10); break; default : break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } } void keyscan3() //选择修改密码或者返回锁住状态 { uchar temp; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: di(10); break; case 0xdd: di(10); break; case 0xbd: di(10); break; 哈尔滨工业大学(威海)课程设计报告 case 0x7d: di(10); break; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: di(10); break; case 0xdb: di(10); break; case 0xbb: di(10); break; case 0x7b: di(10); break; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } 哈尔滨工业大学(威海)课程设计报告 } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: set=1; di(10); break; case 0xd7: set=2; di(10); break; default : break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } } void display(uchar w1,w2,w3,w4,w5,w6) //数码管显示函数 { dula=1; P0=w1; dula=0; P0=0xff; wela=1; P0=0xfe; delayms(2); P0=0xff; 哈尔滨工业大学(威海)课程设计报告 wela=0; dula=1; P0=w2; dula=0; P0=0xff; wela=1; P0=0xfd; delayms(2); P0=0xff; wela=0; dula=1; P0=w3; dula=0; P0=0xff; wela=1; P0=0xfb; delayms(2); P0=0xff; wela=0; dula=1; P0=w4; dula=0; P0=0xff; wela=1; P0=0xf7; delayms(2); P0=0xff; wela=0; dula=1; P0=w5; dula=0; P0=0xff; wela=1; P0=0xef; delayms(2); P0=0xff; wela=0; dula=1; P0=w6; 哈尔滨工业大学(威海)课程设计报告 dula=0; P0=0xff; wela=1; P0=0xdf; delayms(2); P0=0xff; wela=0; } void T0_time() interrupt 1 //中断函数 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; time++; if(time==20) { time=0; led++; } } void main() //主函数 { uint i,tag,error,ledtime,ditime; error=0; while(1) { tag=3; keyscan1(); display(lock[0],lock[1],lock[2],lock[3],table[key],table[num]); if(num==8) { for(i=0;i<8;i++) { if(tablecod[i]!=tempcod[i]) tag=0; else tag=1; } } if(tag==0) //密码错误 { error++; if(error==3) { ledtime=60; 哈尔滨工业大学(威海)课程设计报告 } else { ledtime=5; } TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; led=0; num=0; while(1) { shi=led/10; ge=led%10; display(lock[0],lock[1],lock[2],lock[3],table[shi],table[ge]); di(10); if(led==ledtime) { key=0; break; } } } if(tag==1) //密码正确 { TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; led=0; num=0; key=0; while(1) { shi=led/10; ge=led%10; display(complete[0],complete[1],complete[2],complete[3],table[shi],table[ge]); keyscan1(); 哈尔滨工业大学(威海)课程设计报告 di(ditime); if(key!=0)// 解锁完成 { TR0=0; set=0; while(1) { display(open[0],open[1],open[2],open[3],table[0],table[0]); keyscan3(); if(set==2) //返回锁住状态 { num=0; key=0; error=0; break; } if(set==1) //进入修改密码状态 { TR0=1; tag=2; key=0; break; } } break; } else { TR0=1; tag=1; } if(led>=1&&led<5) //开锁5秒内未进入,自动锁闭,前2秒声音提示 { ditime=0; } else if(led==5) { ditime=0; key=0; error=0; break; } else { 哈尔滨工业大学(威海)课程设计报告 ditime=10; } } } if(tag==2) //设定密码 { TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=0; led=0; num=0; while(1) //设定8位密码 { keyscan2(); display(setcode[0],setcode[1],setcode[2],setcode[3],table[key],table[num]); if(num==8) { key=0; break; } } while(1) //密码设定完毕,提示2秒 { TR0=1; shi=led/10; ge=led%10; display(complete[0],complete[1],complete[2],complete[3],table[shi],table[ge]); di(10); if(led==2) { num=0; error=0; break; } } } } } 哈尔滨工业大学(威海)课程设计报告 7.小结 以前做电子设计大赛的时候做过可编程控制交通灯、自动寻迹小车,都是用51单片机来实现的,所以对51单片机有一定的了解,再加上本学期学习了《单片机原理及接口技术》,经过在实验室的试验箱上实际操作,用汇编语言实现了一些简单的功能以及8155和8255的IO口扩展,我对单片机的工作原理有了更清晰的认识,所以这次课程设计还算是比较轻松。此次课程设计我抽到的题目是基于单片机的密码锁设计,这个题目涉及到了矩阵键盘,数码管,蜂鸣器等模块,我打算用自己的单片机开发板来完成这次课设。因为以前学习过Pspice和Protel,所以虽然是第一次用Proteus,但是用起来还算是顺手,按照开发板的电路图绘出仿真的电路图,然后开始写程序。写程序时先写一个个的模块,把一个个模块的程序写完,调试成功后,再写主程序,整个程序写完后,在用Proteus绘制好的电路中调用Keil生成的HEX文件,进行仿真。仿真成功后再通过STC-ISP软件把程序烧录到单片机上,然后到实际的电路中运行。在写程序的过程中,遇到了一个问题不能编译通过,困扰了我很久,就是我想把键盘输入的密码保存到一个数表中,但是编译器提示这个变量不能被改变,在经过请教老师和查阅C语言教程后,我恍然大悟,发现用code定义的数表是只读属性的,去掉code后,程序就能正常编译了。此次课程设计有一个遗憾,不论怎么调试,我写的LCD1602程序在开发板上不能用,但是用Proteus仿真是能够正常使用的,我怀疑是自己开发板上LCD1602的接口坏掉了,于是用数码管代替了LCD1602。 总的来说,此次课程设计收获是很多的,复习了以前学会的数码管,矩阵键盘,蜂鸣器,学会了用Proteus仿真调试,感受到了单片机的强大功能,对单片机的工作过程有了新的认识,加强巩固了我们在课堂上学习的知识。 哈尔滨工业大学(威海)课程设计报告 因篇幅问题不能全部显示,请点此查看更多更全内容