老師讓做AD轉換的實驗,並把轉換結果用數碼管顯示出來。由於疫情的原因,沒有C51的小試驗箱,就只能用protues進行仿真。
一、AD部分
AD轉換我用的是ADC0808芯片。ADC0808的內部結構和外部引腳分別如下圖所示,內部各部分的作用和工作原理在內部結構圖中一目瞭然,下面對各引腳定義分述如下:
(1)IN~IN—8路模擬輸入,通過3根地址譯碼ADDA,ADDB,ADDC。來選通一路。
(2) D7-D0—A/D轉換後的數據輸出端,爲三態可控輸出,8位排列順序是D7爲最高位, D0爲最低位。
(3) ADDA,ADDB,ADDC—模擬通道選擇地址信號,ADDA爲低位,ADDC爲高位。
(4) VR(+)、VR(-)—正、負參考電壓輸入端,用於提供片內DAC電阻網絡的基準電壓。在單極性輸入時, VR(+)=5V,VR(-)=0V。
(5) ALE—地址鎖存允許信號,高電平有效。當此信號有效時, A、B、C三位地址信號被鎖存,譯碼選通對應模擬通道。在使用時,該信號常和START信號連在一起。
(6) START— A/D轉換啓動信號,正脈衝有效。加於該端的脈衝的上升沿使逐次逼近寄存器清零,下降沿開始AD轉換。如正在進行轉換時又接到新的啓動脈衝,則原來的轉換進程被中止,重新從頭開始轉換。
(7) EOC—轉換結束信號,高電平有效。該信號在A/D轉換過程中爲低電平,其餘時間爲高電平。該信號可作爲被單片機查詢的狀態信號,也可作爲對單片機的中斷請求信號。
(8) OE—輸出允許信號,高電平有效。當微處理器將該信號置高時, ADC0B808的輸出三態門被打開,使轉換結果通過數據總線輸出。
二、數碼管動態顯示
動態顯示的特點是將所有位數碼管的段選線聯在一起,由位選線控制是哪一位數碼管亮。所謂動態顯示即輪流向各位數碼管送出相應段碼,並一直循環。利用發光管的餘輝和人眼視覺殘留作用,使人感覺好像各位數碼管同時都在顯示。也就是實際上每一時刻只有一個數碼管是亮的,但是隻要更新頻率足夠快(>100Hz),肉眼看起來,這些數碼管就同時顯示我們需要的數字了。
這裏我用了四個數碼管,將轉換的數據用毫伏顯示。
三、代碼部分
#include <REGX51.H>
typedef unsigned char u8;
typedef unsigned int u16;
#define ALESTART P2_3
#define ADCBUSY P2_5
#define DATA P0
#define SEG_Port P1 //數碼管顯示
float Volt=0.0;
u8 channel=0;
u8 SEG_Sel[4]={0x08,0x04,0x02,0x01}; //數碼管位選數據
u8 SEG[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數碼管段選數據
/*****函數聲明*****/
void ADC_Init(void);
float Get_Vlot(void);
void Delay(u8 time);
void SEG_Show(void);
/*****主函數*****/
void main(void)
{
ADC_Init();
channel=4;
while(1)
{
Volt=Get_Vlot();
SEG_Show();
}
}
void ADC_Init(void)
{
DATA=0xff; //IO口用做輸入時,先輸出1
ADCBUSY=1; //IO口用做輸入時,先輸出1
ALESTART=0;
}
float Get_Vlot(void)
{
u16 num;
P2&=0xf8;
P2|=channel; //ADDA,ADDB,ADDC模擬通道選擇地址信號
ALESTART=1;
Delay(2);
ALESTART=0;
Delay(2);
while(ADCBUSY==0); //等待EOC置高
num=DATA; //讀取數據
return (num*5000.0/255.0); //毫伏顯示
}
void Delay(u8 time)
{
unsigned char i, j;
for (i=0; i<time; i++)
for (j=0; j<12; j++);
}
void SEG_Show(void) //數碼管顯示
{
int temp;
u8 ord;
temp=(int)Volt;
for(ord=0;ord<4;ord++)
{
P3=SEG_Sel[ord];
SEG_Port=SEG[temp%10];
Delay(10);
SEG_Port=0xff;
temp=temp/10;
}
}
四、protues部分
ADC0808連接圖
C51部分連接圖
仿真結果(protues如何畫圖仿真以及如何與keil5聯調在這裏我就說明了)
仿真結果還是很滿意的。