登录
|
立即注册
|
使用QQ帐号登录
论坛
>
51单片机
发帖
|
基于51单片机的无线温湿度控制系统
看8131
|
回11
|
收藏
楼主
ID:502576
只看他
2019-4-1 17:40
代码:
发射_DHT11程序
//宏定义
#define uchar unsigned char
#define uint unsigned int
//头函数
#include <reg51.h>
#include <intrins.h>
//无线模块
#include "api.h"
#include "nRF24L01P.h"
#include "DHT11.h"
//LED 管脚定义
sbit TXLED_R=P1^3;
sbit RXLED_Y=P1^5;
//主机询问命令
uchar CMD[]={0xaa,0xbb,0xcc,0xdd};
//主函数
void main()
{
TXLED_R=0; //初始化LED
RXLED_Y=0;
init_io(); //无线初始化IO
RX_Mode(); //设置为接收模式
TXLED_R=1;
RXLED_Y=1;
//循环执行
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 = 0; //清标志
//命令为主机询问
if(RX_BUF[0]==CMD[0]&&RX_BUF[1]==CMD[1]&&RX_BUF[2]==CMD[2]&&RX_BUF[3]==CMD[3])
{
//打开接收成功指示
//无线答应信号湿度 温度
RH(); //DHT11读取
TX_BUF[0]=0xaa;
//T温度
TX_BUF[1]=U8T_data_H;
//RH湿度
TX_BUF[2]=U8RH_data_H;
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(); // 设置为接收模式
}
}
}
}
代码:
接收_温湿度控制程序
//宏定义
#define uchar unsigned char
#define uint unsigned int
//头函数
#include <reg51.h>
#include <intrins.h>
//屏幕函数调用
#include "Lcd.h"
//无线模块
#include "api.h"
#include "nRF24L01P.h"
//继电器定义
sbit jiangwen=P3^5;
sbit shengwen=P3^4;
sbit choushi=P3^3;
sbit jiashi=P3^2;
//LED 管脚定义
sbit TXLED_R=P1^3;
sbit RXLED_Y=P1^5;
//蜂鸣器
sbit Feng=P1^2;
//蜂鸣器闪烁标志位
bit shan=0;
#include "KEY.h"
//主机询问命令
uchar CMD[]={0xaa,0xbb,0xcc,0xdd};
uchar Mode=0;
uchar temp=0;
uchar KK=0;
//报警温湿度
uchar TNumber=30,RHNumber=50,TX=20,HX=40;
//主函数
void main()
{
TH0=0x4b;
TL0=0xff;//赋初值
TMOD=0x01;//设置工作方式
EA=1;//打开中断总开关
ET0=1;//打开允许开关
TR0=1;
//LCD初始化显示
Init_LCD();
delay_ms(250);
TXLED_R=0; //初始化
RXLED_Y=0;
init_io(); //无线初始化IO
RX_Mode(); //设置为接收模式
TXLED_R=1;
RXLED_Y=1;
/////////////////////////////////////////////
TXLED_R=0; //发送指示灯
////////////////////////////////////////////////////////////////////////////////
//循环显示
while(1)
{
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;
}
display2(RX_BUF[1],RX_BUF[2]);//显示读数
if(RX_BUF[1]>TNumber) //温度超标降温
{
jiangwen=0;
}
else
{
jiangwen=1;
}
if(RX_BUF[1]<TX) //温度过低升温
{
shengwen=0;
}
else
{
shengwen=1;
}
if(RX_BUF[2]>RHNumber) //湿度超标抽湿
{
choushi=0;
}
else
{
choushi=1;
}
if(RX_BUF[2]<HX) //湿度过低加湿
{
jiashi=0;
}
else
{
jiashi=1;
}
if(((RX_BUF[1]>TNumber||RX_BUF[2]>RHNumber||RX_BUF[1]<TX||RX_BUF[2]<HX))&&(shan==1)) //超阀值蜂鸣器报警
{
Feng=0;
}
else
{
Feng=1;
}
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(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+5);
//调温上限
while(KK!=3)
{
//读取键值
KK=KEY_();
if(KK==1)//++
{
TNumber++;
if(TNumber==51)
TNumber=50;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+5);
}
if(KK==2)//--
{
TNumber--;
if(TNumber==TX)
TNumber++;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+5);
}
}
KK=0;
write_com(0x0f);//打开光标
write_com(0x80+0x40+5);
//调温x下限
while(KK!=3)
{
//读取键值
KK=KEY_();
if(KK==1)//++
{
TX++;
if(TX==TNumber)
TX--;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+0x40+5);
}
if(KK==2)//--
{
TX--;
if(TX==0xff)
TX=0;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+0x40+5);
}
}
KK=0;
write_com(0x0f);//打开光标
write_com(0x80+14);
//调湿 上
while(KK!=3)
{
//读取键值
KK=KEY_();
if(KK==1)//++
{
RHNumber++;
if(RHNumber==91)
RHNumber=90;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+14);
}
if(KK==2)//--
{
RHNumber--;
if(RHNumber==HX)
RHNumber++;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+14);
}
}
KK=0;
write_com(0x0f);//打开光标
write_com(0x80+0x40+14);
//调湿 下
while(KK!=3)
{
//读取键值
KK=KEY_();
if(KK==1)//++
{
HX++;
if(HX==RHNumber)
HX--;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+0x40+14);
}
if(KK==2)//--
{
HX--;
if(HX==19)
HX=20;
display4(TNumber,RHNumber,TX,HX);
write_com(0x0f);//打开光标
write_com(0x80+0x40+14);
}
}
KK=0;
}
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}
void time0() interrupt 1//定时器函数
{
uchar m;
TH0=0x4b;
TL0=0xff;//重新赋初值
m++;
if(m==4)
{
shan=~shan;
m=0;
}
}
基于51单片机的无线温湿度控制系统.rar
(542.46 KB)
(下载次数: 245, 2019-4-1 17:40 上传)
下载积分: 黑币 -5
沙发
ID:452816
只看他
2019-4-4 19:11
学习到了!
板凳
ID:486067
只看他
2019-4-10 10:59
感谢楼主,帮了我的大忙
地板
ID:496361
只看他
2019-5-8 00:10
求仿真啊楼主 跪求 有偿
5
#
ID:528782
只看他
2019-5-13 14:58
楼主这是属于什么协议进行通信?
6
#
ID:282650
只看他
2019-12-9 08:45
改一下应该可以多从机
7
#
ID:662516
只看他
2019-12-13 19:28
轰多尼?
8
#
ID:662516
只看他
2019-12-13 19:32
牛皮
9
#
ID:701576
只看他
2020-3-3 10:35
请问能给一个最基础的51单片机控制温湿度的解释吗,小白求助
10
#
ID:722714
只看他
2020-4-5 17:44
为什么要继电器驱动
11
#
ID:543424
只看他
2020-4-23 19:56
为什么我下载测试,接收连通了开机始终采集不到?温度和湿度显示都是0,请问是什么问题求指导谢谢。
12
#
ID:368810
只看他
2020-5-10 20:35
proteus仿真有吗,楼主
51黑电子论坛
Powered by
Discuz!
X3.1
首页
|
标准版
|
触屏版
|
电脑版