基于单片机热敏电阻PT100温度控制系统设计
文章目录
- 前言
- 资料获取
- 设计介绍
- 功能介绍
- 设计程序
- 具体实现截图
- 设计获取
前言
💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
资料获取
文章底部名片,详细资料联系我。
设计介绍
温度计量是计量学的一个重要分支,它在国民经济各领域中占有重要的地位。人们的日常生活、工农业生产和科学实验等许多方面都与温度测量有着十分密切的关系。
本文在查阅、分析了现有的几种不同的测温原理,分析确定了热敏电阻测温,并对基于热敏电阻pt100的数字温度计的设计进行了深入探讨和研究。该系统分为测温模块、信号放大模块、A/D转换模块和控制显示模块,并分别对其进行方案分析,最终确定数字温度计系统的系统构架和设计方案;在硬件电路中,详细阐述了各模块电路的工作原理,分析了以AT89C51单片机为主控单元的系统硬件和软件设计,并对该系统进行误差分析,使我们对于系统的各种性能有了进一步认识。
本文用protues进行仿真,采用at89c51单片机作为处理的核心部分;用pt100作为温度传感器,把采集到的温度经放大后送到adc0804进行A/D转换,经过at89c51单片机处理后送到显示器,显示器将显示采集的温度。
功能介绍
使用铂热电阻PT100,其阻值会随着温度的变化而改变。PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。厂家提供有PT100在各温度下电阻值值的分度表,在此可以近似取电阻变化率为 0.385Ω/℃。向PT100输入稳恒电流,再通过A/D转换后测PT100两端电压,即得到PT100的电阻值,进而算出当前的温度值。
采用2.55mA的电流源对PT100进行供电,然后用运算放大器LM324搭建的同相放大电路将其电压信号放大25倍后输入到AD0804中。利用电阻变化率0.385Ω/℃的特性,计算出当前温度值。
软件设计采用C语言或汇编语言编程,运用模块化程序设计思想,对不同功能模块的程序进行分别编程,以便移植或调用,这样使软件层次结构清晰,有利于软件的调试修改。
根据设计方案画出程序流程图
图4-1主程序流程图
设计程序
#include <reg52.h>
#include <string.h>
#include <math.h>
#include "intrins.h"
#define ROW1 0x80
#define ROW2 0xC0
#define Ts_CONST 1 /* AD采样时间系数,采样时间为0.1xTs_CONST(s) */
#define NOACT 0
#define FC 1
#define Start_AD 2
#define Cal_Temperature 3
#define Kpt 0.02732644 /* AD芯片max1240的采样值到温度值的转化系数 */
void LCD_Init( void );
void ClearDisp( unsigned char Row );
void Display( unsigned char Addr, unsigned char *pstr );
void DecToASC( unsigned int Dec, unsigned char *p, unsigned char n );
void Disp_Initize( void );
void pid( void );
void Write_CMD( unsigned char CMD );
unsigned int AD_MAX1240( void );
sbit RS = P2^2;
sbit RW = P2^1;
sbit E = P2^0;
sbit SDA = P1^5;
sbit SCL = P1^6;
sbit CS = P1^7;
sbit Beep = P1^0;
sbit Led =P1^1;
sbit Key = P3^5;
sbit up = P3^6;
sbit down = P3^7;
sbit cool = P3^1;
sbit heat = P3^0;
char SET = 23;
char ALERM = 80;
unsigned char DispBuf[16];
unsigned char RunState = NOACT;
unsigned int AD_Reslut, tsflag, ts = 1;
float fz, tmp, tmp1, Pt;
void delay (unsigned int j) /* 延时jms */
{
unsigned int m, n;
for ( n = 0; n < j; n++ )
{
for ( m = 0; m < 120; m++ )
;
}
}
void main( void )
{
LCD_Init();
ClearDisp( ROW1 );
Disp_Initize();
CS = 1;
SDA = 1;
SCL = 0;
TMOD = 0x11;
TF0 = 0; /* 开始程序前先延时65ms,等待max1240上电,以保证AD采样准确 */
TH0 = 0;
TL0 = 0;
TR0 = 1;
while ( !TF0 )
;
TF0 = 0;
TR0 = 0;
TH0 = 0x3C; /* 12M晶振时延时50ms */
TL0 = 0xB0;
ET0 = 1;
TR0 = 1;
EX1 = 1;
IT1 = 1;
EA = 1;
heat = 0;
cool = 0;
Beep = 0;
Led = 1;
while ( 1 )
{
pid();
switch ( RunState )
{
case NOACT:
break;
/*
* case FC: / * F0计算及显示 * /
* fz = pow( 10, (tmp - 121.0000) / 10 );
* DecToASC( fz, DispBuf, 1 );
* DispBuf[1] = '.';
* DecToASC( (fz - (unsigned int) fz) * 1000, DispBuf + 2, 3 );
* DispBuf[5] = '\0';
* Display( 0x80 + 11, DispBuf );
*/
/*
* RunState = NOACT;
* break;
*/
case Start_AD: /* 开始AD采样 */
AD_Reslut = AD_MAX1240();
RunState = Cal_Temperature;
break;
case Cal_Temperature: /* 将AD值转化为温度并进行线性化 */
{
Pt = AD_Reslut * Kpt;
Pt += 100; /* 温度值 */
tmp = Pt / 100;
tmp = 1 - tmp;
tmp = 2.31e-6L * tmp;
tmp += 1.527480889e-5L;
tmp = sqrt( tmp );
tmp += -3.9083e-3L;
tmp /= -1.155e-6L; /* AD采样值线性化修正 */
tmp1 = tmp;
tmp = (tmp + tmp1) / 4; /* 取平均温度 */
tmp = ( (float) ( (unsigned int) (tmp * 10) ) ) / 10 - 0.2; /* 温度补偿 */
DecToASC( tmp, DispBuf, 3 );
DispBuf[3] = '.';
DecToASC( (tmp - (unsigned int) tmp) * 10, DispBuf + 4, 1 );
DispBuf[5] = '\0';
Display( 0xC0 + 4, DispBuf ); /* 显示函数 */
}
RunState = NOACT;
break;
}
if((float)SET>(float)tmp){
heat = 0;
cool = 1;
}else if((float)SET<(float)tmp){
heat = 1;
cool = 0;
}else if((float)SET==(float)tmp){
heat = 1;
cool = 1;
}
if((float)tmp > ALERM){
Beep = 1;
Led = 0;
}else{
Beep = 0;
Led = 1;
}
}
}
具体实现截图
设计获取
文章下方名片联系我即可~
精彩专栏推荐订阅:在下方专栏👇🏻
毕业设计精品实战案例
收藏关注不迷路!!
🌟文末获取设计🌟