#include "STC10FXX.H" //包含头文件
#include "intrins.h"
#include "ctype.h"
#include "string.h" //比较字符串相关操作头文件!
/******************************/
sbit OUT1=P2^0; //控制三极管
sbit OUT2=P2^1; //控制LED3
sbit OUT3=P2^2; //控制LED4
sbit S1 =P2^3;
sbit S2 =P2^4;
sbit OUT4=P3^3; //控制LED2
#define FOSC 11059200 //晶振频率
#define BAUD 115200L //波特率值
#define RELOAD_COUNT (256-FOSC/32/BAUD) //载入值
#define UART_P1 0x80 //串口选择在P1。
/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE 0 //Stand-By
#define CMD_READ 1 //Byte-Read
#define CMD_PROGRAM 2 //Byte-Program
#define CMD_ERASE 3 //Sector-Erase
//#define ID_ADDR_RAM 0xf1 //ID号的存放内部RAM单元 F1H - F7H。
//#define ID_ADDR_ROM 0x0ff9 //4K程序
/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
//#define ENABLE_IAP 0x80 //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81 //if SYSCLK<24MHz
//#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
//#define ENABLE_IAP 0x83 //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84 //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85 //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86 //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87 //if SYSCLK<1MHz
#define ENABLE_IAP 0x83 //if SYSCLK<12MHz
//Start address for STC11/10xx series EEPROM
#define IAP_ADDRESS 0x0000
#define uchar unsigned char
#define uint unsigned int
#define OLEN 48 /* size of serial transmission buffer */
idata char outbuf[OLEN]; /* storage for transmission buffer */
volatile uchar idata *outlast=outbuf; //最后由中断传输出去的字节位置
volatile uchar idata *putlast=outbuf; //最后放入发送缓冲区的字节位置
#define ILEN 64 /* size of serial receiving buffer */ //LXG=64
idata char inbuf[ILEN]; //接收缓冲区
volatile uchar idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置
volatile uchar idata *getlast=inbuf; //最后取走的字节位置
bit outbufsign0; //最后一个数据覵BUF发完标志 发完=0
bit outbufsign; //输出缓冲区非空标志 有=1
bit inbufsign; //接收缓冲区非空标志 有=1
bit inbufful; //输入缓冲区满标志 满=1
bit worksign ; //上电时间够了,可以工作了!
bit atsign ; //每隔1S发送AT指令,用业配置或查询模块状态!
//EEPROM 操作用
bit er_flag; //清除标标位。 0:清除成功, 1:未清除失败!
//wifi at 状态控制
bit ip_flag; //IP分配状态标志 1:已分配, 0:未分配IP
bit pw_flag; //AT配置标志 1:配置完成, 0:未完成
bit server_flag; //创建服务器标志 1:已创建, 0:未创建
bit gb_flag; //广播连接标志 1:已连接, 0:未连接
bit app_flag; //app使能标志 1:APP通信使能, 0:APP通信未使能
bit h_flag; //
//APP 发送标志
bit send_flag ; //数据设置好,可以发送了!
//bit ip_send_flag ; //发送IP及端口应答标志
//bit un_lock_flag ; //发送激化数据应答标志
uchar n=0; //
uchar LockFlag=0; // 全局变量.
uchar Count=0; //记录IP响应发送次数!
uchar g_len = 0; // 全局变量,一次接收数据长度。
uchar a_len =0; //记录IP中点的位置,来记录IP前两数数长度!
char data Rx_data[64]={0,0,0,0,0,0,0,0,0,0}; //存放读串口数据
char ip_addr[16] ={0,0,0,0,0,0,0,0,0,0}; //
uint g_Count = 0; // 全局变量,定时器0用于上电记时。
uint g_flag; // 全局变量,定时器0用于AT配置。
char code UDPIP[]="AT+CIPSTART=0,UDP," ;
char code PORTR[]="8888" ;
char code PORTL[]="333" ;
//基础配置
char code CWMODEACK[]="AT+CWMODE=3\n\r\nOK\r\n\0";//19
char code SLEEPACK[]="AT+SLEEP=0\n\r\n+SLEEP:0\0\r\nOK\r\n\0";//29
char code CWSMARTCONFIGACK[]="AT+CWSMARTCONFIG=1\n\r\nOK\r\n\0"; //26
//"AT+CIPSTAIP?\n\r\n+CIPSTAIP:192.168.1.102\0\r\nOK\r\n\0" //查询IP响应!
//配置服务器及广播IP ,只要上电重启都需要再配一次。
char code CIPMUXACK[]="AT+CIPMUX=1\n\r\nOK\r\n\0"; //19
char code CIPSERVERACK[]="AT+CIPSERVER=1\n\r\nOK\r\n\0"; //22
char code CIPSTARTACK[]="AT+CIPSTART=0,UDP,";//18 //192.168.1.255,8888,333\n\r\0 CONNECT\r\n\0" ; //54
//char code CIPSTARTACK[]="AT+CIPSTART=0,UDP,192.168.1.102,8888,333\n\r\CONNECT\r\n\0" ; //54
//配置数据发送 ,只要发送数据,都需要重新配置。
char code CIPSENDACK[]="AT+CIPSEND=0,25\n\r\n>\0" ;//20 //AT+CIPSEND=<link ID>,<len>
//配置好后,就可以向手机客户端发送数所了;每次都得先配置数据发送,然后才能发送数据。
//查询IP是否分配;状态:OK :ERROR
char code CIPSTAIPERROR[]= "AT+CIPSTAIP?\n\r\nERROR\r\n\0" ; //23
char code CIPSTAIPOK[]="AT+CIPSTAIP?\n\r\n+CIPSTAIP:" ;//25 //“192.168.0.102\0\r\nOK\r\n\0” //21
void putbyte(char c);
void putbytes(unsigned char *outplace,unsigned char j);
void putstring(unsigned char *puts);
uchar getbyte (void);
void us_delay(uint n);
void ms_delay(uint t);
void IapIdle();
uchar IapReadByte(uint addr);
void IapProgramByte(uint addr, uchar dat);
void IapEraseSector(uint addr);
void P2init();
void InitUart();
void InitTimer0();
void Send_Uart(uchar value);
//AT 指令解析函数集
uchar CWMODE();
uchar SLEEP();
uchar CWSMARTCONFIG();
uchar WifiState();
uchar CIPSERVER();
uchar CIPSTART();
uchar CIPSEND();
void ATCommandPro(); //AT配置处理程序
void RecevieCommandData(); //AT配置接收程序
void WIFIPro(); //WIFI通信协议处理
uchar OPENLOCKACK();//开锁函数。
uchar GOTIPState(); //获取IP配网状态!
void IPGETDOC();//udp 广播
void Word_Cvt_Str(char zifu[],uchar val);//数值转字符串功能
uchar IPGBACK(); //IP 广播确认
/********************************************************/
//*****************************
//放入一个字节到发送缓冲区
void putbyte(char c)
{
ES=0; /*暂停串行中断,以免数据比较时出错�* */
while ( (((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-outlast)==2))) //LXG出队比进队快时,等待下!
{
ES=1;
c++;
c--;
ES=0; //what mean?
}
*putlast=c; //放字节进入缓冲区
putlast++; //发送缓冲区指针加一
if (putlast==outbuf+OLEN) putlast=outbuf; //指针到了顶部换到底部
outbufsign=1; //输出缓冲区非空标志 有=1
if (!outbufsign0) {outbufsign0=1;TI=1; } //缓冲区开始为空置为有,启动发送(第一个字节需要让TI=1 启动发送)
ES=1;
}
//******************************
//放一串数据到发送缓冲区
void putbytes(unsigned char *outplace,unsigned char j)
{
unsigned char i;
for(i=0;i<j;i++)
{
putbyte(*outplace);
outplace++;
}
}
//***************************************
//发送一个定义在程序存储区的字符串到串口
void putstring(unsigned char *puts)
{
for (;*puts!=0;puts++) //遇到停止符0结束
putbyte(*puts);
}
//*************************************
//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
uchar getbyte (void)
{
unsigned char c ;
//while (!inbufsign); //缓冲区空等待
if(inbufsign) //接收缓冲区非空标志 有=1
{
ES=0;
c= *getlast; //取数据
getlast++; //最后取走的数据位置加一
inbufful=0; //输入缓冲区的满标志清零
if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
ES=1;
return (c); //取回数据
}
return 0;
}
//UDP 广播:IP最后一位改成255。
void IPGETDOC()
{
uchar j;
for(j=0;j<13;j++)
{
if(ip_addr[j]=='.')
{
a_len=j+1; //把点也加上去。
}
}
putbytes(UDPIP,18); //"AT+CIPSTART=0,UDP," ;
putbytes(ip_addr,a_len); //IP 局或网广播!xxx.xxx.1.255
a_len=0; //必须清零!!!
putbyte('2');
putbyte('5');
putbyte('5');
putbyte(',');
putstring(PORTR);
putbyte(