部落客福利:100G+電子設計學習資源包!
http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect --------------------------------------------------------------------------------------------------------------------------
以單片機為核心器件,組成一個簡單的直流數字電壓表。
(1)采用1路模拟量輸入,能夠測量0-5V之間的直流電壓值。
(2)電壓顯示可采用4位LED數位管顯示,至少能夠顯示兩位小數。
簡易數字電壓表的制作,主要涉及資料(電壓)測量、A/D轉換及控制顯示方面的知識。
(1)A/D轉換采用ADC0808、0809實作。
(2)電壓顯示采用4位的LED數位管。
(3)單片機選用AT89C51
系統初步方案設計
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iNyAzNzEWM3Y2YwQGOjBjNzYzX4QDMyUTMxAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- A/D轉換器是實作模拟量向數字量轉換的器件,按轉換原理可分為四種:計數式A/D轉換器、雙積分式A/D轉換器、逐次逼近式A/D轉換器和并行式A/D轉換器。
- 目前最常用的A/D轉換器是雙積分式A/D轉換器和逐次逼近式A/D轉換器。前者的主要優點是轉換精度高,抗幹擾性能好,價格便宜,但轉換速度較慢,一般用于速度要求不高的場合。後者是一種速度較快、精度較高的轉換器,其轉換時間大約在幾微秒到幾百微秒之間。
- ADC0809是一個8位8通道的逐次逼近式AD轉換器。
仿真圖如下:
代碼的具體實作,如下:
#include <reg51.h>
#include <intrins.h>
sbit OE=P1^0; // 輸出允許控制位
sbit EOC=P1^1; // 轉換結束狀态信号
sbit ST=P1^2; // 轉換啟動信号
sbit CLK=P1^3; // 時鐘信号
sbit C3=P1^4; //
sbit C2=P1^5; //
sbit C1=P1^6; //
unsigned int temp;
unsigned char show[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; // 0-9
void delay(int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<200;j++);
}
}
void display() // 數位管顯示
{
P3=0X80;
P0=show[temp/1000]&0X7F;
delay(5);
P3=0X40;
P0=show[temp/100%10];
delay(5);
P3=0X20;
P0=show[temp%100/10];
delay(5);
P3=0X10;
P0=show[temp%10];
delay(5);
}
unsigned int ADC0809()
{
unsigned int dat;
ST=0;
ST=1;
_nop_();
ST=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EOC=1;
while(EOC==0);
OE=1;
P2=0XFF; // 設定P2口為輸入口
dat=P2;
OE=0;
return dat;
}
void main()
{
ET0=1;
EA=1;
TMOD=0X00; // 設定定時器工作方式為0
//11111111 11110
TH0=0XFF;
TL0=0X0;
TR0=1;
CLK=1;
ST=0;
OE=0;
C1=0;C2=0;C3=0;
while(1)
{
temp=ADC0809()*19.53125; //19.53125=5/256*1000 5/256 為精度 乘以1000為了友善在數位上顯示
display();
}
}
void inex_T0() interrupt 1
{
TH0=0XFF;
TL0=0X0;
CLK=!CLK;
注意:采集後的資料需要進行轉換成在數位管上合理輸出的資料,需要大家注意。
效果仿真圖: