久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機+ADC0809的多路數(shù)字電壓表設(shè)計

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:479854 發(fā)表于 2019-3-3 08:01 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本電路主要采用STC89C51單片機芯片和ADC0809芯片來完成一個簡單的電壓表,可以對多路在0—5V的模擬直流電壓進行測量,并通過一個LCD160顯示。制作的全部文件都在壓縮包里面,謝謝大家的支持!


制作出來的實物圖如下:


電路原理圖如下:


八路電壓表元件清單
1)    9*15萬用板
2)    stc89c51單片機
3)    ADC0809
4)    40腳座
5)    28腳座(寬)
6)    1602液晶
7)    16p母座
8)    16p排針
9)    10uF電解電容
10)    30pF瓷片電容*2
11)    10k電阻*2
12)    1k電阻
13)    按鍵*3
14)    鱷魚夾*9(8紅1黑)
15)    3p接線端子*3
16)    紅黑并線1米
17)    103排阻
18)    103電位器藍*8
19)    12MHz晶振
20)    自鎖開關(guān)
21)    DC002接口
22)    導(dǎo)線若干
23)    焊錫若干
24)    USB電源線


以下是程序:
  1. #include<reg52.h>                                   //包含頭文件
  2. #include <math.h>
  3. #include "uart.h"
  4. #include "display.h"
  5. #define uint unsigned int
  6. #define uchar unsigned char                   //宏定義
  7. sbit ale=P2^6;
  8. sbit start=P2^7;
  9. sbit eoc=P3^2;
  10. sbit oe=P3^3;                                           //定義adc0809的控制引腳
  11. sbit adda=P2^0;
  12. sbit addb=P2^1;
  13. sbit addc=P2^2;                                           //adc0809的地址引腳
  14. //sbit rs=P2^3;
  15. //sbit rw=P2^4;
  16. //sbit en=P2^5;                                           //液晶的控制引腳
  17. sbit key1=P3^4;
  18. sbit key2=P3^5;
  19. unsigned long voltdata[8];
  20. uint realvolt,i,j,k,l,t,sum,a[5];         //定義全局變量
  21. unsigned char CH;
  22. uchar add;                                                                         //地址變量
  23. uchar TxBuf[8];                //四個顯示的位
  24. unsigned char t0Count;
  25. unsigned char flagAu=1;
  26. uchar code t1[]={"DC Voltmeter:IN "};
  27. uchar code t2[]={" (0~20V):  .  V "};
  28. uchar code t3[]={"      Hello!    "};
  29. uchar code t4[]={"     Welcome!   "};                 //初始化顯示

  30. /*
  31. 函數(shù)說明
  32. */
  33. void addselect()                //量程選擇
  34. {
  35.   CH++;                                                //通道號加
  36.   if(CH>7)                                        //最大到7                  符號&:按位與符號,二進制的對應(yīng)位如果都為1,那么結(jié)果的對應(yīng)位就為1,否則為0
  37.   CH=0;                                                //清零,一共八個通道0 1 2 3 4 5 6 7,對應(yīng)二進制是0000.0001.0010.0011.0100.0101.0110.0111
  38.   adda=CH&0x01;                                //例如5通道計算方法:將通道對應(yīng)的二進制0101&0001,結(jié)果就是0001,賦值給adda(引腳只能接受最低位的數(shù)據(jù),只有1和0),那么adda引腳就是高電平
  39.   addb=(CH&0x02)>>1;                //然后將通道5的二進制0101&0010,結(jié)果就是0000(因為所有位都不同),然后整組數(shù)據(jù)右移一位,賦值給addb,那么addb引腳就是低電平
  40.   addc=(CH&0x04)>>2;                 //然后將通道5的二進制0101&0100,結(jié)果就是0100,然后整組數(shù)據(jù)右移兩位,賦值給addc,那么addc引腳就是高電平,最后芯片的通道選擇引腳的狀態(tài)就是101,則選擇的就是通道5了
  41.   delay(5);                                        //短延時
  42. }
  43. uint adtrans()                         //AD轉(zhuǎn)換
  44. {
  45.         addselect();
  46.         sum=0;                     //濾波開始
  47.         for (i=0;i<5;i++)           
  48.         {
  49.                 ale=1;
  50.                 ale=0;
  51.                 start=1;                         //啟動AD轉(zhuǎn)換。
  52.                 start=0;
  53.                 while(eoc==0);                 //等待轉(zhuǎn)換結(jié)束。
  54.                 oe=1;
  55.                 a[i]=P1;             //出入轉(zhuǎn)換結(jié)果。
  56.                 delay(5);                  ////每隔5usAD轉(zhuǎn)換并采集一次數(shù)據(jù),將得到的數(shù)值存入數(shù)組中
  57.         }
  58.         for (j=0;j<4;j++)                                
  59.                 for(i=0;i<4-j;i++)
  60.                         if(a[i]>a[i+1])
  61.                         {
  62.                                 t=a[i];
  63.                                 a[i]=a[i+1];
  64.                                 a[i+1]=t;
  65.                         }
  66.         for(i=1;i<4;i++)
  67.         {
  68.                 sum+=a[i];
  69.         }                                  //采用冒泡法比較,取中間3個數(shù)值
  70.         voltdata[CH]=sum/3;
  71.         
  72.         delay(1);
  73.         oe=0;
  74.         voltdata[CH]=4*(100*voltdata[CH])/51;                   //處理運算結(jié)果。
  75.         //voltdata[CH]是讀取到的ad值,乘以100是讓小數(shù)點后移兩位,乘以4是量程擴大四倍也就是5*4=20V,然后除以51(和乘以0.0196一樣)得到實際的電壓值
  76.         //8位AD最小分辨率就是0.0196V
  77.         return voltdata[CH];
  78. }
  79. void disvolt()                                //顯示函數(shù)        
  80. {
  81.         realvolt=voltdata[add];
  82.         writelcd_cmd(0x80);
  83.         writelcd_dat('1'+add);
  84.         TxBuf[1]=realvolt/1000+0x30;
  85.         TxBuf[2]=realvolt/100%10+0x30;
  86.         TxBuf[4]=realvolt/10%10+0x30;
  87.         TxBuf[5]=realvolt%10+0x30;                 //將電壓值分成4個一位數(shù),方便顯示
  88.         writelcd_cmd(0x82);           //顯示電壓值
  89.         writelcd_dat(TxBuf[1]);
  90.         writelcd_dat(TxBuf[2]);
  91.         writelcd_cmd(0x85);
  92.         writelcd_dat(TxBuf[4]);
  93.         writelcd_dat(TxBuf[5]);
  94.         realvolt=voltdata[add+1];
  95.         writelcd_cmd(0x88);
  96.         writelcd_dat('1'+add+1);
  97.         TxBuf[1]=realvolt/1000+0x30;
  98.         TxBuf[2]=realvolt/100%10+0x30;
  99.         TxBuf[4]=realvolt/10%10+0x30;
  100.         TxBuf[5]=realvolt%10+0x30;                 //將電壓值分成4個一位數(shù),方便顯示
  101.         writelcd_cmd(0x8a);           //顯示電壓值
  102.         writelcd_dat(TxBuf[1]);
  103.         writelcd_dat(TxBuf[2]);
  104.         writelcd_cmd(0x8d);
  105.         writelcd_dat(TxBuf[4]);
  106.         writelcd_dat(TxBuf[5]);

  107.         realvolt=voltdata[add+2];
  108.         writelcd_cmd(0xc0);
  109.         writelcd_dat('1'+add+2);
  110.         TxBuf[1]=realvolt/1000+0x30;
  111.         TxBuf[2]=realvolt/100%10+0x30;
  112.         TxBuf[4]=realvolt/10%10+0x30;
  113.         TxBuf[5]=realvolt%10+0x30;                 //將電壓值分成4個一位數(shù),方便顯示
  114.         writelcd_cmd(0xc2);           //顯示電壓值
  115.         writelcd_dat(TxBuf[1]);
  116.         writelcd_dat(TxBuf[2]);
  117.         writelcd_cmd(0xc5);
  118.         writelcd_dat(TxBuf[4]);
  119.         writelcd_dat(TxBuf[5]);
  120.         realvolt=voltdata[add+3];
  121.         writelcd_cmd(0xc8);
  122.         writelcd_dat('1'+add+3);
  123.         TxBuf[1]=realvolt/1000+0x30;
  124.         TxBuf[2]=realvolt/100%10+0x30;
  125.         TxBuf[4]=realvolt/10%10+0x30;
  126.         TxBuf[5]=realvolt%10+0x30;                 //將電壓值分成4個一位數(shù),方便顯示
  127.         writelcd_cmd(0xca);           //顯示電壓值
  128.         writelcd_dat(TxBuf[1]);
  129.         writelcd_dat(TxBuf[2]);
  130.         writelcd_cmd(0xcd);
  131.         writelcd_dat(TxBuf[4]);
  132.         writelcd_dat(TxBuf[5]);
  133. }
  134. void anjian()                                //按鍵掃描函數(shù)
  135. {

  136.         if(key1==0)                                //第一個按鍵按下
  137.         {
  138.                  delay(20);
  139.                 if(key1==0)
  140.                 {
  141.                  if(add==0)
  142.                  add=4;
  143.                  else
  144.                  add=0;
  145.                  flagAu=0;
  146.                  while(key1==0);
  147.                 }
  148.         }
  149.         if(key2==0)
  150.         {
  151.                  delay(20);
  152.                 if(key2==0)
  153.                 {
  154.                  
  155.              flagAu=1;
  156.                  while(key2==0);
  157.                 }
  158.         }
  159.                                          //切換檔位
  160.         TxBuf[6]=CH+0x31;

  161. }
  162. void init()                                         //初始化函數(shù)
  163. {

  164.         add=0;                                
  165.                 addselect();
  166.         lcd_init();                                //液晶顯示初始化
  167.     write_string(0x80,"1:  .  V2:  .  V");
  168.         write_string(0xc0,"3:  .  V4:  .  V");
  169.         TxBuf[0]='


  170. ;
  171.         TxBuf[3]='.';
  172.         TxBuf[7]='\0';
  173. }
  174. void main()                                  //主程序
  175. {
  176.         init();                                  //調(diào)用初始化函數(shù)
  177.         Uart_init();
  178.         while(1)                          //進入while循環(huán)
  179.         {   
  180.                 anjian();                  //掃描按鍵
  181.                 adtrans();                  //ad函數(shù)
  182.                 disvolt();                  //顯示電壓
  183.         }                           
  184. }
  185. void timer0() interrupt 1
  186. {
  187.   TH0=0x4c;
  188.   TL0=0x00;
  189.   t0Count++;
  190.   if(t0Count>=40)
  191.   {
  192.    t0Count=0;
  193.    if(flagAu==1)
  194.    {
  195.     if(add==0)
  196.         add=4;
  197.         else
  198.         add=0;
  199.    }
  200.   }
  201. }
復(fù)制代碼

全部資料51hei下載地址:
基于單片機的多路數(shù)字電壓表 C51 ADC0809.7z (518.83 KB, 下載次數(shù): 319)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:479854 發(fā)表于 2019-3-3 08:03 | 只看該作者
第一次發(fā)帖,寫得不太好,請大家支持,謝謝大家Thanks♪(・ω・)ノ!
回復(fù)

使用道具 舉報

板凳
ID:236382 發(fā)表于 2021-2-25 20:48 | 只看該作者
樓主,想請教一下,仿真圖里ADC0808的clock端口有給500KHZ時鐘信號,但是我看你的原理圖里,是直接把clock端口連接了單片機的30引腳,這樣可以正常運行嗎?在原理圖中需要重新繪制時鐘信號嗎?
回復(fù)

使用道具 舉報

地板
ID:902145 發(fā)表于 2021-4-20 20:39 | 只看該作者
Mr.Haovia 發(fā)表于 2021-2-25 20:48
樓主,想請教一下,仿真圖里ADC0808的clock端口有給500KHZ時鐘信號,但是我看你的原理圖里,是直接把clock ...

我也想問一下樓主這個
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产三级国产aⅴ原创 | 欧美精品一区二区在线观看 | 丁香五月缴情综合网 | 国产精品国产a级 | 国产精品欧美一区二区三区不卡 | 亚洲精品一区二 | 国产小视频在线 | 浮生影院免费观看中文版 | 黄色一级电影在线观看 | av中文字幕在线 | 午夜小视频在线播放 | 久久久.com | 91精品国产一区二区三区蜜臀 | 中日韩欧美一级片 | 桃色五月| 成人av片在线观看 | 激情一区二区三区 | 精品国产一区二区三区久久狼黑人 | 日韩精品a在线观看图片 | 亚洲精品成人网 | 欧美一区二区免费 | 在线观看av网站永久 | 一级黄在线观看 | 韩国久久 | 国产一区二区三区四区 | 麻豆久久久久久久 | 在线视频 中文字幕 | 日本福利在线观看 | 国产一区二区三区四区五区加勒比 | 精品在线观看一区 | av毛片| 日日日操 | 国产成人精品综合 | 日批日韩在线观看 | 天天操夜夜操免费视频 | 亚洲成人免费av | 国产精品久久久久久福利一牛影视 | 国产成人精品999在线观看 | 亚洲一区二区日韩 | 国产美女久久久 | 欧美一级欧美一级在线播放 |