基于RC充放电的NTC热敏电阻测温试验Word文档下载推荐.docx
- 文档编号:21877983
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:54.26KB
基于RC充放电的NTC热敏电阻测温试验Word文档下载推荐.docx
《基于RC充放电的NTC热敏电阻测温试验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于RC充放电的NTC热敏电阻测温试验Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
通过单片机计算得到热敏电阻RT的阻值。
并通过查表法可以得到温度值。
从上面所述可以看出,该测温电路的误差来源于以下几个方面:
单片机的定时器精度,RK电阻的精度,热敏电阻RT的精度,而与单片机的输出电压值、门嵌电压值、电容精度无关。
因此,适当选取热敏电阻和精密电阻的精度,单片机的工作频率够高,就可以得到较好的测温精度。
当单片机选用4MHz的工作频率,RK、RT均为1,
精度的电阻时,温度误差可以做到小于1?
。
如果P1.2具有外部上升沿中断的功能,程序可以更简单,效果更好。
本试验使用AT89C2051单片机,利用了AT89C2051的P1.0或P1.1脚无上拉电阻的特点,否则需I/O口具有高阻功能的单片机或在放电回路加入一只二极管才能实现。
原理图如下:
图2本图使用了内部比较器
注意:
电路中的P1.2与P1.3应对调连接,即P1.2控制热敏电阻充电,P1.3控制固定电阻充电。
若采用比较器则比较器同相输入端的分压电阻供电应使用精密稳压电源(如TL431等),令外RC充放电回路也应采用精密稳压电源供电,否则,显示的温度值将在很大范围内跳变,这是由于电压波动造成的,可以在单片机供电电路中加一个精密稳压器件。
由于AT89C2051的I/O口为准双向口无高阻态功能,所以加入三极管来实现高阻态。
图3使用I/O口
程序如下:
/******************************************************************************************
本程序利用I/O口的阀值电压来代替电压比较器进行RC充电时间的计算
******************************************************************************************/
#include<
reg51.h>
sbitover=P1^1;
//用于检测充电电压
sbitCLK=P1^7;
//MAX7219时钟信号线
sbitLD=P1^6;
//数据加载线
sbitDIN=P1^5;
//数据输入线
unsignedcharcodedisp_table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x01,0x00};
//非译码方式时的共阴数码管显示编码,0~9,E,o,r,d,-,息灭
unsignedintcodetemp_table1[]={2953,3092,3238,3392,3554,3726,3908,4099,4302,4516,4743,4983,5237,5507,5792,6095,6416,6756,7118,7502,7910,8348,8804,9295,9818,10374,10966,11598,12272,12991,13759,14579,15455,16392,17394,18467,19616,20847,22167,23583,25000};
//负温度查表值(-1~-40)
unsignedintcodetemp_table2[]={2822,2697,2579,2467,2360,2259,2163,2071,1984,1901,1823,1748,1676,1608,1543,1482,1423,1366,1313,1262,1213,1166,1122,1079,1038,1000,962,927,893,860,829,799,771,743,
717,692,668,644,622,601,580,561,542,524,507,490,474,458,444,429,416,402,390,377,366,354,343,333,
323,313,303,294,286,277,269,261};
//0~66度查表值
unsignedcharcodetemp_table3[]={253,246,239,232,226,219,213,207,201,196,190,185,180,175,171,166,
162,157,153,149,145,142,138,134,131,128,124,121,118,115,112,110,107,104,102,99,97,95,93,90,88,86,
84,82,80,79,77,75,73,72,70,69,67,66,64,63,61,60,59,57,56,55,50};
//67~127度查表值voidw_max7219(unsignedcharaddr,unsignedcharwdata);
//向MAX7219写数据函数声明voidinit_max7219();
//MAX7219初始化函数声明
voidtimer_ms(unsignedchartim);
//毫秒级延时函数声明
voidtemp_ntc();
//NTC热敏电阻测温函数声明
函数名称:
main
函数说明:
主函数
入口参数:
出口参数:
其它:
main()
{
TMOD=0x01;
//设置T0的工作模式
init_max7219();
//MAX7219初始化函数
m1:
temp_ntc();
//NTC热敏电阻测温函数
gotom1;
}
temp_ntc
NTC热敏电阻测温函数
voidtemp_ntc()
bitflag;
unsignedcharj,t,bw,sw,gw;
unsignedintrt,temp;
floatc=0,a,b;
for(j=0;
j<
10;
j++)
P1=0xf1;
//放电
timer_ms(5);
//延时等待电放完
TH0=0x00;
//定时器T0清零
TL0=0x00;
P1=0xfb;
//使用RK冲电
TR0=1;
//启动T0计时
while(over==0);
//等待P1.1口变为高电平
TR0=0;
b=(TH0<
<
8)|TL0;
//读取冲电时间
P1=0xf7;
//使用热敏电阻冲电
a=(TH0<
c=c+(a/b);
//累加10测量结果
rt=((c/10)*10)*100;
//先除以10求平均值,再乘以10求传感器电阻值,并放大100倍以便查表求出温度值。
if(rt>
2822)//判断热敏电阻值是否在0度以下,否则跳转并继续比较
flag=0;
//负温度,并将标志位清零
for(j=1;
=40;
j++)//查表求出温度值
temp=temp_table1[j];
if(rt<
=temp)break;
//条件满足则退出循环
if(rt!
=temp)j--;
t=j;
//保存温度值
elseif(rt>
253)//判断热敏电阻值是否在0~66度之间,否则跳转并继续比较
flag=1;
//正温度,并将标志位置1
=65;
temp=temp_table2[j];
50)//判断热敏电阻值是否在67~127度之间,否则为热敏电阻短路
=63;
temp=temp_table3[j];
t=66+j;
elset=0;
//热敏电阻短路时显示0
/*******正负温度显示处理程序*******/
if(flag==1)//正温度
bw=t/100;
//取出显示用的百位数据
sw=(t%100)/10;
//取出显示用的十位数据
gw=(t%100)%10;
//取出显示用的个位数据
if(bw==0)//判断百位和十位是否为0,是则不显示
bw=0x0f;
//写入使LED熄灭的段码
if(sw==0)sw=0x0f;
else//负温度
bw=0x0e;
//百位显示负号
sw=t/10;
gw=t%10;
if(sw==0)//判断十位是否为0,是则百位不显示,十位显示负号
sw=0x0e;
//"
-"
//熄灭
w_max7219(0x01,disp_table[bw]);
//向MAX7219第一位写显示数据,从左起
w_max7219(0x02,disp_table[sw]);
//向MAX7219第二位写显示数据
w_max7219(0x03,disp_table[gw]);
//向MAX7219第三位写显示数据}
/**********************************************************************************************
init_max7219
函数功能:
MAX7219初始化
**********************************************************************************************/
voidinit_max7219()
w_max7219(0x0a,0x07);
//显示亮度,取值范围0~f
w_max7219(0x0b,0x02);
//8位扫描显示,取值范围0~0x07
w_max7219(0x09,0x00);
//译码方式,0x00为不译码,0xff为译码
w_max7219(0x0c,0x01);
//操作方式,0x00为低功耗模式,0x01为正常操作模式
w_max7219(0x0f,0x00);
//显示状态,0x00为正常显示,0x01为显示测试
timer_ms
(2);
/*********************************************************************************************
w_max7219
向MAX7219写入数据
addrMAX7219内部寄存器地址,wdata写入内部寄存器的操作数值出口参数:
*********************************************************************************************/
voidw_max7219(unsignedcharaddr,unsignedcharwdata)
unsignedchartemp,i=1,j,k;
LD=0;
while(i<
16)
if(i<
8)temp=addr;
//先写入MAX7219内部寄存器地址,再向内部寄存器写入操作数值
elsetemp=wdata;
8;
CLK=0;
if((temp&
0x80)==0x80)DIN=1;
//先发送数据的最高位
elseDIN=0;
for(k=5;
k>
0;
k--);
//时钟频率高的单片机需曾加延时时间,此处为12MHz
CLK=1;
temp<
=1;
i+=8;
LD=1;
/*-------------------------------------------------------------------------------------------
timer_ms
1ms延时子程序
tim为接收主调传来需延时的毫秒数,取值范围1~256,定时时间1~256ms出口参数:
------------------------------------------------------------------------------------------*/
voidtimer_ms(unsignedchartim){
unsignedchari;
while(tim--)
for(i=0;
i<
200;
i++);
//延时1ms
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 RC 放电 NTC 热敏电阻 测温 试验