久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1573|回復: 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;
}
                          }

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

使用道具 舉報

沙發
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;

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久网 | 羞羞视频网站免费看 | 亚洲综合久久精品 | 国产精品久久久久久久久久 | 日韩一二区 | 国产精品视频在线观看 | 91精品国产综合久久久久久 | 国产一区二区三区视频在线观看 | 伊人精品久久久久77777 | a视频在线观看 | 日韩精品久久 | 成人免费视频观看 | 91青娱乐在线 | 中文字幕一区二区三区四区五区 | 亚洲视频免费在线观看 | 少妇午夜一级艳片欧美精品 | 日韩在线播放av | 免费毛片网站 | a视频在线播放 | 男女视频在线观看免费 | 亚洲一区二区三区在线免费观看 | 五月激情综合 | 亚洲欧美激情国产综合久久久 | 国产成人免费视频 | 中文字幕一区二区三区四区 | 色综合一区二区 | 欧美午夜精品 | 国产偷录叫床高潮录音 | 成人在线精品视频 | 久草久草久草 | 一区欧美 | 久久人人爽人人爽人人片av免费 | 久草成人网 | 狠狠草视频 | 国产综合精品 | 亚洲精品在线免费 | 午夜国产羞羞视频免费网站 | 久久69精品久久久久久久电影好 | 岛国av一区二区三区 | 毛片在线视频 | 国产美女在线观看 |