51單片機電壓表,ADC
 ADC0808
- IN0~IN7:8路模擬量輸入端。
- D0~D7:8位數字量輸出端。
- ADDA、ADDB、ADDC:3位地址輸入線,用于選通8路模擬輸入中的一路。
- ALE:地址鎖存允許信號,輸入端,產生一個正脈沖以鎖存地址。
- START: A/D轉換啟動脈沖輸入端,輸入一個正脈沖(至少100ns寬)使其啟動(脈沖上升沿使0809復位,下降沿啟動A/D轉換)。
- EOC: A/D轉換結束信號,輸出端,當A/D轉換結束時,此端輸出一個高電平(轉換期間一直為低電平)。
- OE: 數據輸出允許信號,輸入端,高電平有效。當A/D轉換結束時,此端輸入一個高電平,才能打開輸出三態門,輸出數字量。
- CLK:時鐘脈沖輸入端。要求時鐘頻率不高于640KHz。
- REF(+)、REF(-):基準電壓。
Vcc:電源,接+5V。- GND:地。
 74LS74 74LS04
 CD4511 - A0~A3:二進制數據輸入端
- Ya~Yg:數據輸出端
BI:輸出消隱控制端,接電源 LT:燈測試端,接電源- LE:數據鎖定控制端,接地
- VDD: 接電源
- VSS: 接地
4位數碼管
AT89C52 
單片機源程序如下:
- #include <reg52.H>
- #define uchar unsigned char;
- uchar code scan_con[]={0x08,0x04,0x02,0x01}; //定義掃描片選
- uchar dispbuf[4]={0,0,0,0}; //定義4個存儲空間
- uchar getdata;
- unsigned long int temp;//定義暫存空間
- uchar i,j,k,l,m;
- int a,b;
- sbit s3=P3^7; //位定義,控制模擬開關
- sbit s2=P3^6;
- sbit s1=P3^5;
- sbit dp=P0^7; //定義小數點
- #define v20_on {s3=0;s2=0;s1=0;} //宏定義不同量程,不同的開關狀態
- #define v2_on {s3=0;s2=0;s1=1;}
- #define v02_on {s3=0;s2=1;s1=0;}
- sbit ST=P3^1; //定義單片機和ADC的控制信號
- sbit OE=P3^3;
- sbit EOC=P3^2;
- delay_ms(int n)
- {
- for(a=n;a>0;a--)
- for(b=100;b>0;b--);
- }
- main(void)
- {
- while(1)
- {
- _20v: //2~20V量程
- v20_on;
- ST=1;
- delay_ms(1); //啟動A/D轉換
- ST=0;
- while(EOC==0)
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21) //量程不合適,切換
- {
- goto _2v;
- delay_ms(1);
- }
- l=3;
- temp=getdata; //量程合適,數據處理
- temp=temp*100;
- temp=temp*5/51;
- goto disp; //跳到數碼管顯示程序段
- _2v: //200MV~2V量程
- v2_on;
- ST=1;
- delay_ms(1); //啟動A/D轉換
- ST=0;
- while(EOC==0)
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21)
- {
- goto _02v;
- delay_ms(1);
- }
- else if(getdata>204)
- {
- goto _20v;
- delay_ms(1);
- }
- l=2;
- temp=getdata;
- temp=temp*100*5/51;
- goto disp;
- _02v: //0~200MV量程
- v02_on;
- OE=0;
- ST=1;
- delay_ms(1); //啟動A/D轉換
- ST=0;
- while(EOC==0)
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata>204)
- {
- goto _2v;
- delay_ms(1);
- }
- l=1;
- temp=getdata;
- temp=temp*100*5/51;
-
- disp:
- dispbuf[3]=0;
- dispbuf[2]=0;
- dispbuf[1]=0;
- dispbuf[0]=0;
- i=0;
- for(;temp;i++)//電壓值的每個位計
- {
- dispbuf[i]=temp%10;
- temp=temp/10;
- }
- for(k=0;k<=3;k++) //數碼管顯示
- {
-
- if((k==3&&l==3&&i==3) ||(k==3&&l==1&&i==3))
- continue;
- P0=scan_con[k]; //位選
- P2=dispbuf[k]&0x0f; //段選
- if((l==3&&k==2)||(l==2&&k==3)||(l==1&&k==1))
- dp=0 ;
- else dp=1;
- for(m=0;m<=2;m++)
- for(j=0;j<=20;j++);
- }
- }
- }
復制代碼
所有資料51hei提供下載:
電壓表.zip
(795.15 KB, 下載次數: 23)
2018-9-29 21:09 上傳
點擊文件名下載附件
|