找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4034|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)ADC0808電壓表仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
51單片機(jī)電壓表,ADC




LM324               CD4051

ADC0808


  • IN0~I(xiàn)N7:8路模擬量輸入端。
  • D0D7:8位數(shù)字量輸出端。
  • ADDA、ADDB、ADDC:3位地址輸入線,用于選通8路模擬輸入中的一路。
  • ALE:地址鎖存允許信號(hào),輸入端,產(chǎn)生一個(gè)正脈沖以鎖存地址。
  • START: A/D轉(zhuǎn)換啟動(dòng)脈沖輸入端,輸入一個(gè)正脈沖(至少100ns寬)使其啟動(dòng)(脈沖上升沿使0809復(fù)位,下降沿啟動(dòng)A/D轉(zhuǎn)換)。
  • EOC A/D轉(zhuǎn)換結(jié)束信號(hào),輸出端,當(dāng)A/D轉(zhuǎn)換結(jié)束時(shí),此端輸出一個(gè)高電平(轉(zhuǎn)換期間一直為低電平)。
  • OE: 數(shù)據(jù)輸出允許信號(hào),輸入端,高電平有效。當(dāng)A/D轉(zhuǎn)換結(jié)束時(shí),此端輸入一個(gè)高電平,才能打開輸出三態(tài)門,輸出數(shù)字量。
  • CLK:時(shí)鐘脈沖輸入端。要求時(shí)鐘頻率不高于640KHz。
  • REF(+)、REF(-):基準(zhǔn)電壓。
  • Vcc:電源,+5V。
  • GND:地。




74LS74                74LS04                    





CD4511
  • A0A3:二進(jìn)制數(shù)據(jù)輸入端   
  • YaYg:數(shù)據(jù)輸出端
  • BI:輸出消隱控制端,接電源
  • LT:燈測(cè)試端,接電源
  • LE:數(shù)據(jù)鎖定控制端,接地
  • VDD: 接電源
  • VSS: 接地


4位數(shù)碼管






AT89C52



單片機(jī)源程序如下:
  1. #include <reg52.H>
  2. #define uchar unsigned char;
  3. uchar code scan_con[]={0x08,0x04,0x02,0x01};  //定義掃描片選
  4. uchar dispbuf[4]={0,0,0,0}; //定義4個(gè)存儲(chǔ)空間
  5. uchar getdata;
  6. unsigned long int temp;//定義暫存空間
  7. uchar i,j,k,l,m;
  8. int a,b;
  9. sbit s3=P3^7;  //位定義,控制模擬開關(guān)
  10. sbit s2=P3^6;
  11. sbit s1=P3^5;
  12. sbit dp=P0^7; //定義小數(shù)點(diǎn)
  13. #define v20_on {s3=0;s2=0;s1=0;} //宏定義不同量程,不同的開關(guān)狀態(tài)
  14. #define v2_on {s3=0;s2=0;s1=1;}
  15. #define v02_on {s3=0;s2=1;s1=0;}
  16. sbit ST=P3^1;   //定義單片機(jī)和ADC的控制信號(hào)
  17. sbit OE=P3^3;
  18. sbit EOC=P3^2;

  19. delay_ms(int n)
  20. {
  21.         for(a=n;a>0;a--)
  22.                 for(b=100;b>0;b--);
  23. }

  24. main(void)
  25. {
  26.         while(1)
  27.         {   
  28. _20v:       //2~20V量程
  29.         v20_on;
  30.         ST=1;
  31.         delay_ms(1);      //啟動(dòng)A/D轉(zhuǎn)換
  32.         ST=0;
  33.         while(EOC==0)
  34.         OE=1;
  35.         getdata=P1;
  36.         OE=0;
  37.         if(getdata<21)  //量程不合適,切換
  38.         {
  39.                 goto _2v;
  40.                 delay_ms(1);
  41.         }           
  42.         l=3;
  43.         temp=getdata;   //量程合適,數(shù)據(jù)處理
  44.         temp=temp*100;
  45.         temp=temp*5/51;
  46.         goto disp;   //跳到數(shù)碼管顯示程序段
  47. _2v:                   //200MV~2V量程
  48.         v2_on;
  49.         ST=1;
  50.         delay_ms(1);      //啟動(dòng)A/D轉(zhuǎn)換
  51.         ST=0;
  52.         while(EOC==0)
  53.         OE=1;
  54.         getdata=P1;
  55.         OE=0;
  56.         if(getdata<21)
  57.         {
  58.                 goto _02v;
  59.                 delay_ms(1);
  60.         }
  61.         else if(getdata>204)
  62.         {
  63.                 goto _20v;
  64.                 delay_ms(1);
  65.         }
  66.         l=2;
  67.         temp=getdata;
  68.         temp=temp*100*5/51;
  69.         goto disp;
  70. _02v:              //0~200MV量程
  71.            v02_on;
  72.            OE=0;
  73.           ST=1;
  74.         delay_ms(1);      //啟動(dòng)A/D轉(zhuǎn)換
  75.         ST=0;
  76.         while(EOC==0)
  77.         OE=1;
  78.         getdata=P1;
  79.         OE=0;
  80.         if(getdata>204)
  81.            {
  82.                    goto _2v;
  83.                    delay_ms(1);
  84.            }
  85.            l=1;
  86.            temp=getdata;
  87.            temp=temp*100*5/51;
  88.            
  89. disp:
  90.            dispbuf[3]=0;
  91.            dispbuf[2]=0;
  92.            dispbuf[1]=0;
  93.            dispbuf[0]=0;
  94.            i=0;
  95.            for(;temp;i++)//電壓值的每個(gè)位計(jì)
  96.        {
  97.                    dispbuf[i]=temp%10;
  98.                    temp=temp/10;  
  99.            }
  100.            for(k=0;k<=3;k++)  //數(shù)碼管顯示
  101.            {
  102.                   
  103.                    if((k==3&&l==3&&i==3)        ||(k==3&&l==1&&i==3))
  104.                    continue;
  105.                    P0=scan_con[k];      //位選
  106.                     P2=dispbuf[k]&0x0f;   //段選
  107.                    if((l==3&&k==2)||(l==2&&k==3)||(l==1&&k==1))
  108.                    dp=0        ;
  109.                    else dp=1;
  110.                    for(m=0;m<=2;m++)
  111.                    for(j=0;j<=20;j++);
  112.                    }
  113.                    }
  114.                    }
復(fù)制代碼

所有資料51hei提供下載:
電壓表.zip (795.15 KB, 下載次數(shù): 23)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表