跪求电子密码锁设计 在线等

2024-12-15 23:08:22
推荐回答(2个)
回答1:

/*

六位密码,原始密码为362330,该程序有点问题,也有不完善的地方,就是修改密码后,如果输入的密码与修改的密码

相同,则锁会开,如果有一次输入有错,则密码会变回原来的密码,即362330.可能因为定义的数组

pws[6]为全局变量,但是也不肯定.希望下载的人提出宝贵的意见,大家共同交流,谢谢.

*/

#include

#define uchar unsigned char

#define uint unsigned int

uint num=10; //开始让数码管什么都显示

bit set=0;  //定义设置密码的位

char count=-1; //开始让COUNT=-1,方便后面显示数码管

sbit Beep=P1^2; //蜂鸣器

uchar temp;

uchar pws[6]={3,6,2,3,3,0}; //原始密码

uchar pwx[6];   //按下的数字存储区

bit rightflag;   //密码正确标志位

uchar workbuf[6];

uchar code tabledu[]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40

};   //段选码,共阴极

uchar code tablewe[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf

};   //位选码

uint keyscan();

void delay(uchar z)  //延时,ms级 

{

 uchar y;

 for(;z>0;z--)

  for(y=120;y>0;y--);

}

void setpw()  //设置密码函数

{

 keyscan();

}

uint keyscan()  //键盘扫描函数

{

 P3=0xfe;

 temp=P3;

 temp=temp&0xf0;

 if(temp!=0xf0)

 {

  delay(5); //键盘去抖,最好20ms以上,这里用了5ms

  temp=P3;

  temp=temp&0xf0;

  if(temp!=0xf0)

  {

   count++;//按键计数加1

   temp=P3;

   switch(temp)

   {

    case 0xee: 

    { 

     num=7;

     if(count<6) //六位密码,所以COUNT<6

     { 

      if(set==0) //设置密码键没有按下时

      pwx[count]=num; //存储按下的数字

      else

      pws[count]=num; //设置密码键按下时,设置新密码

      workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的

     }

    }

    break;

    case 0xde: 

    { 

     num=8;

     if(count<6)  //以下扫描键盘的原理差不多同上

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

    case 0xbe: 

    { 

     num=9;

     {

      if(count<6)

      {

       if(set==0)

       pwx[count]=num;

       else

       pws[count]=num;

       workbuf[count]=tabledu[11];

      }

     } 

    }

    break;

    case 0x7e: //设置密码键按下

    {

     set=1; //设置密码标志位置1

     P1_3=0; //设置密码指示灯亮

     workbuf[0]=0x00;//数码管第一位不显示

     workbuf[1]=0x00;//......

     workbuf[2]=0x00;//......

     workbuf[3]=0x00;

     workbuf[4]=0x00;

     workbuf[5]=0x00;//......

     count=-1; //按键计数复位为-1

     if(count<6) //密码没有设置完,继续设置密码

     {

      setpw(); //设置密码

     }

    }  

    break;

   }

   while(temp!=0xf0)  //按键抬起检测

   {

    temp=P3;

    temp=temp&0xf0;

   } 

  }

 }

 P3=0xfd;

 temp=P3;

 temp=temp&0xf0;

 if(temp!=0xf0)

 {

  delay(5);

  temp=P3;

  temp=temp&0xf0;

  if(temp!=0xf0)

  {

   count++;

   temp=P3;

   switch(temp)

   {

    case 0xed: 

    { 

     num=4;

     if(count<6)

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

    case 0xdd: 

    { 

     num=5;

     if(count<6)

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

    case 0xbd:

    {

     num=6;

     if(count<6)

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

   }

   while(temp!=0xf0)

   {

    temp=P3;

    temp=temp&0xf0;

   }

  }

 }

 P3=0xfb;

 temp=P3;

 temp=temp&0xf0;

 if(temp!=0xf0)

 {

  delay(5);

  temp=P3;

  temp=temp&0xf0;

  if(temp!=0xf0)

  { 

   count++;

   temp=P3;

   switch(temp)

   {

    case 0xeb:

    { 

     num=1;

     if(count<6)

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

    case 0xdb: 

    { 

     num=2;

     if(count<6)

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

    case 0xbb:

    { 

     num=3;

     if(count<6)

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

   }

   while(temp!=0xf0)

   {

    temp=P3;

    temp=temp&0xf0;

   }

  }

 }

 P3=0xf7;

 temp=P3;

 temp=temp&0xf0;

 if(temp!=0xf0)

 {

  delay(5);

  temp=P3;

  temp=temp&0xf0;

  if(temp!=0xf0)

  {

   count++;

   temp=P3;

   switch(temp)

   {

    case 0xd7:

    { 

     num=0;

     if(count<6)

     {

      if(set==0)

      pwx[count]=num;

      else

      pws[count]=num;

      workbuf[count]=tabledu[11];

     }

    }

    break;

    case 0xe7: num=20;break; //确定键按下检测

    case 0x77:   //复位键或者输入密码全部一次删除

    { 

     P1_1=0;  //锁关

     P1_3=1;  //密码设置指示灯灭

     set=0;  //不设置密码

     num=10;  //num复位

     count=-1; //COUNT复位

     workbuf[0]=tabledu[10];  //第一位数码管不显示

     workbuf[1]=tabledu[10];  //第二位数码管不显示

     workbuf[2]=tabledu[10];  

     workbuf[3]=tabledu[10];

     workbuf[4]=tabledu[10];

     workbuf[5]=tabledu[10];  //......

     P1_0=1;      //锁关

    }

    break;

    case 0xb7: //输入密码删除键(一位一位删除)

    {

     count--; 

     workbuf[count]=0x00; //因确定键按下时,COUNT也会加1,而确定键不是密码,所以这里是COUNT,而不是COUNT+1

     count--; //因确定键按下时,确定键不是密码,COUNT也会加1,这里COUNT再自减1

     if(count<=-1)

     count=-1;

    }

    break;

   }

   while(temp!=0xf0)

   {

    temp=P3;

    temp=temp&0xf0;

   }

  }

 }

 return(num);

}

void init()  //利用定时显示数码管

{

 TMOD=0x01;

 TH0=(65536-500)/200;

 TL0=(65536-500)%200;

 ET0=1;

 EA=1;

 TR0=1;

}

bit compare() //密码比较函数

{

 if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pwx[5]==pws[5])) 

 rightflag=1;

 else

 rightflag=0;

 return(rightflag);

}

void main()

{

 uint i,j;

 init();

 P0=0;

 P1_1=0; //锁关

 while(1)

 {

  keyscan();

  if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键)

  {

   if(count==6)

   {

    if(set==1) //修改密码确定

    { 

     P1_3=1;

     workbuf[0]=0; 

     workbuf[1]=0;

     workbuf[2]=0;

     workbuf[3]=0;

     workbuf[4]=0;

     workbuf[5]=0;

    }

    else //输入密码确定

    {

     set=0;

     compare();

     if(rightflag==1) //如果密码正确

     {

      P1_0=0; //锁开

      P1_1=1;

      workbuf[0]=tabledu[8]; //数码管第一位显示"8"

      workbuf[1]=tabledu[8]; //数码管第二位显示"8"

      workbuf[2]=tabledu[8]; 

      workbuf[3]=tabledu[8];

      workbuf[4]=tabledu[8];

      workbuf[5]=tabledu[8]; //......

     }

     else

     {

      P1_1=0; //锁仍然是关

      workbuf[0]=0X71; //数码管第一位显示"F"

      workbuf[1]=0X71;

      workbuf[2]=0X71;

      workbuf[3]=0X71;

      workbuf[4]=0X71;

      workbuf[5]=0X71; //......

      for(i=0;i<1000;i++) //密码错误报警

      {

       for(j=0;j<80;j++);

       Beep=~Beep;

      }

      break;

     }

    }

   }

   else   //若输入的密码位数不为6位时

   {

    P1_1=0;  //锁仍然关

    workbuf[0]=0X71; //数码管第一位显示"F"

    workbuf[1]=0X71;

    workbuf[2]=0X71;

    workbuf[3]=0X71;

    workbuf[4]=0X71;

    workbuf[5]=0X71; 

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

    {

     for(j=0;j<80;j++);

     Beep=~Beep;

    }

    break;

   } 

  } 

 }

}

void timer0() interrupt 1 //显示数码管

{

 uchar i;

 TH0=(65536-500)/200;

 TL0=(65536-500)%200;

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

 {

  P0=workbuf[i];

  P2=tablewe[i];

  delay(5);

  P0=0;

 }

}

回答2:

首先你用的是什么单片机,硬件接口电路先出来才能写软件的。