基于51单片机无线恒温箱恒温控制系统设计


本设计包含原理图+程序代码

📚开发环境

原理图:Altium Designer
程序编译器:keil 4
编程语言:C语言
设计编号:C0020

📚设计介绍

1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机主控制器;
2.采用DS18B20温度传感器测温;
3.可按键设置刷新温度的时间间隔和温度的上下限;
4.通过NRF24L01无线模块传输数据;
5.当温度超过设定的上或下限时,相应的指示灯亮,同时相应的继电器吸合;
6.继电器可以驱动负载(风扇、制冷片、加热管等);
7.本设计包括主机(显示和控制)和从机(温度检测)两块板子。

📚原理图

在这里插入图片描述

在这里插入图片描述

📚源程序

源码分为两部分,一部分是发射端,一部分是接收端
发射端,发射和接收是分开烧录的。

//宏定义
#define uchar unsigned char 
#define uint unsigned int

//头函数
#include <reg51.h>
#include <intrins.h>
//无线模块
#include "api.h" 
#include "nRF24L01P.h"
#include "DS18B20.h"


//LED 管脚定义
sbit TXLED_R=P1^3;	//红灯
sbit RXLED_Y=P1^5;	//黄灯


//主机询问命令
uchar CMD[]={0xaa,0xbb,0xcc,0xdd};
uchar flag=0;	  //接收完成标志位
uint T_=0;		  //读取温度变量
//主函数
void main()
{
	TXLED_R=0;					  //点亮LED
	RXLED_Y=0;
	init_io();		              //无线模块初始化IO
	RX_Mode();		              //设置为接收模式
	TXLED_R=1;
	RXLED_Y=1;					  //熄灭led
	//进入循环(括号内一直是1,所以一直执行while里的内容)
	while(1)
	{
		sta = SPI_Read(STATUS);	  //读状态寄存器
	    if(RX_DR)				     //判断是否接受到数据
		{
			SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  //从RX FIFO读出数据
			flag = 1;			  //接收数据完成标志位置一
			RXLED_Y=0;			  //打开接收指示灯
		}
		SPI_RW_Reg(WRITE_REG + STATUS, sta);  //清除RX_DS中断标志,等待下次接收数据

		if(flag)		              //判断flag是否为1,接收完成
		{
			flag = 0;		        //清除标志位
			//命令为主机询问
			if(RX_BUF[0]==CMD[0]&&RX_BUF[1]==CMD[1]&&RX_BUF[2]==CMD[2]&&RX_BUF[3]==CMD[3])		   //判断是否是主机指令
			{
				//打开接收成功指示
				//无线答应信号温度	
				tmpchange();   //启动温度转换
				T_=tmp();	   //读取温度
				TX_BUF[0]=0xAA;
				TX_BUF[1]=T_&0x00ff;	//T温度
				TX_BUF[2]=(T_>>8)&0x00ff;
				TX_BUF[3]=0xdd;
				delay_ms(100);
				RXLED_Y=1;			//关闭接受射指示灯
				TXLED_R=0;			//打开发射指示灯
				TX_Mode(TX_BUF);	// 把nRF24L01设置为发送模式并发送数据
				Check_ACK(1);        // 等待发送完毕,清除TX FIFO
				delay_ms(100);		 //延时
				TXLED_R=1;			//发送成功指示,关闭发射指示灯
				RX_Mode();			   // 设置为接收模式		
			}
		}
	}
}

接收端

//主函数
void main()
{
	Init_LCD();					  //LCD初始化显示
	InitTimer0();				  //初始化定时器
	delay_ms(250);				  //延时
	TXLED_R=0;					  //初始化LED点亮
	RXLED_Y=0;
	init_io();		           //无线模块初始化IO
	RX_Mode();		           //设置为接收模式
	TXLED_R=1;
	RXLED_Y=1;				   //关闭LED
	/////////////////////////////////////////////
	TXLED_R=0;					  //发送指示灯点亮
	////////////////////////////////////////////////////////////////////////////////
	//循环显示
	while(1)
	{
		if(XXX==1)		//启动刷新数据
		{
			XXX=0;
			TXLED_R=0;					  //发送指示灯	
		   TX_ACK();				      //发送询问信号	
			sta = SPI_Read(STATUS);		  //读状态寄存器
			TXLED_R=1;					  //发送指示灯	
			if(RX_DR)				 	  //判断是否接受到数据
			{
				SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  // 从RX FIFO读出数据
				flag = 1;
			}
			delay_ms(100);				//延时
			SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中断标志
			if(flag==1)		            // 接受完成
			{
				Mode=0;					//接收到数据
				flag=0;
			}
			else					         //设备丢失
			{
				Mode=1;
			}
		}
	

		//显示
		//数据显示
		if(Mode==0)						//接收到数据
		{		
			RXLED_Y=0;					//点亮指示灯
			if(temp!=1)//当前不是正常显示状态时就重新初始化
			{
				display1();				//调用显示函数
				temp=1;
			}
			
			TTT=RX_BUF[2];				//读取温度高八位
			TTT=TTT<<8;					//高八位左移
			TTT=TTT|RX_BUF[1];			//高八位和低八位合并到一起
			display2(T_time,TTT/10);//显示读数


			RXLED_Y=1;				  //熄灭指示灯
		}
		KK=KEY_();					//读取键值
		if(KK==3)
		{
			Mode=2;//调整模式
			KK=0;
		}
		
	   if(Mode==1)		 //数据显示不在线
		{
			if(temp!=2)	  //当前不是设备丢失状态就显示设备丢失
				NoLine();//设备丢失
			temp=2;
		}
		//键盘
		else if(Mode==2)
		{
			temp=3;
			display3();//显示刷新时间和上下限的英文字符
			display4(T_time,up,down);//显示刷新时间和上下限数据
			write_com(0x0f);//打开光标
			write_com(0x80+0x0a);
			//调时
			while(KK!=3)  //不是设置键按下
			{
				//读取键值
				KK=KEY_();
				if(KK==1)//++
				{
					T_time++;
					if(T_time==61)
						T_time=60;
					display4(T_time,up,down);
					write_com(0x0f);//打开光标
					write_com(0x80+0x0a);
				}
				if(KK==2)//--	
				{
					T_time--;
					if(T_time==0xff)
						T_time=0;
					display4(T_time,up,down);
					write_com(0x0f);//打开光标
					write_com(0x80+0x0a);				
				}
			}
			KK=0;
			write_com(0x0f);//打开光标
			write_com(0x80+0x45);
			//调up
			while(KK!=3)
			{
				//读取键值
				KK=KEY_();	
				if(KK==1)//++
				{
					up++;
					if(up==100)
						up=99;
					display4(T_time,up,down);
					write_com(0x0f);//打开光标
					write_com(0x80+0x45);
				}
				if(KK==2)//--	
				{
					up--;
					if(up==0)
						up=1;
					if(up<down)
						up=down;	
					display4(T_time,up,down);
					write_com(0x0f);//打开光标
					write_com(0x80+0x45);			
				}
			}
			KK=0;
			write_com(0x0f);//打开光标
			write_com(0x80+0x4e);
			//调down
			while(KK!=3)
			{
				//读取键值
				KK=KEY_();	
				if(KK==1)//++
				{
					down++;
					if(down==100)
						up=99;
					if(down>up)
						down=up;
					display4(T_time,up,down);
					write_com(0x0f);//打开光标
					write_com(0x80+0x4e);
				}
				if(KK==2)//--	
				{
					down--;
					if(down==0)
						down=1;	
					display4(T_time,up,down);
					write_com(0x0f);//打开光标
					write_com(0x80+0x4e);			
				}
			}
			KK=0;
		}
		delay_ms(200);	
		delay_ms(200);
		delay_ms(200);		
	}
}

在这里插入图片描述

📚资料清单

在这里插入图片描述

📚下载链接

https://pan.baidu.com/s/1bsZECC126UradZXXSerWPw?pwd=23qe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值