1. 前言
设计一种针对特定企业气体温度测量的工况(要求测量精度较高的)进行实际测量。热电阻用来做测量用的电阻有两类,即铂和铜,它们与温度的函数关系是一样的,但实用测温范围不一样,工厂实际测温中要求的精度也不同,铂比铜的测温范围要宽一些,精度也高一些,要确定一个具体的企业。如:电子电路印刷焊接流水线、热水工厂、锅炉类企业、烟囱类等,他们的温度范围不同。
主要研究内容: 铂电阻传感器是利用电阻率随温度变化的特性(阻–温效应)而制成(实际上热金属电阻主要有铂和 铜两种)的一类热电阻传感器,测温范围大约是在-200—850摄氏度之间,有较宽的测温范围,广泛地应用于温度的基准、标准测量中。而气体的温度变化范围较大,有很大的不确定性。因此要求测气体温度的热电阻具有较好的物理化学性质,电阻温度系数要大,线性度要好,性能可靠,精度高,特性复现性好,有较好的标准电阻铂电阻的测量精度与铂的纯度有关系,纯度越高,测量的精度就越好,它有两段温区的特性方程,三种不同的温度系数,两种不同的标准电阻值,测量可通过分度表数值(对应的阻—温关系来确定,可以用方程表达出可测量和被测量的关系。
设计总结:
(1)采用铂电阻PT100测量温度
(2)采用MAX31865温度测量模块读取PT100电阻的温度
(3)采用LCD显示屏显示测量的温度
(4)主控单片机采用STM32F103RCT6
2. 硬件选型
2.1 STM32F103RCT6
2.2 USB数据线
2.3 PT100温度传感器
2. 4 MAX31865测温模块
3. STM32程序设计
3.1 文字取模
3.2 keil工程
需要整个工程源码的可以去这里下载: https://download.csdn.net/download/xiaolong1126626497/85896877
3.3 硬件接线
代码语言:javascript复制硬件连接方式:
1. TFT 1.44 寸彩屏接线
GND 电源地
VCC 接5V或3.3v电源
SCL 接PC8(SCL)
SDA 接PC9(SDA)
RST 接PC10
DC 接PB7
CS 接PB8
BL 接PB11
2. 板载LED灯接线
LED1---PA8
LED2---PD2
3. 板载按键接线
K0---PA0
K1---PC5
K2---PA15
4. MAX31865测温模块
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(5.0V)
3.4 main.c代码
代码语言:javascript复制#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "oled.h"
#include <string.h>
#include <stdlib.h>
#include "font.h"
#include "MAX31865.h"
//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=temp; //设置jtag模式
}
int main()
{
char *max31865_p=NULL;
u32 i=0;
u8 key=0;
u32 time_cnt=0;
JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
LED_Init(); //LED灯初始化
KEY_Init(); //按键初始化
delay_init(72);
USART1_Init(115200); //串口1初始化-打印调试信息
Lcd_Init(); //LCD初始化
Lcd_Clear(0); //清屏为黑色
LCD_LED_SET; //通过IO控制背光亮
printf("系统开始运行...rn");
delay_ms(2000); //等待系统稳定
LCD_ShowChineseFont(16*0,0,16,HZ_FONT_16[6],RED,0);
LCD_ShowChineseFont(16*1,0,16,HZ_FONT_16[7],RED,0);
LCD_ShowChineseFont(16*2,0,16,HZ_FONT_16[8],RED,0);
LCD_ShowChineseFont(16*3,0,16,HZ_FONT_16[9],RED,0);
LCD_ShowChineseFont(16*4,0,16,HZ_FONT_16[10],RED,0);
LCD_ShowChineseFont(16*5,0,16,HZ_FONT_16[11],RED,0);
LCD_ShowChineseFont(16*6,0,16,HZ_FONT_16[12],RED,0);
LCD_ShowChineseFont(16*7,0,16,HZ_FONT_16[13],RED,0);
//温度传感器硬件检测
while(1)
{
key=MAX31865_Init();
if(key==0)break;
delay_ms(1000);
printf("MAX31865检测失败.rn");
}
printf("MAX31865检测成功.rn");
Lcd_Clear(0); //清屏为黑色
//文字提示
LCD_ShowChineseFont(16*1,0,16,HZ_FONT_16[0],WHITE,0);
LCD_ShowChineseFont(16*2,0,16,HZ_FONT_16[1],WHITE,0);
LCD_ShowChineseFont(16*3,0,16,HZ_FONT_16[2],WHITE,0);
LCD_ShowChineseFont(16*4,0,16,HZ_FONT_16[3],WHITE,0);
LCD_ShowChineseFont(16*5,0,16,HZ_FONT_16[4],WHITE,0);
LCD_ShowChineseFont(16*6,0,16,HZ_FONT_16[5],WHITE,0);
printf("系统正常运行.....rn");
while(1)
{
delay_ms(10);
//按键可以手动控制开启窗帘和LED灯
key=KEY_Scan();
if(key)
{
printf("key=%drn",key);
LED2=!LED2;
}
//轮询时间到达
if(time_cnt>500)
{
time_cnt=0;
LED1=!LED1;
LED2=!LED2;
//获取一次温度
max31865_p=MAX31865_GetTemp();
printf("当前温度:%srn",max31865_p);
//实时显示
Gui_DrawFont_GBK16(0,0,WHITE,0,(u8*)" ");
Gui_DrawFont_GBK16(52,72,WHITE,0,(u8*)max31865_p);
}
// 接收WIFI返回的数据
if(USART2_RX_FLAG)
{
USART2_RX_BUFFER[USART2_RX_CNT]='