找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3793|回复: 5
打印 上一主题 下一主题
收起左侧

关于ADC0831读取热敏电阻如何转化为阻值并显示温度

[复制链接]
跳转到指定楼层
楼主
50黑币
购买了一个ADC0831就试着编写程序,读取电压值正确。使用NTC(3950   10K)显示温度,但是在转换阻值与查表却无法编写出正确的程序,经多次实验还是无法写出程序,实属无奈还请大神不吝赐教,给予文献作为参考不胜感激!!!单片机使用;STC89C52;


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

sbit SCK = P1^0;    //11脚数据时钟
sbit RCK = P1^1;    //12脚输出时钟
sbit SI  = P1^2;    //14脚数据

sbit CS=P1^3;        //ADC片选信号
sbit CLK=P1^4;        //ADC时钟信号
sbit DO=P1^5;        //ADC数据接口

unsigned int NTC_R;//定义热敏电阻阻值变量
unsigned char code segmcode[]={
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90  //共阴极数码管段码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};  //数码管显示位置 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_();//第一个下降沿,准备输出数据
        CLK=1;        _nop_();        _nop_();

        for(i=8;i>0;i--){
                CLK=1;        //第二至九个下降沿
        _nop_();
        _nop_();
                com<<=1;//左移,先采最高位
                if(DO)com++;//采当前数据
                CLK=0;
                _nop_();
            _nop_();
        }       
        CS=1;
    _nop_();
    _nop_();
        return com;
}

//数码管显:
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();      //显示
        }
       
}

最佳答案

查看完整内容

给你写了一个简单的温度表示例,8位ADC温度不是很准确,需要补充完善,但程序框架和逻辑没有问题。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-11-20 16:18 | 只看该作者
1P1P 发表于 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. //顺序共阴极数码管段码表,段码a-h顺序接PX0-PX7
  9. uchar code table[]={//共阴数码管段码"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. /*******主函数********/
  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 发表于 2020-11-21 16:04 | 只看该作者
ADC0831需要输入的是电压值,电压范围0~VCC。要根据生产商提供的温度/阻值资料制作数据表。获取的ADC转换值通过查表得到当前温度值。 10K B3950 NTC温阻电压编码表 上偏电阻2.4K.zip (23.96 KB, 下载次数: 28)




回复

使用道具 举报

地板
ID:709561 发表于 2020-11-23 13:35 | 只看该作者
wulin 发表于 2020-11-21 16:04
ADC0831需要输入的是电压值,电压范围0~VCC。要根据生产商提供的温度/阻值资料制作数据表。获取的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 发表于 2020-11-25 11:16 | 只看该作者
wulin 发表于 2020-11-23 19:36
给你写了一个简单的温度表示例,8位ADC温度不是很准确,需要补充完善,但程序框架和逻辑没有问题。

多谢你给予的帮助!!!
回复

使用道具 举报

6#
ID:398219 发表于 2023-3-1 20:27 | 只看该作者
1P1P 发表于 2020-11-25 11:16
多谢你给予的帮助!!!

楼主,单片机AD采集的固定电阻和NTC电阻中间,分出来的电压,你是怎么转换成阻值的呢,谢谢指导
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表