天天看點

基于單片機的簡易數字電壓表設計(電路+程式)

部落客福利: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

系統初步方案設計

基于單片機的簡易數字電壓表設計(電路+程式)
  • 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;      

注意:采集後的資料需要進行轉換成在數位管上合理輸出的資料,需要大家注意。

效果仿真圖:

基于單片機的簡易數字電壓表設計(電路+程式)
基于單片機的簡易數字電壓表設計(電路+程式)