新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PCF8591 AD/DA轉換MSP430程序

        PCF8591 AD/DA轉換MSP430程序

        作者: 時間:2016-11-30 來源:網絡 收藏
        PCF8591用的也是IIC 總線,有了昨晚寫的總線協議,倒不是很難,下一步可以考慮做一個不精確的信號發生器,睡覺去咯!iic.h文件的源碼在這里:http://www.51hei.com/mcu/2319.html

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

        #ifndef __PCF8591_h
        #define __PCF8591_h

        #include "basic.h"
        #include "IIC.H"
        //-------------------------------------------
        //宏定義
        #define AD_WRITE_MODE 0X90
        #define AD_READ_MODE 0X91

        #define EN_DA0 0X40//打開DA
        #define AI_M0 0X00//AD模式0,四個單通道輸入
        #define AI_M1 0X10//AD模式1,三個差分輸入
        #define AI_M2 0X20//AD模式2,兩個單通道,一個差分混合輸入
        #define AI_M3 0X30//AD模式3,兩個差分混合輸入
        #define AUTO 0X04//自動增加打開
        #define CH0 0X00//1通道
        #define CH1 0X01//2通道
        #define CH2 0X02//3通道
        #define CH3 0X03//4通道

        //--------------------------------------
        //進行DA轉換
        uchar AD_W_BYTE(uchar DATA)
        {
        IIC_START();//啟動IIC

        IIC_WRITE_DATA(AD_WRITE_MODE);//寫入模式
        //delay();
        if(TEST_ACK())
        return 1;
        IIC_WRITE_DATA(EN_DA0);//寫控制寄存器,打開DA轉換器
        //delay();
        if(TEST_ACK())
        return 1;
        IIC_WRITE_DATA(DATA);//寫入數據
        //delay();
        if(TEST_ACK())
        return 1;

        IIC_STOP();//停止IIC
        return 0;
        }
        //-----------------------------------------
        //進行AD轉化,并返回一個8位數據(單通道,自動增加關閉)
        uchar AD_R_BYTE(uchar CH)
        {
        uchar temp=0;
        IIC_START();//啟動IIC

        IIC_WRITE_DATA(AD_WRITE_MODE);//偽寫模式
        if(TEST_ACK())
        return 1;

        IIC_WRITE_DATA(AI_M0|CH);//寫入通道,已經設定為四個單通道模式,如要改變方式,請改變值
        if(TEST_ACK())
        return 1;

        IIC_START();//重新啟動IIC

        IIC_WRITE_DATA(AD_READ_MODE);//讀取模式
        if(TEST_ACK())
        return 1;

        temp=IIC_READ_DATA();//讀取數據
        NO_ACK();

        IIC_STOP();
        delayms(10);
        return temp;
        }
        //-------------------------------------------------
        //連續的進行DA轉化,用于輸出一個特定的波形
        uchar AD_W_PAGE(uchar *p,uchar lengh)
        {
        uchar i=0;
        IIC_START();//啟動IIC

        IIC_WRITE_DATA(AD_WRITE_MODE);//寫入模式
        //delay();
        if(TEST_ACK())
        return 1;
        IIC_WRITE_DATA(EN_DA0);//寫控制寄存器,打開DA轉換器
        //delay();
        if(TEST_ACK())
        return 1;
        for(i=0;i {
        IIC_WRITE_DATA(*p);//寫入數據
        //delay();
        if(TEST_ACK())
        return 1;
        p++;
        delayms(1);
        }
        IIC_STOP();//停止IIC
        return 0;
        }
        //------------------------------------------------
        //連續的進行AD轉換,用于外界波形的采樣
        uchar AD_R_PAGE(uchar CH,uchar *p,uchar lengh)
        {
        uchar temp=0;
        uchar i;
        IIC_START();//啟動IIC

        IIC_WRITE_DATA(AD_WRITE_MODE);//偽寫模式
        if(TEST_ACK())
        return 1;

        IIC_WRITE_DATA(AI_M0|CH);//寫入通道,已經設定為四個單通道模式,如要改變方式,請改變值
        if(TEST_ACK())
        return 1;

        IIC_START();//重新啟動IIC

        IIC_WRITE_DATA(AD_READ_MODE);//讀取模式
        if(TEST_ACK())
        return 1;
        for(i=0;i {
        *p=IIC_READ_DATA();//讀取數據
        IIC_ACK();
        p++;
        delayms(1);
        }
        *p=IIC_READ_DATA();//讀取數據
        NO_ACK();

        IIC_STOP();
        delayms(10);
        return temp;
        }
        #endif



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 庆安县| 美姑县| 全南县| 阿荣旗| 郓城县| 瓮安县| 汉川市| 蓬安县| 贡山| 紫阳县| 平定县| 大邑县| 桐梓县| 台江县| 甘孜县| 绵阳市| 长沙市| 灵宝市| 隆回县| 南皮县| 塔河县| 阿图什市| 兰坪| 南木林县| 横山县| 枣阳市| 深水埗区| 崇阳县| 安康市| 铁岭县| 开江县| 延吉市| 六枝特区| 遵化市| 龙南县| 东莞市| 潼南县| 沙田区| 南开区| 乳源| 天津市|