本帖最后由 alex_wzc 于 2019-7-17 22:44 编辑
利用单片机技术,无线传输技术,温度测量技术等知识设计一个基于STC89C52单片机控制的无线温度采集系统,以DS18B20作为温度传感器,检测比较精确的温度信号,并通过NRF24L01无线模块将从机点的温度信号传送到主机。主机接收发送过来的温度数据进行解码,一方面将实时的温度数据通过OLED显示屏进行显示,另一方面再将温度数据传输给温度监测上位机。上位机一方面可以对实时的温度数据进行曲线绘制,另一方面也可以通过上位机设置温度上下限,当温度超过设定阈值时,发出控制指令给单片机,单片机控制蜂鸣器发出报警声音。我们也可通过独立按键模块对温度上下限进行设定。
发送端程序:
//功能:将DS18b20温度传感器温度数据采集,利用模拟SPI方式,传输给NRF24L01
#include <reg52.h>
#include "mcu.h"
#include "NRF24L01.H"
#include "temp.h"
//void delayms(uint ms);
void main()
{
uint while_times = 0;
init_NRF24L01(); //NRF24L01初始化
//delayms(10);
while(1)
{
//将温度采集数据传递给TxBuf[0]和TxBuf[1],TxBuf[0]为高8位,TxBuf[1]为低8位;
TxBuf[0]=Ds18b20ReadTemp()/256;
TxBuf[1]=Ds18b20ReadTemp()%256;
nrf_TxMod(); // 设置为发送模式
nrf_trans(TxBuf); //将待发送的数据写入NRF24L01
while_times = 30; //检测是否发送成功 循环检测?次
while(while_times--)
{
get_nrf_sta(); //获取状态标志
if(TX_DS == 1) //发送成功,跳出循环
break;
}
}
}
接收端程序:
#include "reg52.h"
#include "MCU.h"
#include "OLED.H"
#include "NRF24L01.H"
#include "button.h"
sbit k1=P3^2; //温度上限设置按键
sbit k2=P3^3; //温度下限设置按键
sbit WARN=P0^3; //蜂鸣器控制端口
int Temp; //温度变量
uchar receiveData[3];//接收变量存储数组
uint Value_UP=0; //温度上限值
uint Value_DOWN=0; //温度下限值
float Temp_UP=3000,Temp_DOWN=1000;
uchar str1[]={" "};
uchar str2[]={" "};
uchar str3[]={" "};
uchar i=0;
uchar flag1=0;
uchar flag2=0;
uchar flag_receive = 0;//接收数据完成标志位
extern uchar code du[];//声明摄氏度字符变量
extern uchar key_type;
void Int_Init(void); //中断配置
void UsartConfiguration(); //串口配置
void receive_dispose(uchar *p); //数据接收解码函数
float data_dispose(uchar *p , uchar mode); //接收数据处理函数
void message_display(void); //显示提示信息
void main()
{
uchar num=0;
uint while_times = 0;
uchar flag=0;
float tp=0;
UsartConfiguration(); //串口初始化
Int_Init(); //中断初始化
oled_init(); //OLED初始化
clear_screen(); //OLED清屏
NRF24L01_Init(); //初始化NRF24L01
delay(10);
message_display();
while(1)
{
uchar num=0;
uchar flag=0;
nrf_RxMod(); // 设置为接收模式
while_times = 400; //检测是否接收成功 循环检测?次 大于发射效果好
while(while_times--)
{
get_nrf_sta(); //获取状态标志
if(RX_DR == 1) //接收成功
{
nrf_read(RxBuf);//接收成功后,将NRF24L01接收到的数据读到单片机的RxBuf数组中。
flag=1;
break; //跳出循环
}
}
receive_dispose(receiveData);//单片机数据接收解码
switch(flag1)
{
case 1:Temp_UP+=10;break;
case 2:Temp_UP-=10;break;
}
switch(flag2)
{
case 1:Temp_DOWN+=10;break;
case 2:Temp_DOWN-=10;break;
}
flag1=0;
flag2=0;
Value_UP=Temp_UP;
Value_DOWN=Temp_DOWN;
str2[0] = (char)(0X30+Value_UP/1000);
str2[1] = (char)(0X30+Value_UP%1000/100);
str2[2] = 0x2e; //小数点
str2[3] = (char)(0X30+Value_UP%100/10);
str2[4] = (char)(0X30+Value_UP%10);
str3[0] = (char)(0X30+Value_DOWN/1000);
str3[1] = (char)(0X30+Value_DOWN%1000/100);
str3[2] = 0x2e; //小数点
str3[3] = (char)(0X30+Value_DOWN%100/10);
str3[4] = (char)(0X30+Value_DOWN%10);
disp_string_8x16_16x16(5,72,(uchar*)str2); //显示温度上限
disp_string_8x16_16x16(7,72,(uchar*)str3); //显示温度下限
Temp=(RxBuf[0]*256+RxBuf[1])*0.0625*100+0.5;
//温度整数部分
str1[0] = (char)(0X30+Temp % 10000 / 1000);
str1[1] = (char)(0X30+Temp % 1000 / 100);
str1[2] = 0x2e; //小数点
//温度小数部分
str1[3] = (char)(0X30+Temp % 100 / 10);
str1[4] = (char)(0X30+Temp % 10);
disp_string_8x16_16x16(3,72,(uchar*)str1);
SBUF = 0xF1; //将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
SBUF = RxBuf[0];
while (!TI);
TI = 0;
SBUF = RxBuf[1];
while (!TI);
TI = 0;
if(Temp>Value_UP||Temp<Value_DOWN) //报警控制
WARN=0;
else
WARN=1;
}
}
附件列表
上位机图片.png
(2019-7-17 22:44 上传)
原图尺寸 65.35 KB, 下载次数: 32
下位机调试结果.jpg
(2019-7-17 22:44 上传)
原图尺寸 2.16 MB, 下载次数: 27
接收端.pdf
(2019-7-16 22:23 上传)
181.04 KB, 下载次数: 38, 下载积分: 黑币 -5
发送端.pdf
(2019-7-16 22:23 上传)
153.51 KB, 下载次数: 36, 下载积分: 黑币 -5
下位机51程序.rar
(2019-7-17 22:36 上传)
228.23 KB, 下载次数: 29, 下载积分: 黑币 -5