P1 = 0x00;
delayms(1000);
P1 = 0xFF;
delayms(1000);
或者 如下 会熄灭
if(MAIN_BUF==0xAA)
MAIN_BUF=0x00;
{
P1 = 0x00;
delayms(1000);
P1 = 0xFF;
}单片机用ESP8266作为服务器,手机做客户端,用TCP连接 手机控制单片机是没有问题的,单片机在 收到 手机指令 回复应该也没有问题的,只是单片机对ESP8266的设置问题,透传 与 非透传 单片机发送数据 是不一样的。用 UDP连接 发送指令数据 是以广播形式发送的,单片机发送数据的格式和TCP连接基本一样。这个很简单,我来教你玩:
首先我们说下硬件接法,USB转485信号电路块(只要20元,贵了的都是坑你的),MAX485芯片,110592M晶振(这个频率的晶振产生的波特率误差低)
思路:利用串口中断方式对P0口的LED进行控制(我只是举例,程序你自己写)
程序如下:
#include <reg51h> //选用晶振110592MHz
#define AddressID 0x31 //本机地址1
sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态
sbit MAX485_DIR=P3^7;
main()
{
//通讯设置
SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口优先级高
TH1 = 0xf4; //fa // //baud2 / 波特率4800、数据位8、停止位1。效验位无 (110592M)
TL1 = 0xf4;
TR1 = 1; //开启定时器1
EA = 1; // 开总中断
ES = 1; //开串口中断
RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态
while(1);
}
void counter4(void) interrupt 4 using 2 //串口中断
{
while(RI==0);
RI=0;
if(SBUF==0x2a) //2a的ASCII码是
{
while(RI==0);
RI=0;
if(SBUF==AddressID) //发送本地地址31的ASCII码是1
{
while(RI==0);
RI=0;
if(SBUF==0x23) //23的ASCII码是#
{
P0=254; //P0=1111 1110,这里写你要对LED控制的程序
}
}
}
}
就是这么简单,已经调试通过,注释也有
PS:回答问题五天后的补充:解决了问题不追问,不给分,这个楼主不厚道,鉴定完毕 !
;110592M
;通讯波特率为9600bps
;按下接在P37的按键, 发送一串ASCII字符
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#00H
MOV TH1,#0FDH;预置初值
MOV TL1,#0FDH;预置初值
SETB TR1;启动定时器T1
;以上完成通讯初始化设置
JB P37,$
ACALL DELAY
JNB P37,$
MOV A,#"%"
MOV SBUF,A ;单片机招待这条写数据发送缓冲器SBUF的指令,就启动发送,将"%"送通过串口发送出去
JNB TI,$
CLR TI
MOV A,#" "
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"0"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"1"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#" "
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"#"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#" "
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"R"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"C"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#" "
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"S"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#" "
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"R"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"0"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"0"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"0"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"1"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#" "
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#""
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#""
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#" "
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"c"
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#"R"
MOV SBUF,A
JNB TI,$
CLR TI
AJMP MAIN
;10毫秒延时子程序
DELAY:MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
END
可以用任一串口调试助手收到这串字符。
用查表方法程序应该简单一点
;110592M
;通讯波特率为9600kbps,按下接在P37的按键, 发送一串23个ASCII字符:"% 01 # RC S R0001 cR"
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#00H
MOV TH1,#0FDH;预置初值
MOV TL1,#0FDH;预置初值
SETB TR1;启动定时器T1
;以上完成通讯初始化设置
MAIN1:
MOV R0,#23
MOV DPTR,#TAB
JB P37,$
ACALL DELAY
JNB P37,$
SEND:
CLR TI
MOV A,#0
MOVC A,@A+DPTR
INC DPTR
MOV SBUF,A ;单片机招待这条写数据发送缓冲器SBUF的指令,就启动发送,数据通过串口发送出去
JNB TI,$
CLR TI
DJNZ R0,SEND
AJMP MAIN1
;10毫秒延时子程序
DELAY:MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
TAB: DB "%"," ","0","1"," ","#"," ","R","C"," ","S"," "
DB "R","0""0","0","1"," ","",""," ","c","R"
END
仅仅一个P10恐怕不行,还需要一个时钟CLK口 才比较好控制。不然会有一定误差产生误码。如果仅仅是P10的话,可以用定时器来做,因为波特率是9600,所以每一位信号占用时间约为是104us,因此编程如下:
KEYSTA EQU P30
KEYEND EQU P31
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#02H
MOV TH0,#(256-104)
MOV TL0,#(256-104)
SETB ET0
SETB EA
LOOP:
JB KEYSTA,LP1
JNB KEYSTA,$
MOV R0,#30H
CLR A
MOV R2,#8
SETB TR0
LP1:
JB KEYEND,LOOP
JNB KEYEND,$
CLR TR0
SJMP LOOP
T0SIR:
MOV C,P10
RLC A
DJNZ R2,T0E
MOV R2,#8
MOV @R0,A
INC R0
T0E:
RETI
END
你是想用web远程监控单片机的运行,但是不知道怎么把单片机的信息上传到服务器,转化成web页面展示出来,我做过一个是通过阿里云IOT实现的
单片机内加入MQTT协议,与阿里云服务器通信,可以通过IOT studio快速配置生成web
官方给到历程是都是通过ESP的WiFi来联网。我做的是通过W5500联网的
把C语言Link Kit SDK移植到stm32单片机中,web由IOT studio生成。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)