|
本帖最后由 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)
下載附件
2019-7-17 22:44 上傳
-
下位機調試結果.jpg
(2.16 MB, 下載次數: 27)
下載附件
2019-7-17 22:44 上傳
-
-
接收端.pdf
2019-7-16 22:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
181.04 KB, 下載次數: 38, 下載積分: 黑幣 -5
-
-
發送端.pdf
2019-7-16 22:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
153.51 KB, 下載次數: 36, 下載積分: 黑幣 -5
-
-
下位機51程序.rar
2019-7-17 22:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
228.23 KB, 下載次數: 29, 下載積分: 黑幣 -5
|