新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PCF8591(AD-DA)芯片-51單片機程序

        PCF8591(AD-DA)芯片-51單片機程序

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

        void ADCinshow(uchar dd)//模擬量輸入值顯示
        {
        P0=seg[dd/100];
        P2=tab[7];
        delay(8);
        P0=0xff; //顯示消影
        P2=0xff;
        P0=seg[dd%100/10];
        P2=tab[6];
        delay(8);
        P0=0xff;
        P2=0xff;
        P0=seg[dd%10];
        P2=tab[5];
        delay(8);
        P0=0xff;
        P2=0xff;
        }
        void ADCoutshow(uchar k) //模擬量輸出值顯示
        {
        P0=seg[k/100];
        P2=tab[2];
        delay(8);
        P0=0xff;
        P2=0xff;
        P0=seg[k%100/10];
        P2=tab[1];
        delay(8);
        P0=0xff;
        P2=0xff;
        P0=seg[k%10];
        P2=tab[0];
        delay(8);
        P0=0xff;
        P2=0xff;
        }
        //------------------主函數----------------
        void main()
        {
        uchar val; //模擬量讀取值變量
        uint cnt=0; //設置喇叭報警延時變量
        while(1)
        { key1();
        key2();
        val=readADC(3);//讀取通道3的轉換值
        ADCinshow(val);
        if(writeDAC(outdata)!=0); //模擬量輸出值
        ADCoutshow(outdata);
        if(val>200) //模擬量輸入值超過200 喇叭報警
        {
        cnt++;
        if(cnt>2)
        {
        bz=~bz;
        cnt=0;
        }
        }
        else
        bz=1;
        }
        }
        //IIC庫函數---------------------------------------------------------------

        sbit scl=P3^0; //IIC 時鐘線
        sbit sda=P3^1; //IIC數據線
        uchar ack; //應答位

        void delay_nop() //延時約5us
        {
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        }
        void iic_start() //啟動IIC總線
        {
        sda=1;
        _nop_();
        scl=1;//時鐘線高電平期間,數據線下降沿產生啟動信號
        delay_nop(); //5us延時
        sda=0;
        delay_nop();
        scl=0; //釋放總線開始準備接受/發送數據
        _nop_();
        _nop_();
        }
        void iic_stop() //停止IIC總線
        {
        sda=0;
        _nop_(); //時鐘線高電平期間,數據線上升沿產生停止信號
        scl=1;
        delay_nop();
        sda=1;
        delay_nop();
        }
        voidiic_sendbyte(uchar byte) //IIC發送一個字節命令
        {
        uchar i;
        for(i=0;i<8;i++)
        {
        if((byte<else sda=0; //發送字節中數據左移一位
        _nop_();
        scl=1; //時鐘線至高位 ,數據保持穩定
        delay_nop();
        scl=0; //釋放開始下一個數據發送
        }
        sda=1; //發送完,釋放數據線開始接受應答
        _nop_();
        _nop_();
        scl=1;//時鐘線至高位
        _nop_();
        _nop_();
        _nop_();
        if(sda==1)ack=0; //應答判斷
        else ack=1;
        scl=0;
        _nop_();
        _nop_();
        }

        uchariic_receive() //IIC接受一個字節
        {
        uchar i;
        uchar byte=0;
        sda=1; //數據線釋放開始接受
        for(i=0;i<8;i++)
        {
        scl=0; //時鐘線置低開始接受數據
        delay_nop();
        scl=1; //時鐘線置高,接受數據
        _nop_(); _nop_();
        byte=byte<<1;
        if(sda==1)byte=byte+1; //數據左移1位
        _nop_();
        _nop_();
        }
        scl=0; //接受完釋放總線
        _nop_();
        _nop_();
        return byte; //返回接受值
        }
        void iic_noack()//非應答
        {
        sda=1;
        _nop_();
        _nop_();
        _nop_();
        scl=1;
        delay_nop();
        scl=0;
        _nop_();
        _nop_();
        }
        uchar readADC(uchar chl) //ADC轉換子函數 選擇通道chl
        {
        uchar value;
        iic_start();
        iic_sendbyte(0x90);//發送寫方向
        if(ack==0)return 0;
        iic_sendbyte(0x40|chl); //控制命令
        if(ack==0)return 0;
        iic_start();
        iic_sendbyte(0x91); //發送讀方向
        if(ack==0)return 0;
        value=iic_receive(); //接受轉換數據
        iic_noack();
        iic_stop();
        return value; //返回轉換值
        }

        uchar writeDAC(uchar da) //模擬量輸出值函數
        {
        iic_start();
        iic_sendbyte(0x90);
        if(ack==0)return 0;
        iic_sendbyte(0x40);
        if(ack==0)return 0;
        iic_sendbyte(da);
        if(ack==0)return 0;
        iic_stop();
        return 1; //正常輸出返回值1 異常返回值0
        }
        //--------------------------------------------------------------------


        上一頁 1 2 下一頁

        關鍵詞: PCF8591AD-DA芯片51單片

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 永宁县| 合江县| 温宿县| 富阳市| 右玉县| 精河县| 营山县| 闵行区| 西丰县| 潼南县| 芦溪县| 烟台市| 曲靖市| 南陵县| 金昌市| 池州市| 红河县| 甘肃省| 阿勒泰市| 西畴县| 临夏市| 故城县| 冷水江市| 贺州市| 甘孜县| 洛南县| 雷波县| 石狮市| 山东省| 响水县| 全南县| 鹤峰县| 沈丘县| 招远市| 喀什市| 句容市| 六枝特区| 阜南县| 娄烦县| 鄂州市| 延长县|