使用參照例程,單片機上傳數據到服務器,同時12864顯示程序。程序寫入開發板后,數據能上傳(在服務器可以看到),但是12864不顯示。搞不懂了,12864換個其它的程序都是正常的。(下面顯示程序只做到主程序中的初始化,正常情況下單片機初始化時就有顯示,現在沒有)
主程序:
#include <reg52.h>
#include <stdio.h>
#include <string.h>//包含頭文件
#include "8266bemfa.h"//包含頭文件
#include "intrins.h"
#include "LCD_12864.h"
void main()
{
Uart_Init();//使用獨立的波特率發生器
ms_delay(1000);
ESP8266_Set("AT+RST"); //重新啟動wifi模塊
ms_delay(1000);
ESP8266_Set("AT"); //重新啟動wifi模塊
ms_delay(1000);
ESP8266_Set("AT+CWMODE=3"); //設置路由器模式 1 station模式 2 AP路由器模式 3 station+AP混合模式
ms_delay(1000);
ESP8266_Set("AT+CWJAP=\""Ssid"\",\""PassWord"\"");//設置模塊SSID:WIFI, PWD:密碼 及安全類型加密模式(WPA2-PSK)
ms_delay(8000);
// ES=1; //允許串口中斷
LCD_Init( ); //初始化
LCD_ClearTXT( ); //文本區清RAM函數
LCD_ClearBMP( );
LCD_Ascii(1,0,"高低溫控制系統 ");
LCD_Ascii(2,0,"版本:V2.0 ");
LCD_Ascii(3,0,"編號 ");
LCD_Ascii(4,0,"管理人 ");
ms_delay(8000);
while(1)
{
POST();//可以設定滿足什么條件是進行消息推送,這里只是一個demo
}
}
上傳程序:
#ifndef __8266bemfa_H
#define __8266bemfa_H
#include <reg52.h>
#include <stdio.h>
#include <string.h>//包含頭文件
#include "8266bemfa.h"//包含頭文件
#define uint unsigned int
#define uchar unsigned char
#define Ssid "moduletest" //WIFI名稱,,修改為自己路由器的WIFI名稱,好像不支持中文
#define PassWord "test1234" //WIFI密碼,修改為自己路由器的
#define Uid "e1dea33331c5e9dff14a0ef7ba9f7a97
#define Topic "myjishu"
/*****************相關變量**************/
//uchar Receive,i;
//uint n;
//uchar Recive_table[15]; //用于接收wifi模塊反饋到MCU上的數據
/*******************************************************************
名稱:延時函數
作用:毫秒級延時,微妙級延時函數,為數據收發完成作等待.......
********************************************************************/
void ms_delay(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
void us_delay(uchar t)
{
while(t--);
}
/********************************************************************
名稱:波特率發生器函數
作用:波特率發生器可以是T1定時器實現,也可以是MCU內部獨立的波特率發生器,
各自不同的載入值計算式,具體根據寄存器相關設置來參考計算,以實現
異步串行通訊。(經測試,兩種設置方式均可用,可任選一種。)
********************************************************************/
void Uart_Init()//使用定時器1作為波特率發生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
{
// SCON=0x50; //設置為串行口以方式1工作,8位異步通訊,允許接收中斷。
// //一幀信息為10位,1位起始位,8位數據位(低位在先),1位停止位。
// PCON=0x80; //SMOD波特率選擇位為1,SMOD=1.
// TMOD=0x21; //設置定時器1為波特率發生器,工作在模式2,8位自動裝載
// TH1=0xFA ;//波特率9600 ,TH1=256-FOSC/16/12/波特率
// TL1=TH1;
// EA=1; //總中斷打開
// ES=0; //關閉串口中斷
// TR1=1; //啟動定時器1
//
// TH0=0xD8; //定時10ms
// TL0=0xF0;
// ET0=1;
// TR0=1;
TMOD = 0X20;
SCON = 0x50;
TL1 = 0xfd;
TH1 = 0xfd;
ES = 1;
TR1 = 1;
}
/********************************************************************
名稱:串口發送函數
功能:MCU向其他與其連接的設備發送數據(此處是無線WIFI模塊ESP8266)
********************************************************************/
void Send_Uart(uchar value)
{
ES=0; //關閉串口中斷
TI=0; //清發送完畢中斷請求標志位
SBUF=value; //發送
while(TI==0); //等待發送完畢
TI=0; //清發送完畢中斷請求標志位
ES=1; //允許串口中斷
}
/********************************************************************
名稱:WIFI模塊設置函數
作用: 啟動模塊,以便可以實現無線接入和控制
********************************************************************/
void ESP8266_Set(uchar *puf) // 數組指針*puf指向字符串數組
{
while(*puf!='\0') //遇到空格跳出循環
{
Send_Uart(*puf); //向WIFI模塊發送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\r');//回車
us_delay(5);
Send_Uart('\n'); //換行
}
/********************************************************************
名稱:WIFI模塊設置函數
作用: 啟動模塊,沒有回車換行
********************************************************************/
void ESP8266_Set_Only(uchar *puf) // 數組指針*puf指向字符串數組
{
while(*puf!='\0') //遇到空格跳出循環
{
Send_Uart(*puf); //向WIFI模塊發送控制指令。
us_delay(5);
puf++;
}
}
void POST(void)//POST數據函數
{
int dataLen;
uchar postData[150];
char strLen[3];
char data1[] = "32"; ////為了演示定義的模擬數據,可根據自己傳感器自行采集數據
char data2[] = "27.8"; //
char data3[] = "45";
char data4[] = "26";
char data5[] = "99.12";
char data6[] = "ON";
//通過&符號整合需要post的數據。傳感器數據用#分開,以便app進行數據分割
//自己要知道每個數據代表的意思,一會app端會按排列分割提取數值
sprintf(postData,"uid=%s&topic=%s&msg=#%s#%s#%s#%s#%s#%s#\r\n",Uid,Topic,data1,data2,data3,data4,data5,data6);
dataLen = strlen(postData); //計算數據長度
sprintf(strLen,"%d",dataLen); //int類型轉char
ESP8266_Set("AT+CIPMODE=1"); //開啟透明傳輸模式
ms_delay(1000);
ESP8266_Set("AT+CIPSTART=\"TCP\",\"apibemfacom\",80"); // 連接服務器和端口
ms_delay(1000);
ESP8266_Set("AT+CIPSEND"); //進入透傳模式,下面發的都會無條件傳輸
ms_delay(1000);
ESP8266_Set_Only("POST /api/device/v1/data/1/ HTTP/1.1\r\nHost: apibemfacom\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection:close\r\nContent-Length:");//??device? ??sensor?
ESP8266_Set(strLen);//數據長度(postData數據長度),一定要準確
ESP8266_Set("");//回車(發完數據長度后,有回車,不懂的百度http post 格式)
ESP8266_Set(postData);//發送數據
ms_delay(2000);
ESP8266_Set("+++"); //
memset(strLen,'\0',3); //重置數組
memset(postData,'\0',sizeof postData);//重置數組
}
#endif
12864顯示程序:
//#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
////***********12864***************
//sbit CS=P0^0;
//sbit SID=P0^1;
//sbit SCK1=P0^2;
sbit CS=P3^5;
sbit SID=P3^6;
sbit SCK1=P3^4;
unsigned char code bmp1[],bmp2[];
void Delay1ms(uint ms)
{
unsigned char i, j;
while(ms--)
{
_nop_();
_nop_();
i = 12;
j = 168;
do
{
while (--j);
} while (--i);
}
}
//串口發送一個字節
void LCD_SendByte(unsigned char Dbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK1 = 0;
Dbyte=Dbyte<<1; //左移一位
SID = CY; //移出的位給SID
SCK1 = 1;
SCK1 = 0;
}
}
//****************送命令********************
void LCD_WriteCommand( unsigned char Cbyte )
{
CS = 1;
LCD_SendByte(0xf8); //11111,RW(0),RS(0),0
LCD_SendByte(0xf0&Cbyte); //高四位
LCD_SendByte(0xf0&Cbyte<<4); //低四位(先執行<<)
CS = 0;
}
//****************送數據********************
void LCD_WriteData( unsigned char Dbyte )
{
CS = 1;
LCD_SendByte(0xfa); //11111,RW(0),RS(1),0
LCD_SendByte(0xf0&Dbyte); //高四位
LCD_SendByte(0xf0&Dbyte<<4); //低四位(先執行<<)
CS = 0;
}
//****************初始化********************
void LCD_Init( void )
{
LCD_WriteCommand(0x34); //8BitMCU,基本指令集合
LCD_WriteCommand(0x30); //AC歸0,不改變DDRAM內容
LCD_WriteCommand(0x01); //顯示ON,游標OFF,游標位反白OFF
LCD_WriteCommand(0x06); //清屏,AC歸0
LCD_WriteCommand(0x0c); //寫入時,游標右移動
}
void LCD_pos(uchar X,uchar Y)
{
uchar pos;
LCD_WriteCommand(0x30); //顯示文本命令
if (X==1) {X=0x80;} //第一行
else if (X==2) {X=0x90;}
else if (X==3) {X=0x88;}
else if (X==4) {X=0x98;}
pos = X+Y ;
LCD_WriteCommand(pos); //顯示地址
}
//***************文本區清RAM函數****************************
void LCD_ClearTXT( void )
{
LCD_WriteCommand(0x01);
LCD_WriteCommand(0x34);
LCD_WriteCommand(0x30);
}
//**************圖形區清RAM函數****************************************
void LCD_ClearBMP( void )
{
unsigned char i,j;
LCD_WriteCommand(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
for(i=0;i<32;i++) //12864實際為256x32
{
LCD_WriteCommand(0x80|i); //行位置
LCD_WriteCommand(0x80); //列位置
for(j=0;j<32;j++) //256/8=32 byte
LCD_WriteData(0);
}
LCD_WriteCommand(0x36); //數據送完后最后開顯示
}
void LCD_DATA_3(uchar X,uchar Y,unsigned char DATA)
{
LCD_pos(X,Y);
if(DATA>=0 && DATA<10)
{
LCD_WriteData(DATA+0X30);
LCD_WriteData('C');
LCD_WriteData(' ');
LCD_WriteData(' ');
}
else if(DATA<100 && DATA>=10)
{
LCD_WriteData(DATA/10+0X30);
LCD_WriteData(DATA%10+0X30);
LCD_WriteData('C');
LCD_WriteData(' ');
}
}
void t_LCD_DATA_3(uchar X,uchar Y,unsigned int DATA)
{
LCD_pos(X,Y);
if(DATA>=10 && DATA<100)
{
LCD_WriteData('-');
LCD_WriteData(DATA/10+0X30);
LCD_WriteData(DATA%10+0X30);
LCD_WriteData('C');
}
else if(DATA>=1 && DATA<10)
{
LCD_WriteData('-');
LCD_WriteData(DATA+0X30);
LCD_WriteData('C');
LCD_WriteData(' ');
}
}
//void LCD_RSLT(uchar X,uchar Y,char rslt)
//{
// LCD_pos(X,Y);
// if(rslt==1)
// {
// LCD_WriteData(' ');
// LCD_WriteData('O');
// LCD_WriteData('K');
// LCD_WriteData(' ');
//
// }
// else if(rslt==2)
// {
// LCD_WriteData(' ');
// LCD_WriteData('O');
// LCD_WriteData('F');
// LCD_WriteData(' ');
// }
// else if(rslt==3)
// {
// LCD_WriteData(' ');
// LCD_WriteData('O');
// LCD_WriteData('K');
// LCD_WriteData(' ');
//
// }
// else if(rslt==4)
// {
// LCD_WriteData(' ');
// LCD_WriteData('O');
// LCD_WriteData('F');
// LCD_WriteData(' ');
//
// }
//}
//****************送字符串*********************************************
//1行顯示的是8個字符
//顯示8個修改參數即可
void LCD_Ascii(unsigned char row,unsigned char col,unsigned char *puts)
{
LCD_WriteCommand(0x30); //8BitMCU,基本指令集合
LCD_pos(row,col); //確定顯示地址
while(*puts != '\0') //判斷字符串是否顯示完畢
{
if(col==8) //判斷換行
{ //若不判斷,則自動從第一行到第三行
col=0;
row++;
}
if(row==5) row=0; //一屏顯示完,回到屏左上角
LCD_pos(row,col); //確定顯示地址
LCD_WriteData(*puts); //一個漢字要寫兩次
puts++;
LCD_WriteData(*puts);
puts++;
col++;
}
}
//**********字符反白顯示*************************************************
//輸入參數:CX=要反白字符的行(0-3)
//CY=要反白字符的列(0-7)
//width=要反白字符的長度(1-16)
//off_on開反白關反白
void LCD_convertChar (uchar CX, CY, width,off_on)
{
uchar lcdPosX,lcdPosY ;
uchar halfLineCnt,basicBlock;
// EA=0;
halfLineCnt = 16;
if (CX == 1){CX = 0x80;lcdPosY= 0x80;}
else if (CX == 2){CX = 0x90;lcdPosY= 0x90;}
else if (CX == 3){CX = 0x88;lcdPosY= 0x80;}
else if (CX == 4){CX = 0x88;lcdPosY= 0x90;}
lcdPosX = CX + CY;
for (; halfLineCnt != 0; halfLineCnt--)
{
basicBlock = width&0x1F; //低5位,主要是0到16
// wrPosition();
LCD_WriteCommand(0x36);
LCD_WriteCommand(lcdPosY);
LCD_WriteCommand(lcdPosX);
LCD_WriteCommand(0x30);
for (;basicBlock != 0; basicBlock--)
{
// if ((width&0x80) && (basicBlock==2) )//若最高位為1,則為光標右邊1位
// {
// LCD_WriteData(0x00);
// }
if(off_on==0) //關反白
{
LCD_WriteData(0x00);
}
else
{
LCD_WriteData(0xff);//開反白
}
}
lcdPosY++;
}
LCD_WriteCommand(0x36);
LCD_WriteCommand(0x30);
}
//
//void LCD_RST (uchar x, uchar y )
//{
// LCD_WriteCommand(0x34);
// LCD_WriteCommand(x);
// LCD_WriteCommand(y);
// LCD_WriteCommand(30);
//}
/*******************************/
//LCD12864送顯示函數
//入口參數:x表示行;y表示列;*p表示要寫入的數據
//返回值:無
//說明:串行通信方式
//時間:2013.4.2
//版本:1.0
//void LCD12864_Display(uchar x,uchar y,char *p)
//{
// LCD_WriteCommand(0x80+8*x+y);
//
// while(*p)
// {
// LCD_WriteData(*p);
// p++;
// }
//}
///*******************************************/
|