找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1624|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)串口實時接收數(shù)據(jù)程序(溫濕度)無法使用定時器中斷延時按鍵開關(guān)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:941176 發(fā)表于 2022-5-5 09:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用E4A做了一個手機(jī)APP遠(yuǎn)程控制六個繼電器開關(guān),之前的代碼利用串口和定時器中斷可以達(dá)到六個繼電器開關(guān),有三個可以延時開啟或者關(guān)閉,后來想加一個溫濕度的功能,就加了個DHT11,也是用串口接收數(shù)據(jù)到手機(jī),沒加入定時之前是可以正常工作的,加入定時器中斷后,溫濕度就不行了,但是開關(guān)可以。未加定時器中斷,我的初始化是這樣的
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;


然后就不接收數(shù)據(jù)了。
我附上完整單片機(jī)代碼
#include "DHT11.h"
#include <stdio.h>
#include "string.h"
extern unsigned char  F16T,F16RH;                //溫濕度數(shù)據(jù)
#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;//獲取標(biāo)志
void Get_Clinet(void);
void InitUART(void)                         //這是串口的基本配置,配置他的波特率是9600.這些參數(shù)都是標(biāo)準(zhǔn)的。
{
    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 發(fā)送一字節(jié)
*/
void UART_send_byte(char dat)
{
        SBUF = dat;                                        //發(fā)送
        while (TI == 0);                        //等待發(fā)送完畢
        TI = 0;                                                //清發(fā)送完畢中斷請求標(biāo)志位
}

/*
* UART 發(fā)送字符串
*/
void Send_Str(unsigned char *buf)
{
        while (*buf != '\0')
        {
                UART_send_byte(*buf++);
        }
}

void ESP8266_SERVER(void)//建立服務(wù)器
{
        Send_Str("AT\r\n");
        delayms(500);
        Send_Str("ATE0\r\n");
        delayms(500);
        Send_Str("AT+CWMODE=2\r\n");          //服務(wù)器搭建在WIFI模塊上
        delayms(500);
           Send_Str("AT+CWSAP=\"wifi\",\"12345678\",5,3\r\n");          //設(shè)置顯示名稱:wifi,密碼:12345678
        delayms(500);
        Send_Str("AT+CIPMUX=1\r\n");//啟動多連接,建立服務(wù)器都需要配置
        delayms(500);        
        Send_Str("AT+CIPSERVER=1,5000\r\n");//建立服務(wù)器
        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);//發(fā)送數(shù)據(jù)
        delayms(1000);
}
void main()
{
          unsigned char   Tx_Buf[12];
        delayms(500);
        delayms(1000);          //延時一段時間,讓W(xué)IFI模塊穩(wěn)定
         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;                 //將溫濕度數(shù)據(jù)送往發(fā)送數(shù)組,送給模塊讓手機(jī)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;                 //將溫濕度數(shù)據(jù)送往發(fā)送數(shù)組,送給模塊讓手機(jī)APP顯示
                  Tx_Buf[5]=SF16T%10+0x30;               
                  Tx_Buf[6]=SF16RH/10%10+0x30;
                  Tx_Buf[7]=SF16RH%10+0x30;
                   Send_DATA(Tx_Buf)        ;//發(fā)送數(shù)據(jù)
                                   }
}
                        
/*****************串口接收中斷函數(shù),接收數(shù)據(jù)*********************/
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是串口接收中斷申請標(biāo)志位,就是有數(shù)據(jù)進(jìn)來的時候,RI自動置0,接受完數(shù)據(jù)后,需要手動置1,進(jìn)行下一個數(shù)據(jù)的接收
  {
        RI=0;         //接收中斷信號清零,表示將繼續(xù)接收
        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;
}
                          }

請各位幫忙看看
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 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;
}

評分

參與人數(shù) 1黑幣 +10 收起 理由
XIAOWEN123 + 10

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:941176 發(fā)表于 2022-5-5 11:03 | 只看該作者
wulin 發(fā)表于 2022-5-5 10:36
void InitUART(void)
{
    TMOD=0x21;

感謝!我已經(jīng)解決了,我把定時器中斷初始化放入了主函數(shù),點擊定時才打開就可以了!
if(dingshi1==0)
                {
                 Initdsl();
                 if(miao==15)
                   {
                     led4=~led4;
                     miao=0;
                         ji=0;
                         dingshi1=1;
回復(fù)

使用道具 舉報

地板
ID:941176 發(fā)表于 2022-5-5 11:06 | 只看該作者
wulin 發(fā)表于 2022-5-5 10:36
void InitUART(void)
{
    TMOD=0x21;

我將定時器初始化放入了主循環(huán),在按下定時器時才會開啟,這樣定時和串口就都可以使用了
回復(fù)

使用道具 舉報

5#
ID:121859 發(fā)表于 2022-5-5 13:36 | 只看該作者
其實不用那么麻煩的,只要讀取DHT11時候關(guān)閉中斷就可以了,有中斷會打斷DHT11的讀寫時序,造成無法正常讀取溫濕度。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表