电子密码锁设计说明书.docx
《电子密码锁设计说明书.docx》由会员分享,可在线阅读,更多相关《电子密码锁设计说明书.docx(57页珍藏版)》请在冰豆网上搜索。
电子密码锁设计说明书
微机课程设计
专业:
通信工程
班级:
1303班
姓名:
丘春华
学号:
3131902220
指导老师:
蔡文培、王亚林、张国安
时间:
2015年12月24日—2016年1月6日
一、设计任务与功能要求
1.1设计课题······················································2
1.2设计目的······················································2
1.3设计任务······················································2
1.4设计要求······················································3
二、总体设计规划与方案论证
2.1程序总体编写方法规划··········································3
2.2方案论证······················································5
三、总体软件设计说明及程序总流程图
3.1总流程图······················································6
3.2总体说明······················································7
四、系统的资源分配及数据定义说明
4.1数据变量定义说明与使用说明····································7
4.2定时器中断设置················································9
4.3输入输出的硬件分配············································9
4.5键盘功能分配··················································9
五、局部程序设计方案
5.1初始以及自检··················································10
5.2主流程·······················································11
六、系统功能与用户操作使用说明
6.1系统的功能····················································18
6.2操作说明······················································18
七、课程设计总结···················································19
八、附录源程序·····················································21
九、硬件原理图·····················································44
一、设计任务与功能要求
1.1设计课题
门禁电子密码锁程序设计
1.2设计目的
通过小型微机应用产品的设计与调试过程,运用《微机原理及接口技术》课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高发展,通过实践的过程学习掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。
1.3设计任务
设计一个以单片机为核心的门禁密码锁。
具有密码开锁,不同权限的密码修改、密码输入安全设置、开门时段管理等功能。
编程并在单片机实验板上模拟调试实现。
1.4设计要求
1.4.1基本设计要求
1、开机进行接口部件及数码显示器、指示灯、讯响器等自检。
2、密码分为管理员密码和用户密码:
管理员密码为8位0~9的数字,而用户密码为6位0~9的数字。
3、设置“0”~“9”的数字键及“ESC”和“ENT”等功能键。
对按键输入信号须进行软件消抖处理。
4、工作模式:
(1)常态:
数码管显示时钟。
(2)开锁模式:
需输入6位数字为0~9的密码进行开锁。
密码数字可以由管理员事先设置保存共普通用户使用。
(3)管理员操作模式:
需输入8位0~9的密码,可以进行修改用户密码、修改管理员密码、修改进门时段等功能。
5、常态下,八位LED7段数码管显示时钟信息可包括小时、分钟、秒钟。
6、只要按下0~9的数字键则转入开锁状态,每按一个数字键使数码管从左到右逐次显示“—”。
7、如果输入的密码为6位则和用户密码进行匹配,匹配一致则开锁,如果输入的密码为8位则和管理员密码进行匹配,匹配一致则进入管理员操作模式。
8、在密码输入状态下,输入满6位或8位密码数据后,按“ENT”键才能进行密码匹配,如果没满6位或8位数字密码,按“ENT”则不作响应。
9、输入的用户密码如果匹配则相应指示灯亮并且电动开门电磁铁线圈通电1S开门后返回常态;如果输入不正确,则提示“E”,3S后返回常态,等待下一轮的密码输入。
10、开锁模式下可以按“ESC”键取消开锁模式返回常态。
11、管理员操作模式下,管理员可以选择功能,01功能代表设置用户密码、02功能代表重置管理员密码、03功能代表设置进门时间、04功能设置实时钟。
利用ESC键返回常态。
12、管理员操作模式下,01功能可以设置用户密码,输入新密码时需要进行确认。
1.4.2其它扩展功能
1、管理员操作模式下,02功能重置管理员密码;
2、管理员操作模式下,03功能可以设置进门的开始时间和结束时间。
只有在进门时间段输入用户密码才能开锁。
如果开始时间和结束时间均设置为00:
00,则为全天可以按密码开门;
3、管理员操作模式下,04功能实时钟的设置,利用数字3和数字4按键实现对时和分钟的调校,按键操作时实现快调功能;
4、如果在开锁模式下12S后没有按键操作则进入常态;
5、如果在开锁状态下用户密码输入十次均错误则报警锁键15分钟;
6、其他功能扩展。
二、总体设计规划与方案论证
2.1总体设计规划
程序规划分为三个部分:
自检和初始化、主循环和中断服务。
自检和初始化是在开机和复位时执行,其它时候将不执行此部分。
自检是对设备进行检测,初始化对后续的程序执行进行准备。
自检包括对数码管,LED指示灯和蜂鸣器的测试。
初始化包括调用延时等待芯片退出复位状态和对各数据单元赋初始值的准备。
主循环的执行是首先检测状态,然后执行相应的状态模块。
主循环里面共有7个状态,分别为常态,设置时间状态,管理员状态,设置用户密码状态,设置管理员密码状态,设置开门时间状态和输入密码状态;每一个状态都对应有一种显示的方式和键盘处理的方式.所以各种状态可以分开独立编写子程序,这将有利于程序的扩展和修改.
各个状态的功能简单描述如下:
常态时连续读取DS1302中时间的值,写入到液晶LCD1602中,实现程序走时的功能.
设置时间状态:
由管理员状态按设置时间键进入这个状态,然后控制LCD1602在相应的位置闪烁,提示用户设置的内容,然后获取按键值存入DS1302中,实现时间修改的功能;
管理员状态:
在常态输入8位密码,校验正确后进入管理员状态,管理员状态可以进一步选择相应的功能.
设置用户密码状态:
在管理员状态按下设置用户密码键进入这个状态,此时液晶显示用户按键的键值,当密码达到6位时询问用户是否确认修改,按确认键后保存密码至DS1302中永久保存.
设置管理员密码状态:
在管理员状态按下设置管理员密码键进入这个状态,此时液晶显示用户按键的键值,当密码达到8位时询问用户是否确认修改,按确认键后保存密码至DS1302中永久保存.
设置开门时间状态:
在管理员状态按下设置开门时间键进入这个状态,然后在液晶上显示修改的值,修改完成,保存数据到DS1302提供的30个RAM中,以便后面开门设置时读取的比较.
输入密码状态:
当在常态时按下0~9任意一个数字即进入这个状态,然后显示输入密码的个数,输入完成则比较密码,用户密码正确则开门,管理员密码则进入管理员状态.
中断服务子程序实现的功能是检测在没有按键按下时,空闲时间的计时。
它采用定时器0,方式1的16位定时计数器。
只要有中断来临即执行中断子程序对时间进行精准的计时,并改变相应的定时器溢出计数单元,只要有按键被有效按下即将其计数器置零,从新计数,直到计算出12s的时间,便将状态变为常态.这样便实现了长时间无操作进入常态的功能.
2.2方案论证
2.2.1设置状态功能
定义一个内存地址用于存放程序当前状态,然后根据不同的状态对键盘扫描返回的值进行处理,从而实现在同一个按键按下时,实现不同的功能和操作.显示部分也可以根据当前的状态,在液晶中显示相应的提示或功能.这样,对用户体验和程序的模块化设计都带来不小的好处.
2..2.2用DS1302时钟芯片计时
DS1302可以实现实时时钟,可对秒,分,时,日,周,月以及闰年补偿的年进行计数,计时精确.它具有高速数据暂存的31*8RAM数据存储器,可充分利用于存放用户密码,管理员密码和开门时间等数据,这样就不需要额外的数据存储器了.而且它功耗小,引脚少,在2.5-5.5V满度工作范围,这对于备用电源的选用来说是件好事.
2.2.3使用LCD1602液晶显示器
LCD1602可现实16*2排的字符,兼容ASCII编码,能现实英文字符的显示.比起数码管的显示,在功耗和用户体验上极具优势.
三、总框图及总体软件设计说明
3.1流程图
3.1.1程序流程图
图3.11
注:
由于中断部分没有确定的执行位置,所以中断部分在此流程图不作体现
3.12状态转换流程图
图3.12
3.2总体说明
总体程序分为三个部分:
自检和初始化、中断服务子程序、主流程三个部分。
自检和初始化是在开机和复位时执行,其它时候将不执行此部分。
自检是对设备进行检测,初始化对后续的程序执行进行准备。
自检包括对数码管,LED指示灯和蜂鸣器的测试。
初始化包括调用延时等待芯片退出复位状态和对各数据单元赋初始值的准备。
主循环的执行是首先检测状态,然后执行相应的状态模块。
主循环里面共有7个状态,分别为常态,设置时间状态,管理员状态,设置用户密码状态,设置管理员密码状态,设置开门时间状态和输入密码状态;每一个状态都对应有一种显示的方式和键盘处理的方式.所以各种状态可以分开独立编写子程序,这将有利于程序的扩展和修改.
四、系统的资源分配及数据定义说明
4.1数据变量定义说明与使用说明
4.11对各种状态的定义及值得定义如下
#defineucharunsignedchar//重新定义无符号字符型的描述方式(习惯这样使用)
#defineNORMAL0//常态
#defineSET_TIME1//设置时间状态
#defineMANAGER2//管理员状态
#defineCHECK3//输入密码状态
#defineCHANGE_MANAGER4//修改管理员密码状态
#defineCHANGE_USER5//修改用户密码状态
#defineSET_OPEN6//修改开门时间段状态
4.12对IO口的一些位定义如下:
sbitLDE1=P2^6;//573锁存器1控制位
sbitLDE2=P2^7;//573锁存器2控制位
sbitBUZZER=P1^1;//蜂鸣器位声明,低电平有效
sbitTRST=P2^3;//时钟芯片RST位声明
sbitTIO=P2^4;//时钟芯片TO位声明
sbitTSCLK=P2^5;//时钟芯片CLK位声明
sbitp30=P3^0;//P3口位申明,方便使用
sbitp31=P3^1;
sbitp32=P3^2;
sbitp33=P3^3;
sbitp34=P3^4;
sbitp35=P3^5;
sbitp36=P3^6;
sbitp37=P3^7;
4.13一些全局变量的定义和使用说明:
ucharstate=NORMAL;//状态变量,设置初始为常态
ucharpa[8];//临时存放密码的数组
ucharpi=0;//存放密码时的指针
uchartime[7];//临时存放时间的数组
uchartitem=0;//存放时间的指针
ucharirtime=0;//计数器计数值
4.14LCD1602显示字符串的定义:
charcodezifu0[]="USERPASSWPRD";
charcodezifu1[]="MANAGERPASSWPRD";
charcodezifu2[]="MANAGERMODE";
charcodezifu3[]="Waiting...";
charcodezifu4[]="Welcome!
";
charcodezifu5[]="OK";
charcodezifu6[]="Error";
charcodezifu7[]="SURETOCHANGE?
";//询问是否保存密码/时间.
charcodezifu8[]="OPENTIME:
";
charcodezifu9[]="CannotOpen!
";//未到开门时段时的用户提示.
//1602中时间显示的位置,分别是年,月.日.星期,时.分,秒
Charcodelcdadd[]={0x83,0x86,0x89,0x8c,0x80+0x40+4,0x80+0x40+7,0x80+0x40+10};
4.2定时器中断设置
此次采用定时器0,设定为定时方式1,设置定时器初始值和重装值时的TH0和TL0分别为0x3c,0xb0(65536-20000=0x3cb0),与irtime定时器溢出次数计数变量配合,定时器20000个TM溢出,而irtime变量为240次记满,可实现12秒的计算。
使用时设定好初值即可使用。
4.3输入输出的硬件分配
端口
作用
备注
P1
控制L0-L8的指示灯。
开门和自检时点亮,模拟开门的动作
0有效
P1.1
蜂鸣器,作为告警音和提示音
0有效
P2.6
573锁存器1控制位
0有效
P2.7
573锁存器2控制位
0有效
P2.3
DS1302RST脚
/
P2.4
DS1302T0脚
/
P2.5
DS1302C脚
/
P1
LCD1602液晶显示器功能脚(连接有573锁存器)
/
RAM
说明
备注
0xc0~0xcc
DS1302中6位用户密码保存的RAM地址
0xce~0xda
DS1302中8位用户密码保存的RAM地址
0xdc~0xe2
DS1302中4位开门时间保存的RAM地址
(注:
DS1302中分配的RAM地址指的是写地址,读地址是写地址加1)
表4.31
4.4键盘功能分配
键盘的功能及数字按键分布如下图4.41所示.
图4.41
五、局部程序设计方案
5.1初始化以及自检
自检和初始化都是在程序的最前头执行的。
对设备进行检查,和对数据的初始化定义。
为后续的执行做准备。
自检应该包括所有需要显示和指示的输出设备。
此次设计中简化了自检,只有写到两个,即蜂鸣器响一秒和LED点亮一秒。
这两条自检可以检测出指示灯和告警音的设备是否能正常运作。
在自检结束时,全部初始化为无效。
避免影响后续程序的进行。
初始化包括调用延时,等待各芯片退出复位,和对数据进行初始化。
等待各芯片退出复位,这是很重要的部分,芯片如果还未在退出初始化时候,就进行工作,将无法正常实现功能。
所以程序的初始都要调用延时,等待各芯片均退出初始化。
LCD1602初始化按照参考手册进行:
write_com(0x38);//液晶初始化指令
delay(5);
write_com(0x38);//液晶初始化指令
delay(5);
write_com(0x38);//液晶初始化指令
delay(5);
write_com(0x0C);//光标指令
write_com(0x06);//地址移动设定
write_com(0x01);//清屏指令
对数据的初始化有设置定时器0,为定时工作方式1,给TMOD赋初值0x01,每次溢出的定时计数初始值,设置TH0和TL0分别为0x3c,0xb0,每20000个TM溢出,同时启动定时器0工作的相关内容生效。
其他的初始化则是对数据单元进行赋初值,例如置程序初始状态等,都是为了防止后面的程序出错和运行时造成不可预知的影响。
5.2主流程
主流程的7个状态分别是:
常态,输入密码状态,管理员状态,修改时间状态,修改用户密码状态,修改管理员密码状态,修改开门时间状态.
常用子程序的设计:
1.DS1302读取数据子程序:
/****************************************************************************
函数功能:
DS1302读数据函数
入口参数:
数据的地址
出口参数:
读取的数据
****************************************************************************/
unsignedchardsRead(unsignedcharadd)
{
unsignedchari,date=0;
TRST=0;
TSCLK=0;
TRST=1;
delay1(10);//小延时
for(i=0;i<8;i++)
{
TIO=add&0x01;//数据和地址都是从最低位开始传送
delay1(10);
TSCLK=1;
delay1(10);
if(i<7)
TSCLK=0;//CLK置低
add>>=1;
}
for(i=0;i<8;i++)
{
TSCLK=0;
if(TIO==1)//当数据线为高时,证明该位数据为1
date|=0x80;//要传输数据的当前值置为1,若不是,则为0
delay1
(1);
TSCLK=1;
if(i<7)date>>=1;
}
delay1(10);
TRST=0;//关闭数据传输
returndate;
}
2.DS1302写数据子程序:
/**********************************************************************
函数功能:
DS1302写数据函数
入口参数:
写入的地址,写入的数据
出口参数:
**********************************************************************/
voiddsWrite(unsignedcharadd,unsignedchardate)
{
unsignedchari;
TRST=0;
TSCLK=0;
TRST=1;
delay1(10);
for(i=0;i<8;i++)
{
TIO=add&0x01;//数据和地址都是从最低位开始传送
delay1(10);
TSCLK=1;
delay1(10);
TSCLK=0;
add>>=1;
}
for(i=0;i<8;i++)
{
TIO=date&0x01;//数据和地址都是从最低位开始传送
delay1(10);
TSCLK=1;
delay1(10);
TSCLK=0;
date>>=1;
}
delay1(10);
TRST=0;
}
3.LCD1602写命令子程序:
/*********************************************************************
函数功能:
DS1602液晶写指令子程序
入口参数:
指令
出口参数:
**********************************************************************/
voidwrite_com(unsignedcharcom)
{
P0=0x8F;
LDE2=1;
LDE2=0;
P0=com;
LDE1=1;
LDE1=0;
P0=0x0CF;
LDE2=1;
delay(3);
P0=0x08F;
LDE2=0;
}
4.LCD1602写数据子程序:
/******************************************************************
函数功能:
DS1602液晶写数据子程序
入口参数:
要显示的数据
出口参数:
********************************************************************/
voidwrite_date(unsignedchardate)
{
P0=0x9F;
LDE2=1;
LDE2=0;
P0=date;
LDE1=1;
LDE1=0;
P0=0x0DF;
LDE2=1;
LDE2=0;
delay(3);
P0=0x08F;
LDE2=1;
LDE2=0;
delay(3);
}
5.按键扫描子程序
/****************************************************************************
函数功能:
键盘扫描程序
入口参数:
出口参数:
键值
****************************************************************************/
charscandKey(){//当有键被按下时会返回相应的键值,无键时返回-1
uchartem=0x00;
P3=0xf0;
tem=P3;
tem=tem&0xf0;
if(tem!
=0xf0){
delay(30);//延时消抖动
P3=0xf0;
tem=P3;
tem=tem&0xf0;
if(tem!
=0xf0){
if(tem==0xe0){//第一列
P3=0xff;
p34=0;
if(p30==0){
return1;
}elseif(p31==0){
return4;
}elseif(p32==0){
return7;
}elseif(p33==0){
r