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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2698|回復: 0
打印 上一主題 下一主題
收起左側

IAP15F2K61S2單片機+DHT11源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:484359 發表于 2019-7-17 13:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
IAP15F2K61S2單片機 + DHT11 親測可以實現功能,歡迎大家下載

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

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

  14. /*        checkout 為校驗位;
  15.         dat_r[0]->溫度整數
  16.         dat_r[1]->溫度小數
  17.         dat_r[2]->濕度整數
  18.         dat_r[3]->濕度小數
  19.         dat_r[4]->校驗位
  20.         dat_r[1]->溫度小數
  21. */
  22. /*********************************************************************************************
  23. 函數名:延時函數
  24. 調  用:Delay30us();/Delay20ms();/Delay1s();
  25. 參  數:無
  26. 返回值:無
  27. 結  果:延時相應時間
  28. 備  注:振蕩晶體為12MHz(所有延時函數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. 函數名:DHT11讀數據函數
  66. 調  用:? = GetData();
  67. 參  數:無
  68. 返回值:失敗->-1,-2,-3,-4;成功->0
  69. 結  果:讀DHT11數據并保存到數組dat_r[]
  70. 備  注:
  71. **********************************************************************************************/
  72. char GetData (void)
  73. {
  74.     uchar i,j;                                //for循環變量
  75.     uchar t;                                //超時判斷
  76.     uchar dat8=0;                        //一次讀取的8位數據,需要讀5次
  77.     DATA = 0;                                //主機發起始信號
  78.     Delay20ms();                        //主機拉低總線至少18ms
  79.     DATA = 1;                                //主機拉高總線20~40us
  80.     Delay30us();
  81.     t = 80;                                        //設置超時等待時間
  82.     while(DATA && t--);                //等待DHT11拉低總線
  83.     if(t == 0)                                //超時
  84.     {
  85.             DATA = 1;
  86.             return -1;                        //通信錯誤退出,返回錯誤信號:-1
  87.     }
  88.     //等80us響應信號
  89.     t = 250;                                //設置超時等待時間
  90.     while(!DATA && t--);        //等待DHT11拉高總線
  91.     if(t == 0)                                //超時
  92.     {
  93.             DATA = 1;
  94.             return -2;                        //通信錯誤退出,返回錯誤信號:-2
  95.     }
  96.     //等80us響應信號
  97.     t = 250;                                //設置超時等待時間
  98.     while(DATA && t--);                //等待DHT11拉低總線
  99.     if(t == 0)                                //超時
  100.     {
  101.             DATA = 1;
  102.             return -3;                        //通信錯誤退出,返回錯誤信號:-3
  103.     }
  104.     for(j=0; j<5; j++)                //5次讀取
  105.     {
  106.         for(i=0; i<8; i++)                        //1次8個位
  107.         {
  108.             //等待50us開始時隙
  109.             t = 150;                                //設置超時等待時間
  110.             while(!DATA && t--);        //等待DHT11拉高總線
  111.             if(t == 0)                                //超時
  112.             {
  113.                     DATA = 1;
  114.                     return -4;                        //通信錯誤退出,返回錯誤信號:-4
  115.             }
  116.             t = 0;                                        //記錄時間清零
  117.             while(DATA && ++t);                //等待并記錄高電平持續時間
  118.             dat8 <<= 1;
  119.             if(t > JUDGE)                        //高電平持續時間較長(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;                        //結束,拉高總線
  128.         checkout = Check();
  129.         if(checkout == 0)return 0;            //校驗成功,返回成功信號
  130.         else return(88);        //返回不成功                        
  131. }

  132. /*********************************************************************************************
  133. 函數名:數據校驗函數
  134. 調  用:? = Check();
  135. 參  數:無
  136. 返回值:成功->0;失敗->-1;
  137. 結  果:數據校驗
  138. 備  注:數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據”所得結果的末8位。
  139. **********************************************************************************************/
  140. char Check (void)
  141. {
  142.         uchar i;                        //for循環變量
  143.         uint chk=0;                        //校驗和
  144.         for(i=0; i<4; i++)
  145.                 chk += dat_r[i];                //累加
  146.         if((uchar)chk != dat_r[4])        //比對
  147.                 return -1;                                //返回錯誤信號:-1
  148.         else
  149.                 return 0;                                //返回正確信號:0
  150. }

復制代碼

  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)         //讀取數據時間不能小于1秒 時間 > 1s
  48.                 {
  49.                         cp = 0;
  50.                         kk = GetData();//讀取數據               
  51.                 }
  52.                 if(kk == 0)          //數據讀取成功
  53.                 {
  54.                         hum = dat_r[0];
  55.                         temp =         dat_r[2];
  56.                 }        

  57.         }
  58. }
復制代碼

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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频中文字幕 | 精品日韩| 国产欧美日韩精品一区 | 久久国产精品99久久久久久丝袜 | 成人精品久久 | 精品国产乱码久久久久久图片 | 午夜小视频在线播放 | 亚洲网站在线播放 | 中文字幕国产高清 | 日本中文字幕日韩精品免费 | 91精品国产一区二区三区动漫 | 福利精品在线观看 | 欧美国产视频 | 台湾a级理论片在线观看 | 日韩有码一区二区三区 | 欧美国产日韩精品 | 毛片在线免费 | 热久久久| 日本不卡一区 | 久久精品国产久精国产 | 免费久久视频 | 国产在线精品一区二区 | 日本一区二区在线视频 | 免费h在线 | 亚洲国产精品99久久久久久久久 | 久久国产高清 | 精品入口麻豆88视频 | 欧美舔穴 | 亚洲网站在线观看 | 国产乱码久久久久久 | 精品一区二区三区中文字幕 | 亚洲狠狠 | 91久久精品国产91久久 | 亚洲高清在线 | 成人一区二区三区在线观看 | 日本在线看片 | 亚洲人人舔人人 | 亚洲精品一区二区网址 | 在线成人免费视频 | 在线午夜| 久久精品国产99国产精品亚洲 |