单片机课程设计数字密码锁Word文件下载.docx
- 文档编号:18332997
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:30
- 大小:95.64KB
单片机课程设计数字密码锁Word文件下载.docx
《单片机课程设计数字密码锁Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数字密码锁Word文件下载.docx(30页珍藏版)》请在冰豆网上搜索。
方案一:
以ADUC848单片机为数字密码锁系统核心,使用4*4矩阵键盘作为数据输入方式,驱动1602A显示器提示程序运行过程和开锁的步骤,利用AT24C02芯片实现掉电存储。
图1为单片机控制密码锁的系统原理框图。
LED
密码校验提示
图1单片机控制密码锁的系统原理框图
方案二:
以74LS112双JK触发器构成的数字逻辑电路控制方案,如图2。
图2数字逻辑控制方案数字密码锁原理框图
2.2方案选择
由于利用单片机灵活的编程设计和强大的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还可以增添掉电存储、声光提示等功能,故选用方案一。
三、单元模块设计
3.1硬件支持
使用的元器件有:
核心芯片ADUC848、存储芯片AT24C02、液晶显示1602A、4×
4矩阵键盘、报警蜂鸣器、发光二极管和三极管。
3.2功能单元模块设计
3.2.1开锁机构
通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的。
如图3所示,为密码锁开锁电路原理图。
当用户输入的密码正确时,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。
本次设计中,基于节省成本考虑,用发光二极管代替电磁锁,信息通过LCD显示,并利用蜂鸣器和二极管声光指示。
其中,绿发光二极管亮,表示开锁;
否则,表示密码输入错误并开启报警电路。
否
图3密码锁开锁电路原理图
3.2.2矩阵键盘设计电路
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要M条行线和N条列线,即可组成具有M×
N个按键的键盘。
由于本设计中要求使用16个按键输入,为减少键盘与单片机接口时所占用的I/O线的数目,故使用矩阵键盘。
本设计中,矩阵键盘行线和单片机P1.0-P1.3相连,列线与单片机P1.4-P1.7相连。
矩阵键盘设计电路图,如图4所示。
键盘扫描采用行扫描法,即依次置行线中的每一行为低电平,其余均为高电平,扫描列线电平状态,为低电平即表示该键按下。
图4矩阵键盘设计电路图
3.2.3声音提示电路设计
声音提示电路采用小蜂鸣器提示。
蜂鸣器能够根据脉冲信号,以及信号的频率发出各种不同的声音,这样可以根据系统要求在密码出入正确和密码输入错误时发出不同的声音提示,已达到报警的要求。
蜂鸣器电路,如图5所示。
图5蜂鸣器电路
3.2.4显示模块设计
本设计中,显示电路采用1602A液晶显示器显示。
如下所示,图6为1602A液晶显示器的接口示意图,表1为接口说明。
图61602A液晶显示器的接口示意图
表1接口说明
管脚序
名称
电平
功能描述
1
VSS
0V
接地
2
VCC
5.0V
电源输入
3
V0
—
LCD驱动电压输入
4
RS
H/L
寄存器选择:
RS=H,选择数据寄存器;
RS=L,选择指令寄存器
5
R/W
读写信号线:
R/W=H,读操作;
R/W=L,写操作
6
E
H,H→L
使能信号
7
DB0
数据线
8
DB1
9
DB2
10
DB3
11
DB4
12
DB5
13
DB6
14
DB7
15
BLA
背光电源正极
16
BLK
背光电源负极
本设计中液晶串口一共用到11根导线与单片机相连,具体连接情况如表2显示模块与MCU连接说明所示。
表2显示模块与MCU连接说明
序号
1602A液晶显示器引脚
ADUC848单片机引脚
RS引脚
P2.5(A13)
R/W引脚
P2.6(A14)
E引脚
P2.7(A15)
D0引脚
P0.0(AD0)
D1引脚
P0.1(AD1)
D2引脚
P0.2(AD2)
D3引脚
P0.3(AD3)
D4引脚
P0.4(AD4)
D5引脚
P0.5(AD5)
D6引脚
P0.6(AD6)
D7引脚
P0.7(AD7)
四、程序设计与系统仿真
4.1模块介绍
与硬件电路相关联,本系统软件包括主程序模块、密码比较判断模块、键盘扫描模块、修改密码模块、1602A液晶显示模块等。
系统程序流程如图9所示。
N=0x11
图9系统程序流程图
4.1.1主程序模块
主程序主要用于定义全局变量,给全局变量赋初值,初始化E2PROM,启动定时器以及从AT24C02中读取密码,为整个程序提供数据;
检测按键;
调用显示等功能。
4.1.2密码比较判断模块
该模块的功能是将键盘输入的密码利用if语句与设定的密码进行逐个比较,若密码完全正确则开锁;
若不正确,则开启报警电路,复位后重新输入密码。
其密码输入和比较判决流程图如图10所示。
复位
图10密码输入和比较判决流程图
4.1.3键盘扫描模块
键盘使用矩阵式键盘,由行和列组成,CPU对所有键盘进行监视,从而实现逐列扫描键盘确定被按键的具体位置、判断键盘上有无键按下、消除去抖动、判断闭合的键是否释放等功能。
如图11所示,为键盘扫描流程图。
Y
图11键盘扫描流程图
4.1.4修改密码模块
在密码输入正确情况下,可以按下“重置密码”对密码进行重新设置,每设定一位就将密码送给AT24C02存储起来,当设置6位密码完毕后,系统将自动跳到程序开始,调用新设置的密码。
图12为修改密码流程图。
N
图12修改密码流程图
4.1.51602A液晶显示模块
此模块包括液晶初始化、命令的输入等。
五、系统功能
本设计中系统可实现功能如下:
(1)通过切换,对输入的1—8位密码进行显示或隐藏;
(2)通过发光二极管和蜂鸣器,对解密正确或者错误进行声光报警;
(3)1—8位密码修改;
(4)在密码遗失情况下,通过初始密码进行密码再设置;
(5)具有1-3次的解锁次数任意设定功能;
六.设计总结
从基本方案的制定,到硬件电路的选择,最后进行程序调试——在此期间我们遇到很多困难,但经过两个人的不懈努力,终于击破了各个难点,达到的所需要的效果。
在这次设计中,我们深刻认识到自身的不足——缺少实战经验。
与此同时,也因为这次设计,我们得到一定的锻炼,体会到理论与实践相结合的重要意义。
由于本次设计时间有限,一些设想没有完全实现,比如说:
数字密码锁的网络通信扩展,人机界面智能化等。
期待以后有机会对以上设想进行进一步研究实践。
源程序
#include<
aduc848.h>
#include<
intrins.h>
/***************************************************************
类型定义
****************************************************************
#defineuintunsignedint
#defineucharunsignedchar
状态定义
#defineopened0
#definenew115
#definenew216
#definesucced5
#definefanin10
#definenull11
#defineerror12
#definedifferent13
#definetover14
按键定义
#defineenter10
#defineback11
#definetrevise12
#definerevise13
#definecancel14
#definevain15
#defineoff16
#defineend17
#definefinish18
函数声明
voidp_base();
voidp_revise();
voidp_new1();
voidp_new2();
voidp_trevise();
voidp_show();
ucharp_scan();
voidp_record();
voidp_delay(uintf_n);
voidp_state(ucharf_s);
ucharp_compare(uchar*f_k1,uchar*f_k2);
voidp_copy(uchar*f_s,uchar*f_k);
I/O口定义
sbitp00=P0^0;
sbitp10=P1^0;
sbitp11=P1^1;
sbitp12=P1^2;
sbitp13=P1^3;
sbitp14=P1^4;
sbitp15=P1^5;
sbitp16=P1^6;
sbitp17=P1^7;
sbitp20=P2^0;
sbitp21=P2^1;
sbitp22=P2^2;
sbitp23=P2^3;
sbitp24=P2^4;
sbitp25=P2^5;
sbitp26=P2^6;
sbitp27=P2^7;
sbitp30=P3^0;
sbitp31=P3^1;
sbitp32=P3^2;
sbitp33=P3^3;
sbitp34=P3^4;
sbitp35=P3^5;
sbitp36=P3^6;
sbitp37=P3^7;
全局变量定义
uchar
bot,key1[9],key2[9],save[9],t[4],s,min,h,mino,mint,ho,ht,n1=1,n2=1,lock,minu,sign,tov,state,n,sound,point=1,
showlist[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x71,0xff,0x21,0x85,0xe1,0x7f,0x7d};
uint
ms;
/***********************************************************************************
主函数
************************************************************************************/
voidmain()
{
EA=1;
//开总中断
ET0=1;
//开内部中断0
ET1=0;
//关内部中断1
TMOD=0x11;
TH0=0xf9;
//计数器0高八位
TL0=0xdb;
//计数器0低八位
TR0=1;
//计数器0开始计数
I2CCON=0xe8;
sound=0;
tov=1;
//超时计数置为1
P1=0x00;
//P1全置为0作为输入
if(sign!
=1)
p_new1();
//调用首次使用判断函数
p_base();
//调用基础解锁函数
}
voidp_base()
{
n=0;
//密码数组置首位
state=fanin;
//指示管置为输入状态fanin
while
(1)//无限循环
{
if(n==0)
state=fanin;
else
state=n;
bot=p_scan();
if(n!
=0&
&
tov==0)//判断密码数组是不是在首位,超时计数是否为0
{
p_state(tover);
//调用指示管状态闪烁函数,置为用超时状态tover
main();
//调用主函数
}
switch(bot)
{
casevain:
break;
caseenter:
key1[n]=end;
//把密码后一位置为end
if(p_compare(key1,save))//判断输入的密码是否与原密码相同
{
p_state(succed);
//调用指示管状态闪烁函数,置为成功状态succed
lock=0;
//锁定键盘计数置为0
point=1;
//多次密码输入错误计数
state=opened;
//指示管置为输入状态opened
while
(1)
{bot=p_scan();
switch(bot)
{
caseoff:
main();
break;
caseback:
while
(1)
{
bot=p_scan();
switch(bot)
{
caseoff:
main();
break;
caseenter:
main();
break;
}
}
}
}
}
else
{
p_state(error);
//调用指示管状态闪烁函数,置为用错误状态error
p_record();
//调用错误计数函数
main();
//调用主函数
casecancel:
main();
caseback:
if(n!
=0)//判断当前密码是否为首位
key1[n--]=end;
//当前密码位置end,密码退位
caserevise:
p_revise();
casetrevise:
p_trevise();
default:
if(n+1==9)
key1[n++]=bot;
}
voidp_revise()
p_state(fanin);
while
(1)
{
if(tov==0)
if(p_compare(key1,save))
p_new1();
;
}
=0)
key1[n--]=end;
caseoff:
voidp_new1()
state=new1;
{
state=new1;
if((tov==0&
sign==1)||(n!
tov==0))
p_new2();
if(sign==1)
p_revise();
voidp_new2()
state=new2;
state=new2;
key2[n]=end;
if(p_compare(key1,key2))
{
sign=1;
p_copy(save,key2);
p_state(different);
key2[n--]=end;
p_revise(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 数字 密码锁