打印
[应用方案]

NTC测温程序

[复制链接]
3002|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sanfuzi|  楼主 | 2023-11-29 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
*                        NTC测温,10位AD分辨率0.1度
*                                                  硬件说明:IAP15W4K58S4  
*                                第一位数码管 位引脚-->P41                                                                  *
*                                                         第二位数码管 位引脚-->P42                                                                  *
*                                                         第三位数码管 位引脚-->P44                                                                  *
*                                                         第四位数码管 位引脚-->P45                                                                  *
*                                                         所有的数码管 段引脚-->P2                                                                    *
*******************************************************************************/
#define         MAIN_Fosc                22118400L        //定义主时钟
#include <STC15.H>
#include <intrins.H>
#define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒
//#define uchar unsigned char
//#define uint unsigned int
typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define DIS_DOT                0x20
#define DIS_BLACK        0x10
#define DIS_                0x11

u8 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数字编码  0.1.2.3.4....9
u8 qian,bai,shi,ge;

bit        B_1ms;                        //1ms标志
u16        msecond;
u8 flag0;                      //正负温度标志位
u8 flag1;                                        //温度超过100度,千位数正常显示
u16        Get_ADC10bitResult(u8 channel);         //AD转换函数声明,channl输入通道选择
u16        get_temperature(u16 adc);                          //温度转换函数声明

/********************************************************************
* 名称 : Delay()
* 功能 : 延时
* 输入 : i
* 输出 : 无
***********************************************************************/
void delay(u8 i)         //延时函数
{
  u16 j,k;
  for(j=i;j>0;j--)
    for(k=500;k>0;k--);
}

/********************************************************************
* 名称 : display()
* 功能 : 数码管显示函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void display(u8 qian,u8 bai,u8 shi,u8 ge) //显示函数
{
                if(flag0)    //温度低于0度千位数码管显示-
                {
                                P2=0XBF;
                                P41 = 0;
                                delay(5);
                                P41 = 1;
                }
                if(flag1)   //温度超过100度,千位显示
                {
                                P2=table[qian];
                                P41 = 0;
                                delay(5);
                                P41 = 1;
                }
                P2=table[bai];
                P42 = 0;
                delay(5);
                P42 = 1;

                P2=table[shi]&0X7F;                //十位显示小数点
                P44 = 0;
                delay(5);
                P44 = 1;

                P2=table[ge];
                P45 = 0;
                delay(5);
                P45 = 1;
}
/********************************************************************
* 名称 : main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main(void)
{   
  long int j;
        P0M1 = 0;        P0M0 = 0;        //设置为准双向口
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口
        P2M1 = 0;        P2M0 = 0;        //设置为准双向口
        P3M1 = 0;        P3M0 = 0;        //设置为准双向口
        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
        P5M1 = 0;        P5M0 = 0;        //设置为准双向口
        P6M1 = 0;        P6M0 = 0;        //设置为准双向口
        P7M1 = 0;        P7M0 = 0;        //设置为准双向口

        P1ASF = 0xff;                //P1口全部做ADC   
  P1 &= 0x00;         //设置P1.0口输出低电平确保能采集到外部电平信号
  ADC_CONTR = 0xE0;        //90T, ADC power on
  AUXR = 0x80;        //定时器0,1T ,16位自动重装
        TH0 = (u8)(Timer0_Reload / 256);//1ms中断一次
        TL0 = (u8)(Timer0_Reload % 256);
        ET0 = 1;        //开定时器0中断
        TR0 = 1;        //打开定时器0
        EA = 1;                //打开总中断

  while(1)
        {         
                  if(B_1ms)        //1ms到
                        {
                                        B_1ms = 0;   //清0标志位
                                        if(++msecond >= 300)        //300ms到
                            {
                                                        msecond = 0;
                                                        j = Get_ADC10bitResult(2);
                                                        j =        get_temperature(j);        //计算温度值
                                                        if(j >= 400)        flag0 = 0,        j -= 400;                //温度 >= 0度
                                            else flag0 = 1,        j  = 400 - j;        //温度 <  0度
                                                        if(j>=1000) flag1=1;
                                                        else flag1=0;//温度超过100度标志位,千位数正常显示
                                        }
                        }
                  qian=j/1000;
                        bai=j%1000/100;
                        shi=j%100/10;
                        ge=j%10;
                  display(qian,bai,shi,ge);      
        }
}
//========================================================================
// 函数: u16        Get_ADC10bitResult(u8 channel)
// 描述: 查询法读一次ADC结果.
// 参数: channel: 选择要转换的ADC.
// 返回: 10位ADC结果.
// 版本: V1.0, 2012-10-22
//========================================================================
u16        Get_ADC10bitResult(u8 channel)                //channel = 0~7
{      
    u8 status=0;                //判断AD转换结束标志位
                u16 AD_dat=0;                //转换结果10位ADC值
                ADC_RES = 0;
                ADC_RESL = 0;
                ADC_CONTR|=0x80;  ////开启ADC电源
    _nop_();    _nop_();
    _nop_();    _nop_();   //等待ADC电源稳定
                //开启ADC电源,转换速度300k。启动ADC转换。选择转换通道
                ADC_CONTR = (ADC_CONTR | 0xe0) | 0x08 | channel;
                //while((ADC_CONTR & 0x10) == 0)        ;        //ADC_CONTR寄存器ADC_FLAG==1
                //ADC_CONTR &= ~0x10;                //清零ADC结束标志
                while(status==0)   //等待AD转换结束
          {
                    status=ADC_CONTR & 0X10;//判断ADC_FLAG转换结束标志位,转换结束硬件置1,必须软件清零         
          }
          ADC_CONTR&=0xe7;                // 清零ADC_FLAG标志位关闭ADC转换1110 0111
                AD_dat = (ADC_RES << 2)|(ADC_RESL&0X03);//高低字节拼接成一个10位结果
                return AD_dat;               
}

//        MF52E 10K at 25, B = 3950, ADC = 12 bits
u16 code temp_table[]=
{
                25,                //-40                0
                27,                //-39                1
                29,                //-38                2
                31,                //-37                3
                33,                //-36                4
                35,                //-35                5
                38,                //-34                6
                40,                //-33                7
                43,                //-32                8
                46,                //-31                9
                49,                //-30                10
                52,                //-29                11
                55,                //-28                12
                59,                //-27                13
                62,                //-26                14
                66,                //-25                15      
                70,                //-24                16
                75,                //-23                17
                79,                //-22                18
                84,                //-21                19      
                89,                //-20                20
                94,                //-19                21
                99,                //-18                22
                105,        //-17                23
                110,        //-16                24
                116,        //-15                25
                123,        //-14                26
                129,        //-13                27
                136,        //-12                28
                143,        //-11                29
                150,        //-10                30
                157,        //-9                31
                165,        //-8                32
                173,        //-7                33               
                181,        //-6                34
                190,        //-5                35
                198,        //-4                36
                207,        //-3                37
                216,        //-2                38
                225,        //-1                39
                235,        //0                40
                244,        //1                41
                254,        //2                42
                264,        //3                43
                275,        //4                44
                285,        //5                45
                296,        //6                46
                306,        //7                47      
                317,        //8                48
                328,        //9                49
                339,        //10                50
                351,        //11                51
                362,        //12                52
                373,        //13                53
                385,        //14                54
                396,        //15                55      
                408,        //16                56
                420,        //17                57
                431,        //18                58
                443,        //19                59
                454,        //20                60
                466,        //21                61
                478,        //22                62
                489,        //23                63
                501,        //24                64
                512,        //25                65
                523,        //26                66
                535,        //27                67
                546,        //28                68
                557,        //29                69
                568,        //30                70
                579,        //31                71
                589,        //32                72
                600,        //33                73
                610,        //34                74
                620,        //35                75
                630,        //36                76
                640,        //37                77
                650,        //38                78
                660,        //39                79
                669,        //40                80
                678,        //41                81
                688,        //42                82
                696,        //43                83
                705,        //44                84
                714,        //45                85
                722,        //46                86
                730,        //47                87
                738,        //48                88
                746,        //49                89
                754,        //50                90      
                761,        //51                91
                768,        //52                92
                775,        //53                93
                782,        //54                94
                789,        //55                95
                796,        //56                96
                802,        //57                97
                808,        //58                98
                814,        //59                99
                820,        //60                100
                826,        //61                101
                831,        //62                102
                837,        //63                103
                842,        //64                104
                847,        //65                105
                852,        //66                106
                857,        //67                107
                862,        //68                108
                866,        //69                109
                871,        //70                110      
                875,        //71                111
                879,        //72                112      
                883,        //73                113
                887,        //74                114
                891,        //75                115
                895,        //76                116
                898,        //77                117
                902,        //78                118
                905,        //79                119
                909,        //80                120
                912,        //81                121
                915,        //82                122
                918,        //83                123
                921,        //84                124
                924,        //85                125               
                926,        //86                126
                929,        //87                127
                932,        //88                128
                934,        //89                129
                937,        //90                130
                939,        //91                131
                941,        //92                132
                943,        //93                133
                946,        //94                134
                948,        //95                135
                950,        //96                136
                952,        //97                137
                954,        //98                138
                955,        //99                139
                957,        //100                140
                959,        //101                141
                961,        //102                142
                962,        //103                143
                964,        //104                144
                965,        //105                145
                967,        //106                146
                968,        //107                147
                970,        //108                148
                971,        //109                149
                973,        //110                150
                974,        //111                151
                975,        //112                152
                976,        //113                153
                978,        //114                154
                979,        //115                155
                980,        //116                156               
                981,        //117                157
                982,        //118                158
                983,        //119                159
                984,        //120                160
};



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

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

#define                D_SCALE                10                //结果放大倍数, 放大10倍就是保留一位小数
u16        get_temperature(u16 adc)
{
        u16        code *p;    //定义指针变量
        u16        i;
        u8        j,k,min,max;      //定义局部变量j,k,min最小值,max最大值;
      
        adc = 1023 - adc;        //Rt接地时启用//RT接电源时屏蔽
        p = temp_table;
        if(adc < p[0])                return (0xfffe);
        if(adc > p[160])        return (0xffff);
      
        min = 0;                //-40度
        max = 160;                //120度

        for(j=0; j<5; j++)        //对分查表
        {
                k = min / 2 + max / 2;
                if(adc <= p[k])        max = k;
                else                        min = k;
        }
                 if(adc == p[min])        i = min * D_SCALE;
        else if(adc == p[max])        i = max * D_SCALE;
        else        // min < temp < max
        {
                while(min <= max)
                {
                        min++;
                        if(adc == p[min])        {i = min * D_SCALE;        break;}
                        else if(adc < p[min])
                        {
                                min--;
                                i = p[min];        //min
                                j = (adc - i) * D_SCALE / (p[min+1] - i);
                                i = min;
                                i *= D_SCALE;
                                i += j;
                                break;
                        }
                }
        }
        return i;
}


/********************** Timer0 1ms中断函数 ************************/
void timer0 (void) interrupt 1
{
        //DisplayScan();        //1ms扫描显示一位
        B_1ms = 1;                //1ms标志
}


使用特权

评论回复
沙发
mattlincoln| | 2023-12-2 15:48 | 只看该作者
在使用NTC热敏电阻之前,需要进行校准。通过比较实际温度与NTC热敏电阻测得温度之间的差异,可以修正测温误差。

使用特权

评论回复
板凳
sanfuzi|  楼主 | 2023-12-2 16:02 | 只看该作者
不同的数据处理方**影响NTC电阻的温度响应特性和精度。

使用特权

评论回复
地板
lzmm| | 2023-12-2 16:52 | 只看该作者
要考虑到电路的抗干扰能力,以减少外部环境对测温精度的影响。

使用特权

评论回复
5
uytyu| | 2023-12-2 19:23 | 只看该作者
在设计时,要根据实际需求选择合适的ADC转换器,以满足测温精度的要求。

使用特权

评论回复
6
maqianqu| | 2023-12-2 20:09 | 只看该作者
NTC热敏电阻是电子体温计等测温元件的常用选择,具有体积小、响应速度快的优点

使用特权

评论回复
7
pentruman| | 2023-12-2 21:50 | 只看该作者
通过测量NTC两端的电压来计算其阻值,从而得到温度。

使用特权

评论回复
8
updownq| | 2023-12-2 22:19 | 只看该作者
NTC热敏电阻的型号和规格需要根据测量温度范围和精度要求进行选择。

使用特权

评论回复
9
belindagraham| | 2023-12-2 22:30 | 只看该作者
NTC热敏电阻的温度和阻值对应关系是非线性的,其R-T曲线呈类似半抛物性的一种形态,且具有离散性。

使用特权

评论回复
10
claretttt| | 2023-12-2 22:42 | 只看该作者
测量误差可能来自于NTC热敏电阻、测量电路、ADC等元件和环境因素。

使用特权

评论回复
11
uytyu| | 2023-12-4 10:28 | 只看该作者
NTC测温电路应具备良好的稳定性、精度和可靠性。

使用特权

评论回复
12
qiufengsd| | 2023-12-4 15:06 | 只看该作者
需要考虑到NTC的阻值会随着温度的变化而变化

使用特权

评论回复
13
juliestephen| | 2023-12-5 13:27 | 只看该作者
需要了解NTC热敏电阻的原理,包括NTC热敏电阻的工作原理、温度特性、测量范围等。

使用特权

评论回复
14
albertaabbot| | 2023-12-5 14:52 | 只看该作者
NTC测温的精度会受到许多因素的影响,包括NTC的精度、电路设计的精度、计算方法的精度等

使用特权

评论回复
15
mickit| | 2023-12-5 15:17 | 只看该作者
温度测量受到外部环境的影响较大,如电磁干扰、温度梯度等

使用特权

评论回复
16
10299823| | 2023-12-5 15:40 | 只看该作者
需要对NTC热敏电阻的输出数据进行处理,包括数据滤波、数据转换等

使用特权

评论回复
17
cemaj| | 2023-12-5 16:25 | 只看该作者
为了保证测温电路的精度,需要定期进行精度校准。

使用特权

评论回复
18
pl202| | 2023-12-6 15:31 | 只看该作者
环境温度的变化可能会影响到NTC的阻值,因此需要进行温度补偿。

使用特权

评论回复
19
lzmm| | 2023-12-8 08:44 | 只看该作者
在电路设计中,要选择合适的NTC热敏电阻、放大电路、滤波电路和ADC转换器等元器件。

使用特权

评论回复
20
robincotton| | 2023-12-8 10:13 | 只看该作者
注意分辨率的温度区间,以确保在高温和低温区间的测量精度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

3066

帖子

1

粉丝