基於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;
}