|
LCD串行顯示數(shù)值,APP能連接但是收不到數(shù)據(jù),是不是有什么沖突。
sbit beep = P2^0;
sbit setKey = P3^3;//設(shè)置
sbit addKey = P3^4;//加
sbit subKey = P3^5;//減
sbit paishui = P3^6;//排水---低電平觸發(fā)
sbit jiashui = P3^7;//加水
uint Receive,i;
long s;
long s1;
uchar Recive_table[40]; //用于接收wifi模塊反饋到MCU上的數(shù)據(jù)
uchar code ta[]="0123456789- "; //測試一下
uchar table[]="溫度:00.0 C 濕度:00.0 %";//傳送用定位模板
float dataV[4]= {0};
unsigned char dataTH[8]={110,30, 99, 30, 8,2, 45, 15};
unsigned char lcd[8] = {0};
void alarm();
void delay(unsigned int i){//微秒級延時
while(i--);
}
void delayms(int a)//毫秒級延時
{
int x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
float pre_ph_v, phv;
void setKeyDeal();
void addKeyDeal();
void subKeyDeal();
void Uart_Init() //使用定時器1作為波特率發(fā)生器(STC89C52、STC89C51、AT89C51等均可)
{
TMOD = 0x21;
SCON = 0x50; //設(shè)置串行方式
TH1 = 0xFD; //波特率9600
TL1 = TH1;
PCON = 0x00;
EA = 1; //總中斷打開
ES = 1; //開串口中斷
TR1 = 1; //啟動定時器1
}
/********************************************************************
名稱:串口發(fā)送函數(shù) 功能:MCU向無線WIFI模塊ESP8266發(fā)送數(shù)據(jù)
********************************************************************/
void Send_Uart(uchar value)
{
ES=0; //關(guān)閉串口中斷
TI=0; //清發(fā)送完畢中斷請求標(biāo)志位
SBUF=value; //發(fā)送
while(TI==0); //等待發(fā)送完畢
TI=0; //清發(fā)送完畢中斷請求標(biāo)志位
ES=1; //允許串口中斷
TH0=0;
TL0=0;
}
/********************************************************************
名稱:WIFI模塊設(shè)置函數(shù) 作用: 啟動模塊,以便可以實(shí)現(xiàn)無線接入和控制
********************************************************************/
void ESP8266_Set(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組
{
while(*puf!='\0') //遇到空格跳出循環(huán)
{
Send_Uart(*puf); //向WIFI模塊發(fā)送控制指令。
delay(5);
puf++;
}
delay(5);
Send_Uart('\r'); //回車
delay(5);
Send_Uart('\n'); //換行
}
//初始化eeprom
void init_eeprom(){
unsigned char is_first_init = byte_read(0x2020);
if(is_first_init == 1){
dataTH[0] = byte_read(0x2000);
dataTH[1] = byte_read(0x2001);
dataTH[2] = byte_read(0x2002);
dataTH[3] = byte_read(0x2003);
dataTH[4] = byte_read(0x2004);
dataTH[5] = byte_read(0x2005);
dataTH[6] = byte_read(0x2006);
dataTH[7] = byte_read(0x2007);
}else{
SectorErase(0x2000);
byte_write(0x2000, dataTH[0]);
byte_write(0x2001, dataTH[1]);
byte_write(0x2002, dataTH[2]);
byte_write(0x2003, dataTH[3]);
byte_write(0x2004, dataTH[4]);
byte_write(0x2005, dataTH[5]);
byte_write(0x2006, dataTH[6]);
byte_write(0x2007, dataTH[7]);
byte_write(0x2020, 1);
}
}
//更新eeprom存儲的數(shù)據(jù)
void update_eeprom(){
SectorErase(0x2000);
byte_write(0x2000, dataTH[0]);
byte_write(0x2001, dataTH[1]);
byte_write(0x2002, dataTH[2]);
byte_write(0x2003, dataTH[3]);
byte_write(0x2004, dataTH[4]);
byte_write(0x2005, dataTH[5]);
byte_write(0x2006, dataTH[6]);
byte_write(0x2007, dataTH[7]);
byte_write(0x2020, 1);
}
void updateLCD(){
dataV[0] = get_0832_AD_data(0); //PH
dataV[1] = get_0832_AD_data1(0); //SW
dataV[2] = get_0832_AD_data(1); //ZD
dataV[3] = Get18B20Temp();//WD
phv = -58.87*(dataV[0]*5.0/255.0) + 216.77;
if(phv > 141 || phv < 0 ) { phv = pre_ph_v; }
pre_ph_v = phv;
lcd[0] = ((int)phv)%1000/100+48;
lcd[1] = ((int)phv)%100/10 + 48;
lcd[2] = '.';
lcd[3] = ((int)phv)%10 + 48;
lcd[4] = '\0';
PutStr(0,1, lcd);
dataV[0] = phv;
table[6]=lcd[0];
table[7]=lcd[1];
table[9]=lcd[3];
dataV[2] = dataV[2] /2.55;
if(dataV[2] > 99) dataV[2] = 99;
lcd[0] = ((int)dataV[2])%100/10 + 48;
lcd[1] = ((int)dataV[2])%10 + 48;
lcd[2] = '\0';
PutStr(1,1, lcd);
dataV[1] = 10 - (130-dataV[1]) /19;
if(dataV[1] > 10) dataV[1] = 10;
if(dataV[1] < 0) dataV[1] = 0;
lcd[0] = ((int)dataV[1])%100/10 + 48;
lcd[1] = ((int)dataV[1])%10 + 48;
lcd[2] = '\0';
PutStr(2,1, lcd);
lcd[0] = ((int)dataV[3])%100/10 + 48;
lcd[1] = ((int)dataV[3])%10 + 48;
lcd[2] = '\0';
PutStr(3,1, lcd);
}
void updateTH(){
lcd[0] = ((int)dataTH[0])%1000/100+48;
lcd[1] = ((int)dataTH[0])%100/10 + 48;
lcd[2] = '\0';
PutStr(0,4, lcd);
lcd[0] = ((int)dataTH[1])%1000/100+48;
lcd[1] = ((int)dataTH[1])%100/10 + 48;
lcd[2] = '\0';
PutStr(0,7, lcd);
lcd[0] = ((int)dataTH[2])%100/10+48;
lcd[1] = ((int)dataTH[2])%10 + 48;
lcd[2] = '\0';
PutStr(1,4, lcd);
lcd[0] = ((int)dataTH[3])%100/10+48;
lcd[1] = ((int)dataTH[3])%10 + 48;
lcd[2] = '\0';
PutStr(1,7, lcd);
lcd[0] = ((int)dataTH[4])%100/10+48;
lcd[1] = ((int)dataTH[4])%10 + 48;
lcd[2] = '\0';
PutStr(2,4, lcd);
lcd[0] = ((int)dataTH[5])%100/10+48;
lcd[1] = ((int)dataTH[5])%10 + 48;
lcd[2] = '\0';
PutStr(2,7, lcd);
lcd[0] = ((int)dataTH[6])%100/10+48;
lcd[1] = ((int)dataTH[6])%10 + 48;
lcd[2] = '\0';
PutStr(3,4, lcd);
lcd[0] = ((int)dataTH[7])%100/10+48;
lcd[1] = ((int)dataTH[7])%10 + 48;
lcd[2] = '\0';
PutStr(3,7, lcd);
}
void timer1(){
updateLCD();
updateTH();
alarm();
}
void main(){
Uart_Init(); //波特率發(fā)生器
delayms(10);
ESP8266_Set("AT+CWMODE=2"); //設(shè)置路由器模式1 station,模式2 AP,模式3 station+AP混合模式
delayms(500);
ESP8266_Set("AT+CWSAP=\"wifi_yuan\",\"123456789\",11,4"); //AT+CWSAP="wifi_yuan","123456789",11,4 設(shè)置模塊SSID:WIFI, PWD:密碼 及安全類型加密模式(WPA2-PSK)
delayms(500);
ESP8266_Set("AT+CIPMUX=1"); //開啟多連接模式,允許多個各客戶端接入
delayms(500);
ESP8266_Set("AT+CIPSERVER=1,5000"); //啟動TCP/IP 實(shí)現(xiàn)基于網(wǎng)絡(luò)//控制 ESP8266_Set("AT+CIPSERVER=1,5000");
delayms(500);
ESP8266_Set("AT+CIPSTO=0"); //永遠(yuǎn)不超時
delayms(500);
ES=1;
DS18B20Init();
LcmInit(); //LCD12864初始化
LcmClearTXT(); //LCD12864清屏
init_eeprom();
timer1_start(1000, timer1);
PutStr(0,0, "PH H L ");
PutStr(1,0, "ZD H L ");
PutStr(2,0, "SW H L ");
PutStr(3,0, "WD H L ");
while(1){
setKeyDeal();//按鍵
addKeyDeal();
subKeyDeal();
ESP8266_Set(ta);//數(shù)據(jù)發(fā)送出去
delayms(500);
}
}
/*********************************************************************
名稱:串行通訊中斷 作用:發(fā)送或接收結(jié)束后進(jìn)入該函數(shù),對相應(yīng)的標(biāo)志位軟件清0,實(shí)現(xiàn)模塊對數(shù)據(jù)正常的收發(fā)。
********************************************************************/
void Uart_Interrupt() interrupt 4
{
static uchar i=0;
if(RI==1)
{
RI=0;
Receive=SBUF; //MCU接收wifi模塊反饋回來的數(shù)據(jù)
Recive_table[i]=Receive;
if((Recive_table[i]=='\n'))
{
i=0;
}
else i++; //遇到換行 重新裝值
}
else TI=0;
}
void alarm(){//報(bào)警
if( (int)dataV[0] > dataTH[0] || (int)dataV[0] < dataTH[1] || \
(int)dataV[2] > dataTH[2] || (int)dataV[2] < dataTH[3] || \
(int)dataV[3] > dataTH[6] || (int)dataV[3] < dataTH[7] \
){
beep=paishui=jiashui=0;//換水---同時加水排水
}
if((int)dataV[1] > dataTH[4]){ beep=paishui =0;}//水位高排水
else if((int)dataV[1] < dataTH[5]){ beep=jiashui =0;}//水位低加水
else{
beep=paishui=jiashui=1;
}
}
char flagSet = 0;
void setDeal(){
switch(flagSet){
case 0: PutStr(3,6, " "); break;
case 1: PutStr(0,3, "*"); break;
case 2: PutStr(0,6, "*"); PutStr(0,3, " "); break;
case 3: PutStr(1,3, "*"); PutStr(0,6, " "); break;
case 4: PutStr(1,6, "*"); PutStr(1,3, " "); break;
case 5: PutStr(2,3, "*"); PutStr(1,6, " "); break;
case 6: PutStr(2,6, "*"); PutStr(2,3, " "); break;
case 7: PutStr(3,3, "*"); PutStr(2,6, " "); break;
case 8: PutStr(3,6, "*"); PutStr(3,3, " "); break;
}
}
void setKeyDeal(){
setKey = 1;
if(setKey == 0){
delay(1000);
if(setKey == 0){
flagSet++;
if(flagSet > 8){ flagSet = 0; }
setDeal();
while(setKey == 0);
}
}
}
void addKeyDeal(){
addKey = 1;
if(addKey == 0 && flagSet > 0){
delay(1000);
if(addKey == 0){
switch(flagSet){
case 1: if(dataTH[0] < 141) dataTH[0]+=10; break;
case 2: if(dataTH[1] < dataTH[0]) dataTH[1]+=10; break;
case 3: if(dataTH[2] < 99) dataTH[2]++; break;
case 4: if(dataTH[3] < dataTH[2]) dataTH[3]++; break;
case 5: if(dataTH[4] < 10) dataTH[4]++; break;
case 6: if(dataTH[5] < dataTH[4]) dataTH[5]++; break;
case 7: if(dataTH[6] < 99) dataTH[6]++; break;
case 8: if(dataTH[7] < dataTH[6]) dataTH[7]++; break;
}
updateTH();
update_eeprom();
while(addKey == 0);
}
}
}
void subKeyDeal(){
subKey = 1;
if(subKey == 0 && flagSet > 0){
delay(1000);
if(subKey == 0){
switch(flagSet){
case 1: if(dataTH[0] > dataTH[1]+10) dataTH[0]-=10; break;
case 2: if(dataTH[1] > 10) dataTH[1]-=10; break;
case 3: if(dataTH[2] > dataTH[3]) dataTH[2]--; break;
case 4: if(dataTH[3] > 0) dataTH[3]--; break;
case 5: if(dataTH[4] > dataTH[5]) dataTH[4]--; break;
case 6: if(dataTH[5] > 0) dataTH[5]--; break;
case 7: if(dataTH[6] > dataTH[7]) dataTH[6]--; break;
case 8: if(dataTH[7] > 0) dataTH[7]--; break;
}
updateTH();
update_eeprom();
while(subKey == 0);
}
}
}
|
|