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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8199|回復: 3
收起左側

基于單片機+ADC0809的多路數字電壓表設計

  [復制鏈接]
ID:479854 發表于 2019-3-3 08:01 | 顯示全部樓層 |閱讀模式
本電路主要采用STC89C51單片機芯片和ADC0809芯片來完成一個簡單的電壓表,可以對多路在0—5V的模擬直流電壓進行測量,并通過一個LCD160顯示。制作的全部文件都在壓縮包里面,謝謝大家的支持!
搜狗截圖20190303075233.jpg

制作出來的實物圖如下:
0.jpg 0.jpg

電路原理圖如下:
0.png

八路電壓表元件清單
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)    自鎖開關
21)    DC002接口
22)    導線若干
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. 函數說明
  32. */
  33. void addselect()                //量程選擇
  34. {
  35.   CH++;                                                //通道號加
  36.   if(CH>7)                                        //最大到7                  符號&:按位與符號,二進制的對應位如果都為1,那么結果的對應位就為1,否則為0
  37.   CH=0;                                                //清零,一共八個通道0 1 2 3 4 5 6 7,對應二進制是0000.0001.0010.0011.0100.0101.0110.0111
  38.   adda=CH&0x01;                                //例如5通道計算方法:將通道對應的二進制0101&0001,結果就是0001,賦值給adda(引腳只能接受最低位的數據,只有1和0),那么adda引腳就是高電平
  39.   addb=(CH&0x02)>>1;                //然后將通道5的二進制0101&0010,結果就是0000(因為所有位都不同),然后整組數據右移一位,賦值給addb,那么addb引腳就是低電平
  40.   addc=(CH&0x04)>>2;                 //然后將通道5的二進制0101&0100,結果就是0100,然后整組數據右移兩位,賦值給addc,那么addc引腳就是高電平,最后芯片的通道選擇引腳的狀態就是101,則選擇的就是通道5了
  41.   delay(5);                                        //短延時
  42. }
  43. uint adtrans()                         //AD轉換
  44. {
  45.         addselect();
  46.         sum=0;                     //濾波開始
  47.         for (i=0;i<5;i++)           
  48.         {
  49.                 ale=1;
  50.                 ale=0;
  51.                 start=1;                         //啟動AD轉換。
  52.                 start=0;
  53.                 while(eoc==0);                 //等待轉換結束。
  54.                 oe=1;
  55.                 a[i]=P1;             //出入轉換結果。
  56.                 delay(5);                  ////每隔5usAD轉換并采集一次數據,將得到的數值存入數組中
  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個數值
  70.         voltdata[CH]=sum/3;
  71.         
  72.         delay(1);
  73.         oe=0;
  74.         voltdata[CH]=4*(100*voltdata[CH])/51;                   //處理運算結果。
  75.         //voltdata[CH]是讀取到的ad值,乘以100是讓小數點后移兩位,乘以4是量程擴大四倍也就是5*4=20V,然后除以51(和乘以0.0196一樣)得到實際的電壓值
  76.         //8位AD最小分辨率就是0.0196V
  77.         return voltdata[CH];
  78. }
  79. void disvolt()                                //顯示函數        
  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個一位數,方便顯示
  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個一位數,方便顯示
  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個一位數,方便顯示
  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個一位數,方便顯示
  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()                                //按鍵掃描函數
  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()                                         //初始化函數
  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();                                  //調用初始化函數
  177.         Uart_init();
  178.         while(1)                          //進入while循環
  179.         {   
  180.                 anjian();                  //掃描按鍵
  181.                 adtrans();                  //ad函數
  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. }
復制代碼

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


評分

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

查看全部評分

回復

使用道具 舉報

ID:479854 發表于 2019-3-3 08:03 | 顯示全部樓層
第一次發帖,寫得不太好,請大家支持,謝謝大家Thanks♪(・ω・)ノ!
回復

使用道具 舉報

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

使用道具 舉報

ID:902145 發表于 2021-4-20 20:39 | 顯示全部樓層
Mr.Haovia 發表于 2021-2-25 20:48
樓主,想請教一下,仿真圖里ADC0808的clock端口有給500KHZ時鐘信號,但是我看你的原理圖里,是直接把clock ...

我也想問一下樓主這個
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜视频在线观看 | 一级毛片免费完整视频 | 成人av影院 | 国产精品欧美一区二区三区不卡 | 日本天天色 | 欧美日韩国产精品激情在线播放 | 久久黄色精品视频 | 国产一区亚洲二区三区 | 久久爱黑人激情av摘花 | 欧美日韩精品一区二区天天拍 | 久久亚| 日本中文字幕视频 | 日日干日日射 | 欧美视频一区二区三区 | 麻豆国产一区二区三区四区 | 亚洲国产精品一区二区三区 | 亚洲欧美日韩在线 | 精品日韩一区 | 美女视频一区二区三区 | 91电影| 一区二区三区视频在线观看 | 日韩视频在线观看中文字幕 | 精品欧美乱码久久久久久1区2区 | 久久69精品久久久久久久电影好 | 99国产精品久久久 | 99reav| 美女毛片| 日韩免费毛片视频 | 99精品国产一区二区青青牛奶 | 日本一区二区不卡 | 91精品国产91久久综合桃花 | 精品视频一区二区三区 | 日韩高清一区 | 国产高清精品在线 | 亚洲国产一区二区在线 | 狠狠干网| 欧美日韩最新 | 欧美视频一区二区三区 | 亚洲精品美女视频 | 在线观看中文字幕 | 日韩欧美三区 |