1. 程式人生 > >基於51微控制器ADC0809的基礎使用

基於51微控制器ADC0809的基礎使用

  對於ADC0809這種基礎的模擬轉數字的晶片,在現實生活中是很常用的,所以本人再此講一講自己做的心得體會。

    首先我們的框架圖如下:


                                                                    


接下來我們需要了解ADC0809,其引腳圖如下:

                                       

其中

1.IN(0~7):代表的是模擬輸號輸入通道,可以選擇(0~7腳)進行採集;

2.ADD(A~C):這3個腳是用來選擇模擬通道輸入口的,其真值表如下:

3.START:這個引腳是啟動ADC0809的當有一個脈衝輸入時,ADC0809會開始轉換;

4.ALE:這個引腳是用來裝載地址的,當有一個正脈衝輸入時,所選的ADD(A~C)會裝載在晶片裡;

5.EOC:這個引腳是輸出腳,當ADC0809處如轉換期,或者沒有工作時處於低電平狀態,當晶片轉換成功時會變成高電平;

6.2^(-1~-8):這8個腳是輸出腳,從MSB到LSB分別對應的是(128,64......1),在程式中只需將其加起來再除以256*(V_REF+)即得所轉換的電壓;

7.OUTPUT ENABLE:這個引腳是控制輸出的引腳,當為低電平時,輸出呈高阻態,資料不輸出,當為高電平時,資料輸出;

8.CLOCK:時鐘訊號輸入腳其範圍為(10KHz到640KHz,根據廠家的不同,其最大輸入時鐘訊號也會有所不同);

9.V_REF+:正基準電壓,這裡我選擇5V;

10.V_REF-:負基準電壓,這裡我們將其接地;

11.VCC:這裡我們接+5V;

12.GND:接地。


寫程式時,我們需要了解其時序圖,時序圖如下:



  從時序圖中可以看出,我們在程式中先寫地址,然後裝載地址,再啟動START,當EOC為高時,啟動OUTPUT ENABLE,資料輸出,微控制器讀資料。


  從表中可以看出,每個電平的持續時間都是ns級的,51微控制器(以12MHz晶振為例),這裡我們的機器週期為1us,us<ns,所以在寫程式時就不需要進行延時。


  其微控制器與ADC0809的連線圖如下:



其程式如下:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char


sbit ADDA=P1^0;			   //   地址A
sbit ADDB=P1^1;			   //	地址B
sbit ADDC=P1^2;			   //	地址C
sbit START_ALE=P1^4;	   //	地址裝載,轉換啟動腳
sbit OE=P1^5;			   //	輸出使能
sbit EOC=P1^6;			   //	 轉換標誌位
sbit key_start=P3^2;	   //	 開始轉換按鍵
sbit key_end=P3^3;		   //	  停止轉換按鍵

uchar ADC_Date=0;
uint i;

void ADC_START()		  //ADC轉換開始函式
{
	
	START_ALE=1;				  //一個正脈衝
	START_ALE=0;
	while(!EOC);
	OE=1;
}

void usart_timer_init()			  //串列埠初始化,定時器初始化
{
    TMOD=0x22;					  //定時器1,定時器0都設為方式2
	TH1=253;
	TL1=253;
	TH0=131;
	TL0=131;
	TR1=1;						 //開定時器1
	REN=0;						//不開起串列埠接收
	SM0=0;						//波特率不加倍,且為方式 1
	SM1=1;
	EA=1;					   //開總中斷
} 

void key_scan()					 //按鍵掃描函式
{
    if(key_start==0)
	{
	   
    	ET0=1;
	    TR0=1;
	   while(1)
	   {
	        if(key_end==0)
			{
				ET0=0;
				TR0=0;
			    break;
			}
	   }		 
	}
}
void main()
{
   ADDA=0;
   ADDB=0;
   ADDC=0;
   START_ALE=0;
   usart_timer_init(); 
   
   while(1)
   {

      key_scan();  
   }
}


void pick() interrupt 1				  //定時器0中斷服務函式
{
     ADC_START();
	 ADC_Date=P0;
	 SBUF=ADC_Date;
	 while(!TI);
	 TI=0;
	 OE=0;

}