新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機PCF8591AD-DA實驗

        AVR單片機PCF8591AD-DA實驗

        作者: 時間:2016-11-30 來源:網絡 收藏

        未加入濾波函數所以數值有點晃動



        //PCF8591 AVR單片機程序 默認為輸入模式下通道0開始通道0光敏電阻,通道1,熱敏電阻,通道2電位器,通道3外接電位器,如有標點符號丟失格式錯亂的情況可從這里下載源碼:http://www.51hei.com/f/avr8591.rar
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #define k1 PIND_Bit4 //模擬量輸出值按鍵
        #define k2 PIND_Bit5 //模擬量輸入通道設定
        #define k3 PIND_Bit6 //輸入狀態鍵
        #define k4 PIND_Bit7 //輸出狀態鍵
        uchar output_val=0; //輸出值
        uchar input_val; //輸入值
        uchar channel=0; //通道值
        uchar mode=1; //輸入輸出狀態模式 1表示輸入2表示輸出 默認為輸入狀態
        uchar st1[]=" Input mode ";
        uchar st2[]=" output mode ";

        void delay(uint k)
        {
        uint i,j;
        for(i=0;ifor(j=0;j<1140;j++);
        }
        #include "1602.h"
        void port_init() //I/O口初始化
        {
        PORTA=0xff;
        DDRA=0xff;
        PORTB=0xff;
        DDRB=0xff;
        PORTC=0xff;
        DDRC=0xff;
        PORTD=0xff;
        DDRD=0x0f;
        }
        //---------------TWI宏定義-------------
        #define TWINT 7 //TWI完成當前操作允許應用程序介入時,置位
        #define TWSTA 5 //聲明自己希望成為主機TWI硬件檢測是否可用,若空閑則接口上產生START 信號,若繁忙則一直等待直到一個STOP狀態
        #define TWSTO 4 //置位該位產生STOP狀態
        #define TWEN 2 //TWI接口激活 置位后I/O引腳切換到TWI模式

        //--------------TWI狀態字定義------MT主方式傳輸,MR主方式接受----------
        #define START 0x08 //start已經發送
        #define RE_START 0x10 //重復Start已經發送
        #define MT_SLA_ACK 0x18 //SLA+W已經發送接受到應答 進入MT模式
        #define MT_SLA_NOACK 0x20 //SLA+W已經發送接受到非應答
        #define MT_DATA_ACK 0x28 //數據已經發送接受到應答
        #define MT_DATA_NOACK 0x30 //數據發送接受到非應答
        #define MR_SLA_ACK 0x40 //SLA+R已經發送接受到應答
        #define MR_SLA_NOACK 0x48 //SLA+R已經發送接受到非應答
        #define MR_DATA_ACK 0x50 //接受到數據ACK已經返回
        #define MR_DATA_NOACK 0x58 //接受到數據NOACK已經返回
        //-------TWI常用操作(主模式寫,主模式讀)--------------
        #define start() (TWCR=(1<#define stop() (TWCR=(1<#define wait() {while(!(TWCR&(1<#define test_ack() (TWSR&0xf8) //測試應答狀態
        #define set_ack() (TWCR|=(1<#define set_noack() (TWCR=~(1<#define twi() (TWCR=(1<#define write_byte(x) {TWDR=(x);TWCR=(1<
        //-----------------------------
        uchar ADC_read(uchar chl) //讀取函數設置通道變量
        {
        uchar temp; //讀取值
        start();
        wait();
        if(test_ack()!=START) return 0; //啟動失敗返回0
        write_byte(0x90); //發送寫方向
        wait();
        if(test_ack()!=MT_SLA_ACK) return 0;
        write_byte(0x40|chl); //發送寫命令和通道值
        wait();
        if(test_ack()!=MT_DATA_ACK) return 0;
        start(); //再次啟動
        wait();
        if(test_ack()!=RE_START) return 0;
        write_byte(0x91); //發送讀方向
        wait();
        if(test_ack()!=MR_SLA_ACK) return 0;
        twi();
        wait();
        if(test_ack()!=MR_DATA_NOACK) return 0;
        temp=TWDR;
        stop();
        return temp;
        }
        //------------------------------------------------
        uchar ADC_write(uchar data)
        {
        start();
        wait();
        if(test_ack()!=START) return 1;
        write_byte(0x90); //啟動寫方向
        wait();
        if(test_ack()!=MT_SLA_ACK) return 1;
        write_byte(0x40); //模擬量輸出設定
        wait();
        if(test_ack()!=MT_DATA_ACK) return 1;
        write_byte(data); //模擬量輸出值
        wait();
        if(test_ack()!=MT_DATA_ACK) return 1;
        stop();
        delay(10); //延時10ms 等待發送好
        return 0;
        }

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 榆林市| 桑日县| 漠河县| 曲水县| 齐河县| 固阳县| 东乡县| 蒲江县| 万源市| 屏东市| 邢台市| 阜新市| 五莲县| 呼图壁县| 临潭县| 敦煌市| 白朗县| 呈贡县| 乌兰县| 炎陵县| 灵璧县| 兴隆县| 锦屏县| 巴彦县| 西乡县| 松溪县| 陇南市| 武汉市| 文安县| 大渡口区| 漳浦县| 乐亭县| 原阳县| 合作市| 苏州市| 鹤峰县| 澄迈县| 宁明县| 绿春县| 道孚县| 弥渡县|