實驗要求: 應用A/D轉換器將滑動電阻輸出的模擬電壓量轉換為數字電壓量,將數字電壓量輸出到四位數碼管,并通過電壓表給出模擬電壓量的讀數。下圖是實驗截圖。
實驗方案: 應用proteus設計實驗用模擬電路,A/D轉換器采用ADC0804模擬器件,滑動電阻采用proteus支持的POT-HG,四位數碼管采用7SEG-MPX4CA。
有20個引腳,分辨率為8位,轉換時間為100μs,輸入電壓范圍為0~5V。
分辨率:A/D轉換器對輸入模擬信號的分辨能力,ADC0804分辨率為8位,即輸出位數為8個二進制位,可以區分2^8(256)不同等級的輸入模擬電壓,能區分輸入的電壓最小值為滿量程輸入的1/2^8(1/256),若需要區分更小的輸入電壓。就需要增加輸出位數,提高A/D轉換器的分辨率。
轉換時間:A/D轉換器從接收到模擬電壓到輸出數字電壓需要的時間,不同類型的轉換器轉換時間不同,并行比較的A/D轉換器轉換時間可達50ns以內,逐次比較的A/D轉換器轉換時間一般在10~100μs之間,雙積分A/D轉換器轉換時間一般在幾十毫秒到幾百毫秒之間。
CS引腳:芯片的片選信號,低電平有效。若該引腳為低電平,芯片開始工作,若該引腳為高電平,芯片停止工作。當外接多個ADC0804芯片時,該引腳可作為芯片的選擇地址,通過不同的地址信號使用不同的ADC0804芯片,從而可以實現多個ADC通道的分時復用。
WR引腳:采樣觸發信號,低電平有效。若該引腳由高電平變為低電平時,芯片對模擬信號進行一次采樣,并進行AD轉換。
RD引腳:轉換數據完成信號,低電平有效。若檢測到該引腳為低電平,說明一次轉換完成,轉換完成的數據從DB0~DB7引腳讀取。
VIN+和VIN-引腳:模擬電壓輸入端,用以接收單極性、雙極性和差模輸入信號。雙極性輸入信號有正負電壓、零電壓,單極性輸入信號僅有正電壓。若為單極性輸入信號,VIN+接模擬電壓的輸入,VIN-接地;若為雙極性輸入信號,VIN+和VIN-分別接模擬輸入電壓的正極和負極。
VREF/2引腳:參考電壓接入引腳。該引腳可外接電壓,也可懸空。
CLKIN引腳:引入外部時鐘脈沖,用于芯片的時鐘信號。
CLKR引腳:內部時鐘發生器外接電阻端,與CLKIN端配合可由芯片自身產生時鐘脈沖,時鐘脈沖頻率范圍一般為100KHz~1460KHz。
INTR引腳:轉換結束輸出信號,低電平有效,當一次A/D轉換完成后,該引腳被設置為0。在實際應用中,該引腳可與外部中斷輸入引腳相連(如51單片機的INT0,INT1腳),觸發中斷請求,中斷發生后,還需等待RD=0才能正確讀出A/D轉換結果。若不使用中斷,該引腳可以懸空。
AGAND和DGAND引腳:模擬接地和數字接地,兩個引腳可以直接接地。
VCC引腳:接+5V電源。
DB0~DB7引腳:輸出A/D轉換后的8位二進制結果。
四位數碼管7SEG-MPX4CA
實驗用顯示器件采用四位數碼管7SEG-MPX4CA,該器件共有12個引腳。其中1、2、3、4引腳為位選信號,用于控制幾個數碼管亮,A~G引腳為顯示數字的段選信號,DP引腳為小數點。
實驗電路設計
ADC0804中的VCC接入5V電源,REF/2引腳懸空(懸空則相當于與VCC共接5V電源),因此ADC轉換的參考電壓為VCC的值,即5V。DB0DB7引腳連接單片機的P1.0P1.7,RD和WR引腳連接單片機的P3.6和P3.7,VIN+引腳接滑動變阻器的可調節端,VIN-引腳接地,在VIN+和VIN-引腳之間接入電壓表,CLKIN引腳和CLKR引腳連接的電容和電阻構成外部時鐘脈沖。單片機P0.0~P0.7接四位數碼管的段選線。
單片機內運行的完整C程序如下:
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit wr=P3^6;
sbit rd=P3^7;
uchar code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint x)
{
uchar i;
while(x--)
for(i=0;i< 120;i++);
}
void display(uchar db)
{
uchar bw,sw,gw;
float value;
int voltage;
value = (float)db * 5 / 256 * 100;
voltage = (int)value;
bw=voltage/100;
sw=voltage%100/10;
gw=voltage%10;
P2=0x01;
P0=dis[bw]&0x7f;
delay(5);
P2=0x02;
P0=dis[sw];
delay(5);
P2=0x04;
P0=dis[gw];
delay(5);
P2=0x08;
P0=dis[0];
delay(5);
}
void main()
{
uchar i;
while(1)
{
wr=0;
_nop_();
wr=1;
delay(1);
P1=0xff;
rd=0;
_nop_();
for(i=0;i< 10;i++)
display(P1);
}
}
位變量wr和rd用于操作P3.6和P3.7,P3.6和P3.7連接到了ADC0804的WR和RD引腳,用于控制信號采樣和讀取采樣信號。數組變量dis[]定義了數碼管顯示的數字編碼。
delay(uint x)是延遲函數,參數x為延時的毫秒數。
display(uchar db)是數碼管顯示函數,參數db為P1口,P1口存儲了采集到的電壓數字量。ADC0804的分辨率為8位,可以區分2^8(256)不同等級的輸入模擬電壓,且輸入電壓量程為0 ~ 5V,ADC0804輸出的數值范圍為0~256,轉換為電壓(單位V)的公式為:
輸出的數值*輸入最大量程 / 256
下面的代碼將輸出的數值轉換為電壓的數字量(單位V),并分別計算出數字量的各個位數。
value = (float)db * 5 / 256 * 100;
// 輸出數值轉換為電壓,乘以1000方便計算出數值的各個位數
voltage = (int)value;
bw=voltage/100; // 計算出百位數
sw=voltage%100/10; // 計算出十位數
gw=voltage%10; // 計算出個位數
語句P2=0x01選擇數碼管的第1位顯示數字,語句P0=dis[bw]&0x7f用于顯示數字和小數點,dis[bw]指定的數字的編碼,再和0x7f做與操作,顯示小數點。
main()函數是主控函數,應用while結構循環采集和轉換可變電阻輸出的電壓,并將采集的電壓輸出到數碼管顯示。語句wr=0將ADC0804的wr引腳設為低電平,通知ADC0804進行采樣,語句_nop_()執行_nop_()函數, nop ()函數不是C語言標準庫的函數,它是51單片機提供的指令,它執行一個機器周期的空操作,讓ADC0804完成數據采樣和模數轉換,其后執行語句wr=1,將ADC0804的wr引腳設為高電平。語句P1=0xff將P1各端口都設置為高電平,準備接收采集的數據,語句rd=0將ADC0804的rd引腳設為低電平,從DB0~DB7引腳讀取數據到P1口。
-
轉換器
+關注
關注
27文章
8707瀏覽量
147236 -
數碼管
+關注
關注
32文章
1882瀏覽量
91146 -
模數轉換器
+關注
關注
26文章
3205瀏覽量
126847 -
引腳
+關注
關注
16文章
1196瀏覽量
50538 -
adc0804
+關注
關注
1文章
31瀏覽量
22206
發布評論請先 登錄
相關推薦
評論