链接:
提取码:hukw
系统的功能分析及体系结构设计
3.1.1系统功能分析
本系统分为主机和从机两部分组成。
主机由STCC52单片机电路+液位传感器电路+WiFi模块ESP8266电路+电源电路组成。
从机由STCC52单片机电路+蜂鸣器报警电路+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电源输出。
程序流程图
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#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<length) //发送长度对比
{
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;
}
.
.
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务