课程设计密码锁程序.docx

上传人:b****7 文档编号:8955598 上传时间:2023-02-02 格式:DOCX 页数:34 大小:20.28KB
下载 相关 举报
课程设计密码锁程序.docx_第1页
第1页 / 共34页
课程设计密码锁程序.docx_第2页
第2页 / 共34页
课程设计密码锁程序.docx_第3页
第3页 / 共34页
课程设计密码锁程序.docx_第4页
第4页 / 共34页
课程设计密码锁程序.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

课程设计密码锁程序.docx

《课程设计密码锁程序.docx》由会员分享,可在线阅读,更多相关《课程设计密码锁程序.docx(34页珍藏版)》请在冰豆网上搜索。

课程设计密码锁程序.docx

课程设计密码锁程序

#include

#include

#definesomenop{_nop_();_nop_();_nop_();_nop_();_nop_();}

#defineucharunsignedchar

#defineuintunsignedint

 

sbitlcdrs=P1^2;

sbitlcdrw=P1^1;

sbitlcden=P1^0;

sbitled=P3^0;//按键输入超时报警

sbitbuzzer=P1^4;

sbitdisable=P1^7;//锁定键盘标志灯,也作标志位用,锁定1,解除锁定0

sbitrelay=P1^3;//继电器

sbitscl=P1^5;//24C02串行时钟

sbitsda=P1^6;//24C02串行数据

bitopen=0;//门状态,开1,关0

bitbeset=0;//初始化密码标志位,已设置为1,未设置为0

bitchange=0;//open时按下reset键为1,否则置0

bitsaved=0;//密码保存完置1,否则置0

bitadminflag=1;//管理标志位,若按C键则置0

 

ucharcodewelcome[16]="WELCOME!

";

ucharcodeline[16]="================";

ucharcodeunlock[6]="UNLOCK";

ucharcodelock[4]="LOCK";

ucharcodeusercode[10]="USERCODE:

";

ucharcodewithchance[14]="WITHCHANCES";

ucharcodechances[4]="0123";

ucharcodenewcode[9]="NEWCODE:

";

ucharcodesetup[16]="SETUPSUCCESSFUL";

ucharcodeadmincode[10]="ADMINCODE:

";

ucharcodecorrect[8]="CORRECT!

";

ucharcodeopenthedoor[13]="OPENTHEDOOR";

ucharcodeclosethedoor[14]="CLOSETHEDOOR";

ucharcodeerror[6]="ERROR!

";

ucharcodekeylocked[11]="KEYLOCKED!

";

ucharcodemanagemode[11]="MANAGEMODE";

ucharcodenumber[10]="";

ucharcodestar[]="*";

ucharcodeblank[]="";

ucharcodekeytable[16]={0xee,0xde,0xbe,0x7e,

0xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,

0xe7,0xd7,0xb7,0x77};

ucharucode[6];//用户密码表

ucharacode[6]={9,9,9,9,9,9};//管理员密码表

ucharkcode[6];//输入按键密码表

ucharpt;//LCD字符指针

ucharcodeposi;//每位密码在按键密码表中的位置

ucharchance;//用户输入密码的剩余机会

ucharlength=0;//输入的密码位数

ucharcorrectcnt;//正确输入计数

ucharerrorcnt=0;//用户输入密码出错次数

ucharreinputcnt=0;//重新输入计数

ucharcountt0,countt1,sec8,sec16,sec30;//中断计数器,秒计数器

ucharnum,l,ktable;//主函数及中断函数使用

intstop;

 

voiddelay_ms(uintt)//延时t毫秒

{

uchara,b;

for(;t>0;t--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

voidrelay_on()

{

relay=0;

}

voidrelay_off()

{

relay=1;

}

/*====键盘扫描返回1-15值,无按键返回nokey====*/

ucharkey_scan()

{

uchartemp,knum,k;

P2=0xf0;

if(P2!

=0xf0)

{

delay_ms(10);

if(P2!

=0xf0)

{

temp=P2;

P2=0x0f;

temp=temp|P2;

for(k=0;k<16;k++)

{

if(temp==keytable[k])

{

knum=keytable[k];

break;

}

}

}

returnknum;

}

else

return0;

}

/*========将按键值编码为数值========*/

ucharkey_find(ucharm)

{

ucharkeynum=0;

switch(m)

{

case0xeb:

keynum=1;break;

case0xdb:

keynum=2;break;

case0xbb:

keynum=3;break;

case0x7e:

keynum='A';break;

case0xed:

keynum=4;break;

case0xdd:

keynum=5;break;

case0xbd:

keynum=6;break;

case0x7d:

keynum='B';break;

case0xee:

keynum=7;break;

case0xde:

keynum=8;break;

case0xbe:

keynum=9;break;

case0x7b:

keynum='C';break;

case0xe7:

keynum='E';break;

case0xd7:

keynum=0;break;

case0xb7:

keynum='F';break;

case0x77:

keynum='D';break;

}

return(keynum);

}

voidwrite_command(ucharcmd)//LCD写命令子程序

{

lcdrs=0;

lcdrw=0;

P0=cmd;

lcden=1;

delay_ms(5);

lcden=0;

}

voidwrite_data(uchardat)//LCD写数据子程序

{

lcdrs=1;

lcdrw=0;

P0=dat;

lcden=1;

delay_ms(5);

lcden=0;

}

voiddis_welcome()

{

write_command(0x80);//设置字符显示的首地址

for(pt=0;pt<16;pt++)//显示字符串“WELCOME!

{

write_data(welcome[pt]);

delay_ms(20);

}

write_command

(2);//显示回车换行,在第二行显示以下内容

write_command(0x80+0x40);

for(pt=0;pt<16;pt++)//显示字符串“================”

{

write_data(line[pt]);

delay_ms(100);

}

}

voiddis_mainmenu()//主菜单显示函数

{

write_command(0x80);//设置字符显示的首地址

for(pt=0;pt<6;pt++)//显示字符串“UNLOCK”

{

write_data(unlock[pt]);

delay_ms(20);

}

write_command

(2);//显示回车换行,在第二行显示以下内容

write_command(0x80+0x40);

for(pt=0;pt<4;pt++)//显示字符串“LOCK”

{

write_data(lock[pt]);

delay_ms(20);

}

}

voiddis_newcode()

{

write_command(0x80);

for(pt=0;pt<9;pt++)//显示字符串“NEWCODE:

{

write_data(newcode[pt]);

delay_ms(20);

}

}

voiddis_setup()

{

write_command(0x80);

for(pt=0;pt<16;pt++)//显示字符串“SETUPSUCCESSFUL”

{

write_data(setup[pt]);

delay_ms(20);

}

}

voiddis_admincode()

{

write_command(0x80);

for(pt=0;pt<10;pt++)//显示字符串“ADMINCODE:

{

write_data(admincode[pt]);

delay_ms(20);

}

}

voiddis_usercode()

{

write_command(0x80);//设置字符显示的首地址

for(pt=0;pt<10;pt++)//显示字符串“USERCODE:

{

write_data(usercode[pt]);

delay_ms(20);

}

}

voiddis_withchance()

{

write_command

(2);//显示回车换行,在第二行显示以下内容

write_command(0x80+0x40);

for(pt=0;pt<14;pt++)//显示字符串“WITHCHANCES”

{

write_data(withchance[pt]);

delay_ms(20);

}

}

voiddis_num(uchart)

{

write_command

(2);//显示回车换行,在第二行显示以下内容

write_command(0x80+0x45);

write_data(chances[t]);//显示字符串“3”

}

voiddis_clear()

{

write_command(0x01);//清屏显示

}

voiddis_star(ucharadd)

{

write_command(0x80+0x0a+add);//设置字符显示的地址

write_data(star[0]);

delay_ms(20);

}

voiddis_correctopen()

{

write_command(0x80);//设置字符显示的首地址

for(pt=0;pt<8;pt++)//显示字符串“CORRECT!

{

write_data(correct[pt]);

delay_ms(20);

}

write_command

(2);//显示回车换行,在第二行显示以下内容

write_command(0x80+0x40);

for(pt=0;pt<13;pt++)//显示字符串“OPENTHEDOOR”

{

write_data(openthedoor[pt]);

delay_ms(20);

}

}

voiddis_closethedoor()

{

write_command(0x80);//设置字符显示的首地址

for(pt=0;pt<14;pt++)//显示字符串“CLOSETHEDOOR”

{

write_data(closethedoor[pt]);

delay_ms(20);

}

}

voiddis_error()

{

write_command(0x80);//设置字符显示的首地址

for(pt=0;pt<6;pt++)//显示字符串"ERROR!

{

write_data(error[pt]);

delay_ms(20);

}

}

voiddis_locked()

{

write_command(0x80);//设置字符显示的首地址

for(pt=0;pt<11;pt++)//显示字符串“KEYLOCKED!

{

write_data(keylocked[pt]);

delay_ms(20);

}

write_command

(2);//显示回车换行,在第二行显示以下内容

write_command(0x80+0x40);

for(pt=0;pt<11;pt++)//显示字符串“MANAGEMODE”

{

write_data(managemode[pt]);

delay_ms(20);

}

}

voidring(uintt)

{

buzzer=0;

delay_ms(t);

buzzer=1;

}

voidflash(uintt)

{

led=1;

delay_ms(t);

led=0;

}

voidiic_start(void)

{

sda=1;

_nop_();

scl=1;

somenop;

sda=0;

somenop;

scl=0;

}

voidiic_stop(void)

{

sda=0;

_nop_();

scl=1;

somenop;

sda=1;

}

voidiic_ack(bitackbit)

{

if(ackbit)

sda=0;

else

sda=1;

somenop;

scl=1;

somenop;

scl=0;

sda=1;

somenop;

}

bitiic_waitack(void)

{

sda=1;

somenop;

scl=1;

somenop;

if(sda)

{

scl=0;

iic_stop();

return0;

}

else

{

scl=0;

return1;

}

}

voidiic_sendbyte(ucharbyt)

{

uchari;

for(i=0;i<8;i++)

{

if(byt&0x80)

sda=1;

else

sda=0;

somenop;

scl=1;

byt<<=1;

somenop;

scl=0;

}

}

uchariic_recbyte(void)

{

ucharda;

uchari;

for(i=0;i<8;i++)

{

scl=1;

somenop;

da<<=1;

if(sda)

da|=0x01;

scl=0;

somenop;

}

returnda;

}

voidwrbyte_at(ucharadd,uchardat)

{

iic_start();

iic_sendbyte(0xa0);

iic_waitack();

iic_sendbyte(add);

iic_waitack();

iic_sendbyte(dat);

iic_waitack();

iic_stop();

delay_ms

(1);

}

ucharrdbyte_at(ucharadd)

{

ucharda;

iic_start();

iic_sendbyte(0xa0);

iic_waitack();

iic_sendbyte(add);

iic_waitack();

iic_start();

iic_sendbyte(0xa1);

iic_waitack();

da=iic_recbyte();

iic_ack(0);

iic_stop();

returnda;

}

voidset_ucode()

{

wrbyte_at(0x01,kcode[0]);

ucode[0]=rdbyte_at(0x01);

wrbyte_at(0x02,kcode[1]);

ucode[1]=rdbyte_at(0x02);

wrbyte_at(0x03,kcode[2]);

ucode[2]=rdbyte_at(0x03);

wrbyte_at(0x04,kcode[3]);

ucode[3]=rdbyte_at(0x04);

wrbyte_at(0x05,kcode[4]);

ucode[4]=rdbyte_at(0x05);

wrbyte_at(0x06,kcode[5]);

ucode[5]=rdbyte_at(0x06);

}

voidread_ucode()

{

ucode[0]=rdbyte_at(0x01);

ucode[1]=rdbyte_at(0x02);

ucode[2]=rdbyte_at(0x03);

ucode[3]=rdbyte_at(0x04);

ucode[4]=rdbyte_at(0x05);

ucode[5]=rdbyte_at(0x06);

}

voidread_acode()

{

acode[0]=rdbyte_at(0x11);

acode[1]=rdbyte_at(0x12);

acode[2]=rdbyte_at(0x13);

acode[3]=rdbyte_at(0x14);

acode[4]=rdbyte_at(0x15);

acode[5]=rdbyte_at(0x16);

}

/*========确认键,并通过相应标志位执行相应功能========*/

voidensure()

{

uchari,j;

TR0=0;

TH0=0x3C;

TL0=0xB0;

countt0=0;

sec16=0;

if(beset==1&&open==0)//重置密码功能未开启

{

if(length==6&&adminflag==0)

{

for(i=0;i<6;)

{

if(ucode[i]==kcode[i])

{

i++;

}

else

{

errorcnt++;

if(errorcnt<3)//错误输入计数达三次时,报警并锁定键盘

{

dis_clear();

dis_error();

dis_withchance();

dis_num(3-errorcnt);

length=0;

break;

}

else

{

dis_clear();

disable=1;

adminflag=1;

TR1=1;

do

{

dis_locked();

}

while(disable);

errorcnt=0;

TR1=0;

sec30=0;

TH1=0x3c;

TL1=0xb0;

dis_clear();

dis_mainmenu();

length=0;

break;

}

}

}

}

if(i==6)

{

i=0;

dis_clear();

dis_correctopen();

relay_on();

open=1;//置修改密码标志位

errorcnt=0;

delay_ms(1000);

dis_clear();

dis_mainmenu();

for(j=0;j<6;j++)//将输入清除

{

kcode[j]=0;

}

}

if(length<6)

{

errorcnt++;

if(errorcnt<3)//错误输入计数达三次时,报警并锁定键盘

{

dis_clear();

dis_error();

dis_withchance();

dis_num(3-errorcnt);

}

else

{

disable=1;

adminflag=1;

dis_clear();

TR1=1;

do

{

dis_locked();

}

while(disable);

errorcnt=0;

TR1=0;

sec30=0;

TH1=0x3c;

TL1=0xb0;

dis_clear();

dis_mainmenu();

}

}

}

length=0;//将输入数据计数器清零,为下一次输入作准备

}

voidcancel()

{

dis_clear();

dis_mainmenu();

length=0;//输入位数计数器清零

TR0=0;

TH0=0x3C;

TL0=0xB0;

countt0=0;

sec8=0;

sec16=0;

}

voidreset()

{

if(beset==1&&open==1&&saved==0)//修改密码函数只能在已初始化、门开、按下修改键时才能进入

{

change=1;

dis_clear();

dis_newcode();

length=0;

}

}

void

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

当前位置:首页 > 高中教育 > 小学教育

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

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