C51數碼管動態顯示+AD轉換

老師讓做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聯調在這裏我就說明了)
在這裏插入圖片描述
仿真結果還是很滿意的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章