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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17084|回復: 31
收起左側

stc12c5a60s2單片機用自帶ADC采集電壓源程序

  [復制鏈接]
ID:210730 發表于 2017-6-13 11:37 | 顯示全部樓層 |閱讀模式
stc12c5a60s2采集電壓實物圖:
0.png


單片機源程序如下:
  1. /***********************************************************
  2. 程序功能:STC12C5A60S2自帶ADC采集電壓信號+DS18B20溫度傳感器+LCD1602液晶顯示
  3. MCU型號: STC12C5A60S2
  4. 晶振頻率:11.0892MHz
  5. 整理時間:2012年4月25號
  6. ************************************************************/

  7. #include "reg51.h"
  8. #include "intrins.h"
  9. sfr P4        = 0XC0;
  10. sfr ADC_CONTR = 0XBC;
  11. sfr ADC_RES   = 0XBD;
  12. sfr ADC_LOW2  = 0XBE;
  13. sfr P1ASF     = 0X9D;

  14. typedef unsigned char BYTE;
  15. typedef unsigned int WORD;

  16. #include "1602.h"
  17. #include "DS18B20.h"

  18. #define ADC_POWER   0X80
  19. #define ADC_FLAG    0X10
  20. #define ADC_START   0X08
  21. #define ADC_SPEEDLL 0X00
  22. #define ADC_SPEEDL  0X20
  23. #define ADC_SPEEDH  0X40
  24. #define ADC_SPEEDHH 0X60

  25. void InitADC();
  26. void Delay(WORD n);
  27. WORD GetADCResult(BYTE ch);
  28. void DisplayADCResult(BYTE Channel);
  29. void DisplayTemperature();

  30. char qian=0,bai=0,shi=0,ge=0;
  31. BYTE ly_dis[4];//定義顯示緩沖區

  32. void main()
  33. {
  34.         WORD i=0;
  35.         float tt;
  36.         int ltemp;
  37.         InitADC();
  38.         LCDInit();
  39.         DisplayListChar(0, 0, "Temp:");
  40.         DisplayListChar(0, 1, "Volt:");
  41.         while(1)
  42.         {

  43.                 if(i==0)
  44.                         tmpchange();              //溫度轉換
  45.                 if(i==100)
  46.                 {
  47.                         tt=tmp()*0.0625;          //得到真實十進制溫度值,因為DS18B20
  48.                                                                 //可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度。
  49.                           ltemp=tt*10+0.5;           //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。

  50.                         if(ltemp<0)
  51.                         {                //判斷第一位顯示整數還是負號
  52.                                 ly_dis[0]=0xbf;
  53.                                 ltemp=0-ltemp;        
  54.                         }
  55.                         else
  56.                                 ly_dis[0]=ltemp/1000;//顯示百位值
  57.                         ltemp=ltemp%1000;
  58.                         ly_dis[1]=ltemp/100;        //顯示溫度十位值
  59.                         ltemp=ltemp%100;
  60.                         ly_dis[2]=ltemp/10;                //顯示溫度個位值
  61.                         ly_dis[3]=ltemp%10;                //顯示小數點后一位
  62.                 }
  63.                 i++;
  64.                 if(i==3000)
  65.                 {
  66.                         DisplayADCResult(0);
  67.                         i=0;
  68.                 }                        
  69.                 DisplayTemperature();        //調用顯示               
  70.         }
  71. }

  72. void DisplayADCResult(BYTE Channel)
  73. {

  74.         qian=GetADCResult(Channel)/1000;
  75.         bai=GetADCResult(Channel)%1000/100;
  76.         shi=GetADCResult(Channel)%1000%100/10;
  77.         ge=GetADCResult(Channel)%10;
  78.         if(0==qian)
  79.         DisplayOneChar(5,1,' ');
  80.         else
  81.         DisplayOneChar(5,1,table[qian]);

  82.         if(0==bai&&0==qian)
  83.         DisplayOneChar(6,1,' ');
  84.         else
  85.         DisplayOneChar(6,1,table[bai]);

  86.         DisplayOneChar(7,1,table[shi]);
  87.         DisplayOneChar(8,1,table[ge]);
  88.         
  89.         DisplayOneChar(9, 1, 'v');
  90.                
  91. }

  92. void DisplayTemperature()
  93. {
  94.         if(0==ly_dis[0])
  95.                 DisplayOneChar(5, 0, ' ');
  96.         else
  97.                 DisplayOneChar(5, 0, table[ly_dis[0]]);
  98.         DisplayOneChar(6, 0, table[ly_dis[1]]);
  99.         DisplayOneChar(7, 0, table[ly_dis[2]]);
  100.         DisplayOneChar(8, 0, '.');
  101.     DisplayOneChar(9, 0, table[ly_dis[3]]);
  102.         DisplayOneChar(10, 0, 0xdf);
  103.         DisplayOneChar(11, 0, 'C');
  104. }

  105. WORD GetADCResult(BYTE ch)
  106. {
  107.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         _nop_();
  112.         while(!(ADC_CONTR&ADC_FLAG));
  113.         ADC_CONTR&=~ADC_FLAG;

  114.         return ADC_RES*4+ADC_LOW2;
  115. }

  116. void InitADC()
  117. {
  118. ……………………

  119. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png

所有資料51hei提供下載:
STC12C5A60S2自帶ADC采集電壓信號 DS18B20溫度傳感器 LCD1602液晶顯示.rar (458.99 KB, 下載次數: 625)



評分

參與人數 2黑幣 +18 收起 理由
74LS161 + 6 很給力!
perfect123 + 12 驗證通過,而且是完全屬實的

查看全部評分

回復

使用道具 舉報

ID:810174 發表于 2020-8-26 16:37 | 顯示全部樓層
調試了。挺好,我的獲得的電壓數據怎么是實際數據的大約兩倍呢
51_20200826161749.jpg

另外一點,提示大家
void DisplayADCResult(BYTE Channel)
{

        qian=GetADCResult(Channel)/1000;
        bai=GetADCResult(Channel)%1000/100;
        shi=GetADCResult(Channel)%1000%100/10;
        ge=GetADCResult(Channel)%10;

這段最好寫一次=GetADCResult(Channel),因為在獲得數據接近整數時,會發生bug。
例如3.98跳到3.02,實際上應該是4.02。
改成
word data=GetADCResult(Channel);
  qian=data/1000;
        bai=data%1000/100;
        shi=data%1000%100/10;
        ge=data%10;

就不會有問題了。
回復

使用道具 舉報

ID:196205 發表于 2017-7-17 11:13 | 顯示全部樓層
謝謝大神 的分享了,謝謝謝謝
回復

使用道具 舉報

ID:140183 發表于 2018-9-16 09:29 | 顯示全部樓層
不知道準確不?
回復

使用道具 舉報

ID:398585 發表于 2018-9-16 11:19 來自觸屏版 | 顯示全部樓層
學習一下。
回復

使用道具 舉報

ID:335063 發表于 2018-10-31 12:18 | 顯示全部樓層
可以測多少V的電壓呢?
回復

使用道具 舉報

ID:427541 發表于 2018-11-16 09:54 | 顯示全部樓層
下載看看
回復

使用道具 舉報

ID:90353 發表于 2018-11-22 17:23 | 顯示全部樓層
感謝分享,謝謝
回復

使用道具 舉報

ID:270331 發表于 2018-11-29 11:01 | 顯示全部樓層
非常感謝
回復

使用道具 舉報

ID:383987 發表于 2019-3-11 20:02 | 顯示全部樓層
能用?
回復

使用道具 舉報

ID:496304 發表于 2019-4-4 16:40 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:99056 發表于 2019-4-15 14:10 | 顯示全部樓層

謝謝大神 的分享了,謝謝謝謝
回復

使用道具 舉報

ID:528599 發表于 2019-5-7 18:44 | 顯示全部樓層
真好 謝謝 很有用
回復

使用道具 舉報

ID:525384 發表于 2019-5-12 20:47 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:525384 發表于 2019-5-12 20:47 | 顯示全部樓層
謝謝樓主分享,樓主大好人
回復

使用道具 舉報

ID:505113 發表于 2019-8-20 21:04 | 顯示全部樓層
下載試試  主要是ADC采集
回復

使用道具 舉報

ID:556770 發表于 2019-9-22 15:28 | 顯示全部樓層
試試看
回復

使用道具 舉報

ID:296319 發表于 2019-9-24 22:26 | 顯示全部樓層
可用,哈哈
回復

使用道具 舉報

ID:646449 發表于 2019-12-5 08:56 | 顯示全部樓層
好有用,非常感謝
回復

使用道具 舉報

ID:646449 發表于 2019-12-5 08:58 | 顯示全部樓層
找了好久的ADC模塊
回復

使用道具 舉報

ID:646449 發表于 2019-12-5 09:05 | 顯示全部樓層
為什么有typedef unsigned char BYTE;啊
回復

使用道具 舉報

ID:587108 發表于 2019-12-8 12:18 | 顯示全部樓層
希望能用到,感謝樓主分享!
回復

使用道具 舉報

ID:232956 發表于 2020-3-9 22:42 | 顯示全部樓層
請問為什么是2倍?
回復

使用道具 舉報

ID:105481 發表于 2020-3-10 09:16 | 顯示全部樓層
學習一下。
回復

使用道具 舉報

ID:135635 發表于 2020-4-13 16:35 | 顯示全部樓層
學習一下,謝謝
回復

使用道具 舉報

ID:764431 發表于 2020-5-29 17:23 | 顯示全部樓層
謝謝大神分享
回復

使用道具 舉報

ID:75864 發表于 2020-8-5 23:38 | 顯示全部樓層
學習一下,感謝
回復

使用道具 舉報

ID:69310 發表于 2020-8-16 10:42 | 顯示全部樓層
感謝,正在找這個資料,謝謝大神分享!
回復

使用道具 舉報

ID:66377 發表于 2020-8-26 21:33 | 顯示全部樓層
能否直接把交流220V分壓后供檢測?是否會干擾單片機?
回復

使用道具 舉報

ID:620717 發表于 2020-10-11 13:21 | 顯示全部樓層
感謝分享,程序可以運行、。。。。
回復

使用道具 舉報

ID:345773 發表于 2021-7-21 17:09 | 顯示全部樓層
可以可以很可靠
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产一区二区三区不卡 | 亚州毛片 | 色综合久久久 | 免费h在线 | 午夜99 | 国产精品毛片一区二区三区 | 国内精品视频在线 | 91av导航| 日韩精品在线播放 | 99re6在线视频 | 亚州av在线 | 国内av在线 | 午夜国产| 久久亚洲精品久久国产一区二区 | 99色综合| 久草精品视频 | 精品久久久久久久久久久院品网 | 久久亚洲欧美日韩精品专区 | 国产小视频在线 | 精品视频在线观看 | 特级a欧美做爰片毛片 | 日日爱夜夜操 | 日本成人在线免费视频 | 在线视频中文字幕 | 午夜丁香视频在线观看 | 亚洲国产精品精华素 | 精品国产一区二区在线 | 免费一级做a爰片久久毛片潮喷 | 香蕉一区 | 日韩精品区 | 91精品国产91久久久久福利 | 在线观看成人小视频 | 欧美综合在线视频 | 午夜免费小视频 | 在线观看免费av网 | 国产综合久久 | 成人精品啪啪欧美成 | 亚洲国产精品久久久 | 粉嫩国产精品一区二区在线观看 | 亚洲狠狠爱 | 欧美一区视频 |