单片机课程设计多功能密码锁.docx
《单片机课程设计多功能密码锁.docx》由会员分享,可在线阅读,更多相关《单片机课程设计多功能密码锁.docx(38页珍藏版)》请在冰豆网上搜索。
![单片机课程设计多功能密码锁.docx](https://file1.bdocx.com/fileroot1/2022-11/28/f75e29f1-fa76-4149-bfa5-627b4cd1d425/f75e29f1-fa76-4149-bfa5-627b4cd1d4251.gif)
单片机课程设计多功能密码锁
任务及设计要求
1.设计一多位电子密码锁,输入密码用“F”表示,输入密码正确,绿灯亮(或显示其它标志、蜂鸣器替代),输入密码错误,红灯亮(或显示其它标志、蜂鸣器替代).
2.具有确定键和取消键,在未确定之前可以取消,重新输入.
3.连续输入三次错误密码,红灯闪烁,报警电路动作,键盘锁定.
4.具有密码重置、修改功能.
5.具有密码输入等待操作时间限制功能,超过限定时间报警.
6.显示北京时间,时间可调整.
7.可利用蜂鸣器添加提示音.
系统原理框图
硬件原理图
元件清单
元件
数量
元件
数量
ADUC848芯片
01片
三极管
若干
按键
18个
MAX232
01片
8段数码管
05位
二极管
若干
AT24C08
01片
下载线
01根
蜂鸣器
01个
电源线
01根
电阻
若干
开关
01个
电容
若干
硬件原理图
仿真用原理图
由于元件库缺少ADUC848,故使用了STC89C51代替仿真,因为端口两个芯片的P1口输入输出的设置不同,在仿真中修改了键盘扫描函数,以适用STC89C51的仿真.
电源模块原理图
有如下3种供电方式:
1/5V电源适配器供电(开关往上拨、插针1下面两脚接跳线帽).
2/7~12V电源适配器供电(开关往上拨、插针1上面两脚接跳线帽).
3/USB供电(开关往下拨).
RS232串口连接原理图
该模块中采用maxin公司的max232作电平转换,接上串口转换下载线就可以从计算机上下载程序了.
数码管显示模块原理
本开发板采用共阴极数码管,段码由PNP三极管驱动,位码由NPN型三极管驱动.本设计中使用了低5位的数码管.
蜂鸣器原理图
本设计中采用无源电磁式蜂鸣器,蜂鸣器由PWM1(P2.6)控制.PWM1为片内PWM模块的输出.蜂鸣器的驱动采用普通NPN三极管.
按键输入模块原理图
由于P1口(用于行扫描)内部无上拉电阻,为使无键按下时行信号为高电平,故将行信号接上拉电阻,电阻大小10K即可.
P2.0~P2.3为4X4矩阵式键盘列扫描信号.
程序
主要程序流程图
程序
#include
#include
/***********************************************************************************
类型定义
************************************************************************************/
#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);
voidp_rsave();
voidp_wsave();
voidp_rtime();
voidp_stime();
voidp_start();
voidp_stop();
bitp_rack();
voidp_nack();
ucharrbyte();
voidp_wbyte(ucharf_b);
ucharp_rdata(ucharf_a);
voidp_wdata(ucharf_a,ucharf_d);
/***********************************************************************************
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],stime[4],s,min,h,mino,mint,ho,ht,n1=1,n2=1,lock,minu,sign,tov,state,n,sound,point=1,ts,
flash=7,bright33=1,bright35=1,bright36=1,bright37=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;
TMOD=0x11;
TH0=0xf9;
TL0=0xdb;
TR0=1;
I2CCON=0xe8;
sound=0;
tov=1;
P1=0x00;
p_rsave();
sign=p_rdata(40);
if(sign!
=1)
p_new1();
p_base();
}
/***********************************************************************************
基础解锁函数
************************************************************************************/
voidp_base()
{
n=0;
state=fanin;
while
(1)
{
if(n==0)
state=fanin;
else
state=n;
bot=p_scan();
if(n!
=0&&tov==0)
{
p_state(tover);
main();
}
switch(bot)
{
casevain:
break;
caseenter:
key1[n]=end;
if(p_compare(key1,save))
{
p_state(succed);
lock=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:
p_wdata(40,0);
main();
break;
}
}
}
}
}
else
{
p_state(error);p_record();
main();
}
break;
casecancel:
main();
break;
caseback:
if(n!
=0)
key1[n--]=end;
break;
caserevise:
p_revise();
break;
casetrevise:
p_trevise();
break;
default:
if(n+1==9)
{
p_state(error);
main();
}
key1[n++]=bot;
}
}
}
/***********************************************************************************
密码修改函数
************************************************************************************/
voidp_revise()
{
n=0;
p_state(fanin);
state=fanin;
while
(1)
{
if(n==0)
state=fanin;
else
state=n;
bot=p_scan();
if(tov==0)
{
p_state(tover);
main();
}
switch(bot)
{
casevain:
break;
caseenter:
key1[n]=end;
if(p_compare(key1,save))
{
lock=0;
point=1;
p_state(succed);
p_new1();
}
else
{
p_state(error);;
p_record();
main();
}
break;
casecancel:
main();
break;
caseback:
if(n!
=0)
key1[n--]=end;
break;
caserevise:
p_revise();
caseoff:
break;
casetrevise:
p_trevise();
break;
default:
if(n+1==9)
{
p_state(error);
main();
}
key1[n++]=bot;
}
}
}
/***********************************************************************************
新密码输入函数
************************************************************************************/
voidp_new1()
{
n=0;
state=new1;
while
(1)
{
if(n==0)
state=new1;
else
state=n;
if((tov==0&&sign==1)||(n!
=0&&tov==0))
{
p_state(tover);
main();
}
bot=p_scan();
switch(bot)
{
casevain:
break;
caseenter:
key1[n]=end;
p_new2();
break;
casecancel:
main();
break;
caseback:
if(n!
=0)
key1[n--]=end;
break;
caserevise:
if(sign==1)
p_revise();
break;
casetrevise:
p_trevise();
break;
default:
if(n+1==9)
{
p_state(error);
main();
}
key1[n++]=bot;
}
}
}
voidp_new2()
{
n=0;
state=new2;
while
(1)
{
if(n==0)
state=new2;
else
state=n;
bot=p_scan();
if(tov==0)
{
p_state(tover);
main();
}
switch(bot)
{
casevain:
break;
caseenter:
key2[n]=end;
if(p_compare(key1,key2))
{
sign=1;
p_copy(save,key2);
lock=0;
p_state(succed);
p_wsave();
p_wdata(40,1);
main();
}
else
{
p_state(different);
main();
}
break;
casecancel:
main();
break;
caseback:
if(n!
=0)
key2[n--]=end;
break;
caserevise:
if(sign==1)
p_revise();
break;
caseoff:
break;
casetrevise:
p_trevise();
break;
default:
if(n+1==9)
{
p_state(error);
main();
}
key2[n++]=bot;
}
}
}
/***********************************************************************************
键盘扫描函数
************************************************************************************/
ucharp_scan()
{
ucharf_s=vain;
P2=P2&0xf0;
if(P1!
=0xff)
{
p_delay(10);
if(P1!
=0xff)
{
tov=1;
P2=P2&0xf0;
P2=P2|0x07;
switch(P1)
{
case0xfe:
f_s=1;break;
case0xfd:
f_s=4;break;
case0xfb:
f_s=7;break;
case0xf7:
f_s=back;break;
}
while(P1!
=0xff)
{
sound=1;
}
sound=0;
P2=P2&0xf0;
P2=P2|0x0b;
switch(P1)
{
case0xfe:
f_s=2;break;
case0xfd:
f_s=5;break;
case0xfb:
f_s=8;break;
case0xf7:
f_s=0;break;
}
while(P1!
=0xff)
{
sound=1;
}
sound=0;
P2=P2&0xf0;
P2=P2|0x0d;
switch(P1)
{
case0xfe:
f_s=3;break;
case0xfd:
f_s=6;break;
case0xfb:
f_s=9;break;
case0xf7:
f_s=enter;break;
}
while(P1!
=0xff)
{
sound=1;
}
sound=0;
P2=P2&0xf0;
P2=P2|0x0e;
switch(P1)
{
case0xfe:
f_s=cancel;break;
case0xfd:
f_s=off;break;
case0xfb:
f_s=revise;break;
case0xf7:
f_s=trevise;break;
}
while(P1!
=0xff)
{
sound=1;
}
sound=0;
p_delay(10);
}
}
returnf_s;
}
/***********************************************************************************
1毫秒中断函数.数码管显示函数
************************************************************************************/
voidtime()interrupt1
{
TH0=0xf9;
TL0=0xdb;
TR0=1;
ms++;
ms=ms%1000;
p_show();
if(sound)
p26=!
p26;
if(ms==0)
{
ts=!
ts;
tov++;
tov=tov%11;
s++;
s=s%60;
if(s==0)
{
minu