新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ADC0832檢測模擬電壓值

        ADC0832檢測模擬電壓值

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

        ``````````````````````````````程序思想`````````````````````````````

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

        AD0832與AD08004有所不同,AD0804的數據是并行輸出,而AD0832是串行輸出,其思想略有復雜。

        根據ADC0832的時序,首先選通芯片,在第一個脈沖下沿前讓addi為高,在第二個下沿前給addi1位數據,在第三個下沿前給addi1位數據,
        兩位數據為10時選通CH0,為11時選通CH1; 在第三個下沿后開始接收數據。

        數據接收核心思想:
        1、以dat來接收從高位到低位傳回來的數據,分8次依次接收。dat每接收一位后向高位移1位,最低位與下一位接收到的數據
        相或,直到接收到8位。
        2、以ndat來接收從低位到高位傳回來的數據,分8次依次接收。 用參數j來接收1位數據,ndat來存儲接收到的8位數據。當j接收到1位數據以后
        向左移7位,到最高位,然后與ndat相或,即將數據傳給ndat,ndat每接收到1位以后,其數據向右移1位,直到7位傳完。最后將接收到的數據傳回即可。

        AD00832接收數據共分為19個時鐘脈沖,由單片機提供。前三個為初始化,第四個到第11個為高位在先數據,第11到第19個為低位在先數據。

        從AD中讀到的數據并非為真實的電壓值,只是一個虛擬量。真是的電壓值為

        V=date*VREF/256,(VREF為外部提供的基準電壓,即AD給供電的VCC)

        *********************轉載請注明出處,謝謝!*********************

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

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        uchar code table[]={0x3F, //"0"
        0x06, //"1"
        0x5B, //"2"
        0x4F, //"3"
        0x66, //"4"
        0x6D, //"5"
        0x7D, //"6"
        0x07, //"7"
        0x7F, //"8"
        0x6F, //"9"
        };

        //端口定義
        sbit adcs=P3^3; //芯片選通信號,低有效
        sbit adclk=P3^2; //芯片時鐘信號
        sbit addo=P3^7; //通道0
        sbit addi=P3^6; //通道1
        uchar date;
        int a,b,c;

        void delay(uchar z)//延時函數
        {
        uchar x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }

        void delay1() //延時兩個空指令
        {
        _nop_();
        _nop_();
        }


        int ADconvert() //AD轉換


        {
        uchar i=0;
        uchar j;
        uint dat=0;
        uchar ndat=0;

        addi=1;
        delay1();
        adcs=0; //芯片選通
        delay1();
        adclk=1; //
        delay1();
        adclk=0; //下降沿1
        delay1();
        adclk=1; //
        addi=0;
        delay1();
        adclk=0; //下降沿2
        delay1();
        adclk=1; //
        addi=1; //選擇通道
        delay1();
        adclk=0; //下降沿3
        addi=1;
        delay1();
        dat=0;
        for(i=0;i<8;i++) //串行接收數據高位在前
        {
        dat|=addo; //將addo數據給dat
        adclk=1; //拉高
        delay1();
        adclk=0;//拉低,循環時鐘
        delay1();
        dat<<=1;//將數據向左移動1位,方便低位接收下一位數據
        if(i==7)
        dat|=addo;//最后一位數據直接賦給dat
        }
        for(i=0;i<8;i++) //串行接收數據低位在前
        {
        j=0; //每次接收前復位為0
        j|=addo;//j用來接收1位數據
        adclk=1; //拉高
        delay1();
        adclk=0;//拉低,循環時鐘
        delay1();
        j<<=7;//將接收到的數據移動到最高位
        ndat=ndat|j; //將接收到的數據傳給ndat
        if(i<7)
        ndat>>=1; //每接收到1為數據,ndat向右移動1位
        }
        adcs=1;
        adclk=0;
        addo=1; //回到初始狀態
        dat<<=8; //int型數據為16位,將接收到的8位數據移到高8位,
        dat|=ndat;
        return(dat);
        }

        void display() //數碼管顯示
        {
        P1=0xf0;
        P2=table[a];
        delay(10);
        P1=0xf2;
        P2=table[b];
        delay(10);
        P1=0xf4;
        P2=table[c];
        delay(10);

        }

        void main()
        {
        int num;
        delay(500);
        adcs=1;

        while(1)
        {
        date=ADconvert(); //獲取轉換數據
        a=date/100;
        b=date0/10;
        c=date;
        for(num=255;num>0;num--)
        {
        display();
        }

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丁青县| 察哈| 邹平县| 禹州市| 乌审旗| 延川县| 靖宇县| 广河县| 温宿县| 临武县| 兴国县| 沽源县| 叙永县| 宝应县| 临西县| 晋中市| 达尔| 莱西市| 德江县| 龙江县| 康定县| 且末县| 交城县| 萍乡市| 宁陵县| 麻城市| 壶关县| 铁岭市| 肇东市| 东海县| 葫芦岛市| 韶山市| 开阳县| 双流县| 信宜市| 武陟县| 武强县| 东莞市| 勃利县| 广元市| 广水市|