找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3335|回復: 4
打印 上一主題 下一主題
收起左側(cè)

電子密碼鎖設計

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:166437 發(fā)表于 2017-2-25 09:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.實驗任務
根據(jù)設定好的密碼,采用二個按鍵實現(xiàn)密碼的輸入功能,當密碼輸入正確之后,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鐘,同時發(fā)現(xiàn)報警聲,直到?jīng)]有按鍵按下3種后,才打開按鍵鎖定功能;否則在3秒鐘內(nèi)仍有按鍵按下,就重新鎖定按鍵3秒時間并報警。
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次,來完成密碼長度的輸入
{
                          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)         //按下功能鍵后,開始輸入密碼長度
                        {
                          pslen=digitcount;
                          templen=pslen;
                        }
                        else if(funcount>1)    //開始記錄各位密碼
                          {
                           psbuf[funcount-2]=digitcount;
                          }
                   }
                    else
                      {
                        second3=0;
                      }
                  while(P3_7==0);
               }               
           }
     }  //原文少了這個“}
else //進行比較
          {
           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;            //報警聲
       }
  
     aa++;
      if(aa==800)
       {
         aa=0;
         P0_1=~P0_1; //LED2發(fā)光二極管閃
       }
     second3++;
     if(second3==6400) //4次后(8次變換),自動復位到按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             //自動復位到按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;
              }
         }
    }
}
                                                                                                                        
                              
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:185637 發(fā)表于 2017-4-2 18:32 | 只看該作者

 好東西  值得擁有
回復

使用道具 舉報

板凳
ID:251766 發(fā)表于 2017-11-21 14:42 | 只看該作者
好東西哈,謝謝分享
回復

使用道具 舉報

地板
ID:259267 發(fā)表于 2017-12-11 20:30 | 只看該作者
東西哈,謝謝分享
回復

使用道具 舉報

5#
ID:264121 發(fā)表于 2017-12-20 10:44 | 只看該作者
kooklee 發(fā)表于 2017-4-2 18:32
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

來學習學習
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表