使用参照例程,单片机上传数据到服务器,同时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++;
// }
//}
///*******************************************/
|