找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DHT11 STC12C5A60S2單片機(jī)測試代碼(帶詳細(xì)注釋)串口輸出

  [復(fù)制鏈接]
ID:402635 發(fā)表于 2018-9-26 12:46 | 顯示全部樓層 |閱讀模式
DHT11 C51測試代碼,僅供學(xué)習(xí)。

單片機(jī)源程序如下:
  1. /*********************************************************************************************
  2. 程序名:    DHT11驅(qū)動程序
  3. 編寫人:    王朗的誘惑
  4. 硬件支持:  STC12C5A60S2  DHT11
  5. 接口說明:  DHT11:VCC GND DATA
  6. *********************************************************************************************
  7. 說明:1、單片機(jī)是STC12C5A60S2,晶振頻率12MHz,實(shí)驗(yàn)成功。換用12T單片機(jī)或別的晶振的時(shí)候要修改
  8.           延時(shí)函數(shù)和JUDGE。程序里判斷超時(shí)的變量t的閥值也要改。
  9.           2、好東西要共享,大家隨意折騰~~
  10. *********************************************************************************************/
  11. #include <STC12C5A60S2.H>

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

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

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

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

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

  28.         i = 80;
  29.         while (--i);
  30. }



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

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


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

  48.         i = 43;
  49.         j = 6;
  50.         k = 203;
  51.         do
  52.         {
  53.                 do
  54.                 {
  55.                         while (--k);
  56.                 } while (--j);
  57.         } while (--i);
  58. }

  59. /*********************************************************************************************
  60. 函數(shù)名:UART串口初始化函數(shù)
  61. 調(diào)  用:UART_Init();
  62. 參  數(shù):無
  63. 返回值:無
  64. 結(jié)  果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產(chǎn)生波特率(占用)
  65. 備  注:振蕩晶體為12MHz,PC串口端設(shè)置 [ 9600,8,無,1,無 ]
  66. **********************************************************************************************/
  67. void UART_Init (void){
  68.     TMOD |= 0x20;   //定時(shí)器1方式2,8位自動重裝模式。0010 0000  
  69.     PCON = 0x00;    //SMOD:波特率倍增位 SMOD=0,波特率不備增  
  70.     SCON = 0x50;    //串口模式1,8位UART,波特率可變。  
  71.     /*波特率定時(shí)器初始化,定時(shí)器初始值0xFD*/  
  72.     TH1 = 0xFD;     //256-(11.5920*10^6)/(384*9600)  
  73.     TL1 = 0xFD;  
  74.     /*啟動定時(shí)器1*/  
  75.     TR1 = 1;  
  76.     /*中斷處理*/   
  77.     ES = 1; //允許串口中斷  
  78.     EA = 1; //允許總中斷開關(guān)  
  79. }

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

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

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

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

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

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

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

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

  159. /*********************************************************************************************
  160. 函數(shù)名:數(shù)據(jù)校驗(yàn)函數(shù)
  161. 調(diào)  用:? = Check();
  162. 參  數(shù):無
  163. 返回值:成功->0;失敗->-1;
  164. 結(jié)  果:數(shù)據(jù)校驗(yàn)
  165. 備  注:數(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位。
  166. **********************************************************************************************/
  167. char Check (void)
  168. {
  169.         uchar i;                        //for循環(huán)變量
  170.         uint chk=0;                        //校驗(yàn)和
  171.         for(i=0; i<4; i++)
  172.                 chk += dat_r[i];                //累加
  173.         if((uchar)chk != dat_r[4])        //比對
  174.                 return -1;                                //返回錯(cuò)誤信號:-1
  175.         else
  176.                 return 0;                                //返回正確信號:0
  177. }

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

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

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

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

所有資料51hei提供下載:
DHT11.rar (30.21 KB, 下載次數(shù): 163)


評分

參與人數(shù) 1黑幣 +35 收起 理由
王朗的誘惑 + 35 把主函數(shù)循環(huán)里break改成continue吧……抱.

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:408102 發(fā)表于 2018-10-11 15:54 | 顯示全部樓層
STC12C5A60S2.H  是自帶的嗎?
回復(fù)

使用道具 舉報(bào)

ID:408102 發(fā)表于 2018-10-11 17:50 | 顯示全部樓層
你好,我詢問下,我出來的結(jié)果很奇怪,就是一串的數(shù)字,是用的DHT11和STC12C5A60S2單片機(jī),接的也是P20口。但是打印出來就是一串?dāng)?shù)字接一串的*或者+。因?yàn)閯偨佑|單片機(jī),對語言還在學(xué)習(xí)中,能否指教下。
回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2018-10-11 18:04 | 顯示全部樓層
q157543347 發(fā)表于 2018-10-11 15:54
STC12C5A60S2.H  是自帶的嗎?

回復(fù)

使用道具 舉報(bào)

ID:84652 發(fā)表于 2018-10-11 18:07 | 顯示全部樓層
q157543347 發(fā)表于 2018-10-11 17:50
你好,我詢問下,我出來的結(jié)果很奇怪, 就是一串的數(shù)字,是用的DHT11和STC12C5A60S2單片機(jī),接的 ...

接收選擇HEX模式
主函數(shù)里加上一個(gè)發(fā)送常量的語句,比如UART_T(0x33)看發(fā)來是不是0x33,這樣就知道串口通訊有沒有問題。
回復(fù)

使用道具 舉報(bào)

ID:137005 發(fā)表于 2018-11-22 09:11 | 顯示全部樓層
下載學(xué)習(xí),謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:304849 發(fā)表于 2018-12-2 11:35 | 顯示全部樓層
你好,用了這個(gè)程序,請問顯示的16進(jìn)制數(shù)據(jù)怎么看?為什么會每過4個(gè)數(shù)據(jù)顯示0?
1.PNG
回復(fù)

使用道具 舉報(bào)

ID:501681 發(fā)表于 2019-4-27 15:29 | 顯示全部樓層
正好用到,下下來看看效果
回復(fù)

使用道具 舉報(bào)

ID:501681 發(fā)表于 2019-4-28 13:36 | 顯示全部樓層
輸出串口會亂碼是怎么回事呢
回復(fù)

使用道具 舉報(bào)

ID:523982 發(fā)表于 2019-4-29 08:07 | 顯示全部樓層
q157543347 發(fā)表于 2018-10-11 15:54
STC12C5A60S2.H  是自帶的嗎?

不是,可以去STC的下載器復(fù)制這個(gè)頭文件
回復(fù)

使用道具 舉報(bào)

ID:501681 發(fā)表于 2019-5-16 19:37 | 顯示全部樓層
11.0592M   JUDGE怎么修改
回復(fù)

使用道具 舉報(bào)

ID:359588 發(fā)表于 2020-1-31 00:09 | 顯示全部樓層
問什么串口提示亂碼?
回復(fù)

使用道具 舉報(bào)

ID:473579 發(fā)表于 2024-1-18 13:18 | 顯示全部樓層
說明:1、單片機(jī)是STC12C5A60S2,晶振頻率12MHz,實(shí)驗(yàn)成功。換用12T單片機(jī)或別的晶振的時(shí)候要修改
          延時(shí)函數(shù)和JUDGE。程序里判斷超時(shí)的變量t的閥值也要改。
回復(fù)

使用道具 舉報(bào)

ID:473579 發(fā)表于 2024-1-18 13:19 | 顯示全部樓層
說明:1、單片機(jī)是STC12C5A60S2,晶振頻率12MHz,實(shí)驗(yàn)成功。換用12T單片機(jī)或別的晶振的時(shí)候要修改
          延時(shí)函數(shù)和JUDGE。程序里判斷超時(shí)的變量t的閥值也要改。

11.0592M   JUDGE怎么修改,判斷超時(shí)的變量t的閥值怎么改。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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