NTC热敏电阻高精度温度计程序

发布者:心灵之窗最新更新时间:2018-01-14 来源: eefocus关键字:NTC  热敏电阻  高精度温度计 手机看文章 扫描二维码
随时随地手机看文章

STC12C5406AD 晶振频率为12MHz  

本程序已调试完成: 

功能说明:采用廉价的NTC热敏电阻设计高精度温度计的方案, 

根据NTC热敏电阻的温度特性,采用了较具新意程序算法;摆脱了传统的查表显示温度的方法, 

特点:程序中无须查表,打破了常规的查表显示温度的方法。 

//NTC敏电阻温度显示。 

//DS18B20温度显示。 


#include "stc12c5410ad.h"//头文件 
#include "intrins.h" 
#define uchar unsigned char//宏定义 
#define uint unsigned int//宏定义 

sbit RS=P3^4;//定义I/O的硬件接口 
sbit E=P3^7; 

sbit A_B=P3^2; 
sbit CP=P3^3; 

sbit RT=P1^3;//外接NTC 
sbit R_100K=P1^4;// 
sbit D_J=P1^6;//检测 

sbit DQ=P1^5;////定义I/O的硬件接口--温度 

uint Temperature;//温度暂存单元 
uint Negative_Temperature;//负温度暂存单元 
bit Negative_sign=1;//负温度标志 
unsigned long TEMP_1;//长整形单元 

float Time_RT,Time_R; 

uchar aa,CC,ee; 

uint bb[11]; 

float dd,temp5; 

uchar code DispTab_1[]={’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’A’,’B’,’C’,’D’,’E’,’F’};//1602:0-9 数字 
uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号 
uchar DispBuf[6]; //6字节的显示缓冲区 

void delay(uint z)//1ms延时 
{  
uchar x,x1; 
for(;z>0;z--) 

for(x=0;x<114;x++) 

for(x1=0;x1<1;x1++); 




void delay1(uchar x2)//经精准计算,该段程序1次延时时间为 19.53us;多次调用需要重新计算。 

while(x2>0) 

x2--; 




void write_Directive(uchar a)//写指令 
{  
uchar i,temp; 
for(i=0;i<8;i++) 

temp=a; 
temp&=0x80; 
if(temp==0x80) 
A_B=1;  
else  
A_B=0; 
a=a<<1; 
delay1(1); 
CP=0; 
delay1(1); 
CP=1; 
delay1(1); 
CP=0; 


RS=0; 
delay(3); 
E=0; 
delay(3); 
E=1; 
delay(3); 
E=0; 
delay(3); 


void write_Data(uchar a)//写数据 
{  
uchar i,temp; 
for(i=0;i<8;i++) 

temp=a; 
temp&=0x80; 
if(temp==0x80) 
A_B=1;  
else  
A_B=0; 
a=a<<1; 
delay1(1); 
CP=0; 
delay1(1); 
CP=1; 
delay1(1); 


RS=1; 
delay(3); 
E=0; 
delay(3); 
E=1; 
delay(3); 
E=0; 
delay(3); 



void init()//初始化 


TMOD=0x10;//定时器T1工作于方式1,16位计数器 

TH1=0x00; 
TL1=0x00; 

EA=1;//开总中断允许 
ET1=1;//开定时器T1允许控制 
//PT1=1;//开定时器T1中断为最高优先级 
TR1=0;//T1开始运行 

P1M1=0x80; 
P1M0=0x80; 

//aa=TH1; 
//aa=aa<<8; 
//aa|=TL1; 

//Time_RT=aa; 

//Time_RT=Time_RT|TL1; 

_nop_(); 

delay(15); 
write_Directive(0x38); 
delay(5); 
write_Directive(0x38); 
delay(5); 
write_Directive(0x38); 
write_Directive(0x01); 
write_Directive(0x02);///初始化后数据地址为0x80;即第一行,第一个位置 
write_Directive(0x0c); 


void Temperature_symbol()//温度符号 

uchar i; 
for(i=0;i<8;i++) 

write_Directive(0x40+i);//写入温度符号 
write_Data(DispTab_2[i]); 



void write_Data_String()//显示时间函数 
{  
uchar i; 
uint mm,mb; 
mb=temp5; 
// DispBuf[0]=temp/10000;//显示百位 
// mm=temp%10000; 

// DispBuf[1]=mm/1000;//显示十位 
// mm=mm%1000; 

// DispBuf[2]=mm/100;//显示个位 
// mm=mm%100; 

DispBuf[1]=mb/100;//显示小数点:0.001 
mm=mb%100;//显示小数点:0.0001 

DispBuf[2]=mm/10;//显示小数点:0.001 
DispBuf[3]=mm%10;//显示小数点:0.0001 

//i=DispBuf[0];//百位判断,如果为0,则消隐 
//if(i==0) 
// i=10; 

//DispBuf[0]=DispTab_1[i];//查表,取字符 
i=DispBuf[1]; 
DispBuf[1]=DispTab_1[i]; 
i=DispBuf[2]; 
DispBuf[2]=DispTab_1[i]; 
i=DispBuf[3]; 
DispBuf[3]=DispTab_1[i]; 
//i=DispBuf[4]; 
//DispBuf[4]=DispTab_1[i]; 

write_Directive(0x80+0x00);//第一行,第五个位置地址 
write_Data(’N’); 
write_Data(’T’); 
write_Data(’C’); 
//write_Data(’5’); 
//write_Data(’D’); 
//write_Data(’Z’); 
//write_Data(’ ’); 
write_Data(’:’); 

//write_Data(DispBuf[0]);//第一行,第五个位置 


write_Data(DispBuf[1]);//第一行,第七个位置  


write_Data(DispBuf[2]);//第一行,第八个位置 

write_Data(’.’);//第一行,第六个位置 

write_Data(DispBuf[3]);//第一行,第九个位置 

//write_Data(DispBuf[4]);//第一行,第十个位置 

//write_Data(0x00);//第一行,第十三个位置显示温度符号 



void DB18B20_init()//DB18B20复位 

DQ=1; 
delay1(1);//程序1次延时时间为 19.53us 
DQ=0; 
delay1(250);//程序110次延时时间为 965.71us 
DQ=1; 
delay1(10);//程序1次延时时间为 19.53us 
while(DQ==1); 
//if(DQ==0) 
_nop_(); 
// LED_7=~led_7;//led检测复位正常否,如果DB18B20存在,且正常;led闪烁。 
while(DQ==0); 
delay1(40);//程序20次延时时间为 197.32us 



void write_DB18B20(uchar m1)//写DB18B20 
{  
uchar i,m2; 

for(i=0;i<8;i++) 

m2=m1; 
m2=m2&0x01; 
DQ=0; 
_nop_(); 
DQ=1; 
if(m2==0x01) 
DQ=1; 
else  
DQ=0; 
delay1(50);//程序5次延时时间为 54.25us 
m1=m1>>1; 
DQ=1; 




read_DB18B20()//读DB18B20 
{  
uint 1; 
uchar i; 
for(i=0;i<16;i++) 

1=1>>1; 
DQ=1; 
_nop_(); 
DQ=0; 
_nop_(); 
DQ=1; 
_nop_(); 
_nop_(); 
_nop_(); 
_nop_(); 
if(DQ==1) 
1=1|0x8000; 
//else  
// 1=1|0x0000; 
delay1(50);//程序5次延时时间为 54.25us 

return 1;//返回温度值 


void Negative()//温度为零度以下时,将变换温度 

Negative_Temperature=Temperature; 
Negative_Temperature=Negative_Temperature&0xf800; 
if(Negative_Temperature==0xf800) 

Temperature=~Temperature; 
Temperature=Temperature+1; 
Negative_sign=0; 



void write_Data_String1()//显示时间函数 
{  
uchar i; 
unsigned long mm; 
DispBuf[0]=TEMP_1/1000000;//显示百位 
mm=TEMP_1%1000000; 

DispBuf[1]=mm/100000;//显示十位 
mm=mm%100000; 

DispBuf[2]=mm/10000;//显示个位 
mm=mm%10000; 

DispBuf[3]=mm/1000;//显示小数点:0.1 
mm=mm%1000; 

DispBuf[4]=mm/100;//显示小数点:0.01 
mm=mm%100; 

DispBuf[5]=mm/10;//显示小数点:0.001 
DispBuf[6]=mm%10;//显示小数点:0.0001 

i=DispBuf[0];//百位判断,如果为0,则消隐 
if(i==0) 
i=10;  
else if(Negative_sign==0)//负温度判断,如果为0,则温度为负的,显示负号 
i=11; 

DispBuf[0]=DispTab_1[i];//查表,取字符 
i=DispBuf[1]; 
DispBuf[1]=DispTab_1[i]; 
i=DispBuf[2]; 
DispBuf[2]=DispTab_1[i]; 
i=DispBuf[3]; 
DispBuf[3]=DispTab_1[i]; 
i=DispBuf[4]; 
DispBuf[4]=DispTab_1[i]; 
i=DispBuf[5]; 
DispBuf[5]=DispTab_1[i]; 
i=DispBuf[6]; 
DispBuf[6]=DispTab_1[i]; 


write_Directive(0x80+0x40);//第一行,第五个位置地址 

write_Data(’D’); 
write_Data(’S’); 
write_Data(’1’); 
write_Data(’8’); 
write_Data(’B’); 
write_Data(’2’); 
write_Data(’0’); 
write_Data(’:’); 
//write_Data(DispBuf[0]);//第一行,第五个位置 
// 
write_Data(DispBuf[1]);//第一行,第六个位置  
write_Data(DispBuf[2]);//第一行,第八个位置 

write_Data(’.’);//第一行,第七个位置 

write_Data(DispBuf[3]);//第一行,第九个位置 

write_Data(DispBuf[4]);//第一行,第十个位置 

//write_Data(DispBuf[5]);//第一行,第十一个位置 
//write_Data(DispBuf[6]);//第一行,第十二个位置 
write_Data(0x00);//第一行,第十三个位置显示温度符号 



void Timer1() interrupt 3//TR1 

//TR1=0; 

//P1M0=0x08;//P1.3高阻 
/* 
void RT_DJ() 

D_J=0; 
R_100K=0; 
P1M0=0x18;//P1.3,P1.4高阻 
P1M1=0x18;//P1.3,P1.4高阻 

TH1=0x00; 
TL1=0x00; 
P1M0=0x48;//P1.3,P1.6高阻 
P1M1=0x48;//P1.3,P1.6高阻 

R_100K=1; 
TR1=1; 
while(!D_J); 
TR1=0; 
aa=TH1; 
aa=aa<<8; 
aa|=TL1; 
Time_R=aa; 
temp=aa; 

}*/ 

void ADC_Conversion()//ADC开始转 

ADC_CONTR=0x87; 
delay(1); 
ADC_CONTR=0x8f; 
delay(1); 
//while((ADC_CONTR==0x8f)); 
ADC_CONTR=0x87; 
delay(1); 
//temp=ADC_DATA;//高8位 


void main() 


//delay1(5);//程序1次延时时间为 19.53us 
//P1M1=0x80; 
//P1M0=0x80; 
///sbit RT=P1^3;//外接NTC 
//sbit R_100K=P1^4;// 
//sbit D_J=P1^6;//检测 
uchar i; 
cc=0x3d; 
dd=30; 
//goto lk; 
init(); 

Temperature_symbol();//写入温度符号 
while(1) 


DB18B20_init();//DB18B20复位 

write_DB18B20(0xcc);//写DB18B20;0xcc 跳过 ROM 指令 
write_DB18B20(0x44);//写DB18B20;0x44 启动温度转换指令 

delay(1000);//延时1秒 

DB18B20_init();//DB18B20复位 
write_DB18B20(0xcc);//写DB18B20;0xcc 跳过 ROM 指令 
write_DB18B20(0xbe);//写DB18B20;0xbe 读温度指令 
Temperature=read_DB18B20();//读 DB18B20 温度,读出的温度在 Temperature 
Negative();//温度为零度以下时,将变换温度,否则不变 
TEMP_1=Temperature*0.0625*10000;//转换成 十进制(*10000,表示,显示到小数点后4位:0.0000) 
write_Data_String1();//显示温度 


//RT_DJ(); 
for(i=0;i<10;i++) 

ADC_Conversion(); 
bb[i]=ADC_DATA;//高8位; 


Time_RT=bb[0]+bb[1]+bb[2]+bb[3]+bb[4]+bb[5]+bb[6]+bb[7]+bb[8]+bb[9]; 
ee=Time_RT/10; 
//lk: temp=0x46; 
//if(ee==cc) 
//{ 
// temp5=30; 
//} 
if(ee>cc) 

for(i=0;i<94;i++) 

cc=cc+1; 
dd=dd+0.5; 
if(ee==cc) 

temp5=dd*10; 
i=93; 



if(ee
for(i=0;i<30;i++) 

cc=cc-1; 
dd=dd-0.5; 
if(ee==cc) 

temp5=dd*10; 
i=29; 



write_Data_String(); 
delay(100);  


关键字:NTC  热敏电阻  高精度温度计 引用地址:NTC热敏电阻高精度温度计程序

上一篇:1602液晶显示的电压表程序
下一篇:SD7218A数码管驱动芯片实例程序

推荐阅读最新更新时间:2024-03-16 15:52

NTC热敏电阻简易的测量方法
NTC热敏电阻是热敏电阻中常用的一种类型,在多个领域中都有一定的应用。我们在使用NTC热敏电阻的时候对于NTC热敏电阻的测量方法都是需要掌握的,今天小编就来为大家具体介绍一下NTC热敏电阻简易的测量方法吧,希望可以帮助到大家。 一、目的: 在没有专用NTC热敏电阻测试仪器、仪表和测量夹具的情况下,但又需要对NTC热敏电阻进行测量,本方法提供了一个简便的测试方法,虽达不到专业水平的精度,但可大致测量热敏电阻的阻值和精度。 二、测量工具及材料: 1、四位半万用表:两块。 2、测试夹具:一个。 3、± 0.1℃ 测温仪:一个。 4、不锈钢鳄鱼夹:一对。 三、测量方法及步骤: 1、首先用空调将一个房间温度控制在25± 0.1℃ 。 2、
[测试测量]
电池温度智能监测系统设计
摘要:针对采用热敏电阻测温和有线温度测量系统的不足,提出了采用单总线数字温度传感器DS18B20、单片机和无线收发模块等组成智能无线温度监测系统。DS18B20具有体积小,精度高,采用一线总线,可组网等优点,短距离无线通信技术应用到多点温度测量中,实现了温度数据无线传输,该系统扩展维护方便、成本低、高可靠性等特点,具有一定的实用性。 关键词:电池温度;无线传输;DS18B20;热敏电阻     蓄电池作为一种供电方便、安全可靠的直流电源,在电力、通信、军事等领域中得到了广泛的应用。温度是蓄电池的一个重要参数,它可以间接地反映电池的性能状况,并且根据此温度参数可以对电池进行智能化管理,以延长电池的寿命。在蓄电池组充放电维护及工作工程
[电源管理]
电池温度智能监测系统设计
基于热敏电阻的温度测量系统的设计方案
本文首先讨论基于热敏电阻的温度测量系统的历史和设计挑战,以及它与基于电阻温度检测器(RTD)的温度测量系统的比较。此外,本文还会简要介绍热敏电阻选择、配置权衡,以及Σ-Δ型模数转换器(ADC)在该应用领域中的重要作用。 热敏电阻与RTD RTD是一种电阻值随温度变化的电阻器。热敏电阻的工作方式与RTD类似。RTD仅有正温度系数,热敏电阻则不同,既可以有正温度系数,也可以有负温度系数。负温度系数(NTC)热敏电阻的阻值会随着温度升高而减小,而正温度系数(PTC)热敏电阻的阻值会随着温度升高而增大。图1显示了典型NTC和PTC热敏电阻的响应特性,以及它们与RTD曲线的比较。 图 1. 热敏电阻与 RTD 的响应特性比较 在温度
[测试测量]
基于<font color='red'>热敏电阻</font>的温度测量系统的设计方案
基于MSP430单片机的热敏电阻温度的测量
摘要 传统的数字式测量电阻的方法是先将电阻值转换为电信号(如电压),再用A/D转换器将其转换为数字信号,因此电路复杂,费用高。本文介绍一种类R—F转换频率测量温度的方法。直接把热敏电阻Rt接到由RC构成的多谐振荡器电路中,用MSP430单片机的捕获功能来获得多谐振荡器输出信号高低电平的脉宽并同时计数,则热敏电阻Rt与捕获高低电平时的计数值的差值成正比关系,查表可得温度值。 测量温度一般采用热敏电阻做传感器,测量的方法有R—V转换电压测量法和R—F转换频率测量法。这两种方法的电路复杂且成本高,电路中很多元器件直接影响测量精度。本文论述一种类R—F转换频率的测量法,用NE555定时器和热敏电阻等器件构成振荡器,由MSP430单片机
[单片机]
基于MSP430单片机的<font color='red'>热敏电阻</font>温度的测量
基于LM3S101处理器的温度测量模块设计
  温度信息是各类监控系统中主要的被控参数之一,温度采集与控制在各类测控系统中应用广泛。随着处理器技术的发展,在温度测量领域,ARM处理器以其高性能、低成本得到了广泛应用。以Luminary公司生产的32位ARM处理器LM3S101为核心,以热敏电阻为温度传感器,并通过引入RC充放电电路以及对热敏电阻测温曲线的分段线性化处理,实现了一种成本低、测温精度高的温度测量模块设计方案。经实际测量实验,这种设计方案在整个测温范围内能够达到较高测温精度,且模块通用性强、成本低且应用广泛。   1测温模块硬件原理   1.1温度信息的获取   实现温度的检测需要使用温度传感器。温度传感器种类很多,热敏电阻器是其中应用较多的一种,具有灵敏
[测试测量]
基于LM3S101处理器的温度测量模块设计
Power Integrations推出具有温度读数功能的新型SCALE-iFlex LT NTC IGBT/SiC模块门极驱动器
Power Integrations推出具有温度读数功能的新型SCALE-iFlex LT NTC IGBT/SiC模块门极驱动器 SCALE-2技术将流行的100mmx140mm IGBT和SiC半桥功率模块的均流能力提高了20% 德国纽伦堡,PCIM 2023 – 2023年5月9日讯 – 深耕于中高压逆变器应用门极驱动器技术领域的知名公司Power Integrations 今日推出SCALE-iFlex™ LT NTC系列IGBT/SiC模块门极驱动器 。新款门极驱动器适配于流行的100mmx140mm IGBT半桥模块,例如Mitsubishi LV100 和 Infineon XHP 2,以及耐压在23
[电源管理]
Power Integrations推出具有温度读数功能的新型SCALE-iFlex LT <font color='red'>NTC</font> IGBT/SiC模块门极驱动器
EM78P468 NTC lcd测温设计C语言源代码
/******************************************************** * Description: 468N RC temperature * * Company: HANTA (suzhou) LTD. * * Author: Sunli * * Date: 03/09/2007 * 最后更新日期:13/09/2007 * * Version: v1.0 * ************************************************
[单片机]
热敏电阻型浪涌抑制器在电源设计中的应用及其选型
随着电子产品对可靠性要求的不断提高和能源资源的日益紧缩,高可靠性和高效节能的电子产品将是未来电子产品发展的一个方向,因此在产品的电源设计上,必须要充分考虑其可靠性能和电源使用效率。 本文首先分析电子产品为什么会有开机浪涌,然后以典型的电源电路为例分析如何使用热敏电阻抑制浪涌电流,最后介绍热敏电阻在实际应用中应如何选型。 开机浪涌电流产生的原因 图1是典型的电子产品电源部分简化电路,C1是与负载并联的滤波电容。在开机上电的瞬间,电容电压不能突变,因此会产生一个很大的充电电流。根据一阶电路零状态响应模型所建立的一阶线性非齐次方程可以求出其电流初始值相当于把滤波电容短路而得到的电流值。这个电流就是我们常说的输入浪涌电流,它是在对滤波
[电源管理]
<font color='red'>热敏电阻</font>型浪涌抑制器在电源设计中的应用及其选型
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved