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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4122|回復: 1
收起左側

C51單片機+ADC0809的多路數字電壓表Proteus仿真程序

  [復制鏈接]
ID:819508 發表于 2021-11-4 22:05 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

屏幕截圖 2021-11-04 220324.jpg 屏幕截圖 2021-11-04 220354.jpg

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

所有資料51hei附件下載:
仿真代碼.7z (218.42 KB, 下載次數: 195)

評分

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

查看全部評分

回復

使用道具 舉報

ID:1051542 發表于 2023-8-19 09:25 | 顯示全部樓層
可以重新發一次嗎,失效了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合国产 | 91精品国产91久久久久久吃药 | 国产成人精品一区二区三区视频 | 久久久久久久国产精品 | 欧美日韩高清 | 久久精品无码一区二区三区 | 国产精品国产三级国产aⅴ无密码 | 精品国产乱码久久久久久蜜柚 | aaaa网站| 丝袜 亚洲 欧美 日韩 综合 | 人人人人干 | 亚洲一区二区三区免费视频 | 国产成人小视频 | 久久久久久成人 | 在线成人免费视频 | 欧美日产国产成人免费图片 | 一区二区三区四区电影 | 91久久久久久 | 中文字幕日韩欧美一区二区三区 | av黄色在线 | 亚洲高清视频一区 | 久久久久久av | 国产精品亚洲第一区在线暖暖韩国 | 女朋友的闺蜜3韩国三级 | 91成人午夜性a一级毛片 | 日韩一区中文字幕 | 欧美亚洲国产日韩 | 亚洲成人久久久 | 99久久99| 国产成人精品久久二区二区91 | 免费不卡视频 | 高清人人天天夜夜曰狠狠狠狠 | 精品欧美一区二区三区精品久久 | 久久久九九九九 | 国产黄色在线 | 国产色| 久久国产婷婷国产香蕉 | 日韩精品二区 | www.婷婷 | 免费av播放 | 六月色婷|