用E4A做了一个手机APP远程控制六个继电器开关,之前的代码利用串口和定时器中断可以达到六个继电器开关,有三个可以延时开启或者关闭,后来想加一个温湿度的功能,就加了个DHT11,也是用串口接收数据到手机,没加入定时之前是可以正常工作的,加入定时器中断后,温湿度就不行了,但是开关可以。未加定时器中断,我的初始化是这样的
TMOD=0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
(这样是可以读取温湿度的)
加了定时器
void ds1() interrupt 1 //定时器中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ji++;
if(ji==20)
{
miao++;
ji=0;
}
ji2++;
if(ji2==20)
{
miao2++;
ji2=0;
}
ji3++;
if(ji3==20)
{
miao3++;
ji3=0;
}
}
初始化我也改了,如下:
TMOD=0x20;
SM0=0;
SM1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
IE=0X82;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
IP=0x10;
EA = 1;
ES = 1;
TR1 = 1;
然后就不接收数据了。
我附上完整单片机代码
#include "DHT11.h"
#include <stdio.h>
#include "string.h"
extern unsigned char F16T,F16RH; //温湿度数据
#define uchar unsigned char
#define uint unsigned int
uint ji,ji2,ji3,miao,miao2,miao3;
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P1^0;
sbit led4=P1^1;
sbit led5=P1^2;
sbit led6=P1^3;
bit dingshi1=1,dingshi2=1,dingshi3=1;
unsigned char idata Rxbuff[40],Rxnum,SF16T,SF16RH;
unsigned char Recwifi_data[5],led[2],n,x;
char *strx=0;
char clinetid;//连接ID
unsigned char getflag;//获取标志
void Get_Clinet(void);
void InitUART(void) //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。
{
TMOD=0x20;
SM0=0;
SM1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
IE=0X82;*/
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
/*IP=0x10;*/
EA = 1;
ES = 1;
TR1 = 1;
}
/******************************************************************************/
void delayms(unsigned int x)
{
unsigned int i;
while(x--)
for(i=125;i>0;i--);
}
/*
* UART 发送一字节
*/
void UART_send_byte(char dat)
{
SBUF = dat; //发送
while (TI == 0); //等待发送完毕
TI = 0; //清发送完毕中断请求标志位
}
/*
* UART 发送字符串
*/
void Send_Str(unsigned char *buf)
{
while (*buf != '\0')
{
UART_send_byte(*buf++);
}
}
void ESP8266_SERVER(void)//建立服务器
{
Send_Str("AT\r\n");
delayms(500);
Send_Str("ATE0\r\n");
delayms(500);
Send_Str("AT+CWMODE=2\r\n"); //服务器搭建在WIFI模块上
delayms(500);
Send_Str("AT+CWSAP=\"wifi\",\"12345678\",5,3\r\n"); //设置显示名称:wifi,密码:12345678
delayms(500);
Send_Str("AT+CIPMUX=1\r\n");//启动多连接,建立服务器都需要配置
delayms(500);
Send_Str("AT+CIPSERVER=1,5000\r\n");//建立服务器
delayms(500);
Send_Str("AT+CIPSTO=0\r\n");
}
void Send_DATA(uchar *buffer)
{
Send_Str("AT+CIPSEND=0,11\r\n");
delayms(10);
Send_Str(buffer);//发送数据
delayms(1000);
}
void main()
{
unsigned char Tx_Buf[12];
delayms(500);
delayms(1000); //延时一段时间,让WIFI模块稳定
InitUART(); //初始化串口
ESP8266_SERVER(); //初始化ESP8266
SF16T=25;
SF16RH=50;
x=1;
while(1)
{
if(dingshi1==1)
{
ji=0;
miao=0;
}
if(dingshi2==1)
{
ji2=0;
miao2=0;
}
if(dingshi3==1)
{
ji3=0;
miao3=0;
}
if(dingshi1==0)
{
if(miao==15)
{
led4=~led4;
miao=0;
ji=0;
dingshi1=1;
}
}
if(dingshi2==0)
{
if(miao2==15)
{
led5=~led5;
miao2=0;
ji2=0;
dingshi2=1;
}
}
if(dingshi3==0)
{
if(miao3==15)
{
led6=~led6;
miao3=0;
ji3=0;
dingshi3=1;
}
}
getDHT11(); //获取温湿度值
Tx_Buf[0]=F16T/10%10+0x30; //将温湿度数据送往发送数组,送给模块让手机APP显示
Tx_Buf[1]=F16T%10+0x30;
Tx_Buf[2]=F16RH/10%10+0x30;
Tx_Buf[3]=F16RH%10+0x30;
Tx_Buf[4]=SF16T/10%10+0x30; //将温湿度数据送往发送数组,送给模块让手机APP显示
Tx_Buf[5]=SF16T%10+0x30;
Tx_Buf[6]=SF16RH/10%10+0x30;
Tx_Buf[7]=SF16RH%10+0x30;
Send_DATA(Tx_Buf) ;//发送数据
}
}
/*****************串口接收中断函数,接收数据*********************/
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
ES=0;
RI = 0;
Rxbuff[Rxnum]=SBUF;
if(Rxbuff[Rxnum]=='=')
{
Rxnum=0;
}
else
{
Rxnum++;
if(Rxnum>2)
{
Rxnum=2;
}
}
ES=1;
}
}
void Serial_interrupt() interrupt 4
{
if(RI) //RI是串口接收中断申请标志位,就是有数据进来的时候,RI自动置0,接受完数据后,需要手动置1,进行下一个数据的接收
{
RI=0; //接收中断信号清零,表示将继续接收
switch(SBUF)
{
case 'A':led1=~led1;break;
case 'B':led2=~led2;break;
case 'C':led3=~led3;break;
case '!':led4=~led4;break;
case '@':led5=~led5;break;
case '#':led6=~led6;break;
case '$':dingshi1=0;break;
case '%':dingshi2=0;break;
case '&':dingshi3=0;break;
}
}
}
void ds1() interrupt 1 //定时器中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ji++;
if(ji==20)
{
miao++;
ji=0;
}
ji2++;
if(ji2==20)
{
miao2++;
ji2=0;
}
ji3++;
if(ji3==20)
{
miao3++;
ji3=0;
}
}
请各位帮忙看看
|