基于MCU的数字密码锁设计 第3页
case 0x44:sound();return 10;
case 0x84:sound();return 11;
case 0x18:sound();return 12;
case 0x28:sound();return 13;
case 0x48:sound();return 14;
case 0x88:sound();return 15;
default:return 17;
}
}
void password()
{ uchar i;
if(keynum<12&&keynum>=0)
{ if(hibit)
{ if(keynum<10&&keynum>=0)
{ if(keycount<4)
{pw[keycount]=keynum; //将输入键值赋予密码数组
dispbuf[keycount]=11; //输入值用字母P代替
keycount++;
}
}
if(keynum==10)
{ if(keycount>0)
{ keycount--;
pw[keycount]=0; //删除输入密码值
dispbuf[keycount]=10; //同时在数码管上删除字母'P'
}
}
if(keynum==11)
{ for(i=0;i<4;i++) //密码比较,判断输入的密码是否正确
if(ps[i]!=pw[i])
{ error=1;right=0;wr1=0;hibit=0; //设置密码错误标志
wr=0;goto aa;
}
right=1;error=0;ok=0;ok10=0;jdq=0; // 设置密码正确标志
aa:_nop_();
}
}
else
{ok=0;wr=0;}
}
}
void setpassword()
{ if(keynum<12&&keynum>=0)
{ if(keynum<10&&keynum>=0)
{ if(keycount<4)
{ ps[keycount]=keynum; //设置密码,将输入值送入数组内
dispbuf[keycount]=11; //输入键值用字母'P'代替
keycount++;
}
}
if(keynum==10)
{ if(keycount>0)
{ keycount--; //删除输入密码值
ps[keycount]=0;
dispbuf[keycount]=10; //同时在数码管上删除字母'P'
}
}
if(keynum==11)
{ if(keycount==4)
{error=0;right=0;keycount=0;flag=1;jdq=1;buzz=0;key2=0;} //输完密码后重新设置标志
}
}
}
void set()
{
keynum=keyscan();
if(keynum==12)
{flag=0; //时间显示与密码锁切换标志
if(buzz)
{dispbuf[0]=12;dispbuf[1]=16;dispbuf[2]=7;dispbuf[3]=10;delayms(1000);} //设置密码时,数码管显示'SET'
else
{dispbuf[0]=1;dispbuf[1]=17;dispbuf[2]=7;dispbuf[3]=0;delayms(1000);}
dispbuf[0]=dispbuf[1]=dispbuf[2]=dispbuf[3]=10;} //输入或设置密码时,清除时间显示
if(flag)
{ switch(keynum)
{ case 13:id=~id;
flag1=1;
if(id)
{TR1=0;dispbuf[0]=12;dispbuf[1]=13;dispbuf[2]=14;dispbuf[3]=10;delayms(1000);TR1=1;} //id为1时,对时操作,id为0时对分操作
else
{TR1=0;dispbuf[0]=15;dispbuf[1]=16;dispbuf[2]=17;dispbuf[3]=10;delayms(1000);TR1=1;}
break;
case 14:if(flag1)
{if(id) //时间加
{hour++;
if(hour==24) hour=0;
}
else
{ min++;
if(min==60) min=0;
}
}
break; //时间减
case 15:if(flag1)
{if(id==0)
{ min--;
if(min==255) min=59;
}
else
{ hour--;
if(hour==255) hour=23;
}
}
break;
default:break;
}
disptime();
}
if(flag==1&&key2==1)
{flag=0;dispbuf[0]=12;dispbuf[1]=16;dispbuf[2]=7;dispbuf[3]=10;delayms(1000);
dispbuf[0]=dispbuf[1]=dispbuf[2]=dispbuf[3]=10;
}
if(flag==0)
{ if(!(error==0&&right==1)) //当error=0,right=1不同时成立,执行输入密码程序
{
password();
}
else //密码正确后重新设置密码值
{
setpassword();
}
}
if(bit2)
{bit2=0;jdq=1;right=0;error=0;buzz=0;}
}
main()
{ TMOD=0X11; //定时中断初始化
TH0=(65535-500)/256;TL0=(65535-500)%256;
TH1=(65535-45000)/256;TL1=(65535-45000)%256;
EA=1;ET0=1;ET1=1;hibit=1;
TR1=1;TR0=1;dispbit=0x01;
flag=1;
while(1)
{
set();
}
}
void timer0() interrupt 1 //定时中断0用于数码管显示与报警频率变化的处理
{ TH0=(65535-2000)/256;TL0=(65535-2000)%256;
P3=dispbit;
P0=dispcode[dispbuf[count]];
dispbit=(dispbit<<1);
if(dispbit==0x10) dispbit=0x01;
count++;
if(count==4) count=0;
if(error==1&&right==0)
{ wr1++;
if(wr1==1)
{ wr1=0;
spk=~spk;
}
}
if(error==0&&right==1&&flag==0&&buzz==0)
{ ok10++;
if(ok10==25)
{ ok10=0;
spk=~spk;
}
}
}
void timer1() interrupt 3 //定时中断1用于时,分,秒的定时,报警声音时间长短的控制
{ TH1=(65535-40000)/256;TL1=(65535-40000)%256;
sec20++;
if(sec20==10)
{led1=~led1;led2=~led2;}
if(sec20==20)
{ sec20=0;sec++;
if(key1) keysec++;
上一页 [1] [2] [3] [4] 下一页
基于MCU的数字密码锁设计 第3页下载如图片无法显示或论文不完整,请联系qq752018766