推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx
《推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx》由会员分享,可在线阅读,更多相关《推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
当连续按三次错误会被锁定,并且发出警报。
此时按下unclock(解锁键,即三次密码都错了只能按下它进行解锁)
4.软件部分
4.1程序流程图:
4.2程序设计说明
#include<
reg52.h>
#definelcdP2
#defineucharunsignedchar
#defineuintunsignedint
#defineno_key20//无按键时的返回值
sbitrs=P3^0;
sbitrw=P3^1;
//lcd数据命令选择端
sbite=P3^2;
//lcd使能信号端
sbitkey1=P3^3;
sbitkey2=P3^4;
sbitkey3=P3^5;
sbitA=P3^6;
sbitkey=P3^7;
//开锁信号控制端
sbitenter=P1^3;
//该键按下后才能进行输入密码等操作
ucharconflag,keyflag=3;
ucharjz=20;
//键值变量
uchartemp1;
//用此变量来存储键盘扫描的返回值,以便判断是否有键按下
ucharcodetable0[6]={3,0,3,0,3,0};
//初始密码
ucharcodetable9[6]={3,1,3,1,3,1};
ucharcodetable1[]="
20XX-05-23w-4"
;
ucharcodetable2[]="
Time-00:
00:
00"
ucharcodetable3[]="
Enterplease:
"
ucharcodetable4[]="
OK!
ucharcodetable6[]="
ERRO!
ucharcodetable7[]="
Enteragain:
ucharcodetable8[]="
LOCKED!
ucharcodetable10[]="
UNLOCKED!
ucharcodetable11[]="
Can'
topen!
unsignedcharm;
ucharnum,t0,keynum,hour,min,sec,year,month,day,week;
uchartable5[6];
//定义输入密码值存储数组
/**************************************
**函数名称:
delay
**函数功能:
软件延时,时间为z毫秒
**入口参数:
z延时控制值,值越大,延时越长
**出口参数:
无
***************************************/
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
write_
1602写命令函数,可以用此函数写不同的指令
voidwrite_(uchar)
rs=0;
rw=0;
e=0;
P2=;
delay(5);
e=1;
write_date
1602写数据函数,可以用此函数写不同的数据,程序对应的硬件1602的数据口为P2口
date
voidwrite_date(uchardate)
rs=1;
rw=0;
P2=date;
/*显示位*/
voidwrite_week(uchardte)
ucharshi,ge;
shi=dte/10;
ge=dte%10;
write_(0x80+13);
write_date(0x30+ge);
voidwrite_clock(ucharadd,uchardat)
ucharfirst,second;
second=dat/10;
first=dat%10;
write_(0x80+0x40+add);
write_date(0x30+second);
write_(0x80+0x40+add+1);
write_date(0x30+first);
}
voidwrite_nyr(ucharadd,uchardte)
ucharshi,ge;
write_(0x80+add);
write_date(0x30+shi);
write_(0x80+add+1);
init
初始化函数
voidinit()
{ucharhour=3,min=3,year=11,month=5,day=7,week=6;
ucharnum;
write_(0x38);
//设置16*2显示,5*7点阵,8位数据接口
write_(0x0c);
//开显示,不显示光标
write_(0x06);
//当读或写一个字符后地址指针加1,且光标加1
write_(0x01);
//显示清屏:
数据指针、所有显示清0
write_(0x80);
//设置数据地址指针
for(num=0;
num<
15;
num++)
{
write_date(table1[num]);
//LCD显示"
初始设置时间"
delay(5);
}
write_(0x80+0x40);
14;
write_date(table2[num]);
/*定时器初始化*/
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while
(1)
if(key1==0)//时钟设置//key1按下
{
if(key1==0)//key1真的按下了
keynum++;
while(!
key1)//去键抖
TR0=0;
//时钟暂停
if(keynum==1)//key1按下第一次
write_(0x80+0x40+13);
write_(0x0f);
if(keynum==2)//key1按下第二次
write_(0x80+0x40+10);
if(keynum==3)//key1按下第三次
write_(0x80+0x40+7);
if(keynum==4)//key1按下第三次
}
if(keynum==5)//key1按下第三次
write_(0x80+9);
if(keynum==6)//key1按下第三次
write_(0x80+6);
if(keynum==7)//key1按下第三次
write_(0x80+3);
if(keynum==8)//key1按下第四次
{
keynum=0;
//按键次数清零
write_(0x0c);
//继续运行时钟
/*按键加*/
if(keynum!
=0)
if(key2==0)
delay(80);
key2);
if(keynum==1)
sec++;
if(sec==60)
sec=0;
write_clock(12,sec);
if(keynum==2)
min++;
if(min==60)
min=0;
write_clock(9,min);
if(keynum==3)
hour++;
if(hour==24)
hour=0;
write_clock(6,hour);
if(keynum==4)
week++;
if(week==8)
week=1;
write_week(week);
if(keynum==5)
day++;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if(day==32)
day=1;
elseif(month==2)//注意这里没有考虑闰年
if(day==29)
else
if(day==31)
write_nyr(8,day);
if(keynum==6)
month++;
if(month==13)
month=1;
write_nyr(5,month);
if(keynum==7)
year++;
if(year==99)
year=0;
write_nyr(2,year);
/*按键减*/
if(key3==0)
key3);
sec--;
if(sec==-1)
sec=59;
min--;
if(min==-1)
min=59;
hour--;
if(hour==-1)
hour=23;
week--;
if(week==0)
week=7;
day--;
if(day==0)
month=31;
day=28;
day=30;
month--;
if(month==0)
month=12;
year--;
if(year==-1)
year=99;
P1=1<
<
4|1<
0|1<
1|1<
2|1<
3|1<
5|1<
6|0<
7;
if(enter==0)break;
/*检测Enter(P1.3)键是否按下,只有该键按下才能进行输入密码等操作*/
P1=0<
6|1<
while(enter);
if(enter==0)
delay(5);
if(enter==0)
write_(0x80+0x02);
13;
write_date(table3[num]);
//LCD显示“Enterplease:
”
while(!
enter);
//判断按键是否释放
P1=0xff;
keyscan
3*4键盘扫描
jz
ucharkeyscan()
{uchartemp;
P1=0xfe;
//第一行扫描
temp=P1;
temp=temp&
0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&
while(temp!
{
temp=P1;
switch(temp)
{
case0xee:
jz=0;
break;
case0xde:
jz=1;
case0xbe:
jz=2;
case0x7e:
jz=3;
}
temp=P1;
temp=temp&
}
}
P1=0xfd;
//第二行扫描
while(temp!
case0xed:
jz=4;
case0xdd:
jz=5;
case0xbd:
jz=6;
case0x7d:
jz=7;
P1=0xfb;
//第三行扫描
case0xeb:
jz=8;
case0xdb:
jz=9;
case0xbb:
jz='
*'
case0x7b:
#'
returnjz;
codein
完成密码输入,并判断密码是否正确
voidcodein()
{
uchart=0;
write_(0x80+0x40+0x02);
//重新设置LCD数据地址指针
for(t=0;
t<
6;
t++)
temp1=keyscan();
while(temp1==no_key)//若相等则此时没有键按下
{
P1=0xdf;
//判断是否要删除输入的密码
if(enter==0)
delay(5);
if(enter==0)
write_(0x80+0x41+t);
//确定删除对象
write_date('
'
);
//显示空格即为删除
t--;
while(!
}
//P1=0xff
//继续扫描按键直至有键按下
table5[t]=temp1;
//实时保存输入密码值
write_(0x80+0x41+t);
//重新设置数据地址指针
write_date('
//LCD显示“******”
jz=20;
t=0;
if(table5[t]!
=table0[t])//对数组中的内容进行逐一比较,一旦有数据不对马上退出循环
break;
if(t==6)//要是条件退出的话说明六个数全对密码
conflag=1;
//进行标志密码正确
codeout
根据密码输入正确与否作出相应的反应
voidcodeout()