本设计包含原理图+程序代码
📚开发环境
原理图: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);
}
}

📚资料清单

1219

被折叠的 条评论
为什么被折叠?



