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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2668|回復: 2
收起左側

我在51單片機上面用DHT11發送串口數據,但是數據接收不到

[復制鏈接]
ID:1027942 發表于 2022-5-31 21:15 | 顯示全部樓層 |閱讀模式
使用另一個12板子,12MHZ,可以接收到數據,但是會出現亂碼(這個板子的串口可能有問題)

單片機源程序如下:
  1. /********************************************************************
  2. 實現功能:DHT11溫濕度采集串口顯示
  3. 使用芯片:STC12C5A60S2
  4. 晶振:11.059MHZ
  5. 波特率:9600
  6. 編譯環境:Keil
  7. *********************************************************************/
  8. #include <STC12C5A60S2.H>
  9. #include "intrins.h"
  10. #include "delay.h"
  11. #include "IO.h"

  12. #define u8  unsigned char
  13. #define u16 unsigned int  
  14. #define JUDGE  30                //用于判斷通信的0和1,與單片機速度和晶振頻率有關

  15. u8  p[15];
  16. u8  dat_r[5];                  //用于存放從DHT11讀取到的數值

  17. void UartInit(void)                //9600bps@11.0592MHz
  18. {
  19.         SCON = 0x50;                //8???,?????
  20.         AUXR |= 0x40;                //?????1T??
  21.         AUXR &= 0xFE;                //??1?????1???????
  22.         TMOD &= 0x0F;                //???????
  23.         TL1 = 0xE0;                //???????
  24.         TH1 = 0xFE;                //???????
  25.         ET1 = 0;                //?????%d??
  26.         TR1 = 1;                //???1????
  27. }



  28. void SendDataByUart1(u8 *a)//發送字符串  
  29. {
  30.                 while(*a!='\0')
  31.         {
  32.       SBUF = *a++;
  33.       while(TI==0);
  34.       TI = 0;
  35.         }               
  36. }

  37. char GetData (void)
  38. {
  39.         u8 i,j;                                //for循環變量
  40.         u8 t;                                //超時判斷
  41.         u8 dat8=0;                        //一次讀取的8位數據,需要讀5次

  42.         DATA = 0;                                //主機發起始信號
  43.         NDelay1ms(20);                        //主機拉低總線至少18ms
  44.         DATA = 1;                                //主機拉高總線20~40us
  45.         Delay30us();

  46.         t = 80;                                        //設置超時等待時間
  47.         while(DATA && t--);                //等待DHT11拉低總線
  48.         if(t == 0)                                //超時
  49.         {
  50.                 DATA = 1;
  51.                 return -1;                        //通信錯誤退出,返回錯誤信號:-1
  52.         }

  53.         //等80us響應信號
  54.         t = 250;                                //設置超時等待時間
  55.         while(!DATA && t--);        //等待DHT11拉高總線
  56.         if(t == 0)                                //超時
  57.         {
  58.                 DATA = 1;
  59.                 return -2;                        //通信錯誤退出,返回錯誤信號:-2
  60.         }

  61.         //等80us響應信號
  62.         t = 250;                                //設置超時等待時間
  63.         while(DATA && t--);                //等待DHT11拉低總線
  64.         if(t == 0)                                //超時
  65.         {
  66.                 DATA = 1;
  67.                 return -3;                        //通信錯誤退出,返回錯誤信號:-3
  68.         }

  69.         for(j=0; j<5; j++)                //5次讀取
  70.         {
  71.                 for(i=0; i<8; i++)                        //1次8個位
  72.                 {
  73.                         //等待50us開始時隙
  74.                         t = 150;                                //設置超時等待時間
  75.                         while(!DATA && t--);        //等待DHT11拉高總線
  76.                         if(t == 0)                                //超時
  77.                         {
  78.                                 DATA = 1;
  79.                                 return -4;                        //通信錯誤退出,返回錯誤信號:-4
  80.                         }
  81.                         t = 0;                                        //記錄時間清零
  82.                         while(DATA && ++t);                //等待并記錄高電平持續時間
  83.                         dat8 <<= 1;
  84.                         if(t > JUDGE)                        //高電平持續時間較長(70us)
  85.                                 dat8 += 1;                        //傳輸值為1
  86.                         //else dat8 += 0;
  87.                 }
  88.                 dat_r[j] = dat8;
  89.         }

  90.         Delay30us();                //等待DHT11拉低50us
  91.         Delay30us();
  92.         DATA = 1;                        //結束,拉高總線
  93.         return 0;                        //返回成功信號
  94. }

  95. char Check(void)
  96. {
  97.         u8  i;                        //for循環變量
  98.         u16 chk=0;                        //校驗和
  99.         for(i=0; i<4; i++)
  100.                 chk += dat_r[i];                //累加
  101.         if((u8)chk != dat_r[4])        //比對
  102.                 return -1;                                //返回錯誤信號:-1
  103.         else
  104.                 return 0;                                //返回正確信號:0
  105. }

  106. void SendOutDH11Str(void)
  107. {
  108.         char i;
  109.         u8 HD11_str[11];//發送的數據
  110.         u8 RH,RL,TH,TL,revise;
  111.     i = GetData();        //讀數據
  112.     if(i != 0)            //有錯誤
  113.     {
  114.             //UART_T(-i);        //返回錯誤值
  115.             return;              //重新開始
  116.     }
  117.     i = Check();                  //數據校驗
  118.     if(i != 0)                //有錯誤
  119.     {
  120.             //UART_T(-i);                //返回錯誤值
  121.             return;                 //重新開始
  122.     }
  123.        
  124.         RH = dat_r[0];//濕度整數
  125.         RL = dat_r[1];//濕度小數(根據數據手冊,DHT11小數部分一直是0沒用)
  126.         TH = dat_r[2];//溫度整數
  127.         TL = dat_r[3];//溫度小數(根據數據手冊,DHT11小數部分一直是0沒用)
  128.         revise = dat_r[4];//校驗值
  129.        
  130.        
  131.         //數據處理
  132.         HD11_str[0]=RH/10+'0';
  133.         HD11_str[1]=(RH%10)+'0';
  134.         HD11_str[2]='%';
  135.         HD11_str[3]='R';
  136.         HD11_str[4]='H';
  137.         HD11_str[5]=' ';
  138.         HD11_str[6]=' ';
  139.         HD11_str[7]=(TH/10)+'0';
  140.         HD11_str[8]=(TH%10)+'0';
  141.         HD11_str[9]='^';
  142.         HD11_str[10]='C';
  143.         SendDataByUart1(HD11_str);
  144.         NDelay1ms(1000);                        //經測試,兩次連讀要至少延時80ms     
  145. }

  146. void main(void)
  147. {
  148.         Uart1_Init();       
  149.         IO_Init();
  150.         EA=1;
  151.         while(1)   
  152.         {
  153.                 SendOutDH11Str();
  154.         }
  155. }       

  156. void Uart1() interrupt 4 using 1
  157. {     
  158.                 if(TI)           
  159.         {
  160.                 TI=0;
  161.         }       
  162.                 if(RI)                   
  163.         {       
  164.                 RI=0;
  165.         }
  166. }
復制代碼

DHT11_stc12.zip (79.04 KB, 下載次數: 9)


回復

使用道具 舉報

ID:390416 發表于 2022-6-1 08:55 | 顯示全部樓層
回復

使用道具 舉報

ID:161164 發表于 2022-6-1 10:28 | 顯示全部樓層
你SendDataByUart1的代碼顯然在跟中斷拼速度
從結果來看
11.0592Mhz 是中斷比較快,程序在39行死循環了
參考STC-ISP的例程,加個Busy來檢測比較好

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看中文字幕视频 | 国产亚洲一区二区精品 | 欧美精品1区2区3区 免费黄篇 | 欧美一级免费看 | 日韩黄色小视频 | 日韩精品成人 | 欧美一区二区在线观看 | 日韩欧美一区二区三区在线播放 | 激情六月天 | 97精品国产97久久久久久免费 | 国产日韩91 | 午夜免费av| 国产视频福利在线观看 | 国产成人免费网站 | 欧美黄在线观看 | 日韩欧美成人精品 | av黄色片在线观看 | 亚洲视频免费观看 | 日韩欧美在线观看一区 | 日韩三级 | 天天天天操 | 国产精品久久久久久亚洲调教 | www.成人久久| 精品久久久久久久久久久久 | 成人h视频在线 | 搞黄网站在线观看 | 亚洲精品在线免费观看视频 | 精品国产一区二区三区久久久久久 | 国产精品一区二区三区四区 | 天天草天天干天天 | 国产高清在线精品 | 欧美精品99| 日韩欧美三区 | 亚洲成人精选 | 欧美黄 片免费观看 | 精品久久久久久久久久久久 | 国产日韩精品视频 | 亚洲少妇综合网 | 在线免费观看日本 | 国产精彩视频 | 欧美成人精品一区二区三区 |