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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2517|回復: 2
打印 上一主題 下一主題
收起左側(cè)

我在51單片機上面用DHT11發(fā)送串口數(shù)據(jù),但是數(shù)據(jù)接收不到

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1027942 發(fā)表于 2022-5-31 21:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用另一個12板子,12MHZ,可以接收到數(shù)據(jù),但是會出現(xiàn)亂碼(這個板子的串口可能有問題)

單片機源程序如下:
  1. /********************************************************************
  2. 實現(xiàn)功能:DHT11溫濕度采集串口顯示
  3. 使用芯片:STC12C5A60S2
  4. 晶振:11.059MHZ
  5. 波特率:9600
  6. 編譯環(huán)境: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,與單片機速度和晶振頻率有關(guān)

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

  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)//發(fā)送字符串  
  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循環(huán)變量
  40.         u8 t;                                //超時判斷
  41.         u8 dat8=0;                        //一次讀取的8位數(shù)據(jù),需要讀5次

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

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

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

  61.         //等80us響應(yīng)信號
  62.         t = 250;                                //設(shè)置超時等待時間
  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;                                //設(shè)置超時等待時間
  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);                //等待并記錄高電平持續(xù)時間
  83.                         dat8 <<= 1;
  84.                         if(t > JUDGE)                        //高電平持續(xù)時間較長(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;                        //結(jié)束,拉高總線
  93.         return 0;                        //返回成功信號
  94. }

  95. char Check(void)
  96. {
  97.         u8  i;                        //for循環(huán)變量
  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];//發(fā)送的數(shù)據(jù)
  110.         u8 RH,RL,TH,TL,revise;
  111.     i = GetData();        //讀數(shù)據(jù)
  112.     if(i != 0)            //有錯誤
  113.     {
  114.             //UART_T(-i);        //返回錯誤值
  115.             return;              //重新開始
  116.     }
  117.     i = Check();                  //數(shù)據(jù)校驗
  118.     if(i != 0)                //有錯誤
  119.     {
  120.             //UART_T(-i);                //返回錯誤值
  121.             return;                 //重新開始
  122.     }
  123.        
  124.         RH = dat_r[0];//濕度整數(shù)
  125.         RL = dat_r[1];//濕度小數(shù)(根據(jù)數(shù)據(jù)手冊,DHT11小數(shù)部分一直是0沒用)
  126.         TH = dat_r[2];//溫度整數(shù)
  127.         TL = dat_r[3];//溫度小數(shù)(根據(jù)數(shù)據(jù)手冊,DHT11小數(shù)部分一直是0沒用)
  128.         revise = dat_r[4];//校驗值
  129.        
  130.        
  131.         //數(shù)據(jù)處理
  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);                        //經(jīng)測試,兩次連讀要至少延時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, 下載次數(shù): 9)


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

使用道具 舉報

沙發(fā)
ID:390416 發(fā)表于 2022-6-1 08:55 | 只看該作者
回復

使用道具 舉報

板凳
ID:161164 發(fā)表于 2022-6-1 10:28 | 只看該作者
你SendDataByUart1的代碼顯然在跟中斷拼速度
從結(jié)果來看
11.0592Mhz 是中斷比較快,程序在39行死循環(huán)了
參考STC-ISP的例程,加個Busy來檢測比較好

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区日韩精品 | 国产精品欧美精品日韩精品 | 欧美一区二区三区在线观看 | 国产欧美一区二区三区久久人妖 | 日韩a在线 | 午夜免费视频 | 一本在线| 二区视频| 成人av一区 | 国产 亚洲 网红 主播 | 欧美日韩中文字幕在线 | 视频一区二区中文字幕日韩 | 亚洲精品久久久久久一区二区 | 午夜精品久久久久久久久久久久久 | 欧美一区二区三区在线观看 | 亚洲国产精品99久久久久久久久 | 国产在线精品一区二区三区 | 激情欧美一区二区三区中文字幕 | 91亚洲精品久久久电影 | 亚洲在线视频 | 国产日韩欧美一区二区 | 天天草天天干 | 国产成人精品久久二区二区91 | 久久毛片| 国产精品一区二区欧美 | 喷水毛片 | 日韩精品成人 | 夜夜爽99久久国产综合精品女不卡 | 高清不卡毛片 | 在线国产一区 | 欧美最猛性xxxxx亚洲精品 | 国产精品免费一区二区三区四区 | 欧美成人影院 | 精品在线一区 | 亚洲成人在线视频播放 | 日韩激情视频一区 | 亚洲一二三区免费 | 99草免费视频 | 99re视频这里只有精品 | 尤物在线| 欧美精品久久久 |