ADC0832


 

 

#include <reg51.h>
#include "ADC0832.c"
code uchar seven_seg[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共陽數碼管0--9(0時為有效斷)
uchar cp, j; 
uint dat_ad;
void timer0_isr(void);              //聲明中斷服務函數
void timer0_init(void);          //聲明中斷初始化函數

void main(void)                     /**************************主函數**************************/
{
    timer0_init();                 //中斷初始化函數
    adc0832_init();                 //adc0832初始化函數
    while(1);                     //表示一個死循環,循環一直運行下去
}
/***********************中斷服務函數************************/
void timer0_isr(void) interrupt 1
{
    TH0 = 0xf8;
    TL0 = 0x2f;
    cp++;
    if(cp > 250)               //0.5秒·
    {
        cp = 0;
        dat_ad = adc0832_cho();//0.5秒讓ADC0832轉換一次
        dat_ad = dat_ad * 1.96;//模擬信號轉化為數字信號
    }              
    P0 = 0xff;
    switch(j)
    {
        case 0: P0 = seven_seg[dat_ad  % 10]; P2 = ~0x01;break;               //  模擬信號
        case 1: P0 = seven_seg[dat_ad  % 100/10]; P2 = ~0x02;break;//
        case 2: P0 = seven_seg[dat_ad / 100]& 0x7f; P2 = ~0x04;break;//
        case 3: P0 = seven_seg[adc0832_cho()% 10]; P2 = ~0x08; break;   //、   數字信號
        case 4: P0 = seven_seg[adc0832_cho()% 100 / 10]; P2 = ~0x10;break;//
        case 5: P0 = seven_seg[adc0832_cho() / 100]; P2 = ~0x20; break;//
    }
    j++;
    if(j >= 6)
    j = 0;                                 //共顯示六位
}
/***********************中斷初始化函數**********************/
void timer0_init(void)
{
    TMOD = 0x01;     //中斷方式1    
    TH0 = 0xf8;

    TL0 = 0x2f;        //對機器脈沖計數,2000個計滿溢出引發中斷
    EA = 1;            //開總中斷
    ET0 = 1;        //開T0中斷
    TR0 = 1;        //啟動定時器T0
}









/****************************************************************************************/
/*************************************ADC0832的驅動程序***********************************/
/*ADC0832模數轉換將連續變化的模擬信號轉換為離散的數字信號V = 5 / 256 = 0.01953v = 19.53mv*/
/****************************************************************************************/
#include <intrins.h>
#define nop _nop_()
#define uchar unsigned char      //宏定義用uchar 代替 unsigned char
#define uint unsigned int      //宏定義用uint 代替 unsigned int
sbit CS = P3^0;
sbit CLK = P3^1;
sbit DIDO = P3^2;


void adc0832_init(void)          /*****ADC0832初始化函數*****/
{
    CS = 1;                      //adc0832未工作時,CS端為高電平,此時芯片禁用
    nop;                      //對於延時很短的,要求在us級的,采用“_nop_”函數      
    CLK = 1;                  
    CS = 0;
}                   

uchar adc0832_cho(void)         //包含11個CLK下降沿      /**對轉換CHO通道的模擬信號**/
{
    uchar i, dat;
    adc0832_init();
    DIDO = 1; CLK = 0; nop; CLK = 1; nop; //SCLK第一個下降沿來到時,DI = 1啟動ADC0832
    DIDO = 1; CLK = 0; nop; CLK = 1; nop; //SCLK第二個下降沿 
    DIDO = 0; CLK = 0; nop; CLK = 1; nop; //SCLK第三個下降沿,發送1,0選擇通道cho
    DIDO = 1;                             //釋放總線
    for(i = 0; i < 8; i++)                  //第四個下降沿到第11個下降沿
    {
        CLK = 0;                           //clk處於下降沿,每一個下降沿DO端輸入下一個
        nop;                              //對於延時很短的,要求在us級的,采用“_nop_”函數      
        if(DIDO) dat |= 0x01;              // dat = dat | 0x01,dat和0x01做“或”的運算,意思是最低位置1,其它位保持不變。
        CLK = 1; nop;                      //clk處於上升沿
        dat <<= 1;                          //數據左移
    }
    return (dat);
    CS = 1;                                  //adc0832停止工作
}
                                                           ADC0832應用
(1)adc0832的作用
    ADC0832 為8位分辨率A/D轉換芯片,其最高分辨可達256級,可以適應一般的模擬量轉換要求。其內部電源輸入與參考電壓的復用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉換時間僅為32μS,據有雙數據輸出可作為數據校驗,以減少數據誤差,轉換速度快且穩定性能強。獨立的芯片使能輸入,使多器件掛接和處理器控制變的更加方便。通過DI 數據輸入端,可以輕易的實現通道功能的選擇。
adc0832能將連續變化的模擬信號轉化為離散的數字信號,以便於數字系統進行處理儲存控制和顯示。
(2)對ADC0832的認識
    ADC0832 是美國生產的一種8 位分辨率、雙通道A/D轉換芯片。由於它體積小,兼容性,性價比高而深受單片機愛好者及企業歡迎,其目前已經有很高的普及率。學習並使用ADC0832 可使我們了解A/D轉換器的原理,有助於我們單片機技術水平的提高。ADC0832將三位的0~5V的模擬信號轉化為數字信號,通過單片機顯示在數碼管上。
(3)adc0832工作原理
    當ADC0832未工作時其CS輸入端應為高電平,此時芯片禁用,CLK 和DO/DI 的電平可任意。當要進行A/D轉換時,須先將CS使能端置於低電平並且保持低電平直到轉換完全結束。此時芯片開始轉換工作,同時由處理器向芯片時鍾輸入端CLK 輸入時鍾脈沖,DO/DI端則使用DI端輸入通道功能選擇的數據信號。在第1 個時鍾脈沖的下沉之前DI端必須是高電平,表示起始信號。在第2、3個脈沖下沉之前DI端應輸入2 位數據用於選擇通道功能。當此2 位數據為"1""0"時,只對CH0 進行單通道轉換。當2位數據為"1""1"時,只對CH1進行單通道轉換。當2 位數據為"0""0"時,將CH0作為正輸入端IN+,CH1作為負輸入端IN-進行輸入。當2 位數據為"0""1"時,將CH0作為負輸入端IN-,CH1 作為正輸入端IN+進行輸入。到第三個脈沖的下沉之后DI端的輸入電平就失去輸入作用,此后DO/DI端則開始利用數據輸出DO進行轉換數據的讀取。從第4個脈沖下沉開始由DO端輸出轉換數據最高位DATA7,隨后每一個脈沖下沉DO端輸出下一位數據。直到第11個脈沖時發出最低位數據DATA0,一個字節的數據輸出DC0832封裝以及各端子 完成。也正是從此位開始輸出下一個相反字節的數據,即從第11個字節的下沉輸出DATA0。隨后輸出8位數據,到19個脈沖時數據輸出完成,也標志着一次A/D轉換的結束。最后將CS置高電平禁用芯片,直接將轉換后的數據進行處理就可以了。
(4)器件作用
    adc0832:將連續變化的模擬信號轉化為離散的數字信號,以便於數字系統進行處理儲存控制和顯示。
    7404反相器:增大電流
    pothg這是微調電阻,中心抽頭位置改變,整個電阻的阻值是沒變的。只是,中心抽頭和上端間的電阻最小,和下端間的電阻最大,在這里產生的是0~5V的模擬信號
    Respack_8:驅動,電流不夠,加排阻增加電流,排阻一般有九個腳,一個腳接VCC,其他腳接單片機I/o口,比如說P0口,一般需要加排阻。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM