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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2730|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

IAP15F2K61S2單片機(jī)+DHT11源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:484359 發(fā)表于 2019-7-17 13:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
IAP15F2K61S2單片機(jī) + DHT11 親測(cè)可以實(shí)現(xiàn)功能,歡迎大家下載

單片機(jī)源程序如下:
  1. /*********************************************************************************************
  2. 程序名:    DHT11驅(qū)動(dòng)程序
  3. *********************************************************************************************
  4. 說(shuō)明:1、單片機(jī)是IAP15F61S2,晶振頻率12MHz,實(shí)驗(yàn)成功。換用12T單片機(jī)或別的晶振的時(shí)候要修改        
  5.           延時(shí)函數(shù)和JUDGE。程序里判斷超時(shí)的變量t的閥值也要改。15F單片機(jī)處理速度快一點(diǎn),51的慢,
  6.           2、好東西要共享,大家隨意折騰~~
  7. *********************************************************************************************/

  8. char Check (void);
  9. typedef unsigned char        uchar;
  10. typedef unsigned int        uint;
  11. #define JUDGE        30                //用于判斷通信的0和1,與單片機(jī)速度和晶振頻率有關(guān)
  12. sbit DATA = P1^1;                //定義數(shù)據(jù)引腳
  13. uchar dat_r[5],checkout;                        //用于存放從DHT11讀取到的數(shù)值

  14. /*        checkout 為校驗(yàn)位;
  15.         dat_r[0]->溫度整數(shù)
  16.         dat_r[1]->溫度小數(shù)
  17.         dat_r[2]->濕度整數(shù)
  18.         dat_r[3]->濕度小數(shù)
  19.         dat_r[4]->校驗(yàn)位
  20.         dat_r[1]->溫度小數(shù)
  21. */
  22. /*********************************************************************************************
  23. 函數(shù)名:延時(shí)函數(shù)
  24. 調(diào)  用:Delay30us();/Delay20ms();/Delay1s();
  25. 參  數(shù):無(wú)
  26. 返回值:無(wú)
  27. 結(jié)  果:延時(shí)相應(yīng)時(shí)間
  28. 備  注:振蕩晶體為12MHz(所有延時(shí)函數(shù)Copy自STC-ISP(v6.85).exe)
  29. **********************************************************************************************/
  30. void Delay30us()                //@12.000MHz
  31. {
  32.     unsigned char i;
  33.     i = 87;
  34.     while (--i);
  35. }
  36. void Delay20ms()                //@12.000MHz
  37. {
  38.     unsigned char i, j, k;
  39.     i = 1;
  40.     j = 234;
  41.     k = 113;
  42.     do
  43.     {
  44.             do
  45.             {
  46.                     while (--k);
  47.             } while (--j);
  48.     } while (--i);
  49. }
  50. void Delay1s()                //@12.000MHz
  51. {
  52.     unsigned char i, j, k;
  53.     i = 46;
  54.     j = 153;
  55.     k = 245;
  56.     do
  57.     {
  58.         do
  59.         {
  60.                 while (--k);
  61.         } while (--j);
  62.     } while (--i);
  63. }

  64. /*********************************************************************************************
  65. 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
  66. 調(diào)  用:? = GetData();
  67. 參  數(shù):無(wú)
  68. 返回值:失敗->-1,-2,-3,-4;成功->0
  69. 結(jié)  果:讀DHT11數(shù)據(jù)并保存到數(shù)組dat_r[]
  70. 備  注:
  71. **********************************************************************************************/
  72. char GetData (void)
  73. {
  74.     uchar i,j;                                //for循環(huán)變量
  75.     uchar t;                                //超時(shí)判斷
  76.     uchar dat8=0;                        //一次讀取的8位數(shù)據(jù),需要讀5次
  77.     DATA = 0;                                //主機(jī)發(fā)起始信號(hào)
  78.     Delay20ms();                        //主機(jī)拉低總線至少18ms
  79.     DATA = 1;                                //主機(jī)拉高總線20~40us
  80.     Delay30us();
  81.     t = 80;                                        //設(shè)置超時(shí)等待時(shí)間
  82.     while(DATA && t--);                //等待DHT11拉低總線
  83.     if(t == 0)                                //超時(shí)
  84.     {
  85.             DATA = 1;
  86.             return -1;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-1
  87.     }
  88.     //等80us響應(yīng)信號(hào)
  89.     t = 250;                                //設(shè)置超時(shí)等待時(shí)間
  90.     while(!DATA && t--);        //等待DHT11拉高總線
  91.     if(t == 0)                                //超時(shí)
  92.     {
  93.             DATA = 1;
  94.             return -2;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-2
  95.     }
  96.     //等80us響應(yīng)信號(hào)
  97.     t = 250;                                //設(shè)置超時(shí)等待時(shí)間
  98.     while(DATA && t--);                //等待DHT11拉低總線
  99.     if(t == 0)                                //超時(shí)
  100.     {
  101.             DATA = 1;
  102.             return -3;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-3
  103.     }
  104.     for(j=0; j<5; j++)                //5次讀取
  105.     {
  106.         for(i=0; i<8; i++)                        //1次8個(gè)位
  107.         {
  108.             //等待50us開(kāi)始時(shí)隙
  109.             t = 150;                                //設(shè)置超時(shí)等待時(shí)間
  110.             while(!DATA && t--);        //等待DHT11拉高總線
  111.             if(t == 0)                                //超時(shí)
  112.             {
  113.                     DATA = 1;
  114.                     return -4;                        //通信錯(cuò)誤退出,返回錯(cuò)誤信號(hào):-4
  115.             }
  116.             t = 0;                                        //記錄時(shí)間清零
  117.             while(DATA && ++t);                //等待并記錄高電平持續(xù)時(shí)間
  118.             dat8 <<= 1;
  119.             if(t > JUDGE)                        //高電平持續(xù)時(shí)間較長(zhǎng)(70us)
  120.                     dat8 += 1;                        //傳輸值為1
  121.             //else dat8 += 0;
  122.         }
  123.         dat_r[j] = dat8;
  124.     }
  125.     Delay30us();                //等待DHT11拉低50us
  126.     Delay30us();
  127.     DATA = 1;                        //結(jié)束,拉高總線
  128.         checkout = Check();
  129.         if(checkout == 0)return 0;            //校驗(yàn)成功,返回成功信號(hào)
  130.         else return(88);        //返回不成功                        
  131. }

  132. /*********************************************************************************************
  133. 函數(shù)名:數(shù)據(jù)校驗(yàn)函數(shù)
  134. 調(diào)  用:? = Check();
  135. 參  數(shù):無(wú)
  136. 返回值:成功->0;失敗->-1;
  137. 結(jié)  果:數(shù)據(jù)校驗(yàn)
  138. 備  注:數(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位。
  139. **********************************************************************************************/
  140. char Check (void)
  141. {
  142.         uchar i;                        //for循環(huán)變量
  143.         uint chk=0;                        //校驗(yàn)和
  144.         for(i=0; i<4; i++)
  145.                 chk += dat_r[i];                //累加
  146.         if((uchar)chk != dat_r[4])        //比對(duì)
  147.                 return -1;                                //返回錯(cuò)誤信號(hào):-1
  148.         else
  149.                 return 0;                                //返回正確信號(hào):0
  150. }

復(fù)制代碼

  1. #include <REGX51.H>
  2. #include <init.c>
  3. #include <DHT11.c>
  4. unsigned int cp,adc,cp1;
  5. char kk,mm,temp,hum;
  6. void display()
  7. {
  8.         unsigned char j;
  9.         P0 = 0xff;
  10.         switch(j)
  11.         {
  12.                 case 0:display_mm(0x01,0xc0);break;
  13.                 case 1:display_mm(0x02,0xc0);break;
  14.                 case 2:display_mm(0x04,seg[hum/10]);break;
  15.                 case 3:display_mm(0x08,seg[hum%10]);break;
  16.                 case 4:display_mm(0x10,0xbf);break;
  17.                 case 5:display_mm(0x20,0xbf);break;
  18.                 case 6:display_mm(0x40,seg[temp/10]);break;
  19.                 case 7:display_mm(0x80,seg[temp%10]);break;               
  20.         }j++;if(j >= 8) j = 0;
  21. }
  22. void T0_isr()interrupt 1
  23. {
  24.         TH0 = (65536-2000)/256;
  25.         TL0 = (65536-2000)%256;
  26.         cp++;
  27.         
  28.         display();

  29. }
  30. void T0_init()
  31. {
  32.         TMOD = 0x01;
  33.         TH0 = (65536-2000)/256;
  34.         TL0 = (65536-2000)%256;
  35.         EA = 1;
  36.         ET0 = 1;
  37.         TR0 = 1;
  38. }
  39. void main()
  40. {
  41.         T0_init();
  42.         ULN2003(0x00);
  43.         led(0x00);
  44.         Delay1s();
  45.         while(1)
  46.         {
  47.                 if(cp >= 1000)         //讀取數(shù)據(jù)時(shí)間不能小于1秒 時(shí)間 > 1s
  48.                 {
  49.                         cp = 0;
  50.                         kk = GetData();//讀取數(shù)據(jù)               
  51.                 }
  52.                 if(kk == 0)          //數(shù)據(jù)讀取成功
  53.                 {
  54.                         hum = dat_r[0];
  55.                         temp =         dat_r[2];
  56.                 }        

  57.         }
  58. }
復(fù)制代碼

所有資料51hei提供下載:
溫濕度傳感器—DHT11.zip (27.06 KB, 下載次數(shù): 20)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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