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