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條引腳,採用雙列直插式封裝,各引腳功能如下:

   152628(IN0~IN7):8路模擬量輸入端。
  8141517218位數字量輸出端。
  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):地。
  2325(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通道數據顯示
	}
}

3.2.3 、效果圖

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章