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