用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;
}
}
請各位幫忙看看
|