您当前的位置:五五电子网电子知识单元电路电子锁单片机控制的密码锁设计(含电路图及源程序) 正文
单片机控制的密码锁设计(含电路图及源程序)

单片机控制的密码锁设计(含电路图及源程序)

点击数:7999 次   录入时间:03-04 11:42:13   整理:http://www.55dianzi.com   电子锁
     else
     { TR1=1;   //有键按下则开定时器,启动待机计时
       cnt_val_5s=0;
       switch (i)
       { case 0xfe: k=0; break;
         case 0xfd: k=1; break;
         case 0xfb: k=2; break;
         case 0xf7: k=3; break;
         case 0xef: k=4; break;
         case 0xdf: k=5; break;
         case 0xbf: k=6; break;
         case 0x7f: k=7; break;
       }
      }
   }
   return k;
}
//---------数码管显示---------------
void led_show()
{P0=led_seg_code[show_val[0]];
 P2=0xdf;
 delay(500);
 P0=led_seg_code[show_val[1]];
 P2=0xef;
 delay(500);
 P0=led_seg_code[show_val[2]];
 P2=0xf7;
 delay(500);
 P0=led_seg_code[show_val[3]];
 P2=0xfb;
 delay(500);
 P0=led_seg_code[show_val[4]];
 P2=0xfd;
 delay(500);
 P0=led_seg_code[show_val[5]];
 P2=0xfe;
 delay(500);
}
//--------定时器T1中断服务程序-----------------
void  timer1() interrupt 3     //T1中断
{ T1_cnt++;
  if(T1_cnt>3999)      //如果计数>3999, 计时1s
  {  T1_cnt=0;
     switch (cnt_state)
     { case 0: //待机,需要计时5s
           if(cnt_val_5s<5)
              { cnt_val_5s++;}
           else
              { cnt_val_5s=0;
                init_variant();//待机计时到5秒时,清除输入的内容
                TR1=0;         //停止计时
               }
           break;
      case 1://密码输入正确,需要计时4s
           if(cnt_val_4s<4)
              { cnt_val_4s++;}
           else
              { cnt_val_4s=0;
                init_variant();//密码输入正确,计时到4秒时,清除输入的内容
                open_lock=1;   //已开锁信号清零
                relay_open=1;  //开锁信号清零
                cnt_state=0;  
                TR1=0;         //停止计时
               }
           break;
      case 2: //密码输入错误3次,计时15s
           if(cnt_val_15s<15)
              { cnt_val_15s++;}
           else
              { cnt_val_15s=0;
                init_variant();//三次密码错误时,计时15秒,清除输入的内容
                open_lock=1;   // 清除所有指示和报警
                relay_open=1;
                alarm_out=1;
                pw_error=1;
                cnt_state=0;
                TR1=0;         //停止计时
               }
           break;
     }  
  }
}
//--------判断键盘输入内容与密码是否一致------
unsigned char check_input_pw()
{ unsigned char i,k;
  k=1;
  for(i=0;i<6;i++)
  { k=k && (show_val[i]==init_val[i]); }
  return k;
}
//---------主程序----------------
main()
{ //初始化各变量
audio_out=1;
 P3=0xff;
 cnt_val_15s=0;
 cnt_val_5s=0;
 cnt_val_4s=0;
 cnt_state=0; 
 //0-待机计时5s状态;1-密码正确,计时4s状态 ;2-三次密码错误,处于计时15秒状态。
 T1_cnt=0;
 error_num=0;
 key_val_old=255;
 init_variant();
 //初始化51的寄存器
 TMOD=0x20; //用T1计时 8位自动装载定时模式
 TH1=0x19;   //500微秒溢出一次;   250=(256-x)*12/11.0592 -> x=19
 TL1=0x19;
 EA=1;       //开中断
 ET1=1;
 TR1=0;      //开定时器T1
 while(1)
 { key_val=scan_key();  //按键输入,有键按下key_val为0-7,无键按下key_val为255。
   if (key_val!=key_val_old)
   { key_val_old=key_val;
     if (key_val!=255&& cnt_state!=2)
     { audio_out=0;
       delay(100);     //延时去抖动
       audio_out=1;
       switch (key_val)
       { case 0:
         case 1:
         case 2:
         case 3:
         case 4:
         case 5:
              if(key_index<6) //密码为6位,超过6位视为输入无效
              { show_val[key_index]=key_val;
                key_index++; }
              break;

上一页  [1] [2] [3]  下一页


本文关键字:单片机  电路图  源程序  密码锁  电子锁单元电路 - 电子锁