新聞中心

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

        單片機(jī)實(shí)現(xiàn)電子密碼鎖

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

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

        主要器件:

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

        2、4×4行列式鍵盤。

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

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

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


        試驗(yàn)流程圖:



        試驗(yàn)電路圖:


        試驗(yàn)程序代碼:

        //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;//定時(shí)器1由50ms累積到1s所用的計(jì)數(shù)器

        uchar count;//密碼位計(jì)數(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í)函數(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();//去抖動(dòng)

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

        keyl=P1&0x0f;

        }

        }

        key0=keyr+keyl;

        return key0;

        }

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

        void time0_int(void) interrupt 1

        {/*重置2ms定時(shí)*/

        TH0 = -2000/256;

        TL0 = -2000%256;

        if (showflag==1)

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

        else

        digbit=0x01;

        }

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

        void time1_int(void) interrupt 3

        {uchar k;

        /*重置50ms定時(shí)*/

        TH1 = -50000/256;

        TL1 = -50000%256;

        if (t1count<100)

        {t1count++;

        }

        else//計(jì)時(shí)到5s

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

        t1count = 0;

        green = 1;//綠燈不亮

        red = 1;//紅燈不亮

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

        digbit = 0x01;//從數(shù)碼管第1位開始動(dòng)態(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í)設(shè)置 */
        TH0 = -2000/256;
        TL0 = 2000%256;

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

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

        count = 0;// 初始沒有輸入密碼,計(jì)數(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ù)碼管開始動(dòng)態(tài)掃描

        /* 剛加電時(shí),顯示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個(gè)密碼后按確認(rèn)鍵才作密碼比較
        pwflag = pwcmp();
        else
        pwflag = 0;// 否則直接pmflag賦0
        break;
        case 0x84:// 3行4列,取消鍵


        count = 0;// 密碼計(jì)數(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;// 密碼位計(jì)數(shù)器清零
        for (j=0;j<6;j++)
        pwbuf[j] = 0x0f;// 用FFFFFF清除已經(jīng)輸入的密碼
        //showflag=0;// 關(guān)閉數(shù)碼管顯示

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



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

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 肥东县| 锦州市| 贡山| 九龙城区| 龙陵县| 运城市| 临邑县| 区。| 德清县| 永兴县| 吴川市| 凤冈县| 桃源县| 临澧县| 卫辉市| 邓州市| 海林市| 浑源县| 毕节市| 郴州市| 大同县| 铜陵市| 宝鸡市| 日照市| 廊坊市| 渝北区| 青州市| 永善县| 通道| 马尔康县| 长丰县| 西昌市| 阿坝| 兖州市| 大渡口区| 治县。| 宁强县| 陇南市| 台江县| 陇西县| 普格县|