创作者:果冻汇源 | 更新日期:2017-05-20 | 在线时长:5时
果冻汇源的第一个设备,来自贝壳物联
这是一个测试设备,本来是用来做我们学校low爆了的科研成长导师项目,由于队长(myLazy室友)拖延问题,就被一直搁置,最后迫不得已他掏了一款STM32的板子(汗)导致本C51项目流产(哭),顶着被队长骂的风险冒死完成了一部分功能(与贝壳的连接部分)功能没时间进一步完善了,我就先公布一下我的成果吧。
APP控制STC89C51单片机
AndroidAPP STC89C51以及keil、STCISP等软件、ESP8266(01s)
/*
基于贝壳物联的单片机控制系统
public by 果冻汇源 2017.5.20 zju
前期工作:ESP8266的WIFI设置好(可以用smartlink来做),通讯频率为4800Hz
*/
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
void uartconfig();
void delay10ms(unsigned int c) ;
void keypros();
void init();
void send(unsigned char *str);
void function(uchar s);
void receive();
uchar dat0[]="AT+RST\r\n";
uchar dat1[]="AT+CIPSTART=\"TCP\",\"www.bigiot.net\",8181\r\n";
uchar dat2[]="AT+CIPSEND=60\r\n"; //建立TCP连接和轮徇发送指令,保持不掉线
uchar dat3[]="\r\n{\"M\":\"checkin\",\"ID\":\"1450\",\"K\":\"9c85f0bf6\"}\r\n"; //注册信息:到贝壳物联去注册一个
uchar i;
uchar temp[120],j=0,i=0,k=0,m=0,n;
uchar s[10];
uint flag=0;
sbit k1 = P1^3;
sbit k2 = P1^0;
void main()
{
uartconfig(); //init f=4800Hz
while(1){
init(); //login "www.bigiot.net" with passwd
while(1){
keypros(); //send "AT+RST" when K1=P1^3==0
send(dat2); // keep login
for(n=0;n<40;n++){ //延迟中加监听
delay10ms(10);
receive();}
}
}
}
//判断接收的字符串flag字符串接收完成标志,temp寄存器,
void receive(){
if(flag){
while(temp[j]!='C'&&m>=j){
j++;
m=j;
if(temp[j]=='\0'||j>=120){
for(j=0;j<=120;j++)
temp[j]='\0';
j=0;
m=0;
}
}
if(j!=0&&j<=120){
if(temp[j]=='C'){j=j+4;}
while(temp[j]!='\"'){
s[k]=temp[j];
SBUF=s[k];
j++;k++;
while(!TI);
TI=0;}
flag=0;
m=j;
function(*s);
}
} //判断完成flag=0,下次while(1)跳到else完成jmk串口初始化;
else {
j=0;
m=0;
k=0;
}
}
//执行功能,将不同字符串转化为不同输出(指针实现)
void function(uchar s){
if (s=='p'){
P0=10010010;
}
else {
P0=11111111;
}
}
//登录贝壳网的初始化
void init(){
send(dat1);
delay10ms(100);
send(dat2);
delay10ms(100);
send(dat3);
send(dat3);
delay10ms(100);
}
//按键的延时消抖程序(100ms)
void keypros()
{
if(k1==0){
delay10ms(10);
if(k1==0){
send(dat0); //发送AT+RST指令,初始化ESP8266
delay10ms(100);
init(); //发送登录命令
}
}
}
//发送字符串命令到ESP8266串口
void send(unsigned char *str){
i=0;
while(str[i]!='\0'){
SBUF=str[i];
while(!TI);
TI=0;
i++;
}
}
//单片机初始化 通讯频率4800Hz,开串行口ES中断
void uartconfig()
{
SM0=0;
SM1=1;
REN=1;
TMOD=0x20;
PCON=0x80;
TL1=0xf3;
TH1=0xf3;
TR1=1;
EA=1;
ES=1;
}
//ES中断命令,接收字符并保存,接收完成发送flag=1(每次中断接收一个字符)
void ser() interrupt 4
{
if(RI){
RI=0;
temp[i]=SBUF;
i++;
if(SBUF=='}'){
i=0;
flag=1;
}
}
}
//延时程序(粗略)
void delay10ms(unsigned int c)
{
uchar a, b;
for (;c>0;c--)
for (b=38;b>0;b--)
for (a=130;a>0;a--);
}
Readme:
硬件连接:
STC89C51——ESP8266-01s
K1——> P1^4
P3^0(RX)——>TX(ESP)
P3^1(RX)——>RX(ESP)
P0(程序可以自己修改)——>LED
测试的时候可能会不稳定(点击发送的时候单片机可能在延时之中,如果多次发送无效,尝试reset单片机程序)