#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口,一般需要加排阻。