新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機io擴展程序設計

        單片機io擴展程序設計

        作者: 時間:2013-02-21 來源:網絡 收藏

        下面介紹兩種的方法
        !!!!用8243擴展IO接口
        /*------------------------------------------------------------------------------------------------
        函數名稱:Config.h
        功能描述:配置
        輸入參數:無
        輸出參數:無
        特殊說明:在不同的應用系統中,需要做相應調整
        //----------------------------------------------------------------------------------------*/
        #include reg52.h>
        sbit ContrBit0=P1^0;
        sbit ContrBit1=P1^1;
        sbit ContrBit2=P1^2;
        sbit ContrBit3=P1^3;
        sbit PROG =P1^4;
        sbit CS =P1^5;
        sfr data_buf=0x90;


        /*------------------------------------------------------------------------------------------------
        函數名稱:driver8243
        功能描述:驅動8243
        輸入參數:sele_P端口選擇,sele_M工作模式選擇,out_data輸出模式下的輸出數據
        輸出參數:in_data接收模式返回接收到的數據,其它模式返回0
        特殊說明:在不同的單片機應用系統中,需要做相應得調整
        //----------------------------------------------------------------------------------------------------------------*/
        #includeconfig.h>
        char driver8243(char sele_P,char sele_M,char out_data)
        {
        char in_data=0;
        PROG=1; //置PROG為高電平
        //開始寫控制字
        if((sele_P0x01)==0) //將控制字最低位送到8243的p2.0
        {
        ContrBit0=0;
        }
        else
        {
        ContrBit0=1;
        }
        if((sele_P0x02)==0) //將控制字第二位送到8243的p2.1
        {
        ContrBit1=0;
        }
        else
        {
        ContrBit1=1; //以上兩位共同指定端口地址
        }
        //寫端口工作模式控制字

        if((sele_M0x01)==0) //將端口工作模式控制字低位送到8243的p2.2
        {
        ContrBit2=0;
        }
        else
        {
        ContrBit2=1;
        }

        if((sele_M0x01)==0) //將端口工作模式控制字高位送到8243的p2.3
        {
        ContrBit3=0;
        }
        else
        {
        ContrBit3=1;
        } //寫控制字完成

        PROG=0; //在PROG上產生下降沿
        switch(sele_M0x03) //判斷工作模式
        {
        case 0: break; //sele_M=B00為輸入,不處理,等待上升沿
        case 1: data_buf=out_data;break; //sele_M=B01為輸出,直接送數據
        case 2: data_buf=out_data;break; //sele_M=B10為邏輯或,直接送數據
        case 3: data_buf=out_data;break; //sele_M=B11為邏輯與,直接送數據
        }

        PROG=1; //在PROG上產生上升沿
        if((sele_M0x03)==0) //sele_M=B00為輸入,接收數據
        in_data=(data_buf0x0F);
        return(in_data); //sele_M=B00,返回接收到的數據
        //sele_M!=B00,返回0
        }

        void main( void)
        {
        char receive_data;
        receive_data= driver8243(1,0,5);
        }

        單片機方法2:
        =======================單片機中IO口擴展IC===================================


        單片機中IO口數量非常有限,做一些少量的外圍控制還可以,如果系統稍大一些就要加外加芯片來擴展IO數量,在應用過程

        中我發現PCF8574 這款芯片非常理想具有8路的輸入輸出的IO口同時具有鎖存功能,和MCU的通訊方式為I2C,還具有中斷

        輸出功能當其中一個腳拉低時,就從中斷腳輸出一個低電平來通知單片機響應,這樣MCU就可以按自己的方式工作當有外部觸

        發 時才讀取PCF8574做為外部擴展按鍵等非常方便。

        現在這種片子在使用中由于在使用中沒有規化好端口的輸入輸出,在具體的應用時不太符合常規,大家也有所看法,所以philips最近

        又出了一款新的IO擴展芯片打算取爾代之,地址也是和PCF8574一樣它的名字叫PCA9554

        ======================================================



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 斗六市| 德安县| 孝感市| 从江县| 资溪县| 白水县| 嘉义县| 满洲里市| 桃江县| 普格县| 临武县| 恩施市| 来安县| 朝阳县| 岚皋县| 西丰县| 曲阳县| 昭平县| 会理县| 天长市| 都江堰市| 博野县| 宾川县| 凉城县| 会理县| 张家口市| 新安县| 若羌县| 登封市| 平果县| 南和县| 繁峙县| 遂川县| 桑植县| 剑河县| 资源县| 镇平县| 内江市| 红安县| 通山县| 商都县|