找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3736|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机的无线温度采集系统电路图

[复制链接]
跳转到指定楼层
楼主
本帖最后由 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 (65.35 KB, 下载次数: 23)

上位机图片.png

下位机调试结果.jpg (2.16 MB, 下载次数: 19)

下位机调试结果.jpg

接收端.pdf

181.04 KB, 下载次数: 38, 下载积分: 黑币 -5

发送端.pdf

153.51 KB, 下载次数: 36, 下载积分: 黑币 -5

下位机51程序.rar

228.23 KB, 下载次数: 29, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-7-17 00:41 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表