单片机不停地发送数据,无法停止
时间:10-02
整理:3721RD
点击:
#include "lcd.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char buff[2]=0;
void SendASC(uchar d);//发送一个数据
void SendString(uchar *str);//发送一组数据
void delay(uint xms);//延时函数,有参函数
void Init_ESP8266();
void Receive_Handle(uchar Value);//打开led灯
void Uart_init();//初始化定时器
void main()
{
P0=0x00;
P1=0x00;
LcdInit();
Uart_init();
Init_ESP8266();
P0=0xff;
while(1);
}
void uart_rx(void) interrupt 4 using 3 //放在这里 和放在main()里面是一样的
{
unsigned char i;
unsigned char flag;
unsigned char dat;
if(RI) //是否接收中断
{
RI=0;
dat=SBUF;
if(dat==':'&&(i==0)) //接收数据第一帧
{
buff=dat;
flag=1; //开始接收数据
}
else
if(flag==1)
{
i++;
buff=dat;
if(i>=2)
{
i=0;
flag=0;
Receive_Handle(buff[0]);
LcdWriteCom(0x08);
LcdWriteData(buff[0]);
}
}
}
}
void Uart_init()
{
TMOD= 0X21; //T1工作方式2,8位自动重装; T0工作方式1
TH1=0Xfd;
TL1=0Xfd; //波特率设置为9600
TR1=1; // 定时器1启动
SM0=0; // 设置串口的工作模式
SM1=1; //方式1
ET0=1; //打开中断允许开关
TR0=1; //打开定时器开关
REN=1; // 允许串口接收数据
ES=1; // 串口中断应许
EA=1; // 开启中断
}
void SendASC(uchar d)
{
SBUF=d; //将待发送的数据放到发送缓冲器中
while(!TI); //等待发送完毕(硬件置“1”)
TI=0; //硬件置“1”,则需软件清零
}
void SendString(uchar *str)
{
while(*str)
{
SendASC(*str) ;
str++; //这两句等价于SendASC(*str++);
}
}
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void Init_ESP8266()
{
SendString("AT+RST\r\n");
delay(1500);
SendString("AT+CWMODE=1\r\n");
delay(1500);
SendString("AT+CWJAP=\"PE\",\"12345678910\"\r\n"); //在这里填入你的路由器名称和密码 分别替代205和 cug205502 双引号和斜杠不能删除 //我的路由是205 密码是cug205502
delay(10000);
SendString("AT+CIPMODE=0\r\n");
delay(1500);
SendString("AT+CIPMUX=1\r\n");
delay(1500);
SendString("AT+CIPSERVER=1,5050\r\n");
delay(1500);
}
void Receive_Handle(uchar Value)
{
switch(Value)//具体发送过来的是什么数据 需要自己自己通过串口调试助手查看
//改变这里面对应的数据即可
{
case 0x00:P1=0xff;break;
case 0x01:P1=0xfe;break;
case '3':P1=0xfd;break;
case '4':P1=0xfb;break;
default:P2=0x00;break;
}
}
一运行wifi模块就不停复位,也不会执行下一条指令,请问怎么解决
#define uchar unsigned char
#define uint unsigned int
unsigned char buff[2]=0;
void SendASC(uchar d);//发送一个数据
void SendString(uchar *str);//发送一组数据
void delay(uint xms);//延时函数,有参函数
void Init_ESP8266();
void Receive_Handle(uchar Value);//打开led灯
void Uart_init();//初始化定时器
void main()
{
P0=0x00;
P1=0x00;
LcdInit();
Uart_init();
Init_ESP8266();
P0=0xff;
while(1);
}
void uart_rx(void) interrupt 4 using 3 //放在这里 和放在main()里面是一样的
{
unsigned char i;
unsigned char flag;
unsigned char dat;
if(RI) //是否接收中断
{
RI=0;
dat=SBUF;
if(dat==':'&&(i==0)) //接收数据第一帧
{
buff=dat;
flag=1; //开始接收数据
}
else
if(flag==1)
{
i++;
buff=dat;
if(i>=2)
{
i=0;
flag=0;
Receive_Handle(buff[0]);
LcdWriteCom(0x08);
LcdWriteData(buff[0]);
}
}
}
}
void Uart_init()
{
TMOD= 0X21; //T1工作方式2,8位自动重装; T0工作方式1
TH1=0Xfd;
TL1=0Xfd; //波特率设置为9600
TR1=1; // 定时器1启动
SM0=0; // 设置串口的工作模式
SM1=1; //方式1
ET0=1; //打开中断允许开关
TR0=1; //打开定时器开关
REN=1; // 允许串口接收数据
ES=1; // 串口中断应许
EA=1; // 开启中断
}
void SendASC(uchar d)
{
SBUF=d; //将待发送的数据放到发送缓冲器中
while(!TI); //等待发送完毕(硬件置“1”)
TI=0; //硬件置“1”,则需软件清零
}
void SendString(uchar *str)
{
while(*str)
{
SendASC(*str) ;
str++; //这两句等价于SendASC(*str++);
}
}
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void Init_ESP8266()
{
SendString("AT+RST\r\n");
delay(1500);
SendString("AT+CWMODE=1\r\n");
delay(1500);
SendString("AT+CWJAP=\"PE\",\"12345678910\"\r\n"); //在这里填入你的路由器名称和密码 分别替代205和 cug205502 双引号和斜杠不能删除 //我的路由是205 密码是cug205502
delay(10000);
SendString("AT+CIPMODE=0\r\n");
delay(1500);
SendString("AT+CIPMUX=1\r\n");
delay(1500);
SendString("AT+CIPSERVER=1,5050\r\n");
delay(1500);
}
void Receive_Handle(uchar Value)
{
switch(Value)//具体发送过来的是什么数据 需要自己自己通过串口调试助手查看
//改变这里面对应的数据即可
{
case 0x00:P1=0xff;break;
case 0x01:P1=0xfe;break;
case '3':P1=0xfd;break;
case '4':P1=0xfb;break;
default:P2=0x00;break;
}
}
一运行wifi模块就不停复位,也不会执行下一条指令,请问怎么解决