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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)+ADC0832實現(xiàn)量程0~25V數(shù)字電壓表的仿真程序設(shè)計

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:825513 發(fā)表于 2021-9-19 12:29 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
第一次接觸模數(shù)轉(zhuǎn)換,做了這么一個小仿真,測量0~25V的輸入電壓,以4位數(shù)(兩位小數(shù))的形式顯示在一個四位共陽數(shù)碼管上,測量誤差不大于0.1V。
ADC0832只是一個對0~5V電壓進(jìn)行模擬轉(zhuǎn)數(shù)字的器件,分辨率8位,即有從0到255個擋位,每一檔約為(5/255)V,即0.02V,為了實現(xiàn)0~25V的轉(zhuǎn)換,先將待測電壓通過電位器(滑動電阻)縮小5倍,保證其始終處于0~5V內(nèi)再輸入ADC0832(ADC0832實際轉(zhuǎn)換的模擬量在0~5V之內(nèi)),然后再將ADC0832轉(zhuǎn)換后的數(shù)值*5,即可獲知待測電壓的實際值。


但這種取巧的方式雖然能在不換器件的前提下實現(xiàn)量程的擴(kuò)充,但缺陷是誤差值也隨之放大(因為先把電壓通過電位器幾乎零誤差的縮小1/5,然后再把ADC0832的轉(zhuǎn)換結(jié)果放大5倍),ADC0832的誤差值大約0.02V,電壓表實際測量的誤差值大約0.1V

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

源碼:
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. sbit CS=P3^5;
  4. sbit CLK=P3^3;
  5. sbit DI=P3^4;
  6. sbit DO=P3^4;
  7. sbit dot=P0^5;      //小數(shù)點

  8. unsigned char dat=0x00;
  9. unsigned char nums[]={0x00,0x00,0x00,0x00};
  10. unsigned char channel;      //轉(zhuǎn)換通道
  11. unsigned char LEDS[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xB8,0x20,0x28};       //共陽4位數(shù)碼管段碼,字符顯示從'0'到'9'

  12. unsigned char ADC0832(unsigned char channel)        //模數(shù)轉(zhuǎn)換
  13. {
  14.     unsigned char i;
  15.     unsigned char x=0x00;
  16.     unsigned char y=0x00;

  17.     CLK=0;      //初始化
  18.     DI=1;
  19.     _nop_();
  20.     CS=0;
  21.     _nop_();
  22.     CLK=1;
  23.     _nop_();

  24.     if(channel==0x00)       //通道選擇
  25.     {       //通道0
  26.         CLK=0;
  27.         DI=1;
  28.         _nop_();
  29.         CLK=1;
  30.         _nop_();
  31.         CLK=0;
  32.         DI=0;
  33.         _nop_();
  34.         CLK=1;
  35.         _nop_();
  36.     }
  37.     else        //通道1
  38.     {
  39.         CLK=0;
  40.         DI=1;
  41.         _nop_();
  42.         CLK=1;
  43.         _nop_();
  44.         CLK=0;
  45.         DI=1;
  46.         _nop_();
  47.         CLK=1;
  48.         _nop_();
  49.     }

  50.     CLK=0;
  51.     DI=1;
  52.     for(i=0;i<8;i++)        //讀取ADC0832輸出的前8位數(shù)據(jù)
  53.     {
  54.         x<<=1;
  55.         _nop_();
  56.         CLK=1;
  57.         _nop_();
  58.         CLK=0;
  59.         if(DO==1)
  60.         {
  61.             x|=0x01;
  62.         }
  63.         else
  64.         {
  65.             x|=0x00;
  66.         }
  67.     }
  68.     for(i=0;i<8;i++)        //讀取ADC0832輸出的后8位數(shù)據(jù)
  69.     {
  70.         y>>=1;
  71.         if(DO==1)
  72.         {
  73.             y|=0x80;
  74.         }
  75.         else
  76.         {
  77.             y|=0x00;
  78.         }
  79.         _nop_();
  80.         CLK=1;
  81.         _nop_();
  82.         CLK=0;
  83.     }
  84.     if(x==y)        //校驗,比較前8位與后8位的值
  85.     {
  86.         dat=x;
  87.     }
  88.     _nop_();
  89.     CS=1;       //釋放ADC0832
  90.     DO=1;
  91.     CLK=1;
  92.     return dat;
  93. }

  94. void Convert(unsigned char dat0)        //數(shù)據(jù)處理
  95. {
  96.     unsigned int x;
  97.     x=dat0*0.0196*100*5;
  98.     nums[0]=x/1000;
  99.     nums[1]=x%1000/100;
  100.     nums[2]=x%1000%100/10;
  101.     nums[3]=x%1000%100%10;
  102. }

  103. void Delay()        //數(shù)碼管顯示
  104. {
  105.     unsigned char i,j;
  106.     for(i=0;i<1;i++)
  107.     {
  108.         for(j=0;j<121;j++);
  109.     }
  110. }

  111. void Display()
  112. {
  113.     P0=LEDS[nums[0]];
  114.     P2=0xFE;
  115.     Delay();
  116.     P2=0xFF;

  117.     P0=LEDS[nums[1]];
  118.     dot=0;
  119.     P2=0xFD;
  120.     Delay();
  121.     P2=0xFF;

  122.     P0=LEDS[nums[2]];
  123.     P2=0xFB;
  124.     Delay();
  125.     P2=0xFF;

  126.     P0=LEDS[nums[3]];
  127.     P2=0xF7;
  128.     Delay();
  129.     P2=0xFF;
  130. }

  131. void main()
  132. {
  133.     while(1)
  134.     {
  135.         dat=ADC0832(channel);
  136.         Convert(dat);
  137.         Display();
  138.     }
  139. }
復(fù)制代碼



上圖仿真工程文件和.c文件51hei附件下載:
ADC0832數(shù)字電壓表(0~25V).zip (43.82 KB, 下載次數(shù): 177)

評分

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

查看全部評分

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

使用道具 舉報

來自 2#
ID:262 發(fā)表于 2022-9-19 22:16 | 只看該作者
634658537 發(fā)表于 2022-9-19 15:54
仿真圖為什么打不開

要用Proteus8.8版本,你看我用這個版本的打開效果,動圖

51hei.gif (315.33 KB, 下載次數(shù): 129)

51hei.gif
回復(fù)

使用道具 舉報

板凳
ID:1011897 發(fā)表于 2022-4-14 15:46 | 只看該作者
您好  如果我想制成0-200的 縮小40倍嗎  精度我這把可以不考慮 1v都可以 需要怎么修改程序
回復(fù)

使用道具 舉報

地板
ID:622274 發(fā)表于 2022-9-19 15:54 | 只看該作者
仿真圖為什么打不開
回復(fù)

使用道具 舉報

5#
ID:579397 發(fā)表于 2022-9-20 00:55 | 只看該作者
kinghhback 發(fā)表于 2022-4-14 15:46
您好  如果我想制成0-200的 縮小40倍嗎  精度我這把可以不考慮 1v都可以 需要怎么修改程序

是的,把R1 R2的電阻修改,用分壓公式

數(shù)據(jù)修改如下:
void Convert(unsigned char dat0)        //數(shù)據(jù)處理
{
    unsigned int x;
    x=dat0*0.0196*100*5;
    nums[0]=x/1000;
    nums[1]=x%1000/100;
    nums[2]=x%1000%100/10;
    nums[3]=x%1000%100%10;
}
回復(fù)

使用道具 舉報

6#
ID:183990 發(fā)表于 2024-7-9 21:27 | 只看該作者
你好,問下10V一下10位數(shù)的0如何不顯示呢
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线播放国产一区二区三区 | 国产区在线 | 久久亚洲高清 | 一区二区三区四区免费观看 | 国产欧美在线视频 | 欧美精品一区二区三区四区五区 | 久久久青草婷婷精品综合日韩 | 色眯眯视频在线观看 | 国产美女精品 | 成人精品| 国产美女在线免费观看 | 欧产日产国产精品国产 | 久草网站 | 国产精品一区二区av | 欧美日韩综合精品 | 国产成人在线播放 | 国产精品久久久爽爽爽麻豆色哟哟 | 一区视频在线播放 | 一区不卡在线观看 | www.久久| 欧美a免费 | 亚洲美乳中文字幕 | 欧美11一13sex性hd | 国产成人免费视频 | 亚洲免费网 | 日本视频一区二区三区 | 特级黄一级播放 | 精国产品一区二区三区四季综 | 欧美一区二区三区小说 | 特黄级国产片 | 国产精品视频在线播放 | 在线播放一区二区三区 | av免费网站在线观看 | 中文字幕在线播放第一页 | 天天插天天射天天干 | a级片www| 欧美精品一区免费 | 成人一区二 | 精品久久一区 | 国产成人精品a视频 | 成人免费视频久久 |