新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于51單片機(jī)的電子密碼鎖設(shè)計與應(yīng)用

        基于51單片機(jī)的電子密碼鎖設(shè)計與應(yīng)用

        作者: 時間:2008-10-15 來源:網(wǎng)絡(luò) 收藏

        1.實驗任務(wù)

        根據(jù)設(shè)定好的密碼,采用二個按鍵實現(xiàn)密碼的輸入功能,當(dāng)密碼輸入正確之后,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鐘,同時發(fā)現(xiàn)報警聲,直到?jīng)]有按鍵按下3種后,才打開按鍵鎖定功能;否則在3秒鐘內(nèi)仍有按鍵按下,就重新鎖定按鍵3秒時間并報警。

        2.電路原理圖

        圖4.32.1

        3.系統(tǒng)板上硬件連線

        (1). 把“系統(tǒng)”區(qū)域中的p0.0/ad0用導(dǎo)線連接到“音頻放大模塊”區(qū)域中的spk in端子上;

        (2). 把“音頻放大模塊”區(qū)域中的spk out端子接喇叭和;

        (3). 把“系統(tǒng)”區(qū)域中的p2.0/a8-p2.7/a15用8芯排線連接到“四路靜態(tài)數(shù)碼顯示”區(qū)域中的任一個abcdefgh端子上;

        (4). 把“系統(tǒng)“區(qū)域中的p1.0用導(dǎo)線連接到“八路發(fā)光二極管模塊”區(qū)域中的l1端子上;

        (5). 把“單片機(jī)系統(tǒng)”區(qū)域中的p3.6/wr、p3.7/rd用導(dǎo)線連接到“獨立式鍵盤”區(qū)域中的sp1和sp2端子上;

        4.程序設(shè)計內(nèi)容

        (1). 密碼的設(shè)定,在此程序中密碼是固定在程序存儲器rom中,假設(shè)預(yù)設(shè)的密碼為“12345”共5位密碼。

        (2). 密碼的輸入問題:

        由于采用兩個按鍵來完成密碼的輸入,那么其中一個按鍵為功能鍵,另一個按鍵為數(shù)字鍵。在輸入過程中,首先輸入密碼的長度,接著根據(jù)密碼的長度輸入密碼的位數(shù),直到所有長度的密碼都已經(jīng)輸入完畢;或者輸入確認(rèn)功能鍵之后,才能完成密碼的輸入過程。進(jìn)入密碼的判斷比較處理狀態(tài)并給出相應(yīng)的處理過程。

        (3). 按鍵禁止功能:初始化時,是允許按鍵輸入密碼,當(dāng)有按鍵按下并開始進(jìn)入按鍵識別狀態(tài)時,按鍵禁止功能被激活,但啟動的狀態(tài)在3次密碼輸入不正確的情況下發(fā)生的。

        5.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)
        {
        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;ipslen;i++)
        {
        if(ps[i]!=psbuf[i])
        {
        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;
        }
        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(cc1000)
        {
        okflag=1;
        }
        else if(cc2000)
        {
        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;
        }
        }
        }



        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 历史| 沛县| 理塘县| 保德县| 平原县| 环江| 溧水县| 尼玛县| 九江市| 巧家县| 乌拉特中旗| 遂川县| 旬邑县| 满城县| 怀来县| 靖宇县| 乌拉特中旗| 永修县| 抚顺县| 壶关县| 石柱| 丰都县| 那坡县| 都江堰市| 龙山县| 虹口区| 花莲市| 忻城县| 建宁县| 中阳县| 长武县| 兴化市| 鸡泽县| 炎陵县| 南和县| 长汀县| 洞口县| 合阳县| 屏边| 建昌县| 卓资县|