找回密码
 立即注册

QQ登录

只需一步,快速开始

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

NTC热敏电阻测温度 单片机C和汇编源程序

  [复制链接]
跳转到指定楼层
楼主
ID:217640 发表于 2017-7-6 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[2] NTC热敏电阻器参数介绍:
标称阻值
标称阻值是NTC热敏电阻器设计的电阻值,常在热敏电阻器表面标出。标称阻值是指在基准温度为25℃时零功率阻值,因此又被称为电阻值R25。
【额定功率】
额定功率是指热敏电阻器在环境温度25℃、相对湿度为45%~80%及大气压力为0.87~1.07Pa的大气条件下,长期连续负荷所允许的耗散功率
【B值范围】
B值范围(K)是负温度系数热敏电阻器的热敏指数,反映了两个温度之间的电阻变化。它被定义为两个温度下零功率电阻值的自然对数之差与这个温度倒数之差的比值。B值可用下述公式计算,即
式中,R1、R2分别是绝对温度T1、T2时的电阻值(Ω)。

【零功率电阻值】
在规定温度下测量热敏电阻器的电阻值,当由于电阻器内部发热引起的电阻值变化相对于总的测量误差来说可以忽略不计时测得的电阻值。
耗散系数δ(mW/℃)】
耗散系数是指热敏电阻器消耗的功率与环境温度变化之比,即

式中,W是热敏电阻消耗的功率(mW);T是热平衡时的温度(℃);T0是周围环境温度(℃);I是在温度为T时通过热敏电阻器的电流(A);R是在温度为T时热敏电阻器的电阻值(Ω)。

【时间常数τ(s)】
时间常数τ(s)指的是热敏电阻器在零功率状态下,当环境温度由一个特定温度向另一个特定温度突变时,热敏电阻器阻值变化63.2%所需的时间。
电阻温度系数
电阻温度系数是指环境温度变化1℃时热敏电阻器电阻值的相对变化量。知道某一个型号热敏电阻器的电阻温度系数后,就可以估算出热敏电阻器在相应温度下的实际电阻值。



单片机源程序如下:

  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
  5. /*---------------------------------------------------------------------*/


  6. /*************        本程序功能说明        **************

  7. 读ADC和测温度.

  8. 用STC的MCU的IO方式控制74HC595驱动8位数码管。

  9. 用户可以修改宏来选择时钟频率.

  10. 用户可以在"用户定义宏"中选择共阴或共阳. 推荐尽量使用共阴数码管.

  11. 使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户
  12. 修改MCU主时钟频率时,自动定时于1ms.

  13. 左边4位数码管显示ADC2接的电压基准TL431的读数, 右边4位数码管显示温度值, 分辨率0.1度.

  14. NTC使用1%精度的MF52 10K@25度C.

  15. 测温度时, 为了通用, 使用12位的ADC值, 使用对分查找表格来计算, 小数点后
  16. 一位数是用线性插补来计算的.

  17. 所以, 测温度的ADC3进行4次ADC连续采样, 变成12位的ADC来计算温度.

  18. ******************************************/

  19. #include        "config.H"
  20. #include        "adc.h"

  21. /****************************** 用户定义宏 ***********************************/

  22. #define                LED_TYPE        0x00                //定义LED类型, 0x00--共阴, 0xff--共阳

  23. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒

  24. /*****************************************************************************/






  25. /*************        本地常量声明        **************/
  26. u8 code t_display[]={                                                //标准字库
  27. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  28.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  29. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  30.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  31.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  32. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码


  33. /*************        IO口定义        **************/
  34. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  35. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  36. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


  37. /*************        本地变量声明        **************/

  38. u8         LED8[8];                //显示缓冲
  39. u8        display_index;        //显示位索引
  40. bit        B_1ms;                        //1ms标志

  41. u16        msecond;

  42. /*************        本地函数声明        **************/
  43. u16        get_temperature(u16 adc);


  44. /****************  外部函数声明和外部变量声明 *****************/



  45. /********************** ADC配置函数 ************************/
  46. void ADC_config(void)
  47. {
  48.         ADC_InitTypeDef                ADC_InitStructure;                                //结构定义
  49.         ADC_InitStructure.ADC_Px        = ADC_P12 | ADC_P13;//设置要做ADC的IO,        ADC_P10 ~ ADC_P17(或操作),ADC_P1_All
  50.         ADC_InitStructure.ADC_Speed     = ADC_90T;                        //ADC速度                        ADC_90T,ADC_180T,ADC_360T,ADC_540T
  51.         ADC_InitStructure.ADC_Power     = ENABLE;                        //ADC功率允许/关闭        ENABLE,DISABLE
  52.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H8L2;                //ADC结果调整,        ADC_RES_H2L8,ADC_RES_H8L2
  53.         ADC_InitStructure.ADC_Polity    = PolityLow;                //优先级设置        PolityHigh,PolityLow
  54.         ADC_InitStructure.ADC_Interrupt = DISABLE;                        //中断允许                ENABLE,DISABLE
  55.         ADC_Inilize(&ADC_InitStructure);                                        //初始化
  56.         ADC_PowerControl(ENABLE);                                                        //单独的ADC电源操作函数, ENABLE或DISABLE
  57. }


  58. /**********************************************/
  59. void main(void)
  60. {
  61.         u8        i;
  62.         u16        j;
  63.        
  64.         display_index = 0;
  65.         ADC_config();
  66.        
  67.         Timer0_1T();
  68.         Timer0_AsTimer();
  69.         Timer0_16bitAutoReload();
  70.         Timer0_Load(Timer0_Reload);
  71.         Timer0_InterruptEnable();
  72.         Timer0_Run();
  73.         EA = 1;                                                //打开总中断
  74.        
  75.         for(i=0; i<8; i++)        LED8[i] = 0x10;        //上电消隐

  76.        
  77.         while(1)
  78.         {
  79.                 if(B_1ms)        //1ms到
  80.                 {
  81.                         B_1ms = 0;
  82.                         if(++msecond >= 300)        //300ms到
  83.                         {
  84.                                 msecond = 0;
  85.                                 j = Get_ADC10bitResult(2);        //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误
  86.                                
  87.                                 if(j < 1024)
  88.                                 {
  89.                                         LED8[0] = j / 1000;                //显示ADC值
  90.                                         LED8[1] = (j % 1000) / 100;
  91.                                         LED8[2] = (j % 100) / 10;
  92.                                         LED8[3] = j % 10;
  93.                                         if(LED8[0] == 0)        LED8[0] = DIS_BLACK;
  94.                                 }
  95.                                 else        //错误
  96.                                 {
  97.                                         for(i=0; i<4; i++)        LED8[i] = DIS_;
  98.                                 }
  99.                                

  100.                                 j = Get_ADC10bitResult(3);        //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误
  101.                                 j += Get_ADC10bitResult(3);
  102.                                 j += Get_ADC10bitResult(3);
  103.                                 j += Get_ADC10bitResult(3);

  104.                                 if(j < 1024*4)
  105.                                 {
  106.                                 /*
  107.                                         LED8[0] = j / 1000;                //显示ADC值
  108.                                         LED8[1] = (j % 1000) / 100;
  109.                                         LED8[2] = (j % 100) / 10;
  110.                                         LED8[3] = j % 10;
  111.                                         if(LED8[0] == 0)        LED8[0] = DIS_BLACK;
  112.                                 */
  113.                                         j =        get_temperature(j);        //计算温度值

  114.                                         if(j >= 400)        F0 = 0,        j -= 400;                //温度 >= 0度
  115.                                         else                        F0 = 1,        j  = 400 - j;        //温度 <  0度
  116.                                         LED8[4] = j / 1000;                //显示温度值
  117.                                         LED8[5] = (j % 1000) / 100;
  118.                                         LED8[6] = (j % 100) / 10 + DIS_DOT;
  119.                                         LED8[7] = j % 10;
  120.                                         if(LED8[4] == 0)        LED8[4] = DIS_BLACK;
  121.                                         if(F0)        LED8[4] = DIS_;                //显示-
  122.                                 }
  123.                                 else        //错误
  124.                                 {
  125.                                         for(i=0; i<8; i++)        LED8[i] = DIS_;
  126.                                 }
  127.                         }

  128.                 }
  129.         }
  130. }
  131. /**********************************************/


  132. //        MF52E 10K at 25, B = 3950, ADC = 12 bits
  133. u16 code temp_table[]={
  134.                 140,        //;-40        0
  135.                 149,        //;-39        1
  136.                 159,        //;-38        2
  137.                 168,        //;-37        3
  138.                 178,        //;-36        4
  139.                 188,        //;-35        5
  140.                 199,        //;-34        6
  141.                 210,        //;-33        7
  142.                 222,        //;-32        8
  143.                 233,        //;-31        9
  144.                 246,        //;-30        10
  145.                 259,        //;-29        11
  146.                 272,        //;-28        12
  147.                 286,        //;-27        13
  148.                 301,        //;-26        14
  149.                 317,        //;-25        15
  150.                 333,        //;-24        16
  151.                 349,        //;-23        17
  152.                 367,        //;-22        18
  153.                 385,        //;-21        19
  154.                 403,        //;-20        20
  155.                 423,        //;-19        21
  156.                 443,        //;-18        22
  157.                 464,        //;-17        23
  158.                 486,        //;-16        24
  159.                 509,        //;-15        25
  160.                 533,        //;-14        26
  161.                 558,        //;-13        27
  162.                 583,        //;-12        28
  163.                 610,        //;-11        29
  164.                 638,        //;-10        30
  165.                 667,        //;-9        31
  166.                 696,        //;-8        32
  167.                 727,        //;-7        33
  168.                 758,        //;-6        34
  169.                 791,        //;-5        35
  170.                 824,        //;-4        36
  171.                 858,        //;-3        37
  172.                 893,        //;-2        38
  173.                 929,        //;-1        39
  174.                 965,        //;0        40
  175.                 1003,        //;1        41
  176.                 1041,        //;2        42
  177.                 1080,        //;3        43
  178.                 1119,        //;4        44
  179.                 1160,        //;5        45
  180.                 1201,        //;6        46
  181.                 1243,        //;7        47
  182.                 1285,        //;8        48
  183.                 1328,        //;9        49
  184.                 1371,        //;10        50
  185.                 1414,        //;11        51
  186.                 1459,        //;12        52
  187.                 1503,        //;13        53
  188.                 1548,        //;14        54
  189.                 1593,        //;15        55
  190.                 1638,        //;16        56
  191.                 1684,        //;17        57
  192.                 1730,        //;18        58
  193.                 1775,        //;19        59
  194.                 1821,        //;20        60
  195.                 1867,        //;21        61
  196.                 1912,        //;22        62
  197.                 1958,        //;23        63
  198.                 2003,        //;24        64
  199.                 2048,        //;25        65
  200.                 2093,        //;26        66
  201.                 2137,        //;27        67
  202.                 2182,        //;28        68
  203.                 2225,        //;29        69
  204.                 2269,        //;30        70
  205.                 2312,        //;31        71
  206.                 2354,        //;32        72
  207.                 2397,        //;33        73
  208.                 2438,        //;34        74
  209.                 2479,        //;35        75
  210.                 2519,        //;36        76
  211.                 2559,        //;37        77
  212.                 2598,        //;38        78
  213.                 2637,        //;39        79
  214.                 2675,        //;40        80
  215.                 2712,        //;41        81
  216.                 2748,        //;42        82
  217.                 2784,        //;43        83
  218.                 2819,        //;44        84
  219.                 2853,        //;45        85
  220.                 2887,        //;46        86
  221.                 2920,        //;47        87
  222.                 2952,        //;48        88
  223.                 2984,        //;49        89
  224.                 3014,        //;50        90
  225.                 3044,        //;51        91
  226.                 3073,        //;52        92
  227.                 3102,        //;53        93
  228.                 3130,        //;54        94
  229.                 3157,        //;55        95
  230.                 3183,        //;56        96
  231.                 3209,        //;57        97
  232.                 3234,        //;58        98
  233.                 3259,        //;59        99
  234.                 3283,        //;60        100
  235.                 3306,        //;61        101
  236.                 3328,        //;62        102
  237.                 3351,        //;63        103
  238.                 3372,        //;64        104
  239.                 3393,        //;65        105
  240.                 3413,        //;66        106
  241.                 3432,        //;67        107
  242.                 3452,        //;68        108
  243.                 3470,        //;69        109
  244.                 3488,        //;70        110
  245.                 3506,        //;71        111
  246.                 3523,        //;72        112
  247.                 3539,        //;73        113
  248.                 3555,        //;74        114
  249.                 3571,        //;75        115
  250.                 3586,        //;76        116
  251.                 3601,        //;77        117
  252.                 3615,        //;78        118
  253.                 3628,        //;79        119
  254.                 3642,        //;80        120
  255.                 3655,        //;81        121
  256.                 3667,        //;82        122
  257.                 3679,        //;83        123
  258.                 3691,        //;84        124
  259.                 3702,        //;85        125
  260.                 3714,        //;86        126
  261.                 3724,        //;87        127
  262.                 3735,        //;88        128
  263.                 3745,        //;89        129
  264.                 3754,        //;90        130
  265.                 3764,        //;91        131
  266.                 3773,        //;92        132
  267.                 3782,        //;93        133
  268.                 3791,        //;94        134
  269.                 3799,        //;95        135
  270.                 3807,        //;96        136
  271.                 3815,        //;97        137
  272.                 3822,        //;98        138
  273.                 3830,        //;99        139
  274.                 3837,        //;100        140
  275.                 3844,        //;101        141
  276.                 3850,        //;102        142
  277.                 3857,        //;103        143
  278.                 3863,        //;104        144
  279.                 3869,        //;105        145
  280.                 3875,        //;106        146
  281.                 3881,        //;107        147
  282.                 3887,        //;108        148
  283.                 3892,        //;109        149
  284.                 3897,        //;110        150
  285.                 3902,        //;111        151
  286.                 3907,        //;112        152
  287.                 3912,        //;113        153
  288.                 3917,        //;114        154
  289.                 3921,        //;115        155
  290.                 3926,        //;116        156
  291.                 3930,        //;117        157
  292.                 3934,        //;118        158
  293.                 3938,        //;119        159
  294.                 3942        //;120        160
  295. };

  296. /********************  计算温度 ***********************************************/
  297. // 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
  298. // 为了通用, ADC输入为12bit的ADC值.
  299. // 电路和软件算法设计: Coody
  300. /**********************************************/

  301. #define                D_SCALE                10                //结果放大倍数, 放大10倍就是保留一位小数
  302. u16        get_temperature(u16 adc)
  303. {
  304.         u16        code *p;
  305.         u16        i;
  306.         u8        j,k,min,max;
  307.        
  308.         adc = 4096 - adc;        //Rt接地
  309.         p = temp_table;
  310.         if(adc < p[0])                return (0xfffe);
  311.         if(adc > p[160])        return (0xffff);
  312.        
  313.         min = 0;                //-40度
  314.         max = 160;                //120度

  315.         for(j=0; j<5; j++)        //对分查表
  316.         {
  317.                 k = min / 2 + max / 2;
  318.                 if(adc <= p[k])        max = k;
  319.                 else                        min = k;
  320.         }
  321.                  if(adc == p[min])        i = min * D_SCALE;
  322.         else if(adc == p[max])        i = max * D_SCALE;
  323.         else        // min < temp < max
  324.         {
  325.                 while(min <= max)
  326.                 {
  327.                         min++;
  328.                         if(adc == p[min])        {i = min * D_SCALE;        break;}
  329.                         else if(adc < p[min])
  330.                         {
  331.                                 min--;
  332.                                 i = p[min];        //min
  333. ……………………

  334. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
15883879NTC-10K-74HC595.zip (93.85 KB, 下载次数: 1079)





评分

参与人数 5黑币 +25 收起 理由
wofei1314 + 5 很给力!
关外秀才 + 5 赞一个!
lujiangyuan + 5
a92031180 + 5 很给力!
qjzyx + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏40 分享淘帖 顶8 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-7-10 02:55 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:201936 发表于 2017-7-10 18:15 | 只看该作者
好资料,下载了。谢谢楼主
回复

使用道具 举报

地板
ID:60656 发表于 2017-7-11 16:48 | 只看该作者
仿制一个测测室温还是不错的
回复

使用道具 举报

5#
ID:221196 发表于 2017-7-20 21:29 | 只看该作者
想要程序啊
回复

使用道具 举报

6#
ID:236932 发表于 2017-10-11 19:07 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

7#
ID:239092 发表于 2017-10-13 10:22 | 只看该作者
楼主用的什么型号单片机
回复

使用道具 举报

8#
ID:65323 发表于 2017-10-14 08:41 | 只看该作者

好资料,51黑有你更精彩!!!
回复

使用道具 举报

9#
ID:240826 发表于 2017-10-19 09:18 | 只看该作者
都说好资料,看看先
回复

使用道具 举报

10#
ID:241710 发表于 2017-10-22 10:26 | 只看该作者
好程序,值的学习!
回复

使用道具 举报

11#
ID:241837 发表于 2017-10-22 16:30 | 只看该作者
厉害了 我也看看
回复

使用道具 举报

12#
ID:255000 发表于 2017-11-29 07:28 | 只看该作者
正在编写NTC的程序,参考一下,非常感谢!
回复

使用道具 举报

13#
ID:256313 发表于 2017-12-10 10:48 | 只看该作者
刚在学习这方面的知识,请问程序中的temp_table[]数组是怎么得到的?
回复

使用道具 举报

14#
ID:140981 发表于 2017-12-10 12:06 | 只看该作者
不错,
回复

使用道具 举报

15#
ID:73957 发表于 2017-12-10 21:34 | 只看该作者
楼主用得stc哪个型号单片机?
回复

使用道具 举报

16#
ID:262706 发表于 2017-12-17 16:33 | 只看该作者
好的那恭喜啊啊
回复

使用道具 举报

17#
ID:63211 发表于 2017-12-26 13:09 | 只看该作者
好资料
回复

使用道具 举报

18#
ID:225956 发表于 2018-1-4 14:48 | 只看该作者
好东西,多谢分享!
回复

使用道具 举报

19#
ID:250997 发表于 2018-1-4 21:36 | 只看该作者
多谢分享
回复

使用道具 举报

20#
ID:278302 发表于 2018-1-21 14:50 | 只看该作者
好东西,多谢分享
回复

使用道具 举报

21#
ID:278483 发表于 2018-1-22 18:17 | 只看该作者
那个温度数组temp_table[]为什么是这样设置
回复

使用道具 举报

22#
ID:266116 发表于 2018-1-22 20:57 | 只看该作者
谢谢分享
回复

使用道具 举报

23#
ID:183872 发表于 2018-1-31 09:38 | 只看该作者
好资料啊,学习了
回复

使用道具 举报

24#
ID:260128 发表于 2018-1-31 10:13 | 只看该作者
收藏了,谢谢分享
回复

使用道具 举报

25#
ID:283541 发表于 2018-2-10 16:24 | 只看该作者
感谢楼主分享
回复

使用道具 举报

26#
ID:270576 发表于 2018-2-26 15:50 | 只看该作者
这么好的资料,多谢楼主分享!
回复

使用道具 举报

27#
ID:88606 发表于 2018-2-27 08:44 | 只看该作者
51黑有你更精彩!
回复

使用道具 举报

28#
ID:240034 发表于 2018-3-4 08:48 | 只看该作者
也在做NTC测温,很好的参考例子
回复

使用道具 举报

29#
ID:262356 发表于 2018-3-7 21:44 | 只看该作者
有原理图吗???
回复

使用道具 举报

30#
ID:164172 发表于 2018-4-2 10:18 | 只看该作者
楼主 请教一下 我做的温度计  有0.1°的跳变,选用的是10位ADC   读取到的ADC数值一直是+-1,滤波之后也没有得到太大的改善,比如说采集到的数值是572  573  574  经常会在这个温度值跳变
回复

使用道具 举报

31#
ID:301273 发表于 2018-4-3 08:53 | 只看该作者
好东西,多谢分享
回复

使用道具 举报

32#
ID:301273 发表于 2018-4-3 08:54 | 只看该作者
想问要用哪个型号的单片机
回复

使用道具 举报

33#
ID:303195 发表于 2018-4-7 16:08 | 只看该作者
给力,楼主这个程序很有用
回复

使用道具 举报

34#
ID:304391 发表于 2018-4-9 13:40 | 只看该作者
正好用到这部分,谢谢楼主的分享。
回复

使用道具 举报

35#
ID:57366 发表于 2018-4-9 17:53 | 只看该作者
有原理图吗???同问。。。。
回复

使用道具 举报

36#
ID:52915 发表于 2018-4-9 22:45 | 只看该作者
非常好的资料,很受启发,谢谢了
回复

使用道具 举报

37#
ID:88606 发表于 2018-4-10 07:11 | 只看该作者
好资料,正学习这方面的!谢谢楼主!
回复

使用道具 举报

38#
ID:319499 发表于 2018-4-30 18:10 | 只看该作者
好资料,说明清楚移动
回复

使用道具 举报

39#
ID:82491 发表于 2018-5-9 08:31 | 只看该作者
学习了
回复

使用道具 举报

40#
ID:82491 发表于 2018-5-9 08:32 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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