基于51单片机的热敏电阻测温设计

基于51单片机的热敏电阻测温

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

本系统由STC89C52单片机+热敏电阻+TLC2543AD模块+LCD1602显示模块+报警模块+电源构成

1.LCD1602显示测得的温度值与设定的温度范围

2.按键可以设置温度范围;

3.超过设置的温度范围,开始报警;

共3个按键:设置、加、减

​演示视频:

基于51单片机的热敏电阻测温设计 

程序

/*
基于51单片机热敏电阻测温
液晶显示屏显示当前温度及温度上下限值
超过温度范围则报警
/***公众号:木子单片机****
*/
#include<reg52.h>				 //头文件
#include<intrins.h>
#include"eeprom52.h"		  //调用STC89C52单片机的EEPROM控制程序
#include "math.h"
#define uchar unsigned char		 //宏定义
#define uint unsigned int		 //宏定义
#define LCD1602_dat P0			 //LCD1602的数据传输IO口


sbit LCD1602_rs=P2^5;//LCD1602命令数据控制IO
sbit LCD1602_rw=P2^6; //LCD1602读写IO控制
sbit LCD1602_e=P2^7;  //数据脉冲输入
sbit beep=P2^0;	 //蜂鸣器IO
sbit led_1=P1^5; //超上限指示灯
sbit led_2=P1^6;//超下限指示灯

sbit key_1=P3^5;  //设置按键
sbit key_2=P3^6;//加按键
sbit key_3=P3^7;//减按键


sbit TCL2543_EOC  = P1^0; 	//转换结束标志IO口
sbit TCL2543_CLK  = P1^1;	//I/O时钟输入
sbit TCL2543_ADIN = P1^2;	 //串行数据输入端
sbit TCL2543_DOUT = P1^3;  //串行数据输出端
sbit TCL2543_CS   = P1^4;	 //片选脚IO


float zhi;	//暂存读取的输入变量

int temp;	//读取DS18B20的温度数据
char temp_h,temp_l;	//温度上下限制存储变量
uchar state,ms;	   //系统设置项变量、50ms定时变量

bit s1,beep1;	//设置闪烁标志位、报警标志位

void delay(uint T)		//系统延时程序
{
	while(T--);
}

// 其中 port 为通道: 通道0:port = 0x01 通道1:port = 0x02 通道2:port = 0x04 ... 
//    片子操作文本地址    http://wenku.baidu.com/link?url=WTp8rj93fYDbqM6kYbynkqTrI5MGQFQGtgk6aDrMMdfcB0K2Q9HIrVOs-SSSCLUMOKLOS31ENJAadBSdrVMHg_YxXPYcXWC7T0rb-rINptW
uint read2543(unsigned char port) //读取TCL2543对应模拟输入口的AD数据,并返回数据 
{  
	unsigned int i;  //上电时,EOC=“1”,CS=“1” 
	uint ad_value=0;  
	TCL2543_CLK=0;   
	TCL2543_CS=0;   //使能TCL2543片选
	TCL2543_EOC=1;   
	port<<=4;   
	for(i=0;i<12;i++)      //读取12位的模拟量的数字数据
	{  
		if(TCL2543_DOUT) ad_value|=0x01;  //前次转换结果的MSB即A11位数据输出到Dout供读数  
		TCL2543_ADIN=(bit)(port&0x80);    
		TCL2543_CLK=1;    //
		_nop_();  
		_nop_();    
		_nop_();  
		TCL2543_CLK=0;    
		_nop_();    
		_nop_();  
		_nop_();  
		port=port<<1;  
		ad_value=ad_value<<1;   
	}
	TCL2543_CS=1;   //锁定片子
	ad_value=ad_value>>1;   
	return ad_value;  	//返回读取的AD值
}
/********************************************************************
* 名称 : LCD1602_write(uchar order,dat)
* 功能 : 1602写如数据函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_write(uchar order,dat)				  //1602 一个字节  处理
{
    LCD1602_e=0;
    LCD1602_rs=order;
    LCD1602_dat=dat;
    LCD1602_rw=0;
    LCD1602_e=1;
    delay(1);
    LCD1602_e=0;																								     
}
/********************************************************************
* 名称 : LCD1602_writebye(uchar *prointer)
* 功能 : 1602写入数据函数  指针式
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_writebyte(uchar *prointer)				   //1602 字符串    处理
{
    while(*prointer!='\0')
    {
        LCD1602_write(1,*prointer);
        prointer++;
    }
}
/********************************************************************
* 名称 : LCD1602_cls()
* 功能 : 初始化1602液晶 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_cls()									 //1602 初始化
{
	LCD1602_write(0,0x01);     //1602 清屏 指令
	delay(1500);
	LCD1602_write(0,0x38);     // 功能设置 8位、5*7点阵
	delay(1500);
	LCD1602_write(0,0x0c);     //设置 光标   不显示开关、不显示光标、字符不闪烁
	LCD1602_write(0,0x06);
	LCD1602_write(0,0xd0);
	delay(1500);
}

/********************************************************************
* 名称 : show()
* 功能 : LCD1602液晶显示程序 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void show()			//显示数据
{

		LCD1602_write(0,0x80);		   //显示位置设定
		LCD1602_writebyte("Temp:");		//显示当前温度值
		if(temp>=0)			 //显示温度整数部分
		{
		   	if(temp>999)LCD1602_write(1,0x30+temp/1000%10);	   
			else LCD1602_writebyte(" ");
			if(temp>99)LCD1602_write(1,0x30+temp/100%10);
			else LCD1602_writebyte(" ");
			LCD1602_write(1,0x30+temp/10%10);
			LCD1602_writebyte(".");
		   	LCD1602_write(1,0x30+temp%10);
		}else
		{
			LCD1602_writebyte("-");	  //显示温度负数部分
			if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
			else LCD1602_writebyte(" ");
			LCD1602_write(1,0x30+(temp*-1)%10);	
			LCD1602_writebyte(".");
		   	LCD1602_write(1,0x30+temp%10);
		}
		LCD1602_write(1,0xdf);
		LCD1602_writebyte("C  ");



	 	LCD1602_write(0,0xC0);	 //第二行显示温度上下限值
		LCD1602_writebyte("H:");
		if(state==1&&s1==1)		  //对应设置项设置时闪烁控制   //上限
		{
			LCD1602_writebyte("   ");
		}else					   //显示上限值
		{
			if(temp_h>=0)
			{
			   	if(temp_h>99)LCD1602_write(1,0x30+temp_h/100%10);
				else LCD1602_writebyte(" ");
				if(temp_h>9)LCD1602_write(1,0x30+temp_h/10%10);
				else LCD1602_writebyte(" ");
				LCD1602_write(1,0x30+temp_h%10);
			}else
			{
				LCD1602_writebyte("-");
				if(temp_h*-1>9)LCD1602_write(1,0x30+(temp_h*-1)/10%10);
				else LCD1602_writebyte(" ");
				LCD1602_write(1,0x30+(temp_h*-1)%10);	
			}
		}
		LCD1602_write(1,0xdf);
		LCD1602_writebyte("C L:");
		if(state==2&&s1==1)	  //对应设置项设置时闪烁控制   //下限
		{
			LCD1602_writebyte("   ");
		}else
		{
			if(temp_l>=0)		  //显示下限值
			{
			   	if(temp_l>99)LCD1602_write(1,0x30+temp_l/100%10);
				else LCD1602_writebyte(" ");
				if(temp_l>9)LCD1602_write(1,0x30+temp_l/10%10);
				else LCD1602_writebyte(" ");
				LCD1602_write(1,0x30+temp_l%10);
			}else
			{
				LCD1602_writebyte("-");
				if(temp_l*-1>9)LCD1602_write(1,0x30+(temp_l*-1)/10%10);
				else LCD1602_writebyte(" ");
				LCD1602_write(1,0x30+(temp_l*-1)%10);	
			}
		}
		LCD1602_write(1,0xdf);
		LCD1602_writebyte("C");
	
}

/********************************************************************
* 名称 : proc()
* 功能 : 系统指示灯与报警处理
* 输入 : 无
* 输出 : 无
***********************************************************************/
void proc()
{
	if(temp>temp_h*10)	 //如果当前温度高于上限温度
	{
		led_1=0; 	 //对应指示灯点亮
	}else			//否则  熄灭
	{
		led_1=1; 	
	}
	if(temp<temp_l*10)	//如果当前温度低于下限温度 
	{
		led_2=0;	  //对应指示灯点亮
	}else			  //否则  熄灭
	{
		led_2=1;	
	}

	if(temp>temp_h*10||temp<temp_l*10)	 //如果当前温度 值不处于  上下限温度之间  这报警标志位值1   反之  置0   
	{
		beep1=1;  //开始报警
	}else
	{
		beep1=0;  //停止报警
	}
}

/********************************************************************
* 名称 : key()
* 功能 : 系统控制按键控制检测程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void key()
{

	if(!key_1)	//判断按键是否按下
	{
		delay(888);	 //延时去抖
		if(!key_1)	//再次判断按键是否按下
		{
			state=(state+1)%3;		//切换设置项
			while(!key_1);		   //按键判断释放
		}
	}
	if(state!=0)		//如果系统非设置状态   则 
	{
		if(!key_2)		//判断按键是否按下//如果加按键按下  
		{
			delay(888);	   //延时去抖
			if(!key_2)	//再次判断按键是否按下
			{
				while(!key_2) show();  //按键判断释放
				switch(state) //判断当前设置项
				{
					case 1:				  //如果是上限设置
					if(temp_h<99)temp_h++;
					SectorErase(0x2000);	 //保存上限值
					byte_write(0x2000,temp_h);
					break;
					case 2:		     //如果是下限设置
					if(temp_h>temp_l+1)temp_l++;	
					SectorErase(0x2200);	 //保存上限值
					byte_write(0x2200,temp_l);
					break;
				}
			}
		}
		if(!key_3)	//判断按键是否按下  如果减按键按下
		{
			delay(888);	 //延时去抖
			if(!key_3)	 //再次判断按键是否按下
			{
				while(!key_3) show();  //按键判断释放
				switch(state)	 //判断当前设置项
				{
					case 1:			     //如果是上限设置
					if(temp_h>temp_l+1)temp_h--;
					SectorErase(0x2000);	 //保存上限值
					byte_write(0x2000,temp_h);
					break;
					case 2:			   //如果是下限设置
					if(temp_l>-40)temp_l--;
					SectorErase(0x2200);	 //保存上限值
					byte_write(0x2200,temp_l);
					break;

				}
			}
		}
	}
}


/********************************************************************
* 名称 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
* 功能 : 根据当前热敏电阻的阻值、以及参数、通过Sin曲线求出当前系统的温度值  并返回浮点型的温度值
* 输入 : 无
* 输出 : 无
***********************************************************************/
float TempCalculate(float Rx,float B,float Revise,float BasicRx){
/*

Rx:  热敏电阻当前阻值
B:   热敏电阻参数B值
Revise:  校正温度
BasicRx:  热敏电阻25度时电阻(标称电阻数值)


返回: 摄氏度

*/  


    Rx = Rx / BasicRx;
    
    Rx = log(Rx);
    
    Rx = (Rx) / B;
    
    Rx = Rx + 0.003356;
    Rx = 1 / Rx;
    Rx = Rx - 273.13;  
    Rx = Rx + Revise;
    
    
    return Rx;
  
}
/********************************************************************
* 名称 : void main()
* 功能 : 系统主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

104瓷片电容;电源接口;

10uf电解电容;30pf瓷片电容;

轻触按键;3mm 红色led灯;

5V有源蜂鸣器;4针排针;

LCD1602液晶显示屏+16P插座;

103排阻;8550三极管;

10K电阻;1K电阻;3K电阻;

热敏电阻 带线+2P白色插头;

自锁开关;12M晶振;

TLC2543芯片+DIP20插座;

导线:若干;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus8.9版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

九千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

05设计资料

        资料获取请关注同名公众号,全部资料包括仿真源文件 、AD原理图、程序(含注释)、PCB、任务书、开题报告、设计报告、结构框图、实物图、元件清单、仿真演示视频等。具体内容如下,全网最全! !

 

可以关注下方公众号!

点赞分享一起学习成长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值