1.最近发现坛里对热敏电阻测温系统呼声很高,刚好我手里有个NTC10K的热敏电阻,于是乎我就打算做个热敏电阻温度计。
2.我首先了解了NTC热敏电阻的特性,阻值随温度的升高而减小。通过厂商提供的温度和电阻对应的关系表就可以知道阻值对应的温度,要想测温度就要测出热敏电阻的阻值,知道了原理就好办多了。
3.闭上眼开始思考测量电阻的方法,不可能直接拿万用表测吧,首先想到初中物理学到的R=U/I(电阻的阻值等于加在它两端的电压除以流过它的电流)。只要在热敏电阻上加上电,测出电压和电流就行了。
4.测量电压可以用ADC测量,可是电流怎么测量呢?于是想到串联电路电流相等,把一个已知阻值的精密电阻和热敏电阻串联,根据I=U/R测到已知电阻上分得的电压就可以知道电路中的电流了。
5.系统原理:NTC 10k热敏电阻和10k精密电阻串联接入VCC—GND,利用单片机内部的ADC模块测出NTC电阻上分的电压ADC_V以及系统的供电电压POWER_V,从而得到10k精密电阻上的电压R_V=(POWER_V-ADC_V),根据电阻串联电流相等可以知道NTC电阻中的电流I=R_V/10K,,再根据U=I*R可得到热敏电阻的阻值NTC_R=ADC_V/I,通过查表找出此阻值对应的温度。此系统由于使用了STC单片机内部的电压基准为参考,所以测温精度不受系统电压VCC的影响。
6.为了简化NTC10k测温系统的硬件制作难度,我尽量优化设计,只需NTC热敏电阻+10k精密电阻+STC单片机+数码管公4个元件。单片机依然采用STC15W408ASS,温度显示只有两位所以数码管采用3位共阴数码管(把数码管旋转180度颠倒过来使用,前两位显示温度第三位显示“℃”符号),10k电阻尽量选择精密一点的。
下图为测得的室温21度
下图为数码管正放时的显示,实际使用时要旋转180度放
(这样就可以显示温度符号℃)
下图为原理图截图(源文件见附件PADS layout)
下图为买热敏电阻时卖家提供的阻值与温度对应关系表
请评分支持一下谢谢
- /********************************************/
- //2016.10.24日编写完成
- //作者:刘海龙 (读单片机内部BandGap基准电压值参考的STC官网程序)
- //硬件:STC15W408AS+3位共阴数码管+1个10K的电阻(最好选用精密电阻)+NTC10K热敏电阻
- //晶振选12M或11.0952M
- /*原理:NTC 10k热敏电阻和10k精密电阻串联接入VCC—GND,利用单片机内部的ADC
- 模块测出NTC电阻上分的电压ADC_V以及系统的供电电压POWER_V,从而得到10k精密电阻上
- 的电压R_V=(POWER_V-ADC_V),根据电阻串联电流相等可以知道NTC电阻中的电流I=R_V/10K,
- ,再根据U=I*R可得到热敏电阻的阻值NTC_R=ADC_V/I,通过查表找出此阻值对应的温度。*/
- #include <STC15W.h>//STC15W408AS头文件
- #include <intrins.h>
- unsigned int NTC_R;//定义热敏电阻阻值变量
- unsigned char temperature;//定义温度存储变量
- 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
-
- };
- #include<4LED_YIN.H>//数码管驱动显示程序
- #include <BandGap.H>//包含读单片机内部BandGap基准电压值
- void T_dis(){//温度处理函数采集到的阻值与二维数组的阻值进行比较,从而获得相对应的温度值。
- unsigned char i;
- for(i=105;i<106;i--) {
- if(NTC_R >= Ttable[i][1] && NTC_R < Ttable[i-1][1]){
- temperature=(Ttable[i][0]+1);
- break;
- }
- }
- }
- /********************************/
- void main (void)
- { Delay20ms();//待系统稳定
- InitADC();//初始化ADC
- P1M1=0X80;//P1.7高阻输入
- init();//IO口设置初始化
- while (1)
- {
- ShowResult(7);//测量NTC热敏电阻上的电压并根据电压计算出阻值
- T_dis();//测量到的阻值进行查表对比找到阻值对应的温度值
- disp(); //数码管显示温度值
- }
- }
复制代码
|