標(biāo)題: 電子密碼鎖設(shè)計(jì) [打印本頁]

作者: hd1648    時(shí)間: 2017-2-25 09:16
標(biāo)題: 電子密碼鎖設(shè)計(jì)
1.實(shí)驗(yàn)任務(wù)
根據(jù)設(shè)定好的密碼,采用二個(gè)按鍵實(shí)現(xiàn)密碼的輸入功能,當(dāng)密碼輸入正確之后,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鐘,同時(shí)發(fā)現(xiàn)報(bào)警聲,直到?jīng)]有按鍵按下3種后,才打開按鍵鎖定功能;否則在3秒鐘內(nèi)仍有按鍵按下,就重新鎖定按鍵3秒時(shí)間并報(bào)警。
2.C語言源程序
#include <AT89X52.H>
  
unsigned char code ps[]={1,2,3,4,5};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
                         0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char pslen=9;
unsigned char templen;
unsigned char digit;
unsigned char funcount;
unsigned char digitcount;
unsigned char psbuf[9];
bit cmpflag;
bit hibitflag;
bit errorflag;
bit rightflag;
unsigned int second3;
unsigned int aa;
unsigned int bb;
bit alarmflag;
bit exchangeflag;
unsigned int cc;
unsigned int dd;
bit okflag;
unsigned char oka;
unsigned char okb;
  
void main(void)
{
unsigned char i,j;
  
P2=dispcode[digitcount];
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
ET0=1;
EA=1;
  
while(1)
    {
     if(cmpflag==0)
       {
         if(P3_6==0) //function key
          {
              for(i=10;i>0;i--)
              for(j=248;j>0;j--);
              if(P3_6==0)
                {
                  if(hibitflag==0)         //按鍵是否被鎖
                   {
                      funcount++;
if(funcount==pslen+2) //前面有按下功能鍵1次和按數(shù)字鍵1次,來完成密碼長(zhǎng)度的輸入
{
                          funcount=0;
                          cmpflag=1;
                         }
                       P1=dispcode[funcount]; //可以由燈判斷按鍵是否按下,
                   }
                    else
                      {
                         second3=0;
                      }
                  while(P3_6==0);
                }
          }
  
         if(P3_7==0) //digit key
          {
              for(i=10;i>0;i--)
              for(j=248;j>0;j--);
              if(P3_7==0)
                {
                  if(hibitflag==0)
                   {
                      digitcount++;                     
                      if(digitcount==10)
                        {
                          digitcount=0;
                        }
                      P2=dispcode[digitcount];
                      if(funcount==1)         //按下功能鍵后,開始輸入密碼長(zhǎng)度
                        {
                          pslen=digitcount;
                          templen=pslen;
                        }
                        else if(funcount>1)    //開始記錄各位密碼
                          {
                           psbuf[funcount-2]=digitcount;
                          }
                   }
                    else
                      {
                        second3=0;
                      }
                  while(P3_7==0);
               }               
           }
     }  //原文少了這個(gè)“}
else //進(jìn)行比較
          {
           cmpflag=0;
           for(i=0;i<pslen;i++)
             {
                if(ps!=psbuf)
                  {
hibitflag=1; //密碼輸入不正確,按鍵禁止功能被激活
                    i=pslen;
                    errorflag=1;
                    rightflag=0;
                    cmpflag=0;
                    second3=0;
                    goto a;
                  }
              }
           cc=0;
           errorflag=0;
           rightflag=1;
           hibitflag=0;
a:         cmpflag=0;
          }      
   }
}
  
void t0(void) interrupt 1 using 0
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
  
if((errorflag==1) && (rightflag==0))
    {
     bb++;
     if(bb==800)
       {
          bb=0;
         alarmflag=~alarmflag;
       }
     if(alarmflag==1)
       {
         P0_0=~P0_0;            //報(bào)警聲
       }
  
     aa++;
      if(aa==800)
       {
         aa=0;
         P0_1=~P0_1; //LED2發(fā)光二極管閃
       }
     second3++;
     if(second3==6400) //4次后(8次變換),自動(dòng)復(fù)位到按ENTER前的狀態(tài)
       {
         second3=0;
         hibitflag=0;
         errorflag=0;
         rightflag=0;
         cmpflag=0;
         P0_1=1;
         alarmflag=0;
         bb=0;
          aa=0;
       }
    }
  
if((errorflag==0) && (rightflag==1)) //發(fā)出“叮咚”聲
    {
     P0_1=0;               //LED2發(fā)光二極管亮
     cc++;
     if(cc<1000)
       {
         okflag=1;
       }
       else if(cc<2000)
         {
           okflag=0;
         }
         else             //自動(dòng)復(fù)位到按ENTER前的狀態(tài)
           {
              errorflag=0;
              rightflag=0;
              hibitflag=0;
              cmpflag=0;
              P0_1=1;            //LED2發(fā)光二極管滅
              cc=0;
              oka=0;
              okb=0;
              okflag=0;
              P0_0=1;
           }
     if(okflag==1)
       {
         oka++;
         if(oka==2)
           {
              oka=0;
              P0_0=~P0_0;
           }
       }
     else
         {
           okb++;
           if(okb==3)
              {
                okb=0;
                P0_0=~P0_0;
              }
         }
    }
}
                                                                                                                        
                              
作者: kooklee    時(shí)間: 2017-4-2 18:32

 好東西  值得擁有
作者: fnks    時(shí)間: 2017-11-21 14:42
好東西哈,謝謝分享
作者: 凌玉龍    時(shí)間: 2017-12-11 20:30
東西哈,謝謝分享
作者: 恍恍惚惚或    時(shí)間: 2017-12-20 10:44
kooklee 發(fā)表于 2017-4-2 18:32
**** 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽 ****

來學(xué)習(xí)學(xué)習(xí)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1