帶我們的王老師剛評上碩導了,下學期開始帶研究生了。
從他那里了解到每做一次實驗或者實踐,應該把它用規范的格式記錄下來,一來自己可以日后查看,二來同學間可以相互交流,共通過進步,甚為必要,F將本次實驗記錄如下。
實驗
名稱:根據光強控制外圍器件的通斷。
實驗原理;使用AD芯片將太陽能電池產生的光生伏打電壓轉化為數字信號,再通過單片機處理后,在數碼管上顯示電壓,同時根據設定電壓伐值,控制外圍器件的通斷。
實驗所需的設備:51單片機燒寫器一個,電腦一臺,數字式示波器一個,數字式萬用表一個
實驗所需的元件:太陽能電池一片,單片機一片,1k排阻一個,四位連體的數碼管一個,排針若干排,導線,萬用版一塊,焊錫。
實驗前的理論準備;能熟練使用51單片機,示波器,keil軟件,isp下載軟件,看懂AD0809的英文pdf說明
實驗的難點:難點一就是AD0809芯片的使用。
難點二就是將AD0809產生的0~256的數字換算成0~5.000的精確度,而又不至于溢出出錯。
難點三就是以上的理論準備全部系自學,呵呵
下面著重說明AD0809的使用難點。
ADC0809是采樣頻率為8位的、以逐次逼近原理進行模—數轉換的器件。其內部有一個8通道多路開關,它可以根據地址碼鎖存譯碼后的信號,只選通8路模擬輸入信號中的一個進行A/D轉換。
1.主要特性
1)8路8位A/D轉換器,即分辨率8位。
2)具有轉換起?刂贫。
3)轉換時間為100μs
4)單個+5V電源供電
5)模擬輸入電壓范圍0~+5V,不需零點和滿刻度校準。
6)工作溫度范圍為-40~+85攝氏度
7)低功耗,約15mW。
2.內部結構
ADC0809是CMOS單片型逐次逼近式A/D轉換器,內部結構如圖13.22所示,它由8路模擬開關、地址鎖存與譯碼器、比較器、8位開關樹型D/A轉換器、逐次逼近
3.外部特性(引腳功能)
ADC0809芯片有28條引腳,采用雙列直插式封裝,如圖13.23所示。下面說明各引腳功能。
IN0~IN7:8路模擬量輸入端。
2-1~2-8:8位數字量輸出端。
ADDA、ADDB、ADDC:3位地址輸入線,用于選通8路模擬輸入中的一路
ALE:地址鎖存允許信號,輸入,高電平有效。
START: A/D轉換啟動信號,輸入,高電平有效。
EOC: A/D轉換結束信號,輸出,當A/D轉換結束時,此端輸出一個高電平(轉換期間一直為低電平)。
OE:數據輸出允許信號,輸入,高電平有效。當A/D轉換結束時,此端輸入一個高電平,才能打開輸出三態門,輸出數字量。
CLK:時鐘脈沖輸入端。要求時鐘頻率不高于640KHZ。
REF(+)、REF(-):基準電壓。
Vcc:電源,單一+5V。
GND:地。
ADC0809的工作過程是:首先輸入3位地址,并使ALE=1,將地址存入地址鎖存器中。此 地址經譯碼選通8路模擬輸入之一到比較器。START上升沿將逐次逼近寄存器復位。下降沿啟動 A/D轉換,之后EOC輸出信號變低,指示轉換正在進行。直到A/D轉換完成,EOC變為高電平,指示A/D轉換結束,結果數據已存入鎖存器,這個信號可 用作中斷申請。當OE輸入高電平 時,輸出三態門打開,轉換結果的數字量輸出到數據總線上。
值得一提的是,我按照上面電路,把AD的ABC三腳共同接接地時,AD0809088始終輸出高電平,最后當我把BC共同接地,在程序中給A一個0,則AD0809正常運行,有輸出,并且發現當所給的時鐘頻率越低,最高精度的那位輸出越穩定,具體參數范圍從芯片資料里有詳細介紹,不過十全英文,專業詞匯哦。哈哈
現將程序記錄如下:
完整的程序從這里下載: http://m.raoushi.com/ziliao/file/0809c51x.rar
#include< reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar aa,qian,bai,shi,ge;
uint temp;
sbit clock=P2^0;
sbit start=P2^1;
sbit eoc=P2^2;
sbit oe=P2^3;
sbit ale=P2^4;
sbit adda=P2^5;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
//void display(uchar bai,uchar shi,uchar ge);
void delay(uint z);
void main()
{
TMOD=0x20; //設置定時器1為工作方式2
TH1=0x216; //216
TL1=0x216; //216
EA=1; //開總中斷
ET1=1; //開t1中斷
TR1=1;
start=0; //復位
oe=0; //輸出
adda=0;
//eoc=0;
ale=0; //關閉地址選擇
while(1)
{
start=0;
///delay(10);
start=1; // 復位
ale=1; // 打開地址選擇
adda=0;
///delay(10);
start=0; // 開始轉換
ale=0; // 關地址
//delay(1);
while(eoc==0); // 等待eoc變為1
//delay(1);
oe=1; // 打開輸出
//delay(1);
//P1=0xff;
temp=P1; // 取p1到p3
oe=0; // 關輸出
temp=temp*50;
temp=temp/256;
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
P3=0x00;
P0=0xfe;
P3=table[qian];
delay(50);
P3=0x00;
P0=0xfd;
P3=table[bai];
delay(50);
P3=0x00;
P0=0xfb;
P3=table[shi];
delay(50);
P3=0x00;
P0=0xf7;
P3=table[ge];
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1;y>0;y--);
}
void cl() interrupt 3
{
clock=!clock;
}
