在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機實現(xiàn)電子密碼鎖

            單片機實現(xiàn)電子密碼鎖

            作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
            單片機系統(tǒng)包括輸出與輸入系統(tǒng),在學(xué)習(xí)過的LED、LCD顯示等都為輸出系統(tǒng),常見的輸入系統(tǒng)有鍵盤等?;谝郧皩W(xué)習(xí)的內(nèi)容,加上鍵盤輸入系統(tǒng)構(gòu)成簡單的電子密碼鎖。在鍵盤輸入設(shè)計中要注意去抖動和判斷是否一次按鍵而有多個鍵值輸入的情況。

            本文引用地址:http://www.biyoush.com/article/201611/315960.htm

            主要器件:

            1、AT89C52單片機芯片,接受鍵盤的輸入并作出判斷,并控制6位7段數(shù)碼管和LED指示燈的顯示。

            2、4×4行列式鍵盤。

            3、7段數(shù)碼管,共6位數(shù)碼管,對應(yīng)于6位密碼。

            4、LED指示燈,紅燈表示輸入密碼錯誤告警,綠燈表示輸入密碼正確。

            5、CMOS六反相驅(qū)動器CD4069UB,以提供足夠的驅(qū)動電流。


            試驗流程圖:



            試驗電路圖:


            試驗程序代碼:

            //PWLock.h程序

            #ifndef_PWLOCK_H//防止PWLock.h被重復(fù)引用

            #define_PWLOCK_H

            #include

            #include

            #include

            #include

            #define uchar unsigned char

            #define uint unsigned int

            uchar digbit;//字位

            uchar wordbuf[6];//字型碼緩沖區(qū)

            uchar t1count;//定時器1由50ms累積到1s所用的計數(shù)器

            uchar count;//密碼位計數(shù)

            uchar pw[6];//初始密碼存儲區(qū)

            uchar pwbuf[6];//輸入密碼存儲區(qū)

            bit enterflag;//確認(rèn)鍵按下與否標(biāo)志

            bit pwflag;//密碼正確與否標(biāo)志

            bit showflag;//數(shù)碼管顯示與否標(biāo)志

            sbit green=P3^0;

            sbit red=P3^1;

            void display(void);//顯示函數(shù)

            #endif

            //PWLock.c程序

            #include "PWLock.h"

            /*鍵消抖延時函數(shù)*/

            void delay(void)

            {uchar i;

            for (i=300;i>0;i--);

            }

            /*鍵掃描函數(shù)*/

            uchar keyscan(void)

            {uchar keyl,key0;

            uchar keyr;

            P1=0x0f;

            if ((P1|0x0f)!=0x0f)//若有鍵按下................

            {

            {

            delay();//去抖

            if((P1|0x0f)!=0x0f)

            keyr=P1&0xf0;

            }

            P1=0xf0;

            if((P1|0xf0)!=0xf0)

            {

            delay();//去抖動

            if((P1|0xf0)!=0xf0)

            keyl=P1&0x0f;

            }

            }

            key0=keyr+keyl;

            return key0;

            }

            /*定時器0中斷服務(wù)子程序,2ms定時動態(tài)掃描顯示*/

            void time0_int(void) interrupt 1

            {/*重置2ms定時*/

            TH0 = -2000/256;

            TL0 = -2000%256;

            if (showflag==1)

            display();//調(diào)用顯示函數(shù)

            else

            digbit=0x01;

            }

            /*定時器1中斷服務(wù)子程序,50ms*/

            void time1_int(void) interrupt 3

            {uchar k;

            /*重置50ms定時*/

            TH1 = -50000/256;

            TL1 = -50000%256;

            if (t1count<100)

            {t1count++;

            }

            else//計時到5s

            {TR1 = 0;//關(guān)閉計數(shù)器1

            t1count = 0;

            green = 1;//綠燈不亮

            red = 1;//紅燈不亮

            showflag = 1;//打開數(shù)碼管顯示

            digbit = 0x01;//從數(shù)碼管第1位開始動態(tài)顯示

            for (k=0;k<6;k++)//顯示888888

            wordbuf[k]=8;

            }

            }

            /*根據(jù)共陰極字型編碼表獲取0~9,A~B字型代碼*/

            uchar getcode(uchar i)

            {uchar p;

            switch (i)

            {case 0:p=0xc0;break;/* 0 */

            case 1:p=0xf9;break;/* 1 */

            case 2:p=0xa6;break;/* 2 */

            case 3:p=0xb0;break;/* 3 */

            case 4:p=0x99;break;/* 4 */

            case 5:p=0x92;break;/* 5 */

            case 6:p=0x82;break;/* 6 */

            case 7:p=0xf8;break;/* 7 */

            case 8:p=0x80;break;/* 8 */

            case 9:p=0x90;break;/* 9 */

            case 10: p=0x88;break;/* A */

            case 11: p=0x83;break;/* B */

            case 12: p=0xc6;break;/* C */

            case 13: p=0xa1;break;/* D */

            case 14: p=0x86;break;/* E */

            case 15: p=0x8e;break;/* F */

            default:break;

            }

            return(p);

            }

            /*顯示函數(shù)*/

            void display(void)

            {uchar i;

            switch (digbit)

            {case 1:i=0;break;

            case 2:i=1;break;

            case 4:i=2;break;

            case 8:i=3;break;

            case 16:i=4;break;

            case 32:i=5;break;

            default:break;

            }

            P2 = 0x00;//關(guān)閉顯示

            P0 = getcode(wordbuf[i]);//送字型碼

            P2 = digbit;//送字位碼

            if (digbit<0x20)//共6位

            digbit = digbit*2;//左移一位

            else

            digbit = 0x01;

            }

            /*密碼比較函數(shù)*/

            bit pwcmp(void)

            {bit flag;

            uchar i;

            for (i=0;i<6;i++)

            {

            if (pw[i]==pwbuf[i])

            flag = 1;

            else

            {

            flag = 0;

            i = 6;

            }

            }

            return(flag);

            }

            接上篇程序代碼:

            /* 主程序 */
            void main()
            {
            uchar j,key;

            P2 = 0x00;// 關(guān)閉數(shù)碼管顯示

            TMOD = 0x11;// T0,T1工作方式1

            /* 2ms 定時設(shè)置 */
            TH0 = -2000/256;
            TL0 = 2000%256;

            /* 50ms 定時設(shè)置 */
            TH1 = -50000/256;
            TL1 = -50000%256;

            /* 啟動計數(shù)器0,關(guān)閉計數(shù)器1 */
            TR0 = 1;
            ET0 = 1;
            TR1 = 0;
            ET1 = 1;
            EA = 1;

            count = 0;// 初始沒有輸入密碼,計數(shù)器設(shè)為0
            enterflag = 0;// 沒有按下確認(rèn)鍵
            pwflag = 0;// 密碼標(biāo)志先置為0
            green = 1;// 綠燈不亮
            red = 1;// 紅燈不亮

            /* 假設(shè)內(nèi)定密碼為164211 */
            pw[0] = 1;
            pw[1] = 6;
            pw[2] = 4;
            pw[3] = 2;
            pw[4] = 1;
            pw[5] = 1;

            digbit = 0x01;// 從第一位數(shù)碼管開始動態(tài)掃描

            /* 剛加電時,顯示888888 */
            for (j=0;j<6;j++)
            wordbuf[j] = 8;

            showflag = 1;// 打開數(shù)碼管顯示

            for(;;)
            {

            key=keyscan();// 調(diào)用鍵盤掃描函數(shù)
            if(P1==0xf0)//確定按鍵已經(jīng)放開
            switch(key)
            {
            case 0x11:// 1行1列,數(shù)字0
            if (count<6)
            {



            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示?
            pwbuf[count] = 0;
            count++;

            break;
            }

            case 0x21:// 1行2列,數(shù)字1
            if (count<6)
            {

            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F
            pwbuf[count] = 1;
            count++;
            }
            break;
            case 0x41:// 1行3列,數(shù)字2
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 2;
            count++;
            }
            break;
            case 0x81:// 1行4列,數(shù)字3
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 3;
            count++;
            }
            break;
            case 0x12:// 2行1列,數(shù)字4
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 4;
            count++;
            }
            break;
            case 0x22:// 2行2列,數(shù)字5
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 5;
            count++;
            }
            break;
            case 0x42:// 2行3列,數(shù)字6
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 6;
            count++;
            }
            break;
            case 0x82:// 2行4列,數(shù)字7
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 7;
            count++;
            }
            break;
            case 0x14:// 3行1列,數(shù)字8
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 8;
            count++;
            }
            break;
            case 0x24:// 3行2列,數(shù)字9
            if (count<6)
            {
            wordbuf[count] = 0x0f;// 對應(yīng)密碼位上顯示“F"
            pwbuf[count] = 9;
            count++;
            }
            break;
            case 0x44:// 3行3列,確認(rèn)鍵


            enterflag = 1;// 確認(rèn)鍵按下
            if (count==6) // 只有輸入6個密碼后按確認(rèn)鍵才作密碼比較
            pwflag = pwcmp();
            else
            pwflag = 0;// 否則直接pmflag賦0
            break;
            case 0x84:// 3行4列,取消鍵


            count = 0;// 密碼計數(shù)清零
            for (j=0;j<6;j++)
            {
            wordbuf[j] = 8;// 數(shù)碼管顯示888888
            pwbuf[j] = 0x0f;// 用FFFFFF清除已經(jīng)輸入的密碼
            }
            break;
            default:break;
            }

            if (enterflag==1)// 如果按下確認(rèn)鍵
            {
            enterflag = 0; // 標(biāo)志位置回0
            count = 0;// 密碼位計數(shù)器清零
            for (j=0;j<6;j++)
            pwbuf[j] = 0x0f;// 用FFFFFF清除已經(jīng)輸入的密碼
            //showflag=0;// 關(guān)閉數(shù)碼管顯示

            TR1=1;// 計數(shù)器1開始計數(shù)
            t1count=0;// 定時器1由50ms累積到5s所用的計數(shù)器
            if (pwflag==1)
            green=0;// 綠燈亮
            else
            red = 0; // 紅燈亮
            }
            }
            }



            關(guān)鍵詞: 單片機電子密碼

            評論


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

            關(guān)閉