新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > AVR單片機密碼鎖程序

        AVR單片機密碼鎖程序

        作者: 時間:2012-08-02 來源:網(wǎng)絡(luò) 收藏

        這是一款用單片機實現(xiàn)的,它分別由硬件16個、數(shù)碼管以及蜂鳴器組成的。系統(tǒng)正確的初始密碼為0、1、2、3。當我們按下按鍵次數(shù)在4次以內(nèi),系統(tǒng)才判斷密碼對與否,當輸入密碼正確時,蜂鳴器報響起,即表示密碼是正確的,當我們按下按鍵的次數(shù)超過4次,即使按下的密碼正確,蜂鳴器也不響,還有按下密碼順序必須是0、1、2、3,如果按下0、2、1、3或者是其它的,都不能正常開蜂鳴器。如果按鍵次數(shù)超過4次了,密碼就無法正常輸入了,此時只要按下第16個按鍵時,就可以回到初始狀態(tài),即清除我們以前按鍵按下的次數(shù),(因為密碼輸入時必須在4次以內(nèi)完成的,超過了4次你怎么輸,也進入密碼判斷模式)此時就可以重新輸入正確的密碼了。另外當按下按鍵時,可以在數(shù)碼管上顯示我們按下的數(shù),以方便我們看我們按下的數(shù)是否正確。
        硬件連接:矩陣按鍵接PD口,數(shù)碼管段接PB口,位控制端接PC低4位,蜂鳴器接PA1口。
        以下是完整程序下載地址:http://www.51hei.com/f/mmsavr.rar

        #includeiom16v.h>
        #includemacros.h>
        #define uchar unsigned char
        #define uint unsigned int
        #define setb(val,bitn) (val|=(1(bitn)))//設(shè)置某IO口某位為1,即設(shè)置IO口進行位操縱
        #define clr(val,bitn) (val=~(1(bitn)))//設(shè)置某IO口某位為0 即設(shè)置IO口進行位操縱
        #define get(val,bitn) (val(1(bitn)))//讀取某位狀態(tài)如if(get(PORTC,7))即判斷PC7口是否為1 即設(shè)置IO口進行位操縱
        #pragma data:code//定義程序存在ROM里面
        uchar yin,yin1,yin2,yin3;//4位密碼初始變量
        uchar qing,qing1,qing2,qing3;//4位密碼比較變量
        uchar num;//按鍵按下次數(shù)變量
        uchar temp;//比較標志位變量,即按下后比較變量與初始密碼變量比較,如果是相等,則些標志位生效,它自動變量加1
        const table[]={
        0xc0,0xf9,0xa4,0xb0,0x99,
        0x92,0x82,0xf8,0x80,0x90,
        0x88,0x83,0xc6,0xa1,0x86,
        0x8e,0xff
        };
        /***********************************************/
        /*******************延時子程序******************/
        /***********************************************/
        void delay(uint z)
        {
        uint x,y;
        for(x=0;x50;x++)
        for(y=0;yz;y++);
        }
        /***********************************************/
        /*****************蜂鳴器響子程序****************/
        /***********************************************/
        void bbt()
        {
        setb(DDRA,1);
        clr(PORTA,1);
        delay(2550);
        setb(PORTA,1);
        delay(2550);
        }
        /***********************************************/
        /*******************顯示子程序******************/
        /***********************************************/
        void xian(uchar num)
        {
        uchar i;
        PORTB=table[num];
        PORTC=0x00;//打開位選端
        }
        /***********************************************/
        /***************按鍵按下處理程序***************/
        /***********************************************/
        uchar key_press()
        {
        uchar i;
        DDRD=0XFF;//設(shè)置PD口全為輸出
        PORTD=0XF0;//設(shè)置PD高四位為高電平,以便進行判斷
        DDRD=0X0F;//設(shè)置高4位為輸入,低4位為輸出
        i=PIND;//讀出IO口狀態(tài)
        if(i==0XF0)//如果它等于0XF0就執(zhí)返回0
        {
        DDRD=0XFF;//將IO口值讀回來
        return 0;
        }
        else//否則它就執(zhí)返回1
        {
        DDRD=0XFF;
        return 1;
        }
        }
        /***********************************************/
        /***************按鍵鍵值處理程序***************/
        /***********************************************/
        uchar key_scan()
        {
        uchar key,i=0X7F,j;//將變量I設(shè)置為01111111B
        if(key_press())//判斷按鍵是否被按下了
        {
        delay(10);//如果被按下了,消下抖
        if(key_press())//再次判斷下按鍵是否被按下了
        {

        do//先執(zhí)行一次
        {
        i=(i1|i>>7);/*將變量I內(nèi)容左移1位,11111110
        然后將I右移7位,11111110,即實現(xiàn)11111110
        11111101 11111011 11110111*/
        PORTD=i;//將移位后的值給PD口
        DDRD=0X0F;//將PD口高位設(shè)為輸入,低位設(shè)為輸出
        key=PIND;//將IO口高位值讀一下
        j=key0XF0;//只需要讀高4位
        }
        while(j==0XF0);//如果按鍵沒有按下,則再執(zhí)行上面的do語句

        while(key_press());//如果有按下則釋放一下
        num++;//計數(shù)改變變量值
        //if(num>3)
        //num=0;

        蜂鳴器相關(guān)文章:蜂鳴器原理

        上一頁 1 2 下一頁

        關(guān)鍵詞: AVR 密碼鎖 矩陣鍵盤

        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 尼勒克县| 榆树市| 尖扎县| 凤山市| 岑溪市| 应用必备| 昭平县| 教育| 昌平区| 宁武县| 抚宁县| 丽水市| 淮南市| 黄石市| 建宁县| 宁国市| 娄烦县| 台中市| 晴隆县| 温泉县| 应城市| 宁国市| 汾西县| 仲巴县| 仙游县| 玉田县| 民权县| 读书| 安顺市| 丰顺县| 收藏| 伊春市| 安陆市| 麟游县| 宁武县| 新民市| 洪泽县| 射阳县| 临邑县| 应城市| 桃江县|