89C51使用ADC0808模數轉換
1、基本要求簡介:
1.1、採用中斷方式,利用ADC0808實現8路模擬輸入信號依次進行A/D轉換。
要求:採用線選法規定其端口地址,用單片機的P2.7引腳作爲片選信號,因此端口地址爲7FFFH。片選信號和WR信號一起經或非門產生ADC0808的啓動信號START和地址鎖存信號ALE;片選信號和RD一起經或非門產生ADC0808輸出允許信號OE。EOC信號經反相後接到8051的INT1引腳,用於產生中斷請求信號。ADC0808芯片的3位模擬量輸入通道地址碼輸入端A、B、C分別接到8051的P0.0、P0.1、P0.2。8路輸入信號的轉換結果存儲在內部數據存儲器首地址爲30H開始的單元內,並將第0路轉換結果送到P1口顯示。
1.2 、採用查詢方式,利用ADC0808實現8路模擬輸入信號依次進行A/D轉換。
要求:8051單片機P2.7引腳作爲片選信號,ADC0808芯片3位模擬量輸入通道地址碼輸入端A、B、C分別接8051最低3位地址線,8個通道地址爲7F00H~7F07H。需要分別對這8個地址進行寫操作來啓動A/D轉換。ADC0808 EOC信號接8051的P3.3引腳,通過查詢P3.3引腳電平狀態來判斷A/D轉換是否完成。
2、ADC0808簡介
ADC0808 是含8 位A/D 轉換器、8 路多路開關,以及與微型計算機兼容的控制邏輯的CMOS組件,其轉換方法爲逐次逼近型。ADC0808的精度爲 1/2LSB。在AD 轉換器內部有一個高阻抗斬波穩定比較器,一個帶模擬開關樹組的256 電阻分壓器,以及一個逐次通近型寄存器。8 路的模擬開關的通斷由地址鎖存器和譯碼器控制,可以在8 個通道中任意訪問一個單邊的模擬信號。
ADC0808芯片有28條引腳,採用雙列直插式封裝,各引腳功能如下:
1~5和26~28(IN0~IN7):8路模擬量輸入端。
8、14、15和17~21:8位數字量輸出端。
22(ALE):地址鎖存允許信號,輸入,高電平有效。
6(START): A/D轉換啓動脈衝輸入端,輸入一個正脈衝(至少100ns寬)使其啓動(脈衝上升沿使0809復位,下降沿啓動A/D轉換)。
7(EOC): A/D轉換結束信號,輸出,當A/D轉換結束時,此端輸出一個高電平(轉換期間一直爲低電平)。
9(OE):數據輸出允許信號,輸入,高電平有效。當A/D轉換結束時,此端輸入一個高電平,才能打開輸出三態門,輸出數字量。
10(CLK):時鐘脈衝輸入端。要求時鐘頻率不高於640KHZ。
12(VREF(+))和16(VREF(-)):參考電壓輸入端
11(Vcc):主電源輸入端。
13(GND):地。
23~25(ADDA、ADDB、ADDC):3位地址輸入線,用於選通8路模擬輸入中的一路
來源百度百科。
3、中斷/查詢方式
3.1 、採用中斷方式
3.1.2、電路原理圖
3.1.3、代碼
#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define ADC 0x7fff //定義ADC0808端口地址
uchar data ADCDat[8] _at_ 0x30;
uchar i = 0;
//主函數
main()
{
EX1 = 1;IT1 = 1;EA = 1;
XBYTE[ADC] = i; //啓動ADC第0通道
while(1)
{
P1 = ADCDat[0];//0通道轉換結果送P1顯示
}
}
//中斷服務
int1() interrupt 2 using 1
{
ADCDat[i] = XBYTE[ADC]; //讀取ADC轉換結果
i++;
XBYTE[ADC] = i;
if(i==8)
{
i = 0;
XBYTE[ADC] = i; //重新啓動ADC第0通道
}
}
3.1.4 、效果圖
LED燈顯示轉換的數據。
3.2、 採用查詢方式
3.2.1、電路原理圖
查詢方式多了一個譯碼器。
3.2.2、代碼
#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar data ADCDat[8] _at_ 0x30;
uchar i = 0;
uint ADC = 0x7f00; //定義ADC0808端口地址
sbit EOC = P3^3;
//讀取ADC結果
void ADC_Read()
{
ADCDat[i] = XBYTE[ADC] ;//讀取ADC0808轉換結果
ADC++;
i++;
XBYTE[ADC] = i;
if(i==8)
{
i = 0;
ADC = 0x7f00;
XBYTE[ADC] = i; //重啓ADC0808 第0通道
}
}
//主函數
main()
{
XBYTE[ADC] = 0x00; //啓動ADC第0通道
while(1)
{
if(EOC==1) //根據EOC查詢狀態 讀取ADC
{
ADC_Read();
}
P1 = ADCDat[0]; //0通道數據顯示
}
}