功能介绍:
0.本系统采用STC89C52作为单片机
1.系统分为主机和从机。
2.从机负责设定压力阈值、屏幕显示及蜂鸣器报警。
3.从机负责检测当前的水压值,并通过对比设定压力阈值,控制水泵继电器
4.主机和从机通过NRF24L01定时传输设定的压力阈值和当前水压值
5.当水压低于设定阈值时,水泵开始工作,当水压低于设定阈值5%时,蜂鸣器报警。
6.按键可设定阈值
收起
7.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
上位机
下位机
PCB:
上位机
下位机
主程序:
#include "reg52.h"
#include <stdio.h>
#include "eeprom52.h"
#include "lcd1602.h"
#include "nrf24l01.h"
#include "delay.h"
#define ON 0
#define OFF 1
#define TX_MODE 0
#define RX_MODE 1
#define CNT_MAX 10 //连续发送或接收最大值
sbit KEY_ADD = P3^4;
sbit KEY_SUB = P3^6;
//sbit MOTOR = P1^3;
sbit BUZZER = P3^7;
bit refreshFlag = 1;
bit rekey = 0;
unsigned char dis[16];
bit modeFlag = TX_MODE;
unsigned char txCnt = 0;
unsigned char rxCnt = 0;
void Timer0_Init(void); //函数声明
void KeyProcess(void);
void main(void)
{
DelayMs(250);
EEPROM52_Init(); //初始化内部EEPROM
Timer0_Init();
DelayMs(20);
nRF24L01_Init();
DelayMs(20);
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
while (1) //主循环
{
if (refreshFlag == 1)
{
EA = 0;
refreshFlag = 0;
if (modeFlag == TX_MODE) //发送模式
{
if (nRF24L01_TxPacket(TxBuf) || txCnt > CNT_MAX) //发送成功
{
txCnt = 0;
modeFlag = RX_MODE; //切换至接收模式
SetRX_Mode();
}
txCnt++;
}
else
{
if (nRF24L01_RxPacket(RxBuf) || rxCnt > CNT_MAX) //接收成功
{
rxCnt = 0;
modeFlag = TX_MODE; //切换至发送模式
SetTX_Mode();
}
rxCnt++;
}
if (RxBuf[0] < TxBuf[0] - 5) //水压低于设定阈值5%,蜂鸣器报警
{
//MOTOR = ON;
BUZZER = ON;
}
else
{
BUZZER = OFF;
//MOTOR = OFF;
}
sprintf (dis, "Set Pressure:%02d%%", (int)TxBuf[0]);
LCD_DispStr(0, 0, dis);
sprintf (dis, "Now Pressure:%02d%%", (int)RxBuf[0]);
LCD_DispStr(0, 1, dis);
EA = 1;
}
KeyProcess();
}
}
void KeyProcess(void)
{
if (!KEY_ADD || !KEY_SUB)
{
DelayMs(20);
if (!KEY_ADD && !rekey)
{
rekey = 1;
TxBuf[0]++;
if (TxBuf[0] > 99)
{
TxBuf[0] = 5;
}
EEPROM52_Write(); //写入EEPROM
}
if (!KEY_SUB && !rekey)
{
rekey = 1;
if (TxBuf[0] == 5)
{
TxBuf[0] = 100;
}
TxBuf[0]--;
EEPROM52_Write(); //写入EEPROM
}
}
else
{
rekey = 0;
}
}
void Timer0_Init(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = (65536 - 18432) / 256; //重新赋值 20ms
TL0 = (65536 - 18432) % 256;
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
static unsigned int time_20ms = 0; //定时器计数
TH0 = (65536 - 18432) / 256; //重新赋值 20ms
TL0 = (65536 - 18432) % 256;
time_20ms++;
if (time_20ms > 10) //定时
{
refreshFlag = 1; //刷新
time_20ms = 0;
}
}