基于STC12C5A60S2系列1T 8051单片机的数码管显示模数芯片ADC0832采样NTC热敏电阻传感器电压推算NTC热敏电阻传感器电阻实现NTC热敏电阻传感器电阻对比温度进行测温应用
STC12C5A60S2系列1T 8051单片机管脚图
STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
模数芯片ADC0832介绍
通过数码管显示模数芯片ADC0832采样NTC热敏电阻传感器电压推算NTC热敏电阻传感器电阻实现NTC热敏电阻传感器电阻对比温度进行测温功能
NTC热敏电阻传感器不同阻值不同B值下的电阻阻值与温度对应表
Rp(25℃下的阻值))= 5K Bx(B值) = 3470
Rp(25℃下的阻值))= 5K Bx(B值) = 3950
Rp(25℃下的阻值))= 10K Bx(B值) = 3380
Rp(25℃下的阻值))= 10K Bx(B值) = 3435
Rp(25℃下的阻值))= 10K Bx(B值) = 3950
Rp(25℃下的阻值))= 15K Bx(B值) = 3950
Rp(25℃下的阻值))= 20K Bx(B值) = 3950
Rp(25℃下的阻值))= 50K Bx(B值) = 3950
Rp(25℃下的阻值))= 100K Bx(B值) = 3950
main.c
#include "STC12C5A60S2.h"
#include "Timer0.h"
//#include "Timer1.h"
//#include "Key.h"
#include "Digitron.h"
#include "ADC0832.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
//uchar AnalogDataResult = 0;//定义模拟量数字结果变量为0 即模拟量转十进制数变量
//uchar AnalogSamplingCount = 0;//定义模拟采样计数变量为0
//uint OutPutVoltage = 0;//定义输出电压变量为0
//uint AnalogFilterVoltage = 0;//定义模拟滤波电压变量为0
//uint AnalogFilterOutPutVoltage = 0;//定义模拟滤波后输出电压变量为0
void main(void)//主函数
{
Timer0Init();//定时器0初始化函数
// Timer1Init();//定时器1初始化函数
// ADC0832Init();//ADC0832初始化函数
DigitronBootDisplay();//数码管开机显示函数
while(1)//主循环
{
// AnalogDataResult = ADC0832Change();//ADC0832转化函数转化的模拟量十进制数赋给模拟量数字结果变量 即模拟量转十进制数变量
// OutPutVoltage = (AnalogDataResult * 1.0 * 5 / 255) * 1000;//输出电压计算公式 5是基准电压5V 255是模数芯片ADC0832内部八位模拟转换寄存器储存的最大数值 为啥乘以1000? 由于输出电压是用四位数码管来显示 需要乘以1000来把输出电压变成四位数在四位数码管上分解显示出来
DigitronDisplayDataSplit();//数码管显示数据分解函数
// DigitronDisplayData();//数码管显示数据函数
// KeyScan();//按键扫描函数 该函数放在定时器定时2ms的中断函数中扫描
// KeyScanResult();//按键扫描结果函数
// AnalogFilterVoltage = AnalogFilterVoltage + OutPutVoltage;//模拟滤波电压变量
// AnalogSamplingCount++;//模拟采样计数变量自加1
// if(AnalogSamplingCount >= 8)//模拟采样计数变量计8次
// {
// AnalogFilterOutPutVoltage = AnalogFilterVoltage >> 3;//模拟滤波电压变量右移三位 表示模拟滤波电压变量除以8取平均滤波后的输出电压
// AnalogSamplingCount = 0;//模拟采样计数变量清0
// AnalogFilterVoltage = 0;//模拟滤波电压变量清0
// }
}
}
NTC10KB3435.c
#include "NTC10KB3435.h"
#include "ADC0832Filter.h"
#include "ADC0832.h"
#include "math.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uin
uchar AnalogDataResult = 0;//定义模拟量数值变量
float Rt = 0,NTCTemperature = 0,NTCOutPutVoltage = 0;//定义NTC当前阻值变量、NTC当前温度变量、NTC当前电压变量
float Rp = 10000;//定义NTC在25℃的阻值 这里是10K
float Bx = 3435;//定义NTC的B值
float T3 = 273.15;//定义开尔文温度 等于273.15+NTC当前摄氏度T
float T4 = 273.15+25;//定义开尔文温度 等于273.15+摄氏度25
float GetNTCTemperature()//获取NTC温度函数
{
AnalogDataResult = ADC0832Change();//ADC0832转化函数转化的模拟量十进制数赋给模拟量数字结果变量 即模拟量转十进制数变量
// AnalogDataResult = FliterMiddle();//模拟量数值取中间值滤波采样
NTCOutPutVoltage = (float)(AnalogDataResult) * (5.0 / 255.0);//模拟量转化成数字量 即电压模拟量转化成电压数字量 NTCOutPutVoltage = (float)(AnalogDataResult) * (5.0 / 255.0)是咋么算的?根据电压数字量 / 模拟量数值 = 5V电压 / 5V电压分成255份来算的 即NTCOutPutVoltage / AnalogDataResult = 5.0 / 255 转化后可得NTCOutPutVoltage = (float)(AnalogDataResult) * (5.0 / 255.0)
Rt = NTCOutPutVoltage * 1000 / (5.0 - NTCOutPutVoltage);//Rt = NTCOutPutVoltage * 1000 / (5.0 - NTCOutPutVoltage)是咋么算的?其中1000是NTC串联的电阻1K 5是基准电压5V 根据NTC与串联电阻串联电流相等 即(基准电压-NTC当前电压) / 串联电阻阻值 = NTC当前电压 / NTC当前阻值 基准电压取5V 串联电阻阻值取1k 由此可得(5. 0 - NTCOutPutVoltage) / 1000 = NTCOutPutVoltage / Rt 转化可得Rt = NTCOutPutVoltage * 1000 / (5.0 - NTCOutPutVoltage)
NTCTemperature = 1 / (1 / T4 + log( Rt / Rp) / Bx) - T3 - 2;//减2是为了减少温度误差 由NTC当前阻值与NTC当前温度计算公式:Rt = Rp * EXP(Bx * ( 1 / T3 - 1 / T4))转换可得T1 = 1 /(ln(Rt / Rp )/ Bx + 1 / T4) 其中Rt是NTC在T3温度下的阻值 Rp是NTC常温下标称阻值 EXP是e的n次方 Bx是NTC的B值 T3是开尔文温度273.15 + NTC当前摄氏度T T4是开尔文温度等于273.15 + 摄氏度25 其中T3 = 273.15 + NTC当前摄氏度T T4 = 273.15 + 摄氏度25 由此可换算成273.15 + T = 1 /(ln(Rt / Rp )/ Bx + 1 / T4)进一步转换成T = [ 1 /(ln(Rt / Rp )/ Bx + 1 / T4)] - 273.15 再次转换可得T = [ 1 /(log(Rt / Rp )/ Bx + 1 / T4)] - 273.15 代入数据可得T = [1 / (log(Rt / 10000)/ 3950 + 1 / (273.15 + 25))] - 273.15
return NTCTemperature;//返回NTC温度变量值
}
NTC10KB3435.h
#ifndef __NTC10KB3435_H__
#define __NTC10KB3435_H__
#include "STC12C5A60S2.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int