找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 29166|回復(fù): 44
收起左側(cè)

[原創(chuàng)]自己編的DHT11驅(qū)動(dòng)程序~

  [復(fù)制鏈接]
ID:84652 發(fā)表于 2015-8-4 17:29 | 顯示全部樓層 |閱讀模式
本帖最后由 王朗的誘惑 于 2015-8-4 21:05 編輯

前幾天在某寶上看到DHT11,感覺藍(lán)色的外殼做的很漂亮,然后就買了1個(gè)。結(jié)果發(fā)現(xiàn)網(wǎng)上的程序都是給舊12T單片機(jī)用的,注釋也沒幾句,用著很不順手。所以就自己按照數(shù)據(jù)手冊(cè)編了驅(qū)動(dòng)程序。還是自己的程序用著順手~~~~拿來和大家分享~~~~
  1. /*********************************************************************************************
  2. 程序名:    DHT11驅(qū)動(dòng)程序
  3. 編寫人:    王朗的誘惑
  4. 編寫時(shí)間:  2015年8月4日
  5. 硬件支持:  STC12C5A60S2  DHT11
  6. 接口說明:  DHT11:VCC GND DATA
  7. *********************************************************************************************
  8. 說明:1、單片機(jī)是STC12C5A60S2,晶振頻率12MHz,實(shí)驗(yàn)成功。換用12T單片機(jī)或別的晶振的時(shí)候要修改
  9.           延時(shí)函數(shù)和JUDGE。程序里判斷超時(shí)的變量t的閥值也要改。
  10.           2、好東西要共享,大家隨意折騰~~
  11. *********************************************************************************************/
  12. #include <STC12C5A60S2.H>

  13. typedef unsigned char        uchar;
  14. typedef unsigned int        uint;

  15. #define JUDGE        30                //用于判斷通信的0和1,與單片機(jī)速度和晶振頻率有關(guān)

  16. sbit DATA = P1^0;                //定義數(shù)據(jù)引腳

  17. uchar dat_r[5];                        //用于存放從DHT11讀取到的數(shù)值

  18. /*********************************************************************************************
  19. 函數(shù)名:延時(shí)函數(shù)
  20. 調(diào)  用:Delay30us();/Delay20ms();/Delay1s();
  21. 參  數(shù):無
  22. 返回值:無
  23. 結(jié)  果:延時(shí)相應(yīng)時(shí)間
  24. 備  注:振蕩晶體為12MHz(所有延時(shí)函數(shù)Copy自STC-ISP(v6.85).exe)
  25. **********************************************************************************************/
  26. void Delay30us()                //@12.000MHz
  27. {
  28.         unsigned char i;

  29.         i = 87;
  30.         while (--i);
  31. }


  32. void Delay20ms()                //@12.000MHz
  33. {
  34.         unsigned char i, j, k;

  35.         i = 1;
  36.         j = 234;
  37.         k = 113;
  38.         do
  39.         {
  40.                 do
  41.                 {
  42.                         while (--k);
  43.                 } while (--j);
  44.         } while (--i);
  45. }

  46. void Delay1s()                //@12.000MHz
  47. {
  48.         unsigned char i, j, k;

  49.         i = 46;
  50.         j = 153;
  51.         k = 245;
  52.         do
  53.         {
  54.                 do
  55.                 {
  56.                         while (--k);
  57.                 } while (--j);
  58.         } while (--i);
  59. }

  60. /*********************************************************************************************
  61. 函數(shù)名:UART串口初始化函數(shù)
  62. 調(diào)  用:UART_Init();
  63. 參  數(shù):無
  64. 返回值:無
  65. 結(jié)  果:?jiǎn)?dòng)UART串口接收中斷,允許串口接收,啟動(dòng)T/C1產(chǎn)生波特率(占用)
  66. 備  注:振蕩晶體為12MHz,PC串口端設(shè)置 [ 4800,8,無,1,無 ]
  67. **********************************************************************************************/
  68. void UART_Init (void){
  69.         EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
  70.         ES = 1; //允許UART串口的中斷

  71.         TMOD = 0x20;        //定時(shí)器T/C1工作方式2
  72.         SCON = 0x50;        //串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)
  73.         TH1 = 0xF3;        //定時(shí)器初值高8位設(shè)置
  74.         TL1 = 0xF3;        //定時(shí)器初值低8位設(shè)置
  75.         PCON = 0x80;        //波特率倍頻(屏蔽本句波特率為2400)
  76.         TR1 = 1;        //定時(shí)器啟動(dòng)   
  77. }

  78. /*********************************************************************************************
  79. 函數(shù)名:UART串口發(fā)送函數(shù)
  80. 調(diào)  用:UART_T (?);
  81. 參  數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
  82. 返回值:無
  83. 結(jié)  果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認(rèn)發(fā)送完成后退出
  84. 備  注:
  85. **********************************************************************************************/
  86. void UART_T (uchar UART_data){ //定義串口發(fā)送數(shù)據(jù)變量
  87.         SBUF = UART_data;        //將接收的數(shù)據(jù)發(fā)送回去
  88.         while(TI == 0);                //檢查發(fā)送中斷標(biāo)志位
  89.         TI = 0;                        //令發(fā)送中斷標(biāo)志位為0(軟件清零)
  90. }

  91. /*********************************************************************************************
  92. 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
  93. 調(diào)  用:? = GetData();
  94. 參  數(shù):無
  95. 返回值:失敗->-1,-2,-3,-4;成功->0
  96. 結(jié)  果:讀DHT11數(shù)據(jù)并保存到數(shù)組dat_r[]
  97. 備  注:
  98. **********************************************************************************************/
  99. char GetData (void)
  100. {
  101.         uchar i,j;                                //for循環(huán)變量
  102.         uchar t;                                //超時(shí)判斷
  103.         uchar dat8=0;                        //一次讀取的8位數(shù)據(jù),需要讀5次

  104.         DATA = 0;                                //主機(jī)發(fā)起始信號(hào)
  105.         Delay20ms();                        //主機(jī)拉低總線至少18ms
  106.         DATA = 1;                                //主機(jī)拉高總線20~40us
  107.         Delay30us();

  108.         t = 80;                                        //設(shè)置超時(shí)等待時(shí)間
  109.         while(DATA && t--);                //等待DHT11拉低總線
  110.         if(t == 0)                                //超時(shí)
  111.         {
  112.                 DATA = 1;
  113.                 return -1;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-1
  114.         }

  115.         //等80us響應(yīng)信號(hào)
  116.         t = 250;                                //設(shè)置超時(shí)等待時(shí)間
  117.         while(!DATA && t--);        //等待DHT11拉高總線
  118.         if(t == 0)                                //超時(shí)
  119.         {
  120.                 DATA = 1;
  121.                 return -2;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-2
  122.         }

  123.         //等80us響應(yīng)信號(hào)
  124.         t = 250;                                //設(shè)置超時(shí)等待時(shí)間
  125.         while(DATA && t--);                //等待DHT11拉低總線
  126.         if(t == 0)                                //超時(shí)
  127.         {
  128.                 DATA = 1;
  129.                 return -3;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-3
  130.         }

  131.         for(j=0; j<5; j++)                //5次讀取
  132.         {
  133.                 for(i=0; i<8; i++)                        //1次8個(gè)位
  134.                 {
  135.                         //等待50us開始時(shí)隙
  136.                         t = 150;                                //設(shè)置超時(shí)等待時(shí)間
  137.                         while(!DATA && t--);        //等待DHT11拉高總線
  138.                         if(t == 0)                                //超時(shí)
  139.                         {
  140.                                 DATA = 1;
  141.                                 return -4;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-4
  142.                         }
  143.                         t = 0;                                        //記錄時(shí)間清零
  144.                         while(DATA && ++t);                //等待并記錄高電平持續(xù)時(shí)間
  145.                         dat8 <<= 1;
  146.                         if(t > JUDGE)                        //高電平持續(xù)時(shí)間較長(zhǎng)(70us)
  147.                                 dat8 += 1;                        //傳輸值為1
  148.                         //else dat8 += 0;
  149.                 }
  150.                 dat_r[j] = dat8;
  151.         }

  152.         Delay30us();                //等待DHT11拉低50us
  153.         Delay30us();
  154.         DATA = 1;                        //結(jié)束,拉高總線
  155.         return 0;                        //返回成功信號(hào)
  156. }

  157. /*********************************************************************************************
  158. 函數(shù)名:數(shù)據(jù)校驗(yàn)函數(shù)
  159. 調(diào)  用:? = Check();
  160. 參  數(shù):無
  161. 返回值:成功->0;失敗->-1;
  162. 結(jié)  果:數(shù)據(jù)校驗(yàn)
  163. 備  注:數(shù)據(jù)傳送正確時(shí)校驗(yàn)和數(shù)據(jù)等于“8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)”所得結(jié)果的末8位。
  164. **********************************************************************************************/
  165. char Check (void)
  166. {
  167.         uchar i;                        //for循環(huán)變量
  168.         uint chk=0;                        //校驗(yàn)和
  169.         for(i=0; i<4; i++)
  170.                 chk += dat_r[i];                //累加
  171.         if((uchar)chk != dat_r[4])        //比對(duì)
  172.                 return -1;                                //返回錯(cuò)誤信號(hào):-1
  173.         else
  174.                 return 0;                                //返回正確信號(hào):0
  175. }

  176. /*********************************************************************************************
  177. 函數(shù)名:主函數(shù)
  178. 調(diào)  用:無
  179. 參  數(shù):無
  180. 返回值:無
  181. 結(jié)  果:讀DHT11數(shù)據(jù)并送到串口顯示
  182. 備  注:
  183. **********************************************************************************************/
  184. void main (void)
  185. {
  186.         char i;
  187.         UART_Init();                //串口初始化
  188.         Delay1s();                        //等待DHT11穩(wěn)定
  189.         do
  190.         {
  191.                 i = GetData();        //讀數(shù)據(jù)
  192.                 if(i != 0)                //有錯(cuò)誤
  193.                 {
  194.                         UART_T(-i);        //返回錯(cuò)誤值
  195.                         break;                //重新開始
  196.                 }

  197.                 i = Check();        //數(shù)據(jù)校驗(yàn)
  198.                 if(i != 0)                //有錯(cuò)誤
  199.                 {
  200.                         UART_T(-i);        //返回錯(cuò)誤值
  201.                         break;                //重新開始
  202.                 }

  203.                 UART_T(dat_r[0]);                //濕度整數(shù)
  204.                 //UART_T(dat_r[1]);                //濕度小數(shù)(根據(jù)數(shù)據(jù)手冊(cè),DHT11小數(shù)部分一直是0沒用)
  205.                 UART_T(dat_r[2]);                //溫度整數(shù)
  206.                 //UART_T(dat_r[3]);                //溫度小數(shù)(根據(jù)數(shù)據(jù)手冊(cè),DHT11小數(shù)部分一直是0沒用)
  207.                 UART_T(dat_r[4]);                //校驗(yàn)值

  208.                 Delay1s();                                //經(jīng)測(cè)試,兩次連讀要至少延時(shí)80ms        
  209.         }while(1);
  210. }//main
復(fù)制代碼



評(píng)分

參與人數(shù) 1黑幣 +35 收起 理由
davg1 + 35 贊一個(gè)!程序?qū)懙暮芄ふ?/td>

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2018-9-16 11:16 | 顯示全部樓層
把主函數(shù)里的break都改成continue
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2019-3-1 21:22 | 顯示全部樓層
修改一處bug:請(qǐng)把程序里所有的t--改成--t,否則錯(cuò)誤值返回不了。原來的程序一次成功了,所以直到現(xiàn)在才發(fā)現(xiàn)這個(gè)bug……向大家道歉……

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:123712 發(fā)表于 2016-12-28 22:03 | 顯示全部樓層
謝謝樓主分享資料,學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

ID:158563 發(fā)表于 2016-12-29 10:43 | 顯示全部樓層
感覺好難……
回復(fù)

使用道具 舉報(bào)

ID:146045 發(fā)表于 2017-3-18 11:45 | 顯示全部樓層
程序很好
回復(fù)

使用道具 舉報(bào)

ID:186776 發(fā)表于 2017-5-17 21:02 | 顯示全部樓層
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:186776 發(fā)表于 2017-5-17 21:26 來自觸屏版 | 顯示全部樓層
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:145935 發(fā)表于 2017-5-18 10:41 | 顯示全部樓層
感謝分享,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

ID:141361 發(fā)表于 2017-5-25 13:13 | 顯示全部樓層
這兩天一直在研究,開始初始化都失敗,然后呢卻卻讀出來數(shù)據(jù),真是鬧心,借鑒一下程序看有沒有效果
回復(fù)

使用道具 舉報(bào)

ID:202299 發(fā)表于 2017-5-26 11:06 | 顯示全部樓層
請(qǐng)問大神,有沒有DHT11加1602顯示的綜合程序?
回復(fù)

使用道具 舉報(bào)

ID:202299 發(fā)表于 2017-5-26 11:06 | 顯示全部樓層
請(qǐng)問大神,要用1602顯示的話,還要用到串口嗎?
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2017-8-21 14:43 | 顯示全部樓層
smallriver 發(fā)表于 2017-5-25 13:13
這兩天一直在研究,開始初始化都失敗,然后呢卻卻讀出來數(shù)據(jù),真是鬧心,借鑒一下程序看有沒有效果

單總線一般都是時(shí)序問題,最好是能有臺(tái)示波器看看。
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2017-8-21 14:44 | 顯示全部樓層
aiait 發(fā)表于 2017-5-26 11:06
請(qǐng)問大神,要用1602顯示的話,還要用到串口嗎?

把數(shù)據(jù)送到1602屏幕上就行了吧?只是這樣的話不用串口。串口可以用來調(diào)試,看看有沒有數(shù)據(jù)讀出來。
回復(fù)

使用道具 舉報(bào)

ID:229113 發(fā)表于 2017-8-24 13:41 | 顯示全部樓層
我在stc15上用的,仿真軟件上串口輸出時(shí)十六進(jìn)制,怎么才能輸出的是十進(jìn)制呢?
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2017-8-25 11:02 | 顯示全部樓層
cp66 發(fā)表于 2017-8-24 13:41
我在stc15上用的,仿真軟件上串口輸出時(shí)十六進(jìn)制,怎么才能輸出的是十進(jìn)制呢?

寫個(gè)發(fā)送字符串函數(shù),把數(shù)據(jù)的十位和個(gè)位分開發(fā),串口助手用文本模式接收。
回復(fù)

使用道具 舉報(bào)

ID:215834 發(fā)表于 2017-11-18 09:55 | 顯示全部樓層
樓主好,感謝分享。請(qǐng)問為什么要檢測(cè)那么多次錯(cuò)誤呢。另外 &nbsp;while(DATA && ++t);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 語句檢測(cè)時(shí)間t自加一次需要多久時(shí)間,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2017-11-18 10:40 | 顯示全部樓層
本帖最后由 王朗的誘惑 于 2017-11-18 11:03 編輯
njzyg 發(fā)表于 2017-11-18 09:55
樓主好,感謝分享。請(qǐng)問為什么要檢測(cè)那么多次錯(cuò)誤呢。另外  while(DATA && ++t);      ...

DHT11是單總線器件,驅(qū)動(dòng)的時(shí)候時(shí)序容易出問題,但是環(huán)節(jié)太多不知道問題出在哪,調(diào)試的時(shí)候就費(fèi)勁。不斷檢測(cè)錯(cuò)誤就是想知道問題出在哪個(gè)環(huán)節(jié),然后有針對(duì)性地解決。那個(gè)自加的具體時(shí)間不知道,和單片機(jī)速度有關(guān)系,先把前面調(diào)試好了,然后記錄下來0和1對(duì)應(yīng)的t值通過串口發(fā)上來,取平均值就可以了。
回復(fù)

使用道具 舉報(bào)

ID:326995 發(fā)表于 2018-5-10 20:55 | 顯示全部樓層
代碼很有用
回復(fù)

使用道具 舉報(bào)

ID:95072 發(fā)表于 2018-11-10 16:49 | 顯示全部樓層
值得學(xué)習(xí)。。
回復(fù)

使用道具 舉報(bào)

ID:458168 發(fā)表于 2019-1-8 23:12 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:445069 發(fā)表于 2019-3-1 17:29 | 顯示全部樓層
樓主,有沒有在STC89C52上測(cè)試過DHT11?
找了很多網(wǎng)上的代碼,根本就讀不出來。
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2019-3-1 19:39 | 顯示全部樓層
ontheroad 發(fā)表于 2019-3-1 17:29
樓主,有沒有在STC89C52上測(cè)試過DHT11?
找了很多網(wǎng)上的代碼,根本就讀不出來。

沒有誒,不過我手上有元件,我可以幫你試試~
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2019-3-1 21:18 | 顯示全部樓層
ontheroad 發(fā)表于 2019-3-1 17:29
樓主,有沒有在STC89C52上測(cè)試過DHT11?
找了很多網(wǎng)上的代碼,根本就讀不出來。

這是STC89C52RC的程序,晶振頻率11.0592MHz,接口還是P1.0,剛剛測(cè)試成功了。

DHT11-STC89.zip

35.33 KB, 下載次數(shù): 80, 下載積分: 黑幣 -5

11.0592MHz

回復(fù)

使用道具 舉報(bào)

ID:434090 發(fā)表于 2019-3-16 11:34 | 顯示全部樓層
最近在研究dht11,多謝分享
回復(fù)

使用道具 舉報(bào)

ID:448233 發(fā)表于 2019-11-12 09:11 | 顯示全部樓層

樓主,有沒有在STC15F408AD測(cè)試過DHT11?
找了很多網(wǎng)上的代碼,根本就讀不出來。
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2019-11-19 00:20 | 顯示全部樓層
zeki520kiki 發(fā)表于 2019-11-12 09:11
樓主,有沒有在STC15F408AD測(cè)試過DHT11?
找了很多網(wǎng)上的代碼,根本就讀不出來。

我沒試過……如果實(shí)在調(diào)不出來,強(qiáng)烈建議用示波器或者邏輯分析儀看看波形。
回復(fù)

使用道具 舉報(bào)

ID:627950 發(fā)表于 2019-12-15 20:16 | 顯示全部樓層
樓主,有沒有在IAP15W4K58S4測(cè)試過DHT11?
求分享~
回復(fù)

使用道具 舉報(bào)

ID:666819 發(fā)表于 2019-12-17 23:32 | 顯示全部樓層
我測(cè)試成功了,謝謝樓主的幫助
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2020-1-7 22:09 | 顯示全部樓層
夢(mèng)在夏天 發(fā)表于 2019-12-15 20:16
樓主,有沒有在IAP15W4K58S4測(cè)試過DHT11?
求分享~

沒有……盲調(diào)主要看人品,最好想辦法搞個(gè)示波器或者邏輯分析儀。
回復(fù)

使用道具 舉報(bào)

ID:259035 發(fā)表于 2020-1-31 17:23 | 顯示全部樓層

樓主,有沒有在STC15f2k60s上測(cè)試過DHT11?
找了很多網(wǎng)上的代碼,根本就讀不出來。
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2020-2-7 19:30 | 顯示全部樓層
yechuan220 發(fā)表于 2020-1-31 17:23
樓主,有沒有在STC15f2k60s上測(cè)試過DHT11?
找了很多網(wǎng)上的代碼,根本就讀不出來。

沒……現(xiàn)在我大概明白,提出這些問題的老哥們是沒有示波器什么的,那就串口調(diào)試吧。DHT11這東西不是把信號(hào)全發(fā)過去才返回的,通信的過程就是反饋的過程,比如主機(jī)發(fā)一個(gè)開始信號(hào),然后DHT11就會(huì)響應(yīng)一個(gè)低電平信號(hào),檢測(cè)這個(gè)信號(hào),就知道之前的開始信號(hào)正不正常。類似于打電話,得聽到對(duì)方的聲音,才知道信號(hào)沒問題,對(duì)吧。
回復(fù)

使用道具 舉報(bào)

ID:626079 發(fā)表于 2020-3-18 23:14 | 顯示全部樓層
感謝樓主的程序,麻煩咨詢下樓主,你的STC52程序中
#define JUDGE        4                //用于判斷通信的0和1,與單片機(jī)速度和晶振頻率有關(guān)
這是起啥作用。 我看在程序里調(diào)用時(shí):
if(t >JUDGE)                        //高電平持續(xù)時(shí)間較長(zhǎng)(70us)
dat8 += 1;                        //傳輸值為1

能解答一下為什么t>JDGE是與70us進(jìn)行比較呢?新手不太明白,謝謝了。
還有dat8 += 1;是不是就是把dat8最后一位給“1”的意思哈?
回復(fù)

使用道具 舉報(bào)

ID:710428 發(fā)表于 2020-3-19 20:34 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:282869 發(fā)表于 2020-3-20 13:32 | 顯示全部樓層
值得參考學(xué)習(xí),謝謝分享.
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2020-3-20 14:51 | 顯示全部樓層
本帖最后由 王朗的誘惑 于 2020-3-20 19:46 編輯
xmfjfhcel 發(fā)表于 2020-3-18 23:14
感謝樓主的程序,麻煩咨詢下樓主,你的STC52程序中
#define JUDGE        4                //用于判斷通 ...

問題1:
截圖_20200320064436.png

看下數(shù)據(jù)手冊(cè)里的圖5,DHT11數(shù)據(jù)高電平持續(xù)時(shí)間規(guī)定為70us,所以比較這個(gè)時(shí)間判斷數(shù)據(jù)是1還是0。JUDGE是手動(dòng)試出來的,這個(gè)值理論上最好能讓單片機(jī)計(jì)時(shí)在DHT11數(shù)據(jù)高電平的時(shí)間中間,就是(70+28)/2 = 49 us。
好好研究下數(shù)據(jù)手冊(cè)是解決問題的最好辦法。已附上數(shù)據(jù)手冊(cè)。

問題2:
是。相當(dāng)于 dat8 |= 1;

DHT11說明書081206.pdf

677.52 KB, 下載次數(shù): 7, 下載積分: 黑幣 -5

DHT11數(shù)據(jù)手冊(cè)

回復(fù)

使用道具 舉報(bào)

ID:626079 發(fā)表于 2020-3-20 16:43 | 顯示全部樓層


謝謝大俠, 高手。已經(jīng)用你的程序做出來通過……
http://www.torrancerestoration.com/bbs/dpj-182291-1.html
回復(fù)

使用道具 舉報(bào)

ID:246783 發(fā)表于 2020-3-21 19:56 | 顯示全部樓層
你這個(gè)思路比較好   相當(dāng)于軟件示波器了       借鑒你這個(gè)思路調(diào)了408AS 的dht11   數(shù)據(jù)出來了 !!

另外問個(gè)問題  :  串口接收時(shí)      開文本接收時(shí) 數(shù)據(jù)一直是字符亂碼  怎么解決 ?

                  SendString("\r\n濕度:");
                        SendData(dat_r[0]);                //濕度整數(shù)        
             
                SendString("\r\n溫度:");
                SendData(dat_r[2]);                //溫度整數(shù)                


/////////////////////////////////////////
我的串口函數(shù)  :  
/******************************************************************************

****************************************************************Author:Liming**/
void SendData(unsigned char dat)
{
    while (B_TX1_Busy);               //等待前面的數(shù)據(jù)發(fā)送完成
    B_TX1_Busy = 1;
    SBUF = dat;                 //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
}

/*******************************************************************************
  * @brief  None
  * @param  None
  * @retval None
****************************************************************Author:Liming**/
void SendString(char *s)
{
    while (*s)                  //檢測(cè)字符串結(jié)束標(biāo)志
    {
        SendData(*s++);         //發(fā)送當(dāng)前字符
    }
}
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2020-3-22 13:13 | 顯示全部樓層
sasafair 發(fā)表于 2020-3-21 19:56
你這個(gè)思路比較好   相當(dāng)于軟件示波器了       借鑒你這個(gè)思路調(diào)了408AS 的dht11   數(shù)據(jù)出來了 !!

另外 ...

文本接收時(shí)發(fā)送的數(shù)字需要進(jìn)行ASCII編碼,比如發(fā)送0,實(shí)際發(fā)送的字節(jié)是0x30;發(fā)送1,實(shí)際發(fā)送的字節(jié)是0x31,依次類推。
實(shí)現(xiàn)的方法有很多,可以自己寫轉(zhuǎn)換函數(shù),轉(zhuǎn)換要發(fā)送的數(shù)據(jù)的每個(gè)十進(jìn)制位;也可以用sprintf函數(shù)把數(shù)據(jù)轉(zhuǎn)換成字符串然后發(fā)送字符串;還可以重定向printf然后直接用printf。
你這個(gè)情況的話,推薦使用sprintf。如果為了學(xué)習(xí)ASCII編碼,建議自己寫個(gè)轉(zhuǎn)換函數(shù)。
祝好運(yùn)~
回復(fù)

使用道具 舉報(bào)

ID:733775 發(fā)表于 2020-4-20 23:25 | 顯示全部樓層
用LCD顯示的數(shù)據(jù)特別不準(zhǔn)咋辦。。是這東西本來就誤差大,還是時(shí)間沒取好導(dǎo)致數(shù)據(jù)有誤差啊?或者算法?不能直接高位/10,%10?太離譜了家里溫度顯示27攝氏度,天氣預(yù)報(bào)也就15攝氏度
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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