51单片机 PT100 温度测量程序

51单片机PT100温度测量系统,包含恒流源驱动、信号放大、AD转换、温度计算、显示输出等功能。

一、系统架构

复制代码
PT100温度测量系统架构:
├── 传感器模块
│   ├── PT100铂电阻(三线制)
│   ├── 恒流源电路(1mA)
│   └── 信号调理电路
├── 单片机模块
│   ├── AT89C51/STC89C52
│   ├── ADC0832模数转换
│   └── 温度计算算法
├── 显示模块
│   ├── LCD1602液晶显示
│   ├── 数码管显示
│   └── 串口输出
└── 输出模块
    ├── 继电器控制
    ├── PWM输出
    └── 报警输出

二、硬件连接

2.1 引脚定义

c 复制代码
/* 51单片机引脚定义 */
sbit ADC_CS   = P1^0;    // ADC0832片选
sbit ADC_CLK  = P1^1;    // ADC0832时钟
sbit ADC_DIO  = P1^2;    // ADC0832数据

sbit LCD_RS   = P2^0;    // LCD1602 RS
sbit LCD_RW   = P2^1;    // LCD1602 RW
sbit LCD_EN   = P2^2;    // LCD1602 EN
#define LCD_DB P0         // LCD1602数据总线

sbit KEY_SET  = P3^2;    // 设置按键
sbit KEY_UP   = P3^3;    // 加按键
sbit KEY_DOWN = P3^4;    // 减按键

sbit RELAY    = P2^5;    // 继电器控制
sbit BUZZER   = P2^6;    // 蜂鸣器报警
sbit LED_RUN  = P2^7;    // 运行指示灯

/* PT100测量参数 */
#define CURRENT_SRC 1.0      // 恒流源电流(mA)
#define AMP_GAIN   10.0      // 放大倍数
#define R_REF     100.0      // 参考电阻(Ω)
#define V_REF       5.0      // 参考电压(V)
#define ADC_BITS    8        // ADC位数

三、核心代码实现

3.1 主程序 (main.c)

c 复制代码
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long ulong;

/* 全局变量 */
float g_temperature = 0.0;      // 当前温度
float g_temp_set = 50.0;       // 设定温度
float g_temp_high = 80.0;      // 高温报警
float g_temp_low = 10.0;       // 低温报警
uchar g_display_mode = 0;      // 显示模式
bit g_alarm_flag = 0;          // 报警标志
bit g_relay_state = 0;         // 继电器状态

/* 函数声明 */
void delay_ms(uint ms);
void adc0832_init(void);
uchar adc0832_read(uchar channel);
float pt100_resistance_to_temp(float resistance);
float adc_to_resistance(uchar adc_value);
void lcd_init(void);
void lcd_show_string(uchar x, uchar y, char *str);
void lcd_show_num(uchar x, uchar y, float num, uchar decimals);
void key_scan(void);
void control_process(void);
void display_update(void);
void alarm_check(void);

/* 主函数 */
void main(void)
{
    EA = 1;  // 开总中断
    
    /* 初始化 */
    adc0832_init();
    lcd_init();
    lcd_show_string(0, 0, "PT100 Temp System");
    lcd_show_string(0, 1, "Initializing...");
    delay_ms(1000);
    
    /* 主循环 */
    while(1)
    {
        uchar adc_value;
        float resistance;
        
        /* 读取ADC */
        adc_value = adc0832_read(0);  // 通道0
        
        /* 计算电阻 */
        resistance = adc_to_resistance(adc_value);
        
        /* 计算温度 */
        g_temperature = pt100_resistance_to_temp(resistance);
        
        /* 控制处理 */
        control_process();
        
        /* 报警检查 */
        alarm_check();
        
        /* 显示更新 */
        display_update();
        
        /* 按键扫描 */
        key_scan();
        
        /* 运行指示灯闪烁 */
        LED_RUN = ~LED_RUN;
        delay_ms(500);
    }
}

/* 延时函数 */
void delay_ms(uint ms)
{
    uint i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

/* ADC0832初始化 */
void adc0832_init(void)
{
    ADC_CS = 1;
    ADC_CLK = 0;
}

/* 读取ADC0832 */
uchar adc0832_read(uchar channel)
{
    uchar i, dat1 = 0, dat2 = 0;
    
    ADC_CS = 0;  // 片选使能
    
    /* 启动信号 */
    ADC_CLK = 0;
    ADC_DIO = 1;
    _nop_();
    ADC_CLK = 1;
    _nop_();
    
    /* 选择通道 */
    ADC_CLK = 0;
    if(channel == 0)  // CH0
        ADC_DIO = 1;
    else              // CH1
        ADC_DIO = 0;
    _nop_();
    ADC_CLK = 1;
    _nop_();
    
    ADC_CLK = 0;
    ADC_DIO = 1;  // 释放数据线
    _nop_();
    
    /* 读取数据 */
    for(i = 0; i < 8; i++)
    {
        ADC_CLK = 1;
        _nop_();
        ADC_CLK = 0;
        dat1 <<= 1;
        if(ADC_DIO)
            dat1 |= 0x01;
        _nop_();
    }
    
    for(i = 0; i < 8; i++)
    {
        dat2 >>= 1;
        if(ADC_DIO)
            dat2 |= 0x80;
        ADC_CLK = 1;
        _nop_();
        ADC_CLK = 0;
        _nop_();
    }
    
    ADC_CS = 1;  // 片选禁止
    
    return (dat1 == dat2) ? dat1 : 0;
}

/* ADC值转换为电阻值 */
float adc_to_resistance(uchar adc_value)
{
    float voltage, resistance;
    
    /* 计算ADC电压 */
    voltage = (float)adc_value * V_REF / 255.0;
    
    /* 计算PT100两端电压(考虑放大倍数) */
    voltage = voltage / AMP_GAIN;
    
    /* 计算PT100电阻 */
    resistance = voltage / (CURRENT_SRC / 1000.0);  // 电流单位转换为A
    
    return resistance;
}

/* PT100电阻转温度(Callendar-Van Dusen方程) */
float pt100_resistance_to_temp(float resistance)
{
    float temp;
    float R0 = 100.0;      // 0℃时的电阻
    float A = 3.9083e-3;   // 系数A
    float B = -5.775e-7;   // 系数B
    float C = -4.183e-12;  // 系数C(用于-200~0℃)
    
    if(resistance < R0)
    {
        /* 负温度范围(-200~0℃) */
        float a = 1.0;
        float b = A;
        float c = B;
        float d = C;
        float e = -R0 + resistance;
        
        temp = (-b + sqrt(b*b - 4*a*d*e)) / (2*a*d);
    }
    else
    {
        /* 正温度范围(0~850℃) */
        float a = B;
        float b = A;
        float c = 1.0 - resistance/R0;
        
        temp = (-b + sqrt(b*b - 4*a*c)) / (2*a);
    }
    
    return temp;
}

/* 简化版温度计算(适合51单片机) */
float pt100_resistance_to_temp_simple(float resistance)
{
    float temp;
    
    /* 使用分段线性近似 */
    if(resistance >= 100.0 && resistance <= 138.5)
    {
        /* 0~100℃范围 */
        temp = (resistance - 100.0) / 0.385;
    }
    else if(resistance >= 80.0 && resistance < 100.0)
    {
        /* -50~0℃范围 */
        temp = (resistance - 100.0) / 0.384;
    }
    else
    {
        /* 超出范围 */
        temp = 999.9;
    }
    
    return temp;
}

/* 控制处理 */
void control_process(void)
{
    /* 继电器控制 */
    if(g_temperature >= g_temp_set)
    {
        RELAY = 1;  // 关闭加热
        g_relay_state = 0;
    }
    else if(g_temperature < g_temp_set - 2.0)  // 回差2℃
    {
        RELAY = 0;  // 开启加热
        g_relay_state = 1;
    }
}

/* 报警检查 */
void alarm_check(void)
{
    if(g_temperature >= g_temp_high || g_temperature <= g_temp_low)
    {
        g_alarm_flag = 1;
        BUZZER = 0;  // 蜂鸣器响
    }
    else
    {
        g_alarm_flag = 0;
        BUZZER = 1;  // 蜂鸣器停
    }
}

/* 显示更新 */
void display_update(void)
{
    char buf[16];
    
    if(g_display_mode == 0)
    {
        /* 显示当前温度 */
        lcd_show_string(0, 0, "Current Temp:");
        sprintf(buf, "%.1f C", g_temperature);
        lcd_show_string(8, 1, buf);
    }
    else if(g_display_mode == 1)
    {
        /* 显示设定温度 */
        lcd_show_string(0, 0, "Set Temp:");
        sprintf(buf, "%.1f C", g_temp_set);
        lcd_show_string(8, 1, buf);
    }
    else if(g_display_mode == 2)
    {
        /* 显示报警温度 */
        lcd_show_string(0, 0, "Alarm Temp:");
        sprintf(buf, "H:%.1f L:%.1f", g_temp_high, g_temp_low);
        lcd_show_string(0, 1, buf);
    }
    
    /* 显示继电器状态 */
    if(g_relay_state)
        lcd_show_string(0, 1, "HEAT ON ");
    else
        lcd_show_string(0, 1, "HEAT OFF");
    
    /* 显示报警标志 */
    if(g_alarm_flag)
        lcd_show_string(14, 1, "ALM");
    else
        lcd_show_string(14, 1, "   ");
}

3.2 LCD1602驱动 (lcd1602.c)

c 复制代码
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
#define LCD_DB P0

/* 延时函数 */
void lcd_delay_us(uint us)
{
    while(us--);
}

void lcd_delay_ms(uint ms)
{
    uint i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

/* 写命令 */
void lcd_write_cmd(uchar cmd)
{
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_DB = cmd;
    lcd_delay_us(10);
    LCD_EN = 1;
    lcd_delay_us(10);
    LCD_EN = 0;
    lcd_delay_ms(2);
}

/* 写数据 */
void lcd_write_data(uchar dat)
{
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_DB = dat;
    lcd_delay_us(10);
    LCD_EN = 1;
    lcd_delay_us(10);
    LCD_EN = 0;
    lcd_delay_ms(2);
}

/* 初始化LCD */
void lcd_init(void)
{
    lcd_delay_ms(15);
    lcd_write_cmd(0x38);  // 8位数据,2行显示,5x7点阵
    lcd_delay_ms(5);
    lcd_write_cmd(0x38);
    lcd_delay_ms(5);
    lcd_write_cmd(0x38);
    lcd_write_cmd(0x0C);  // 开显示,关光标
    lcd_write_cmd(0x06);  // 写入后地址递增
    lcd_write_cmd(0x01);  // 清屏
    lcd_delay_ms(2);
}

/* 设置显示位置 */
void lcd_set_cursor(uchar x, uchar y)
{
    uchar addr;
    if(y == 0)
        addr = 0x80 + x;
    else
        addr = 0xC0 + x;
    lcd_write_cmd(addr);
}

/* 显示字符串 */
void lcd_show_string(uchar x, uchar y, char *str)
{
    lcd_set_cursor(x, y);
    while(*str)
    {
        lcd_write_data(*str++);
    }
}

/* 显示数字 */
void lcd_show_num(uchar x, uchar y, float num, uchar decimals)
{
    char buf[16];
    char fmt[10];
    
    sprintf(fmt, "%%.%df", decimals);
    sprintf(buf, fmt, num);
    lcd_show_string(x, y, buf);
}

3.3 按键处理 (key.c)

c 复制代码
#include <reg52.h>
#include "main.c"

/* 按键扫描 */
void key_scan(void)
{
    static bit key_lock = 0;
    
    if(KEY_SET == 0 && key_lock == 0)
    {
        delay_ms(10);  // 消抖
        if(KEY_SET == 0)
        {
            key_lock = 1;
            g_display_mode = (g_display_mode + 1) % 3;
        }
    }
    else if(KEY_SET == 1)
    {
        key_lock = 0;
    }
    
    /* 加按键 */
    if(KEY_UP == 0)
    {
        delay_ms(10);
        if(KEY_UP == 0)
        {
            if(g_display_mode == 1)
            {
                g_temp_set += 1.0;
                if(g_temp_set > 200.0) g_temp_set = 200.0;
            }
            else if(g_display_mode == 2)
            {
                g_temp_high += 1.0;
                if(g_temp_high > 200.0) g_temp_high = 200.0;
            }
            while(KEY_UP == 0);  // 等待松开
        }
    }
    
    /* 减按键 */
    if(KEY_DOWN == 0)
    {
        delay_ms(10);
        if(KEY_DOWN == 0)
        {
            if(g_display_mode == 1)
            {
                g_temp_set -= 1.0;
                if(g_temp_set < -50.0) g_temp_set = -50.0;
            }
            else if(g_display_mode == 2)
            {
                g_temp_low -= 1.0;
                if(g_temp_low < -50.0) g_temp_low = -50.0;
            }
            while(KEY_DOWN == 0);  // 等待松开
        }
    }
}

四、PT100分度表(查表法)

4.1 PT100分度表 (pt100_table.h)

c 复制代码
#ifndef PT100_TABLE_H
#define PT100_TABLE_H

#include <reg52.h>

/* PT100分度表(-200~850℃,步长1℃) */
code float pt100_table[1051] = {
    // -200℃ ~ -100℃
    18.52, 18.96, 19.40, 19.84, 20.28, 20.72, 21.16, 21.60, 22.04, 22.48,
    22.92, 23.36, 23.80, 24.24, 24.68, 25.12, 25.56, 26.00, 26.44, 26.88,
    27.32, 27.76, 28.20, 28.64, 29.08, 29.52, 29.96, 30.40, 30.84, 31.28,
    31.72, 32.16, 32.60, 33.04, 33.48, 33.92, 34.36, 34.80, 35.24, 35.68,
    36.12, 36.56, 37.00, 37.44, 37.88, 38.32, 38.76, 39.20, 39.64, 40.08,
    40.52, 40.96, 41.40, 41.84, 42.28, 42.72, 43.16, 43.60, 44.04, 44.48,
    44.92, 45.36, 45.80, 46.24, 46.68, 47.12, 47.56, 48.00, 48.44, 48.88,
    49.32, 49.76, 50.20, 50.64, 51.08, 51.52, 51.96, 52.40, 52.84, 53.28,
    53.72, 54.16, 54.60, 55.04, 55.48, 55.92, 56.36, 56.80, 57.24, 57.68,
    58.12, 58.56, 59.00, 59.44, 59.88, 60.32, 60.76, 61.20, 61.64, 62.08,
    
    // 0℃ ~ 100℃
    100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51,
    103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,
    107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,
    111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,
    115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,
    119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.48, 122.86,
    123.24, 123.63, 124.01, 124.40, 124.78, 125.16, 125.55, 125.93, 126.31, 126.70,
    127.08, 127.46, 127.85, 128.23, 128.61, 129.00, 129.38, 129.76, 130.14, 130.53,
    
    // 100℃ ~ 200℃
    130.91, 131.29, 131.67, 132.06, 132.44, 132.82, 133.20, 133.58, 133.96, 134.35,
    134.73, 135.11, 135.49, 135.87, 136.25, 136.63, 137.01, 137.39, 137.77, 138.15,
    138.53, 138.91, 139.29, 139.67, 140.05, 140.43, 140.81, 141.19, 141.57, 141.94,
    142.32, 142.70, 143.08, 143.46, 143.83, 144.21, 144.59, 144.97, 145.34, 145.72,
    146.10, 146.47, 146.85, 147.23, 147.60, 147.98, 148.36, 148.73, 149.11, 149.48,
    149.86, 150.23, 150.61, 150.98, 151.36, 151.73, 152.11, 152.48, 152.86, 153.23,
    153.61, 153.98, 154.35, 154.73, 155.10, 155.48, 155.85, 156.22, 156.60, 156.97,
    157.34, 157.72, 158.09, 158.46, 158.83, 159.21, 159.58, 159.95, 160.32, 160.70,
    
    // 200℃ ~ 300℃
    161.07, 161.44, 161.81, 162.18, 162.56, 162.93, 163.30, 163.67, 164.04, 164.41,
    164.78, 165.15, 165.52, 165.89, 166.26, 166.63, 167.00, 167.37, 167.74, 168.11,
    168.48, 168.85, 169.22, 169.59, 169.96, 170.33, 170.69, 171.06, 171.43, 171.80,
    172.17, 172.54, 172.90, 173.27, 173.64, 174.00, 174.37, 174.74, 175.10, 175.47,
    175.84, 176.20, 176.57, 176.93, 177.30, 177.66, 178.03, 178.39, 178.76, 179.12,
    179.49, 179.85, 180.21, 180.58, 180.94, 181.30, 181.67, 182.03, 182.39, 182.76,
    183.12, 183.48, 183.84, 184.21, 184.57, 184.93, 185.29, 185.65, 186.01, 186.38,
    186.74, 187.10, 187.46, 187.82, 188.18, 188.54, 188.90, 189.26, 189.62, 189.98,
    
    // 300℃ ~ 400℃
    190.34, 190.70, 191.06, 191.42, 191.78, 192.14, 192.50, 192.86, 193.22, 193.58,
    193.94, 194.29, 194.65, 195.01, 195.37, 195.72, 196.08, 196.44, 196.79, 197.15,
    197.51, 197.86, 198.22, 198.57, 198.93, 199.29, 199.64, 200.00, 200.35, 200.71,
    201.06, 201.42, 201.77, 202.13, 202.48, 202.84, 203.19, 203.55, 203.90, 204.25,
    204.61, 204.96, 205.31, 205.67, 206.02, 206.37, 206.73, 207.08, 207.43, 207.78,
    208.14, 208.49, 208.84, 209.19, 209.54, 209.89, 210.24, 210.60, 210.95, 211.30,
    211.65, 212.00, 212.35, 212.70, 213.05, 213.40, 213.75, 214.10, 214.45, 214.80,
    215.15, 215.50, 215.85, 216.20, 216.55, 216.90, 217.25, 217.60, 217.95, 218.30,
    
    // 400℃ ~ 500℃
    218.64, 218.99, 219.34, 219.69, 220.04, 220.38, 220.73, 221.08, 221.42, 221.77,
    222.12, 222.46, 222.81, 223.16, 223.50, 223.85, 224.19, 224.54, 224.88, 225.23,
    225.57, 225.92, 226.26, 226.61, 226.95, 227.30, 227.64, 227.98, 228.33, 228.67,
    229.01, 229.36, 229.70, 230.04, 230.39, 230.73, 231.07, 231.41, 231.76, 232.10,
    232.44, 232.78, 233.12, 233.47, 233.81, 234.15, 234.49, 234.83, 235.17, 235.51,
    235.85, 236.19, 236.53, 236.87, 237.21, 237.55, 237.89, 238.23, 238.57, 238.91,
    239.25, 239.59, 239.93, 240.26, 240.60, 240.94, 241.28, 241.61, 241.95, 242.29,
    242.62, 242.96, 243.30, 243.63, 243.97, 244.31, 244.64, 244.98, 245.31, 245.65,
    
    // 500℃ ~ 600℃
    245.99, 246.32, 246.66, 247.00, 247.33, 247.67, 248.00, 248.34, 248.67, 249.01,
    249.34, 249.68, 250.01, 250.34, 250.68, 251.01, 251.35, 251.68, 252.01, 252.35,
    252.68, 253.01, 253.35, 253.68, 254.01, 254.34, 254.68, 255.01, 255.34, 255.67,
    256.01, 256.34, 256.67, 257.00, 257.33, 257.66, 258.00, 258.33, 258.66, 258.99,
    259.32, 259.65, 259.98, 260.31, 260.64, 260.97, 261.30, 261.63, 261.96, 262.29,
    262.62, 262.95, 263.28, 263.61, 263.94, 264.27, 264.60, 264.93, 265.26, 265.59,
    265.91, 266.24, 266.57, 266.90, 267.23, 267.55, 267.88, 268.21, 268.54, 268.86,
    269.19, 269.52, 269.84, 270.17, 270.50, 270.82, 271.15, 271.48, 271.80, 272.13,
    
    // 600℃ ~ 700℃
    272.46, 272.78, 273.11, 273.43, 273.76, 274.08, 274.41, 274.73, 275.06, 275.38,
    275.71, 276.03, 276.36, 276.68, 277.00, 277.33, 277.65, 277.97, 278.30, 278.62,
    278.94, 279.27, 279.59, 279.91, 280.23, 280.56, 280.88, 281.20, 281.52, 281.84,
    282.16, 282.49, 282.81, 283.13, 283.45, 283.77, 284.09, 284.41, 284.73, 285.05,
    285.37, 285.69, 286.01, 286.33, 286.65, 286.97, 287.29, 287.61, 287.93, 288.25,
    288.57, 288.89, 289.21, 289.52, 289.84, 290.16, 290.48, 290.80, 291.12, 291.43,
    291.75, 292.07, 292.39, 292.70, 293.02, 293.34, 293.65, 293.97, 294.29, 294.60,
    294.92, 295.23, 295.55, 295.87, 296.18, 296.50, 296.81, 297.13, 297.44, 297.76,
    
    // 700℃ ~ 800℃
    298.07, 298.39, 298.70, 299.02, 299.33, 299.64, 299.96, 300.27, 300.59, 300.90,
    301.21, 301.53, 301.84, 302.15, 302.47, 302.78, 303.09, 303.41, 303.72, 304.03,
    304.34, 304.66, 304.97, 305.28, 305.59, 305.90, 306.22, 306.53, 306.84, 307.15,
    307.46, 307.77, 308.08, 308.39, 308.70, 309.01, 309.32, 309.63, 309.94, 310.25,
    310.56, 310.87, 311.18, 311.49, 311.80, 312.11, 312.42, 312.73, 313.04, 313.35,
    313.66, 313.97, 314.28, 314.59, 314.90, 315.21, 315.52, 315.82, 316.13, 316.44,
    316.75, 317.06, 317.37, 317.67, 317.98, 318.29, 318.60, 318.90, 319.21, 319.52,
    319.82, 320.13, 320.44, 320.74, 321.05, 321.36, 321.66, 321.97, 322.28, 322.58,
    
    // 800℃ ~ 850℃
    322.89, 323.19, 323.50, 323.80, 324.11, 324.41, 324.72, 325.02, 325.33, 325.63,
    325.94, 326.24, 326.55, 326.85, 327.16, 327.46, 327.76, 328.07, 328.37, 328.68,
    328.98, 329.28, 329.59, 329.89, 330.19, 330.50, 330.80, 331.10, 331.41, 331.71,
    332.01, 332.31, 332.62, 332.92, 333.22, 333.52, 333.82, 334.13, 334.43, 334.73,
    335.03, 335.33, 335.63, 335.94, 336.24, 336.54, 336.84, 337.14, 337.44, 337.74,
    338.04, 338.34, 338.64, 338.94, 339.24, 339.54, 339.84, 340.14, 340.44, 340.74,
    341.04, 341.34, 341.64, 341.94, 342.24, 342.54, 342.83, 343.13, 343.43, 343.73,
    344.03, 344.33, 344.62, 344.92, 345.22, 345.52, 345.81, 346.11, 346.41, 346.70,
    347.00
};

/* 使用查表法获取温度 */
float pt100_get_temp_from_table(float resistance)
{
    int index;
    float temp;
    
    // 计算电阻对应的索引
    if(resistance < 18.52) return -200.0;
    if(resistance > 347.00) return 850.0;
    
    index = (int)((resistance - 18.52) / 0.385);  // 近似索引
    
    if(index < 0) index = 0;
    if(index >= 1050) index = 1049;
    
    // 线性插值
    float r1 = pt100_table[index];
    float r2 = pt100_table[index + 1];
    float t1 = -200.0 + index;  // 温度从-200℃开始
    float t2 = t1 + 1.0;
    
    temp = t1 + (resistance - r1) * (t2 - t1) / (r2 - r1);
    
    return temp;
}

#endif /* PT100_TABLE_H */

五、硬件电路设计

5.1 恒流源电路

复制代码
         +5V
          |
          |
         [R1] 5kΩ
          |
          +----> 运放同相输入端
          |
         [R2] 1kΩ
          |
         GND

运放输出端 ----+----> PT100
              |
             [R3] 100Ω (采样电阻)
              |
             GND

5.2 信号放大电路

复制代码
PT100电压 ----> 运放差分输入
                  |
                  +----> 放大10倍输出
                  |
                 ADC0832输入

5.3 完整电路连接

复制代码
PT100三线制连接:
   线1 ----+----> 恒流源正极
          |
         PT100
          |
   线2 ----+----> 运放差分输入+
          |
   线3 ----+----> 运放差分输入-
          |
         GND

参考代码 51单片机实现PT100温度测量程序 www.youwenfan.com/contentcsv/72054.html

六、项目配置与使用

6.1 Keil工程配置

  1. 创建新工程,选择AT89C51或STC89C52
  2. 添加所有源文件
  3. 设置晶振频率(11.0592MHz)
  4. 编译生成HEX文件

6.2 使用说明

  1. 上电后显示"PT100 Temp System"
  2. 显示当前温度
  3. 按SET键切换显示模式:
    • 模式0:显示当前温度
    • 模式1:显示设定温度
    • 模式2:显示报警温度
  4. 在设定模式下,用UP/DOWN键调节温度
  5. 当温度超过设定值时,继电器断开
  6. 当温度低于设定值2℃时,继电器闭合
  7. 超温报警时蜂鸣器响

6.3 校准方法

  1. 使用标准温度计测量实际温度

  2. 比较显示温度与实际温度

  3. 调整程序中的系数:

    c 复制代码
    #define CURRENT_SRC 1.0      // 调整恒流源电流
    #define AMP_GAIN   10.0      // 调整放大倍数
  4. 或在程序中加入校准偏移:

    c 复制代码
    g_temperature = pt100_resistance_to_temp(resistance) + CAL_OFFSET;
相关推荐
星夜夏空992 小时前
STM32单片机学习(21) —— I2C通信
stm32·单片机·学习
qq_333120973 小时前
深入探讨8051单片机C351语言及编译器应用
单片机·嵌入式硬件·51单片机
十年编程老舅4 小时前
读懂 MCU 启动:从上电到程序运行全链路
单片机·嵌入式硬件·mcu·嵌入式·cpu·嵌入式开发·ram
北京盟通科技官方账号5 小时前
Windows如何实现硬实时?LxWin双系统隔离架构深度解析
stm32·嵌入式硬件·具身智能·ethercat·人形机器人·实时系统·windows实时扩展
国科安芯6 小时前
低噪声LDO如何破解测试测量与医学成像的电源困局
网络·单片机·嵌入式硬件·安全性测试
半条-咸鱼6 小时前
【STM32】HAL库的本质 及 芯片内部GPIO模块细节
stm32·单片机·嵌入式硬件
小叮当⇔6 小时前
阻容品牌推荐
嵌入式硬件
振南的单片机世界6 小时前
硬件PWM:定时器自动翻转引脚,CPU不费心
stm32·单片机·嵌入式硬件
0南城逆流07 小时前
【STM32】RTT-Studio中HAL库开发教程十二:FreeRTOS移植
stm32·单片机·嵌入式硬件