在電子器件設計中,以單片機作為控制核心的系統得到了廣泛的應用,尤其以 MCS-51最為普遍。而數字電壓表的基本原理是對直流電壓進行模數轉換,
并將其結果用數字直接顯示出來。 為以單片機為控制核心實現數字電壓表的設計,結合了模數轉換技術, 段碼顯示, 并結合 ADC0808芯片,進而實現了對 5V以內的直流電壓的準確測量,并在數碼管顯示。并進一步擴展, 實現了對兩路電壓同時進行測量,交替顯示。 而且對于超出測量范圍的電壓能夠以 LED燈的閃爍以及蜂鳴器報警。
單片機源程序如下:
- #include<reg51.h>
- unsigned char a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,},b[4],c=0x01;
- unsigned char key;
- sbit START=P2^4;
- sbit OE=P2^6;
- sbit EOC=P2^5;
- sbit add_a=P2^2;
- sbit add_b=P2^1;
- sbit add_c=P2^0;
- sbit led=P2^7;
- sbit buzzer=P2^3;
- sbit key1=P1^5;
- sbit key2=P1^6;
- void Delay1ms(unsigned int count)//延時函數
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<200;j++);
- }
- void show() //顯示函數
- {
- unsigned int r;
- for(r=0;r<4;r++)
- {
- P1=(c<<r);
- P3=b[r];
- if(r==2) //顯示小數點
- P3=P3|0x80;//
- Delay1ms(1);
- }
- }
- void main(void)
- {
- unsigned int addata=0,i;
-
- while(1)
- {
- while(key==1);
- add_a=0; //采集第一路信號
- add_b=0;
- add_c=0;
- START=1; //根據時序圖啟動ADC0808的AD程序
- START=0;
- while(EOC==0)
- {
- OE=1;
- }
- addata=P0;
- if(addata>=0x40) //當大于1.25V時,則使用led和蜂鳴器報警
- {
- for(i=0;i<=100;i++)
- {
- led=~led;//取反
- buzzer=~buzzer;
- }
- led=1;
- buzzer=1;
- }
- else //否則取消報警
- {
- led=0;
- buzzer=0;
- }
- addata=addata*1.96; //根據AD原理將采得的二進制數轉換成可讀的電壓
- OE=0;
- b[0]=a[addata%10]; //顯示到數碼管上
- b[1]=a[addata/10%10];
- b[2]=a[addata/100%10];
- b[3]=a[0x01];
- for(i=0;i<=200;i++)
- {
- show();
- }
- add_a=1; //采集第二路信號
- add_b=0;
- add_c=0;
- START=1; //根據時序圖啟動ADC0808的AD程序
- START=0;
- while(EOC==0)
- {
- OE=1;
- }
- addata=P0;
- if(addata>=0x80) //當大于2.5V時,則使用led和蜂鳴器報警
- {
- for(i=0;i<=100;i++)
- {
- led=~led;//取反
- buzzer=~buzzer;
- }
- led=1;
- buzzer=1;
- }
- else //否則取消報警
- {
- led=0;
- buzzer=0;
- }
- addata=addata*1.96; //根據AD原理將采得的二進制數轉換成可讀的電壓
- OE=0;
- b[0]=a[addata%10]; //顯示到數碼管上
- b[1]=a[addata/10%10];
- b[2]=a[addata/100%10];
- b[3]=a[0x02];
- for(i=0;i<=200;i++)
- {
- show();
- }
- }
- }
復制代碼
|