液位显示报警控制器
扫描二维码
随时随地手机看文章
硬件电路的设计
(下方附文件)
系统的功能分析及体系结构设计
3.1.1系统功能分析
本系统分为主机和从机两部分组成。
主机由STC89C52单片机电路+液位传感器电路+WiFi模块ESP8266电路+电源电路组成。
从机由STC89C52单片机电路+蜂鸣器报警电路+WiFi模块ESP8266电路+电源电路组成。
1、主机通过液位传感器检测液位,检测到最低液位和最高液位时,然后将信息通过主机WIFI模块上传给从机的WIFI模块,从机收到后进行相应的处理,当液位处于最低和最高液位时,蜂鸣器报警;否则,蜂鸣器不报警。
2、从机接收到数据有,通过状态指示灯显示当前液位情况,如果连接成功后,设备通讯中断,所有指示灯熄灭,然后黄灯闪烁提醒。方便远程查看现成液位情况变化以及是否在线故障。
3、注意主从机模块配置以及单片机程序都不相同,不可以相互调换位置。
3.1.2系统总体结构
本系统具体框图如下图所示:
原理图:
5V电源电路设计
本系统选择5V直流电源作为系统总电源,为整个系统供电,电路简单、稳定。DC为电源的DC插座,可以直接接USB电源线,一端插在DC插座上,另外一端可以插在5V电源上,如电脑USB、充电宝、手机充电器等等。LED为红色LED灯,作为系统是否有点的指示灯,电阻为1K电阻,起到限流作用,保护LED灯,以防电流过大烧坏LED灯。SW为自锁开关,开关按下后,红灯亮,此时系统电源5V直流输出。开关再次按下后,红灯灭,此时系统电源无5V电源输出。
ESP8266WIFI模块电路设计电路设计
串口WIFI模块是新一代嵌入式WiFi模块,体积小,功耗低。采用UART接口。串口wifi模块是基于通用串行接口特性,符合IEEE802.11 协议栈网络标准,内置TCP/IP协议栈,使传统串口设备更好的加入无线网络。
ESP8266是一款超低功耗的模块,拥有业内极富竞争力的封装尺寸和超低能耗技术,专为移动设备和互联网的应用设计,可将用户的物理设备连接到WIFI无线网络上,进行互联网或局域网通信,实现联网功能。
ESP8266可广泛应用于智能电网、智能交通、智能家具、手持设备、工业控制等领域。WiFi模块电路图如下图所示。
5V转3.3V电源电路设计
AMS1117-3.3是一种输出电压为3.3V的正向低压降稳压器,适用于高效率线性开关电源稳压器。其输出电流为1A,系统电路简单,工作稳定。本电路中,通过AMS1117-3.3芯片将5V直流电压降为3.3V,给系统的特定模块电路供电。
一、基本参数
(1)工作结温范围:-40~125°C
(2)最大输入电压:15V
(3)焊接温度(25秒):265°C
(4)存储温度:- 65~150°C
(5)输出电压:3.267~3.333V
(6)纹波抑制(最小):60dB
其电路原理图如下图所示。电容为电解电容,起到滤波作用,滤除电源中的低频参量,让电压输出更加平稳。
蜂鸣器报警电路(低电平有效)设计
有源蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。本系统所采用的报警模块为5V有源蜂鸣器模块,电路中采用三极管9012来驱动,只要单片机控制引脚为低电平,蜂鸣器就会鸣叫报警,反之则不鸣叫,可以通过控制单片机引脚方波输出形式控制蜂鸣器的鸣叫方式。电阻为限流电阻,保护作用。
FC-37水滴传感器模块电路设计
本系统选择FC-37传感器来检测水滴信号。传感器采用高品质FR-04双面材料,超大面积5.0*4.0CM,并用镀镍处理表面,具有对抗氧化,导电性,及寿命方面更优越的性能。
一、模块参数
(1)比较器输出,信号干净,波形好,驱动能力强,超过15mA;
(2)配电位器调节灵敏度;
(3)工作电压3.3V-5V
(4)输出形式 :数字开关量输出(0和1)和模拟量AO电压输出;
(5)使用宽电压LM393比较器
二、接线方式:
(1)VCC:接电源正极(3-5V)
(2)GND:接电源负极
(3)DO:TTL开关信号输出()
(4)AO:模拟信号输出
三、功能介绍:
接上5V电源,电源指示灯亮,感应板上没有水滴时,DO输出为高电平,开关指示灯灭 ,滴上一滴水,DO输出为低电平,开关指示灯亮,刷掉上面的水滴,又恢复到,输出高电平状态。AO模拟输出,可以连接单片机的AD口检测滴在上面的雨量大小。DO TTL数字输出也可以连接单片机检测是否有雨。
FC-37水滴传感器模块内部电路图如下图所示,其中R1电阻为分压电阻,将水滴传感器检测到的水滴信息转化为模拟电压信号即AO,模拟量信号接入LM393比较器后,即可与LM393比较器芯片2号引脚所接的电位器分压后的模拟电压进行比较,进而得出DO数字信号(即高低电平信号)。C1、C2为滤波电容,C1电容对电源进行滤波,让电源输出更稳定。C2电容对模拟信号进行滤波,保证模拟信号输出的稳定性。R2、R3均为限流电阻,来保护LED灯,防止LED灯烧坏,LED灯均为低电平有效。R4为上拉电阻,上拉就是将不确定的信号通过一个电阻钳位在高电平,同时起限流作用。保证LM393比较器输出的高低电平信号在与单片机引脚连接时电平信号的读取更加稳定。
系统软件设计
程序流程图
#include
#include
#include
#include "delay.h"
sbit buzzer=P2^3; //引脚定义
sbit led_red=P2^4;
sbit led_yel=P2^5;
sbit led_gre=P2^6;
unsigned long times_20ms=0; //定时器计数
unsigned char i; //记录是否已经发送了短信
unsigned char buzzerlater=0; //蜂鸣器报警延时
unsigned char busyNum =0;//串口判忙
void Init_Timer0(void); //函数声明
void UART_Init(void);
void uartSendByte(unsigned char dat);
void uartSendStr(unsigned char *s,unsigned char length);
void main (void)
{
Init_Timer0(); //定时器0初始化
UART_Init();
led_red=0;led_yel=0;led_gre=0; //灯指示
buzzerlater=2;
DelayMs(100);
led_red=1;led_yel=1;led_gre=1;
for(i=0;i<40;i++)
{DelayMs(100);}
uartSendStr("AT+CWMODE=1\r\n",13); //打开多连接
for(i=0;i<5;i++)
{DelayMs(100);}
uartSendStr("AT+CWJAP=\"AUAISOUT000\",\"\"\r\n",27); //建立服务 端口号为8080
for(i=0;i<40;i++) //保留足够时间去获取ip
{DelayMs(100);}
while(1) //主循环
{
uartSendStr("AT+CIPSTART=\"TCP\",\"10.10.10.11\",8080\r\n",38); //打开多连接
for(i=0;i<25;i++) //实时去链接ap
{DelayMs(100);}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void UART_Init(void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TL1 = TH1;
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void uartSendByte(unsigned char dat)//串口发送单字节数据
{
unsigned char time_out;
time_out=0x00;
SBUF = dat; //将数据放入SBUF中
while((!TI)&&(time_out<100)) //检测是否发送出去
{time_out++;DelayUs2x(10);} //未发送出去 进行短暂延时
TI = 0; //清除ti标志
}
void uartSendStr(unsigned char *s,unsigned char length) //发送定长度字符串
{
unsigned char NUM;
NUM=0x00;
while(NUM
{
uartSendByte(*s); //放松单字节数据
s++; //指针++
NUM++; //下一个++
}
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
times_20ms++;
if(times_20ms%10==0) //定时到1s
{
if(buzzerlater>0) //延时打开蜂鸣器
{
buzzer=!buzzer;
buzzerlater--; //延时缩短
}
else
{buzzer =1;} //关闭蜂鸣器
if(busyNum>0)busyNum--; //接收数据过程中
else //接收不到数据
{led_red=1;led_yel=1;led_gre=1; }
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
unsigned char Rebuf;
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
Rebuf=SBUF;
busyNum = 4;
if(Rebuf=='h')
{
buzzerlater=4; //蜂鸣器延时报警
led_red=0;led_yel=1;led_gre=1; //灯指示
}
else if(Rebuf=='n')
{
buzzerlater=0; //蜂鸣器延时报警
led_red=1;led_yel=0;led_gre=1; //灯指示
}
else if(Rebuf=='l')
{
buzzerlater=4; //蜂鸣器延时报警
led_red=1;led_yel=1;led_gre=0; //灯指示
}
else if(Rebuf=='e')
{
buzzerlater=4; //蜂鸣器延时报警
led_red=0;led_yel=0;led_gre=0; //灯指示
}
}
if(TI) //如果是发送标志位,清零
TI=0;
}