欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4384|回復: 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, 下載次數: 32)

上位機圖片.png

下位機調試結果.jpg (2.16 MB, 下載次數: 27)

下位機調試結果.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 單片機教程網

快速回復 返回頂部 返回列表