推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx

上传人:b****3 文档编号:17004091 上传时间:2022-11-27 格式:DOCX 页数:33 大小:200.60KB
下载 相关 举报
推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx_第1页
第1页 / 共33页
推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx_第2页
第2页 / 共33页
推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx_第3页
第3页 / 共33页
推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx_第4页
第4页 / 共33页
推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx

《推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx》由会员分享,可在线阅读,更多相关《推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx(33页珍藏版)》请在冰豆网上搜索。

推荐多功能密码锁单片机课程综合实训报告1精品Word下载.docx

当连续按三次错误会被锁定,并且发出警报。

此时按下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()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1