找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機論壇 51單片機論壇 電路原理圖.rar

        電路原理圖.rar

         

        單片機實現電子密碼鎖:








        /*****************************************/
        /* Copyright (c) 2005, 通信工程學院 */
        /* All rights reserved. */
        /* 作 者:戴 佳 */
        /*****************************************/

        #include "PWLock.h"

        /* 鍵消抖延時函數 */
        void delay(void)
        {
        uchar i;
        for (i=300;i>0;i--);
        }

        /* 鍵掃描函數 */
        uchar keyscan(void)
        {
        uchar scancode,tmpcode;
        P1 = 0xf0; // 發全0行掃描碼
        if ((P1&0xf0)!=0xf0) // 若有鍵按下
        {
        delay(); // 延時去抖動
        if ((P1&0xf0)!=0xf0) // 延時后再判斷一次,去除抖動影響
        {
        scancode = 0xfe;
        while((scancode&0x10)!=0) // 逐行掃描
        {
        P1 = scancode; // 輸出行掃描碼
        if ((P1&0xf0)!=0xf0) // 本行有鍵按下
        {
        tmpcode = (P1&0xf0)|0x0f;

        /* 返回特征字節碼,為1的位即對應于行和列 */
        return((~scancode)+(~tmpcode));
        }
        else scancode = (scancode<<1)|0x01; // 行掃描碼左移一位
        }
        }
        }
        return(0); // 無鍵按下,返回值為0
        }

        /* 定時器0中斷服務子程序,2ms定時動態掃描顯示 */
        void time0_int(void) interrupt 1
        {
        /* 重置2ms定時 */
        TH0 = -2000/256;
        TL0 = -2000%256;

        if (showflag==1)
        display(); // 調用顯示函數
        }

        /* 定時器1中斷服務子程序,50ms*/
        void time1_int(void) interrupt 3
        {
        uchar k;
        /* 重置50ms定時 */
        TH1 = -50000/256;
        TL1 = -50000%256;

        if (t1count<20)
        {
        t1count++;
        }
        else // 計時到1s
        {
        TR1 = 0; // 關閉計數器1
        t1count = 0;
        green = 1; // 綠燈不亮
        red = 1; // 紅燈不亮
        showflag = 1; // 打開數碼管顯示
        digbit = 0x01; // 從數碼管第1位開始動態顯示
        for (k=0;k<6;k++) // 顯示888888
        wordbuf[k] = 8;
        }
        }

        /* 根據共陰極字型編碼表獲取0~9,A~B字型代碼 */
        uchar getcode(uchar i)
        {
        uchar p;
        switch (i)
        {
        case 0: p=0x3f; break; /* 0 */
        case 1: p=0x06; break; /* 1 */
        case 2: p=0x5B; break; /* 2 */
        case 3: p=0x4F; break; /* 3 */
        case 4: p=0x66; break; /* 4 */
        case 5: p=0x6D; break; /* 5 */
        case 6: p=0x7D; break; /* 6 */
        case 7: p=0x07; break; /* 7 */
        case 8: p=0x7F; break; /* 8 */
        case 9: p=0x67; break; /* 9 */
        case 10: p=0x77; break; /* A */
        case 11: p=0x7C; break; /* B */
        case 12: p=0x39; break; /* C */
        case 13: p=0x5E; break; /* D */
        case 14: p=0x79; break; /* E */
        case 15: p=0x71; break; /* F */
        default: break;
        }
        return(p);
        }

        /* 顯示函數 */
        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 = 0x0; // 關閉顯示
        P0 = getcode(wordbuf); // 送字型碼
        P2 = digbit; // 送字位碼

        if (digbit<0x20) // 共6位
        digbit = digbit*2; // 左移一位
        else
        digbit = 0x01;
        }

        /* 密碼比較函數 */
        bit pwcmp(void)
        {
        bit flag;
        uchar i;
        for (i=0;i<6;i++)
        {
        if (pw==pwbuf)
        flag = 1;
        else
        {
        flag = 0;
        i = 6;
        }
        }
        return(flag);
        }

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

        P2 = 0x0; // 關閉數碼管顯示

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

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

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

        /* 啟動計數器0,關閉計數器1 */
        TR0 = 1;
        ET0 = 1;
        TR1 = 0;
        ET1 = 1;
        EA = 1;

        count = 0; // 初始沒有輸入密碼,計數器設為0
        enterflag = 0; // 沒有按下確認鍵
        pwflag = 0; // 密碼標志先置為0
        green = 1; // 綠燈不亮
        red = 1; // 紅燈不亮

        /* 假設內定密碼為937602 */
        pw[0] = 9;
        pw[1] = 3;
        pw[2] = 7;
        pw[3] = 6;
        pw[4] = 0;
        pw[5] = 2;

        digbit = 0x01; // 從第一位數碼管開始動態掃描

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

        showflag = 1; // 打開數碼管顯示

        while(1)
        {
        key = keyscan(); // 調用鍵盤掃描函數
        switch(key)
        {
        case 0x11: // 1行1列,數字0
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F”
        pwbuf[count] = 0;
        count++;
        }
        break;
        case 0x21: // 1行2列,數字1
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 1;
        count++;
        }
        break;
        case 0x41: // 1行3列,數字2
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 2;
        count++;
        }
        break;
        case 0x81: // 1行4列,數字3
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 3;
        count++;
        }
        break;
        case 0x12: // 2行1列,數字4
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 4;
        count++;
        }
        break;
        case 0x22: // 2行2列,數字5
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 5;
        count++;
        }
        break;
        case 0x42: // 2行3列,數字6
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 6;
        count++;
        }
        break;
        case 0x82: // 2行4列,數字7
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 7;
        count++;
        }
        break;
        case 0x14: // 3行1列,數字8
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 8;
        count++;
        }
        break;
        case 0x24: // 3行2列,數字9
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對應密碼位上顯示“F"
        pwbuf[count] = 9;
        count++;
        }
        break;
        case 0x44: // 3行3列,確認鍵
        enterflag = 1; // 確認鍵按下
        if (count==6) // 只有輸入6個密碼后按確認鍵才作密碼比較
        pwflag = pwcmp();
        else
        pwflag = 0; // 否則直接pmflag賦0
        break;
        case 0x84: // 3行4列,取消鍵
        count = 0; // 密碼計數清零
        for (j=0;j<6;j++)
        {
        wordbuf[j] = 8; // 數碼管顯示888888
        pwbuf[j] = 0x0f; // 用FFFFFF清除已經輸入的密碼
        }
        break;
        default:break;
        }

        if (enterflag==1) // 如果按下確認鍵
        {
        enterflag = 0; // 標志位置回0
        count = 0; // 密碼位計數器清零
        for (j=0;j<6;j++)
        pwbuf[j] = 0x0f; // 用FFFFFF清除已經輸入的密碼
        showflag = 0; // 關閉數碼管顯示
        TR1 = 1; // 計數器1開始計數
        t1count = 0; // 定時器1由50ms累積到1s所用的計數器
        if (pwflag==1)
        green = 0; // 綠燈亮
        else
        red = 0; // 紅燈亮
        }
        }
        }


        書上看到的,覺得不錯就跟大家分享一下

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-5-5 07:33 , Processed in 0.041217 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        国产精品第13页| 最新国产在线精品观看| 正在播放国产精品每日更新| 先锋影音资源男人| 久久国产精品无码一区二区三区| 久久99热国产这有精品| 国产乱人伦精品一区二区在线观看 | 黄网站色视频毛片| 久久九九精品99国产精品| 精品一区二区在线观看| 久久久精品国产亚洲成人满18免费网站| 欧美亚洲国产丝袜在线| 99精品久久精品一区二区| 精品久久久久一区二区三区| 亚洲精品国产精品乱码不99| 欧美视频精品一区二区三区| 亚洲国产综合精品一区在线播放| 国产精品一区二区av| 国产精品欧美久久久久无广告| 5566影音先锋中文资源| 久久这里只精品国产99热| 亚洲国产精品一区二区九九| 成人精品视频一区二区三区| 久久99精品国产99久久6| 欧美成人精品高清在线观看| 国产啪亚洲国产精品无码 | 99久久精品免费| 欧美亚洲国产激情| 91精品成人免费国产片| 国产hs免费高清在线观看| 97久久精品人人澡人人爽| 老司机午夜精品视频| 欧美精品第欧美第12页| 国产美女在线吞精子| 成人午夜精品久久久久久久小说| 亚洲国产精品无码久久久秋霞2| 91麻豆精品一二三区在线| 人人妻人人澡人人爽人人精品| 久久国产午夜精品一区二区三区 | 久久精品国产亚洲Aⅴ蜜臀色欲 | 国产精品手机在线观看你懂的 |