
#include<reg52.h>
#include<intrins.h>
#include"eeprom52.h"
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_dat P0
sbit LCD1602_rs=P2^7;
sbit LCD1602_rw=P2^4;
sbit LCD1602_e=P2^6;
sbit beep=P3^7;
sbit led_1=P2^3;
sbit led_2=P2^5;
sbit key_1=P3^3;
sbit key_2=P3^4;
sbit key_3=P3^5;
sbit key_4=P3^6;
sbit alarm_1=P1^7;
sbit alarm_2=P1^6;
sbit ADC0832_CS=P2^0;
sbit ADC0832_CLK=P2^2;
sbit ADC0832_DIO=P2^1;
uint sum;
uchar RH,RH_H=20,RH_L=10,state,ms,cs;
bit beep1,zt,s1;
unsigned char sendDataFlag = 0;
bit messageCnt = 0;
void UART_Init();
void uartSendByte(unsigned char date);
void uartSendStr(unsigned char *s,unsigned char length);
unsigned int A_D()
{
uchar i;
uchar dat;
ADC0832_CS=1;
ADC0832_CLK=0;
ADC0832_CS=0;
ADC0832_DIO=1;
ADC0832_CLK=1;
ADC0832_CLK=0;
ADC0832_DIO=1;
ADC0832_CLK=1;
ADC0832_CLK=0;
ADC0832_DIO=0;
ADC0832_CLK=1;
ADC0832_CLK=0;
ADC0832_DIO=1;
ADC0832_CLK=1;
for(i=0;i<8;i++)
{
ADC0832_CLK=1;
ADC0832_CLK=0;
dat<<=1;
dat|=(unsigned char)ADC0832_DIO;
}
ADC0832_CS=1;
return dat;
}
void delay(uint T)
{
while(T--);
}
void LCD1602_write(uchar order,dat)
{
LCD1602_e=0;
LCD1602_rs=order;
LCD1602_dat=dat;
LCD1602_rw=0;
LCD1602_e=1;
delay(1);
LCD1602_e=0;
}
void LCD1602_writebyte(uchar *prointer)
{
while(*prointer!='\0')
{
LCD1602_write(1,*prointer);
prointer++;
}
}
void LCD1602_cls()
{
LCD1602_write(0,0x01);
delay(1500);
LCD1602_write(0,0x38);
delay(1500);
LCD1602_write(0,0x0c);
LCD1602_write(0,0x06);
LCD1602_write(0,0xd0);
delay(1500);
}
void show()
{
if(state==0)
{
LCD1602_write(0,0x80);
LCD1602_writebyte("Water level:");
LCD1602_write(0,0x80+12);
if(RH>9)LCD1602_write(1,0x30+RH/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(0,0x80+13);
LCD1602_write(1,0x30+RH%10);
LCD1602_write(0,0x80+14);
LCD1602_writebyte("m");
LCD1602_write(0,0xC0);
LCD1602_writebyte("State:");
LCD1602_write(0,0xC0+6);
if(zt==0)
{
LCD1602_writebyte("Manul ");
}else
{
LCD1602_writebyte(" Auto ");
}
}
else
{
LCD1602_write(0,0x80);
LCD1602_writebyte("Water_H:");
LCD1602_write(0,0x80+8);
if(state==1&&s1==1)
{
LCD1602_writebyte(" ");
}else
{ LCD1602_write(0,0x80+8);
if(RH_H>9)LCD1602_write(1,0x30+RH_H/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(0,0x80+9);
LCD1602_write(1,0x30+RH_H%10);
}
LCD1602_write(0,0x80+10);
LCD1602_writebyte("m ");
LCD1602_write(0,0xC0);
LCD1602_writebyte("Water_L:");
if(state==2&&s1==1)
{
LCD1602_write(0,0xC0+8);
LCD1602_writebyte(" ");
}else
{
LCD1602_write(0,0xC0+8);
if(RH_L>9)LCD1602_write(1,0x30+RH_L/10%10);
else LCD1602_writebyte(" ");
LCD1602_write(0,0xC0+9);
LCD1602_write(1,0x30+RH_L%10);
}
LCD1602_write(0,0xC0+10);
LCD1602_writebyte("m ");
}
}
void key()
{
if(!key_1)
{
delay(888);
if(!key_1)
{
while(!key_1) show();
state=(state+1)%3;
}
}
if(!key_2)
{
delay(888);
if(!key_2)
{
while(!key_2)show();
if(state==1)
{
if(RH_H<100)RH_H++;
SectorErase(0x2000);
byte_write(0x2000,RH_H);
}
else if(state==2)
{
if(RH_L<RH_H-1)RH_L++;
SectorErase(0x2200);
byte_write(0x2200,RH_L);
}
else
{
zt=!zt;
alarm_1=1;
alarm_2=1;
}
}
}
if(!key_3)
{
delay(888);
if(!key_3)
{
while(!key_3)show();
if(state==1)
{
if(RH_H>RH_L+1)RH_H--;
SectorErase(0x2000);
byte_write(0x2000,RH_H);
}else if(state==2)
{
if(RH_L>0)RH_L--;
SectorErase(0x2200);
byte_write(0x2200,RH_L);
}else
{
if(zt==0)
{
alarm_1=!alarm_1;
}
}
}
}
if(!key_4)
{
delay(888);
if(!key_4)
{
while(!key_4) show();
if(zt==0)
{
alarm_2=!alarm_2;
}
}
}
}
void UART_1_init()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
void UART_1() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
ms++;
if(ms%5==0)
{
s1=!s1;
}
if(ms%10==0)
{
if(beep1==1)
{
beep=!beep;
}
else
{
beep=1;
}
}
if(ms>19)
{
ms=0;
}
}
void proc()
{
if(zt==1)
{
if(RH>=RH_H)
{
alarm_1=1;
alarm_2=0;
led_1=0;
}
else
{
alarm_1=1;
alarm_2=1;
led_1=1;
}
if(RH<=RH_L)
{
alarm_2=1;
alarm_1=0;
led_2=0;
}else
{
alarm_1=1;
led_2=1;
}
if(RH>=RH_H||RH<=RH_L)
{
beep1=1;
}else
{
beep1=0;
}
}
else
{
if(zt==0)
{
if(RH>=RH_H)
{
led_1=0;
}
else
{
led_1=1;
}
if(RH<=RH_L)
{
led_2=0;
}else
{
led_2=1;
}
if(RH>=RH_H||RH<=RH_L)
{
beep1=1;
}else
{
beep1=0;
}
}
}
}
void UART_Init()
{
#ifdef __REG52_H__
SCON = 0x50;
TH2 = 0xFF;
TL2 = 0xFD;
RCAP2H = 0xFF; //(65536-(FOSC/32/BAUD)) BAUD = 115200 FOSC = 11059200
RCAP2L = 0xFD;
/*****************/
TCLK = 1;
RCLK = 1;
C_T2 = 0;
EXEN2 = 0;
/*****************/
TR2 = 1;
ES = 1; //打开串口中断
EA = 1; //打开总中断
#endif
#ifdef __STC12C5A_H__
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
EA = 1; //打开总中断
ES = 1; //打开串口中断
#endif
}
void uartSendByte(unsigned char date)//串口发送单字节数据
{
unsigned char time_out;
time_out=0x00;
SBUF = date; //将数据放入SBUF中
while((!TI)&&(time_out<100)) //检测是否发送出去
{time_out++;DelayUs10x(2);} //未发送出去 进行短暂延时
TI = 0; //清除ti标志
}
void uartSendStr(unsigned char *s,unsigned char length) //发送定长度字符串
{
unsigned char NUM;
NUM=0x00;
while(NUM<length) //发送长度对比
{
uartSendByte(*s); //放松单字节数据
s++; //指针++
NUM++; //下一个++
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
}
if(TI) //如果是发送标志位,清零
TI=0;
}
void wifi ()
{
UART_1_init();
UART_Init();
DelayS(1);
uartSendStr("AT+CIPMUX=1\r\n", 13); //打开多连接
DelayS(1);
uartSendStr("AT+CIPSERVER=1,8080\r\n", 21); //建立服务 端口号为8080
}
void math()
{
float Ad_dat=0;
RH_H=byte_read(0x2000);
RH_L=byte_read(0x2200);
if((RH_H>99)||(RH_L>99)||(RH_L>=RH_H)) {RH_H=20; RH_L=10;}
while(1)
{
if(cs<10)
{
cs++;
sum+=A_D();
}
else
{
cs=0;
Ad_dat=(uchar)(sum/10);
if(Ad_dat>2)
{
Ad_dat=(float)((Ad_dat-2)/2.6);
RH=(uchar)(Ad_dat);
}
else
RH=0;
sum=0;
show();
key();
proc();
}
}
}
void main()
{
alarm_1=1;
wifi();
LCD1602_cls();
math();
DelayS(1);
while(1)
{
if (sendDataFlag == 1) //发送数据标志
{
if (messageCnt == 0) //区分at命令还是数据内容
{
messageCnt = 1;
uartSendStr("AT+CIPSEND=0,8\r\n", 16); //发送32位数据
}
else
{
if (RH>RH_H) //高低都有水
{
uartSendStr("*High* ", 8); //发送内容
}
else if (RH<RH_L) //高低都没有水
{
uartSendStr("*Low* ", 8); //发送内容
}
else if (RH>RH_L&&RH<RH_H) //正常水位
{
uartSendStr("*Normal*", 8); //发送内容
}
else
{
uartSendStr("*Error* ", 8); //发送内容
}
uartSendStr("\r\n", 2);
messageCnt = 0; //发送数据
}
sendDataFlag = 0; //清除发送数据标志
}
}
}