基于c51单片机的毕业设计——智能温度控制

这篇具有很好参考价值的文章主要介绍了基于c51单片机的毕业设计——智能温度控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

   本设计采用AT89C51单片机为控制芯片,硬件上用dsb18202做温度采集(有需要也可以采用dht11温湿度模块)直流电机作为降温风扇,用户可通过按键来控制转速的大小,用继电器来控制电阻丝提高温度。用lcd1602显示屏来显示环境温度并且通过按键来设置模式与最高温和最低温。

实验现象:
    
首先它能显示环境的温度并能设置上下限阀值,这是最基本的功能,系统上电的时候显示的是当前环境温度和设定的温度阀值,我们可以通过按键来修改温度上下限阀值。我们看,按下这个K1键会进入温度阀值设置 界面,每按一下,切换一次阀值设置(上下阀值)界面,按第3次时,会自动回到主界面,如此循环。
    在进入温度阀值设计界面时,可以通过K2、K3键对阀值进行加减,这里我们只对温度整数部分进行设置,小数部分我们就不需要了,将设置好的上下限阀值保存到AT24C02(EEPROM)内,当下一次开启系统时只需从AT24C02内读取保存的阀值数据,而不需要重复设置上下限阀值。这样的话,我们用3个按键就实现了温度上下限阀值的设定,这是温度检测控制系统基本的功能。假如我们把温度上限设置为32°C,下限设置为30°C。
    另外还有恒定温度的功能。当设定好上下限阀值时,系统即会把当前的温度与设定的上下限阀值对比,如果高于上限温度,开启散热进行降温,同时报警;如果低于下限温度,开启加热,同时报警;如果当前温度处于下限和上限温度之间时,关闭散热、加热及报警。从而可将温度控制在阀值的范围内。

仿真图展示:

基于c51单片机的毕业设计——智能温度控制

温度高于设定值,风扇反转,警报开启

基于c51单片机的毕业设计——智能温度控制

                                               温度低于设定值,加温开启并发出警报基于c51单片机的毕业设计——智能温度控制

部分功能视频展示:

视频地址:基于c51单片机的毕业设计——智能温度控制_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1yU4y177pp/

核心代码展示:

ds18b20的测温原理

DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号发送给计数器1。高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。

 基于c51单片机的毕业设计——智能温度控制

 

lcd1602工作原理

点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成。显示屏上64×16个显示单元与显示RAM区的1024字节相对应,每一字节的内容与显示屏上相应位置的亮暗对应。例如显示屏第一行的亮暗由RAM区的000H~00FH的16字节的内容决定,当(000H)=FFH时,屏幕左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,屏幕右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H时,在屏幕的顶部显示一条由8条亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。

 基于c51单片机的毕业设计——智能温度控制

 基于c51单片机的毕业设计——智能温度控制

 

 ds18b20初始化

#include "temp.h"

void Delay1ms(unsigned int y)
{
	unsigned int x;
	for(y;y>0;y--)
		for(x=110;x>0;x--);
}


unsigned char Ds18b20Init()//初始化
{
	unsigned int i;
	DSPORT=0;			 //将总线拉低480us~960us
	i=70;	
	while(i--);//延时642us
	DSPORT=1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i=0;
	while(DSPORT)	//等待DS18B20拉低总线
	{
		i++;
		if(i>5000)//等待>5MS
			return 0;//初始化失败	
	}
	return 1;//初始化成功
}


void Ds18b20WriteByte(unsigned char dat)//写入一字节
{
	unsigned int i,j;
	for(j=0;j<8;j++)
	{
		DSPORT=0;			//每写入一位数据之前先把总线拉低1us
		i++;
		DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
		i=6;
		while(i--); //延时68us,持续时间最少60us
		DSPORT=1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
		dat>>=1;
	}
}


unsigned char Ds18b20ReadByte()//读取字节
{
	unsigned char byte,bi;
	unsigned int i,j;	
	for(j=8;j>0;j--)
	{
		DSPORT=0;//先将总线拉低1us
		i++;
		DSPORT=1;//然后释放总线
		i++;
		i++;//延时6us等待数据稳定
		bi=DSPORT;	 //读取数据,从最低位开始读取
		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
		byte=(byte>>1)|(bi<<7);						  
		i=4;		//读取完之后等待48us再接着读取下一个数
		while(i--);
	}				
	return byte;
}

void  Ds18b20ChangTemp()
{
	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
	Ds18b20WriteByte(0x44);	    //温度转换命令
//	Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}

void  Ds18b20ReadTempCom()
{	

	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
}


short Ds18b20ReadTemp()
{
	unsigned char temp=0;
	unsigned char tmh,tml;
	short tem;

	Ds18b20ChangTemp();			 	//先写入转换命令
	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
	tml=Ds18b20ReadByte();		//读取温度值共16位,先读低字节
	tmh=Ds18b20ReadByte();		//再读高字节

	if(tmh>7)
    {
        tmh=~tmh;
        tml=~tml; 
        temp=0;//温度为负  
    }
	else
	{
		temp=1;//温度为正	
	} 
		  	  
    tem=tmh; //获得高八位
    tem<<=8;    
    tem|=tml;//获得底八位
    tem=(double)tem*0.625;//转换   放大10倍  精度0.1 
	if(temp)
		return tem; //返回温度值
	else 
		return -tem; 
}

lcd1602初始化

#include "lcd.h"


void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

#ifndef 	LCD1602_4PINS	 //当没有定义这个LCD1602_4PINS时
void LCD_WriteCmd(uchar com)	  //写入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //选择发送命令
	LCD1602_RW = 0;	   //选择写入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待数据稳定

	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(5);	  //保持时间
	LCD1602_E = 0;
}
#else 
void LCD_WriteCmd(uchar com)	  //写入命令
{
	LCD1602_E = 0;	 //使能清零
	LCD1602_RS = 0;	 //选择写入命令
	LCD1602_RW = 0;	 //选择写入

	LCD1602_DATAPINS = com;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	 //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;

//	Lcd1602_Delay1ms(1);
	LCD1602_DATAPINS = com << 4; //发送低四位
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	 //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;
}
#endif

#ifndef 	LCD1602_4PINS		   
void LCD_WriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;	//使能清零
	LCD1602_RS = 1;	//选择输入数据
	LCD1602_RW = 0;	//选择写入

	LCD1602_DATAPINS = dat; //写入数据
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   //写入时序
	Lcd1602_Delay1ms(5);   //保持时间
	LCD1602_E = 0;
}
#else
void LCD_WriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;	  //使能清零
	LCD1602_RS = 1;	  //选择写入数据
	LCD1602_RW = 0;	  //选择写入

	LCD1602_DATAPINS = dat;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	  //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;

	LCD1602_DATAPINS = dat << 4; //写入低四位
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	  //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;
}
#endif

#ifndef		LCD1602_4PINS
void LcdInit()						  //LCD初始化子程序
{
 	LCD_WriteCmd(0x38);  //开显示
	LCD_WriteCmd(0x0c);  //开显示不显示光标
	LCD_WriteCmd(0x06);  //写一个指针加1
	LCD_WriteCmd(0x01);  //清屏
	LCD_WriteCmd(0x80);  //设置数据指针起点
}
#else
void LCD_Init()						  //LCD初始化子程序
{
	LCD_WriteCmd(0x32);	 //将8位总线转为4位总线
	LCD_WriteCmd(0x28);	 //在四位线下的初始化
	LCD_WriteCmd(0x0c);  //开显示不显示光标
	LCD_WriteCmd(0x06);  //写一个指针加1
	LCD_WriteCmd(0x01);  //清屏
	LCD_WriteCmd(0x80);  //设置数据指针起点
}
#endif



void LCD_Clear()
{
	LCD_WriteCmd(0x01);
	LCD_WriteCmd(0x80);	
}

//在任何位置显示字符串

void LCD_Dispstring(u8 x,u8 line,u8 *p)	  
{
	char i=0;
	if(line<1)	   //第一行显示
	{	
		while(*p!='\0')
		{
			if(i<16-x)
			{
				LCD_WriteCmd(0x80+i+x);	
			}
			else
			{
				LCD_WriteCmd(0x40+0x80+i+x-16);	
			}
			LCD_WriteData(*p);
			p++;
			i++;	
		}	
	}
	else		   //第2行显示
	{
		while(*p!='\0')
		{
			if(i<16-x)
			{
				LCD_WriteCmd(0x80+0x40+i+x);	
			}
			else
			{
				LCD_WriteCmd(0x80+i+x-16);	
			}
			LCD_WriteData(*p);
			p++;
			i++;	
		}	
	}		
}


lcd屏显示ds18b20检测温度

​

void Temp_DataPros()
{
	short temp;
	u8 temp_buf[5];
	temp=Ds18b20ReadTemp();
	temp_val=temp;	
	if(temp<0)
	{
		temp=-temp;
		LCD_Dispstring(2+5,0,"-");
	}
	else
	{
		LCD_Dispstring(2+5,0," ");
	}

	temp_buf[0]=temp/100+0x30;
	temp_buf[1]=temp%100/10+0x30;
	temp_buf[2]='.';
	temp_buf[3]=temp%100%10+0x30;
	temp_buf[4]='\0';
	LCD_Dispstring(2+6,0,temp_buf);		 //显示检测的温度xx.x

	temp_buf[0]=set_temph/10+0x30;
   	temp_buf[1]=set_temph%10+0x30;
	temp_buf[2]='\0';
	LCD_Dispstring(5,1,temp_buf);	  //显示设定的温度上限值xx

	temp_buf[0]=set_templ/10+0x30;
   	temp_buf[1]=set_templ%10+0x30;
	temp_buf[2]='\0';
	LCD_Dispstring(14,1,temp_buf);	 //显示设定的温度下限值xx
}

​

按键模式选择并调节

u8 KEY_Scan(u8 mode)
{
	static u8 key=1;
	if(key&&(k1==0||k2==0||k3==0))
	{
		delay(1000);   //消抖
		key=0;
		if(k3==0)
		{
			return K1_MODE;
		}
		else if(k1==0)
		{
			return K2_ADD;
		}
		else if(k2==0)
		{
			return K3_DEC;	
		}
	}
	else if(k1==1&&k2==1&&k3==1)
	{
		key=1;	
	}
	if(mode)
	{
		key=1;
	}
	return 0;	
}

void KEY_Pros()
{
	u8 key;
	u8 temph_buf[3];

	key=KEY_Scan(0);
	
	if(key==K1_MODE)   //模式选择
	{
		mode++;
		LCD_Clear();

		if(mode==1)
		{
			LCD_Dispstring(0,1,"SETH:   C");
      LCD_Dispstring(2,0,"N-TEM:   C");			
		}
		else if(mode==2)
		{
			LCD_Dispstring(0,1,"SETL:   C");
     LCD_Dispstring(2,0,"N-TEM:   C");			
		}
		else 
		{
			mode=0;
			LCD_Dispstring(2,0,"Temp:     C");
			LCD_Dispstring(0,1,"SETH:  ");
			LCD_Dispstring(9,1,"SETL:  ");	
		}
	}
	if(mode==1)	 //温度上限设置
	{
		switch(key)	
		{
			case K2_ADD: 	   //加
						set_temph++;
						if(set_temph>=80)set_temph=80;
						break;
			case K3_DEC: 	 //减
						set_temph--;
						if(set_temph<=0)set_temph=0;
						break;
		}

		temph_buf[0]=set_temph/10+0x30;
		temph_buf[1]=set_temph%10+0x30;
		temph_buf[2]='\0';
	   	LCD_Dispstring(9,0,temph_buf);
		At24c02Write(0,set_temph);
	}

	else if(mode==2)  //温度下限设置
	{
		switch(key)	
		{
			case K2_ADD: 	   //加
						set_templ++;
						if(set_templ>=80)set_templ=80;
						break;
			case K3_DEC: 	 //减
						set_templ--;
						if(set_templ<=0)set_templ=0;
						break;
		}

		temph_buf[0]=set_templ/10+0x30;
		temph_buf[1]=set_templ%10+0x30;
		temph_buf[2]='\0';
	   	LCD_Dispstring(5,1,temph_buf);
		At24c02Write(2,set_templ);
	}
	

核心代码及仿真图展示完毕,获取完整源码下载地址:https://download.csdn.net/download/weixin_51322363/21106377文章来源地址https://www.toymoban.com/news/detail-512826.html

到了这里,关于基于c51单片机的毕业设计——智能温度控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 毕业设计 基于51单片机智能停车场管理车位引导系统设计

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2023年04月15日
    浏览(85)
  • 【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月04日
    浏览(90)
  • 毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2024年02月07日
    浏览(68)
  • 毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月09日
    浏览(74)
  • 【51毕业设计案例】【006】波形发生器(正弦波、矩形波、三角波、锯齿波)-基于51单片机

    功能介绍: 1.输出 正弦波、矩形波、三角波、锯齿波 波形 2.设定波形输出频率 3.设定修改频率的步进值 整体功能简述: 通过按键可以修改输出的波形,一共可以输出四种波形,分别是:正弦波、矩形波、三角波、锯齿波 ;波形也可以修改频率,频率范围为50Hz~0.1Hz。并且可

    2024年02月09日
    浏览(66)
  • 【毕业设计】6-基于51单片机的电子称重装置/电子测温/压力测试控制系统设计(原理图+源码+仿真工程+论文+PPT)

    包含此题目毕业设计全套资料: 原理图工程文件 工程源代码工程文件 仿真工程文件 论文(低重复率), 21533字 原理图截图 仿真截图 主要研究内容: 设计一个基于51单片机的电子称重装置,该装置主要由51单片机、传感器、A/D转换器、电源、键盘、LCD、LED显示器等实验器材

    2024年02月03日
    浏览(73)
  • 毕业设计 基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2023年04月08日
    浏览(178)
  • 【毕业设计】58-基于51单片机的智能语音密码锁设计(原理工程+PCB工程+仿真工程+源代码+答辩论文+实物图)

    主要研究内容: 掌握电子密码锁的原理、构造、以及运用51单片机设计出一款简易密码锁,实现相应的一些要求;掌握并且实际运用所学知识,将书中知识转化为实际能力;对密码锁的应用和未来的发展进行分析。 研究方法: 通过相关的书籍和网上资料,查阅相关资料,收集有

    2024年02月05日
    浏览(106)
  • 【C51】基于51单片机的出租车计价器设计

    随着我国经济的快速发展,出行选择乘坐出租车的人越来越多。与此同时电子信息技术的发展更新,更加准确、便捷、稳定的出租车计价收费系统随之出现。基于单片机的出租车计价系统的设计,不仅可以更加准确、稳定的反映计价情况,也能促进出租车行业健康稳定的发展

    2024年02月03日
    浏览(56)
  • 【C51】基于51单片机的多路抢答器的设计与制作

        随着社会的进步和科技的发展,当今社会活动对电子设备的使用也越发依赖,此时抢答器也作为一种答题方式所需要的设备应运而生。抢答器的适用方面广泛,可用在当下各种答题节目,知识竞赛等活动之中。但随之而来的也有很多问题,当今市面上有的抢答器使用线

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包