【Proteus仿真】【51单片机】便携式恒温箱设计


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用报警模块、LCD1602显示模块、DS18B20温度模块、加热制冷模块、按键模块、HC05蓝牙模块等。

主要功能:
系统运行后,LCD1602显示传感器检测的温度值;
可通过按键K3设置恒定温度,K1和K2进行加减调节,恒定温度范围是0-10,设定好后可再次按下K3保存。系统会根据当前温度与目标温度比对,通过PID算法控制加热或制冷工作。若温度高于报警上限或低于报警下限值则蜂鸣器报警。检测温度会实时将数据通过串口传输到手机终端显示。
主要功能如下:
1、温度实时检测
2、LCD1602液晶显示
3、手机终端显示
4、加热制冷PID调节
5、故障报警
6、范围0-10°C
7、按键设置恒定温度


二、软件设计

/*
作者:嗨小易(QQ:3443792007)
*/




//系统数据获取
void sys_data_get(void)
{
	static u8 i=0;
	while(1)
	{
		//温度获取
		i++;
		if(i%10==0)
		{
			TR0=0;
			sys_ctrl.temp=ds18b20_read_temperture()*10;
			TR0=1;
		}		

		break;
	}	
}

//系统数据显示
void sys_data_show(void)
{
	u8 buf[6];
	u16 temp=sys_ctrl.temp;
	static u8 i=0;

	while(1)
	{
		//温度显示
		if(sys_ctrl.temp>=0)
		{
			buf[0]=' ';	
		}
		else 
		{
			temp=-sys_ctrl.temp;
			buf[0]='-';	
		}
		buf[1]=temp/100+0x30;
		buf[2]=temp%100/10+0x30;
		buf[3]='.';
		buf[4]=temp%100%10+0x30;
		buf[5]='\0';
		lcd1602_show_string(5,0,buf);

		//温度阈值显示
		lcd1602_show_nums(8,1,sys_ctrl.temph,2,0);

		//阈值闪烁指示
		if(sys_ctrl.mode!=0)
		{
			lcd1602_show_string(8,1,"  ");
			delay_ms(50);
			lcd1602_show_nums(8,1,sys_ctrl.temph,2,0);
		}

		//串口终端输出
		i++;
		if(i%20==0)
		{
			UART_SendString("\r\n当前温度:");
			UART_SendString(buf);
			UART_SendString("°C\r\n");
		}

		break;			
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	key=key_scan(0);
	//阈值模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode=!sys_ctrl.mode;
	}
	//阈值设置模式下,K1和K2加减
	if(sys_ctrl.mode!=0)
	{
		//加
		if(key==KEY1_PRESS)
		{
			sys_ctrl.temph++;
			if(sys_ctrl.temph>10)sys_ctrl.temph=0;
			pid.target_val=sys_ctrl.temph;
		}
		//减
		else if(key==KEY2_PRESS)
		{
			sys_ctrl.temph--;
			if(sys_ctrl.temph<0)sys_ctrl.temph=10;
			pid.target_val=sys_ctrl.temph;
		}	
	}
}


//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	lcd1602_init();
	ds18b20_init();
	//读取温度数据,等待稳定
	while(i--)
	{
		sys_ctrl.temp=ds18b20_read_temperture()*10;
		delay_ms(100);	
	}
	UART_Init();//串口初始化9600
	pwm_init(0XFF,0XD1,100,0);//初始时,PWM占空比为0
	sys_open_show();//系统开机界面显示

	while(1)
	{	
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}


三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

关于Proteus仿真ADC0809,说明以下几点: 1、在Proteus,ADC0809是不可仿真的。但可以用ADC0808代替ADC0809进行仿真。ADC0808与ADC0809有相同的引脚,功能极为相似。在Proteus,可以认为:ADC0808就是ADC0809。 2、说明几个关键引脚的输出信号: 1)OE 数据输出允许信号,高电屏有效(意思就是,当OE接高电屏时才允许将转换后的结果从ADC0808的OUT1~OUT8引脚输出,否则,在内部锁存)。 2)ADC0808的ALE信号(22引脚),以及START信号(6引脚) ALE称为“地址锁存允许信号”,高电屏有效。就是说:ALE=1时,允许将ADDA~ADDC的地址输入到ADC0808的内部译码器,经过译码后选定外部模拟量的输入通道。 START信号,这是一个必须重点掌握的信号,向START送入一个高脉冲,其上升沿使ADC0808内部的“逐次逼近寄存器SAR”复位,其下降沿可以*启动A/D转换,并同时使EOC引脚为低电平*(两个*之间的内容必须牢记!)。 应注意到:ALE是高电屏有效,而START的有效部分只是上升沿和下降沿,所以在连接电路时可以将ALE信号与START信号连接到一起,使它们在同一个脉冲上各取所需。 3)EOC AD转换结束的标志信号,在AD转换结束时成现高电屏。不能通过以下方式使EOC恢复低电屏: 假设EOC连到P1.0口上,企图通过CLR P1.0使EOC恢复低电屏是不可行的。在Proteus仿真时,会出现黄色信号,表示短路。在实际当,短路是非常可怕的事情。 千万注意:EOC是靠START的下降沿清零的! 4)在Proteus,ADC0808的时钟信号要用DCLOCK产生(应该知道啥是DCLOCK吧?),因为在Proteus仿真,当不外接扩展ROM时,单片机的ALE信号(注意,不是ADC0808的ALE信号!)在Proteus仿真不会出现,因此即使外接74LS74作分频也不会得到时钟信号。 发点牢骚:很多高校都以ADC0809作为AD转换的代表芯片来讲解,但却不细说其工作过程和工作原理。我们杨红梅老师上课这样说的:“当程序执行到MOVX @DPTR,A的时候,会启动AD转换”。我不理解为什么执行到这里就启动AD转换了,于是说道:“老师,这里我不理解。”作为一名十分有责任感的副教授,她是这样回答的:“就是执行到这里就启动了,你还想理解到什么程度?”……令我实在无语。于是我到校图书馆翻阅了一些相关的高校教材,其各书所述大同小异,也没什么收获,现在的高校教材呀!不得不令人怀疑有抄袭之嫌。后来,在清华大学出版社出版的《单片机原理与应用及C51程序设计》一书获得了一些启发,又亲自动手做了仿真,才略懂一二。对于希望学好单片机的同仁,我有一点小常识奉送,就是:务必学会读懂时序图,即使老师上课不讲,自己也要自学,并学会。 我写的这个程序极其短小,重点在于使读者通过仿真控制理解上述关键信号的作用,进而理解ADC0808的工作过程和工作原理。为了减少赘余,突出重点,并没有用单片机对AD转换后的数字信号行处理,而是通过ADC0808的OUT1~OUT8引脚直接输出。希望看过此例的同仁能通过此例真正学懂ADC0808(也即是:ADC0809)。相关的时序图,百度上有丰富的资源,在这里就不赘赠了,请见谅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值