新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 32. 電子密碼鎖設計

        32. 電子密碼鎖設計

        作者: 時間:2016-11-18 來源:網絡 收藏
        1.實驗任務
        根據設定好的密碼,采用二個按鍵實現密碼的輸入功能,當密碼輸入正確之后,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鐘,同時發現報警聲,直到沒有按鍵按下3種后,才打開按鍵鎖定功能;否則在3秒鐘內仍有按鍵按下,就重新鎖定按鍵3秒時間并報警。
        2.電路原理

        圖4.32.1
        3.系統板上硬件連線
        (1).把“單片機系統”區域中的P0.0/AD0用導線連接到“音頻放大模塊”區域中的SPKIN端子上;
        (2).把“音頻放大模塊”區域中的SPKOUT端子接喇叭和;
        (3).把“單片機系統”區域中的P2.0/A8-P2.7/A15用8芯排線連接到“四路靜態數碼顯示”區域中的任一個ABCDEFGH端子上;
        (4).把“單片機系統“區域中的P1.0用導線連接到“八路發光二極管模塊”區域中的L1端子上;
        (5).把“單片機系統”區域中的P3.6/WR、P3.7/RD用導線連接到“獨立式鍵盤”區域中的SP1和SP2端子上;
        4.程序設計內容
        (1).密碼的設定,在此程序中密碼是固定在程序存儲器ROM中,假設預設的密碼為“12345”共5位密碼。
        (2).密碼的輸入問題:
        由于采用兩個按鍵來完成密碼的輸入,那么其中一個按鍵為功能鍵,另一個按鍵為數字鍵。在輸入過程中,首先輸入密碼的長度,接著根據密碼的長度輸入密碼的位數,直到所有長度的密碼都已經輸入完畢;或者輸入確認功能鍵之后,才能完成密碼的輸入過程。進入密碼的判斷比較處理狀態并給出相應的處理過程。
        (3).按鍵禁止功能:初始化時,是允許按鍵輸入密碼,當有按鍵按下并開始進入按鍵識別狀態時,按鍵禁止功能被激活,但啟動的狀態在3次密碼輸入不正確的情況下發生的。
        5.C語言源程序
        #include
        unsignedcharcodeps[]={1,2,3,4,5};
        unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
        unsignedcharpslen=9;
        unsignedchartemplen;
        unsignedchardigit;
        unsignedcharfuncount;
        unsignedchardigitcount;
        unsignedcharpsbuf[9];
        bitcmpflag;
        bithibitflag;
        biterrorflag;
        bitrightflag;
        unsignedintsecond3;
        unsignedintaa;
        unsignedintbb;
        bitalarmflag;
        bitexchangeflag;
        unsignedintcc;
        unsignedintdd;
        bitokflag;
        unsignedcharoka;
        unsignedcharokb;
        voidmain(void)
        {
        unsignedchari,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)//functionkey
        {
        for(i=10;i>0;i--)
        for(j=248;j>0;j--);
        if(P3_6==0)
        {
        if(hibitflag==0)
        {
        funcount++;
        if(funcount==pslen+2)
        {
        funcount=0;
        cmpflag=1;
        }
        P1=dispcode[funcount];
        }
        else
        {
        second3=0;
        }
        while(P3_6==0);
        }
        }
        if(P3_7==0)//digitkey
        {
        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;
        }
        elseif(funcount>1)
        {
        psbuf[funcount-2]=digitcount;
        }
        }
        else
        {
        second3=0;
        }
        while(P3_7==0);
        }
        }
        }
        else
        {
        cmpflag=0;
        for(i=0;i{
        if(ps!=psbuf)
        {
        hibitflag=1;
        i=pslen;
        errorflag=1;
        rightflag=0;
        cmpflag=0;
        second3=0;
        gotoa;
        }
        }
        cc=0;
        errorflag=0;
        rightflag=1;
        hibitflag=0;
        a:cmpflag=0;
        }
        }
        }

        voidt0(void)interrupt1using0
        {
        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;
        }
        second3++;
        if(second3==6400)
        {
        second3=0;
        hibitflag=0;
        errorflag=0;
        rightflag=0;
        cmpflag=0;
        P0_1=1;
        alarmflag=0;
        bb=0;
        aa=0;
        }
        }
        if((errorflag==0)&&(rightflag==1))
        {
        P0_1=0;
        cc++;
        if(cc<1000)
        {
        okflag=1;
        }
        elseif(cc<2000)
        {
        okflag=0;
        }
        else
        {
        errorflag=0;
        rightflag=0;
        hibitflag=0;
        cmpflag=0;
        P0_1=1;
        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;
        }
        }
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 元江| 滦南县| 安福县| 华坪县| 莱芜市| 曲沃县| 大冶市| 定日县| 阿尔山市| 怀集县| 禄丰县| 南通市| 上虞市| 烟台市| 红原县| 仁布县| 扶绥县| 肥东县| 新郑市| 固镇县| 武清区| 遵义市| 五华县| 阜阳市| 聂拉木县| 郑州市| 隆德县| 东明县| 林周县| 五莲县| 庆城县| 磐安县| 合川市| 伊吾县| 潞城市| 金华市| 铜山县| 江西省| 平邑县| 金寨县| 葫芦岛市|