找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1013|回复: 4
收起左侧

单片机串口实时接收数据程序(温湿度)无法使用定时器中断延时按键开关

[复制链接]
ID:941176 发表于 2022-5-5 09:50 | 显示全部楼层 |阅读模式
用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;
}
                          }

请各位帮忙看看
回复

使用道具 举报

ID:213173 发表于 2022-5-5 10:36 | 显示全部楼层
void InitUART(void)
{
    TMOD=0x21;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TR0=1;

    SCON = 0x50;
    PCON = 0x00;
    TH1 = 0xFD;
    TL1 = TH1;
        TR1 = 1;

        EA = 1;
        ET0=1;
        ES = 1;
}

评分

参与人数 1黑币 +10 收起 理由
XIAOWEN123 + 10

查看全部评分

回复

使用道具 举报

ID:941176 发表于 2022-5-5 11:03 | 显示全部楼层
wulin 发表于 2022-5-5 10:36
void InitUART(void)
{
    TMOD=0x21;

感谢!我已经解决了,我把定时器中断初始化放入了主函数,点击定时才打开就可以了!!
if(dingshi1==0)
                {
                 Initdsl();
                 if(miao==15)
                   {
                     led4=~led4;
                     miao=0;
                         ji=0;
                         dingshi1=1;
回复

使用道具 举报

ID:941176 发表于 2022-5-5 11:06 | 显示全部楼层
wulin 发表于 2022-5-5 10:36
void InitUART(void)
{
    TMOD=0x21;

我将定时器初始化放入了主循环,在按下定时器时才会开启,这样定时和串口就都可以使用了
回复

使用道具 举报

ID:121859 发表于 2022-5-5 13:36 | 显示全部楼层
其实不用那么麻烦的,只要读取DHT11时候关闭中断就可以了,有中断会打断DHT11的读写时序,造成无法正常读取温湿度。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表