找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5075|回復: 5
打印 上一主題 下一主題
收起左側

關于ADC0831讀取熱敏電阻如何轉化為阻值并顯示溫度

[復制鏈接]
跳轉到指定樓層
樓主
ID:709561 發(fā)表于 2020-11-20 16:18 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
購買了一個ADC0831就試著編寫程序,讀取電壓值正確。使用NTC(3950   10K)顯示溫度,但是在轉換阻值與查表卻無法編寫出正確的程序,經(jīng)多次實驗還是無法寫出程序,實屬無奈還請大神不吝賜教,給予文獻作為參考不勝感激。!單片機使用;STC89C52;


#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit SCK = P1^0;    //11腳數(shù)據(jù)時鐘
sbit RCK = P1^1;    //12腳輸出時鐘
sbit SI  = P1^2;    //14腳數(shù)據(jù)

sbit CS=P1^3;        //ADC片選信號
sbit CLK=P1^4;        //ADC時鐘信號
sbit DO=P1^5;        //ADC數(shù)據(jù)接口

unsigned int NTC_R;//定義熱敏電阻阻值變量
unsigned char code segmcode[]={
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90  //共陰極數(shù)碼管段碼0-9
};
unsigned int code Ttable[106][2]={//溫度與電阻阻值對應關系表格
0,3274,//0度對應阻值32.74k
1,3111,//1度對應阻值31.11k
2,2957,//2度對應阻值29.57k
3,2812,//
4,2674,//
5,2545,
6,2422,
7,2306,
8,2196,
9,2092,
10,1993,
11,1900,
12,1811,
13,1728,
14,1648,
15,1573,
16,1501,
17,1433,
18,1369,
19,1308,
20,1250,
21,1194,
22,1142,
23,1092,
24,1045,
25,1000,//25度對應阻值10k               
26,957,//26度對應阻值9.57k
27,916,
28,877,
29,840,
30,805,
31,771,
32,739,
33,709,
34,679,
35,652,
36,625,
37,600,
38,576,
39,553,
40,531,
41,510,
42,490,
43,471,
44,453,
45,435,
46,418,
47,402,
48,387,
49,372,
50,358,
51,345,
52,332,
53,320,
54,308,
55,297,
56,286,
57,276,
58,266,
59,256,
60,247,
61,238,
62,230,
63,222,
64,214,
65,207,
66,199,
67,193,
68,186,
69,180,
70,174,
71,168,
72,162,
73,157,
74,        152,
75,        147,
76,        142,
77,        137,
78,        133,
79,        128,
80,        124,
81,        120,
82,        116,
83,        113,
84,        109,
85,        106,
86,        102,//86度對應阻值1.02k
87,        99,//87度對應阻值0.99k
88,        96,
89,        93,
90,        90,
91,        88,
92,        85,
93,        82,
94,        80,
95,        78,
96,        75,
97,        73,
98,        71,
99,        69,
100,67,
101,65,
102,63,
103,61,
104,59,
105,58//105度對應阻值0.58k
};
unsigned char data bitcode[4]={0,0,0,0};  //數(shù)碼管顯示位置 1-4
unsigned int date,i;

void hc595(uchar num)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        SI=(num<<i)&0x80;
        SCK=0;
        _nop_();
        SCK=1;
        SCK=0;
    }
    RCK=0;
    _nop_();
    RCK=1;
    RCK=0;
}
unsigned char ad_conv(void){
        unsigned char i,com;
        CS=1;
        CLK=0;        _nop_();        _nop_();
        CS=0;        _nop_();        _nop_();//CS置低,啟動轉換
    CLK=1;        _nop_();        _nop_();
        CLK=0;        _nop_();        _nop_();//第一個下降沿,準備輸出數(shù)據(jù)
        CLK=1;        _nop_();        _nop_();

        for(i=8;i>0;i--){
                CLK=1;        //第二至九個下降沿
        _nop_();
        _nop_();
                com<<=1;//左移,先采最高位
                if(DO)com++;//采當前數(shù)據(jù)
                CLK=0;
                _nop_();
            _nop_();
        }       
        CS=1;
    _nop_();
    _nop_();
        return com;
}

//數(shù)碼管顯:
void display()
{
        static uchar i=0;
        bitcode[0]=segmcode[date/100]   ;
        bitcode[1]=segmcode[date%100/10];
        bitcode[2]=segmcode[date%10];
        P0=0xFF;
        hc595(0x01<<i);
        P0=bitcode[i];
        i++;
        i%=3;
}
void main(void)
{
   uchar i = 0;
        while(1)
        {
            i++;
            if(i==100)
            {
                i=0;
                date=ad_conv()*100;   
                date=date/51;        
            }
            display();      //顯示
        }
       
}

最佳答案

查看完整內(nèi)容

給你寫了一個簡單的溫度表示例,8位ADC溫度不是很準確,需要補充完善,但程序框架和邏輯沒有問題。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2020-11-20 16:18 | 只看該作者
1P1P 發(fā)表于 2020-11-23 13:35
是的更改了你給的電壓碼表,電壓值轉換阻值/溫度顯示錯誤,麻煩看一下是不是我的轉換程序錯誤,試了很多 ...

給你寫了一個簡單的溫度表示例,8位ADC溫度不是很準確,需要補充完善,但程序框架和邏輯沒有問題。
  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit CS =P1^0;
  6. sbit CLK=P1^1;
  7. sbit DO =P1^2;
  8. //順序共陰極數(shù)碼管段碼表,段碼a-h順序接PX0-PX7
  9. uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
  10.                 0x3f,0x06,0x5b,0x4f,
  11.                 0x66,0x6d,0x7d,0x07,
  12.                 0x7f,0x6f,0x77,0x7c,
  13.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  14. uchar data dis_buf[4];
  15. uchar code Temp[102]={
  16. 239         ,//        0
  17. 238         ,//        1
  18. 237         ,//        2
  19. 236         ,//        3
  20. 235         ,//        4
  21. 234         ,//        5
  22. 233         ,//        6
  23. 232         ,//        7
  24. 231         ,//        8
  25. 230         ,//        9
  26. 229         ,//        10
  27. 227         ,//        11
  28. 226         ,//        12
  29. 225         ,//        13
  30. 224         ,//        14
  31. 222         ,//        15
  32. 221         ,//        16
  33. 219         ,//        17
  34. 218         ,//        18
  35. 216         ,//        19
  36. 215         ,//        20
  37. 213         ,//        21
  38. 212         ,//        22
  39. 210         ,//        23
  40. 208         ,//        24
  41. 207         ,//        25
  42. 205         ,//        26
  43. 203         ,//        27
  44. 201         ,//        28
  45. 199         ,//        29
  46. 197         ,//        30
  47. 195         ,//        31
  48. 193         ,//        32
  49. 191         ,//        33
  50. 189         ,//        34
  51. 187         ,//        35
  52. 185         ,//        36
  53. 183         ,//        37
  54. 181         ,//        38
  55. 179         ,//        39
  56. 177         ,//        40
  57. 174         ,//        41
  58. 172         ,//        42
  59. 170         ,//        43
  60. 168         ,//        44
  61. 165         ,//        45
  62. 163         ,//        46
  63. 161         ,//        47
  64. 158         ,//        48
  65. 156         ,//        49
  66. 154         ,//        50
  67. 151         ,//        51
  68. 149         ,//        52
  69. 147         ,//        53
  70. 144         ,//        54
  71. 142         ,//        55
  72. 140         ,//        56
  73. 137         ,//        57
  74. 135         ,//        58
  75. 133         ,//        59
  76. 130         ,//        60
  77. 128         ,//        61
  78. 126         ,//        62
  79. 124         ,//        63
  80. 121         ,//        64
  81. 119         ,//        65
  82. 117         ,//        66
  83. 115         ,//        67
  84. 112         ,//        68
  85. 110         ,//        69
  86. 108         ,//        70
  87. 106         ,//        71
  88. 104         ,//        72
  89. 102         ,//        73
  90. 100         ,//        74
  91. 98         ,//        75
  92. 96         ,//        76
  93. 94         ,//        77
  94. 92         ,//        78
  95. 90         ,//        79
  96. 88         ,//        80
  97. 86         ,//        81
  98. 84         ,//        82
  99. 83         ,//        83
  100. 81         ,//        84
  101. 79         ,//        85
  102. 77         ,//        86
  103. 76         ,//        87
  104. 74         ,//        88
  105. 72         ,//        89
  106. 71         ,//        90
  107. 69         ,//        91
  108. 68         ,//        92
  109. 66         ,//        93
  110. 65         ,//        94
  111. 63         ,//        95
  112. 62         ,//        96
  113. 61         ,//        97
  114. 59         ,//        98
  115. 58         ,//        99
  116. 57         ,//        100
  117. 56          //        101
  118. };
  119. uchar Read_ADC0831()
  120. {
  121.         uchar i,temp;
  122.         DO=1;
  123.         _nop_();
  124.         _nop_();
  125.         CS=0;
  126.         _nop_();
  127.         _nop_();
  128.         CLK=0;
  129.         _nop_();
  130.         _nop_();
  131.         CLK=1;
  132.         _nop_();
  133.         _nop_();
  134.         CLK=0;
  135.         _nop_();
  136.         _nop_();
  137.         CLK=1;
  138.         _nop_();
  139.         _nop_();
  140.         CLK=0;
  141.         _nop_();
  142.         _nop_();
  143.         for(i=0;i<8;i++)
  144.         {
  145.                 CLK=1;
  146.                 _nop_();
  147.                 _nop_();
  148.                 temp<<=1;
  149.                 if(DO) temp++;
  150.                 CLK=0;
  151.                 _nop_();
  152.                 _nop_();
  153.         }
  154.         CS=1;
  155.         _nop_();
  156.         _nop_();
  157.         return temp;
  158. }
  159. void display()
  160. {
  161.         static uchar i=0;
  162.         P0=0x00;
  163.         P2=~(0x01<<i);
  164.         P0=dis_buf[i];
  165.         i++;
  166.         i%=4;
  167. }
  168. void delay(uint n)
  169. {
  170.         uint i,j;
  171.         for(i=n;i>0;i--)
  172.                 for(j=120;j>0;j--);
  173. }
  174. /*******主函數(shù)********/
  175. void main()
  176. {
  177.         uint i,T,date;
  178.         while(1)
  179.         {         
  180.                 date=Read_ADC0831();
  181.                 for(i=0;i<101;i++)
  182.                 {
  183.                         if(date<=Temp[i]&&date>Temp[i+1])
  184.                         {
  185.                                 T=i;
  186.                                 break;
  187.                         }
  188.                 }
  189.                 dis_buf[0]=table[T/100];
  190.                 dis_buf[1]=table[T/10%10];
  191.                 dis_buf[2]=table[T%10];
  192.                 dis_buf[3]=0x39;//'C'
  193.                 display();
  194.                 delay(1);
  195.         }
  196. }

復制代碼





回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2020-11-21 16:04 | 只看該作者
ADC0831需要輸入的是電壓值,電壓范圍0~VCC。要根據(jù)生產(chǎn)商提供的溫度/阻值資料制作數(shù)據(jù)表。獲取的ADC轉換值通過查表得到當前溫度值。 10K B3950 NTC溫阻電壓編碼表 上偏電阻2.4K.zip (23.96 KB, 下載次數(shù): 29)




回復

使用道具 舉報

地板
ID:709561 發(fā)表于 2020-11-23 13:35 | 只看該作者
wulin 發(fā)表于 2020-11-21 16:04
ADC0831需要輸入的是電壓值,電壓范圍0~VCC。要根據(jù)生產(chǎn)商提供的溫度/阻值資料制作數(shù)據(jù)表。獲取的ADC轉換值 ...

是的更改了你給的電壓碼表,電壓值轉換阻值/溫度顯示錯誤,麻煩看一下是不是我的轉換程序錯誤,試了很多次顯示還是錯的,還是摸不著頭腦。
//電壓換算成溫度//與上面程序對應
void temp_data()
{
   float Rt=0;
   float Rp=10000;
   float T2=273.15+25;
   float Bx=3950;
   float Ka=273.15;
   float vol=0;
   vol=(float)((date)*(5/256));
   Rt=(5-vol)*10000/vol;
   temp=1/(1/T2+log(Rt/Rp)/Bx)-Ka+0.5;
}
回復

使用道具 舉報

5#
ID:709561 發(fā)表于 2020-11-25 11:16 | 只看該作者
wulin 發(fā)表于 2020-11-23 19:36
給你寫了一個簡單的溫度表示例,8位ADC溫度不是很準確,需要補充完善,但程序框架和邏輯沒有問題。

多謝你給予的幫助。!
回復

使用道具 舉報

6#
ID:398219 發(fā)表于 2023-3-1 20:27 | 只看該作者
1P1P 發(fā)表于 2020-11-25 11:16
多謝你給予的幫助。!

樓主,單片機AD采集的固定電阻和NTC電阻中間,分出來的電壓,你是怎么轉換成阻值的呢,謝謝指導
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表