欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DHT11檢測程序(串口發送)

[復制鏈接]
跳轉到指定樓層
樓主
ID:312455 發表于 2018-4-26 19:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關于DHT11的檢測及串口
單片機源程序如下:
  1. #include <reg51.h>
  2. #include"stdio.h"
  3. #include"intrins.h"
  4. #define OK 1
  5. #define ERROR 0
  6. extern void Delay_1ms(unsigned int ms);
  7. //函數的返回值表示讀取數據是否成功 OK 表示成功 ERROR 表示失敗
  8. extern unsigned char DHT11_ReadTempAndHumi(void);
  9. sbit dht11 = P2^0;         //IO口定義
  10. //防止在與硬件通信時發生死循環的計數范圍
  11. #define NUMBER 120                           //20 12T
  12. #define SIZE 5
  13. static unsigned char status;
  14. unsigned char tempshi,tempge;
  15. //存放五字節數據的數組
  16. static unsigned char value_array[SIZE];
  17. /*可在其他的文件引用溫濕度值,實際是溫度的整數的10 倍
  18. 如dht11 讀回的溫度是26,則temp_value = 260, 濕度同理*/
  19. int temp_value, humi_value;
  20. static unsigned char ReadValue(void);
  21. void serial_init(){
  22.         TMOD=0x20;
  23.         TH1=0xfd;
  24.         TL1=0xfd;                                                 //設置9600波特率
  25.         SCON=0x50;                                                 //串口方式1,允許接收
  26.         TR1=1;
  27. }
  28. void main(){
  29.            serial_init();

  30.            
  31.                 while(1){
  32.                         if(DHT11_ReadTempAndHumi()==OK){
  33.                                 TI=1;
  34.                                 SBUF=temp_value;
  35.                                 TI=0;
  36.                                 Delay_1ms(1000);
  37.                                 TI=1;
  38.                                 SBUF=humi_value;
  39.                                 TI=0;
  40.                                 Delay_1ms(1000);
  41.                         }
  42.                         else if(DHT11_ReadTempAndHumi()==ERROR){
  43.                                 TI=1;
  44.                                 SBUF=0x01;
  45.                                 TI=0;
  46.                                 Delay_1ms(1000);
  47.                         }
  48.                 }
  49. }


  50. extern void Delay_1ms(unsigned int a){                //延時約1ms
  51.         unsigned int i;
  52.         while (--a!=0)
  53.                 for(i=600;i>0;i--);
  54. }
  55. static void DHT11_Delay_10us(void){
  56.                 unsigned char i;
  57.                 i--;
  58.                 i--;
  59.                 i--;
  60.                 i--;
  61.                 i--;
  62.                 i--;
  63.                 i--;
  64.                 i--;
  65.                 i--;
  66.                 i--;
  67.                 i--;
  68.                 i--;
  69.                 i--;
  70.                 i--;
  71.                 i--;
  72.                 i--;
  73.                 i--;
  74.                 i--;
  75.                 i--;
  76.                 i--;
  77.                 i--;
  78.                 i--;
  79. }
  80. /*讀一個字節的數據*/
  81. static unsigned char DHT11_ReadValue(void){
  82.         unsigned char count, value = 0, i;
  83.         status = OK; //設定標志為正常狀態
  84.         for(i = 8; i > 0; i--){
  85.                 //高位在先
  86.                 value <<= 1;
  87.                 count = 0;
  88.                 //每一位數據前會有一個50us 的低電平時間.等待50us 低電平結束
  89.                 while(dht11 == 0 && count++ < NUMBER);
  90.                 if(count >= NUMBER){
  91.                         status = ERROR; //設定錯誤標志
  92.                         return 0; //函數執行過程發生錯誤就退出函數
  93.                 }
  94.                 //26-28us 的高電平表示該位是0,為70us 高電平表該位1
  95.                 DHT11_Delay_10us();
  96.                 DHT11_Delay_10us();
  97.                 DHT11_Delay_10us();

  98.                 //延時30us 后檢測數據線是否還是高電平
  99.                 if(dht11 != 0){
  100.                         //進入這里表示該位是1
  101.                         value++;
  102.                         //等待剩余(約40us)的高電平結束
  103.                         while(dht11 != 0 && count++ < NUMBER){
  104.                                 dht11 = 1;
  105.                         }
  106.                         if(count >= NUMBER){
  107.                                 status = ERROR; //設定錯誤標志
  108.                                 return 0;
  109.                         }
  110.                 }
  111.         }
  112.         return (value);
  113. }
  114. //讀溫度和濕度函數,讀一次的數據,共五字節,讀出成功函數返回OK, 錯誤返回ERROR
  115. extern unsigned char DHT11_ReadTempAndHumi(void){
  116.         unsigned char i = 0, check_value = 0,count = 0;
  117.         //EA = 0;
  118.         dht11 = 0; //拉低數據線大于18ms 發送開始信號
  119.         Delay_1ms(20); //需大于18 毫秒
  120.         dht11 = 1; //釋放數據線,用于檢測低電平的應答信號
  121.         //延時20-40us,等待一段時間后檢測應答信號,應答信號是從機拉低數據線80us
  122.         DHT11_Delay_10us();
  123.         DHT11_Delay_10us();
  124.         DHT11_Delay_10us();
  125.         DHT11_Delay_10us();
  126.         if(dht11 != 0){                   //檢測應答信號,應答信號是低電平
  127.                 //沒應答信號
  128.         //        EA = 1;
  129.                 return ERROR;
  130.         }
  131.         else{
  132.                 //有應答信號
  133.                 while(dht11 == 0 && count++ < NUMBER); //等待應答信號結束
  134.                 if(count >= NUMBER){                                   //檢測計數器是否超過了設定的范圍
  135.                         dht11 = 1;
  136.         //                EA = 1;
  137.                         return ERROR; //讀數據出錯,退出函數
  138.                 }
  139.                 count = 0;
  140.                 dht11 = 1;//釋放數據線
  141.                 //應答信號后會有一個80us 的高電平,等待高電平結束
  142.                 while(dht11 != 0 && count++ < NUMBER);
  143.                 if(count >= NUMBER){
  144.                         dht11 = 1;
  145.         //                EA = 1;
  146.                         return ERROR; //退出函數
  147.                 }
  148.                 //讀出濕.溫度值
  149.                 for(i = 0; i < SIZE; i++){
  150.                         value_array[i] = DHT11_ReadValue();
  151.                         if(status == ERROR){                                //調用ReadValue()讀數據出錯會設定status 為ERROR
  152.                                 dht11 = 1;
  153.         //                        EA = 1;
  154.                                 return ERROR;
  155.                         }
  156.                 //讀出的最后一個值是校驗值不需加上去
  157.                         if(i != SIZE - 1){
  158.                                 //讀出的五字節數據中的前四字節數據和等于第五字節數據表示成功
  159.                                 check_value += value_array[i];
  160.                         }
  161.                 }//end for
  162.                         //在沒用發生函數調用失敗時進行校驗
  163.                 if(check_value == value_array[SIZE - 1]){
  164.                         //將溫濕度擴大10 倍方便分離出每一位
  165.                         humi_value = value_array[0] * 10;
  166.                         temp_value = value_array[2] * 10;
  167.                         dht11 = 1;
  168.         //                EA = 1;
  169.                         return OK; //正確的讀出dht11 輸出的數據
  170.                 }
  171.                 else{
  172.                         //校驗數據出錯
  173.         //                EA = 1;
  174.                         return ERROR;
  175.                 }
  176.         }
  177. }
  178. /*****************************************************************************/
  179. /*****************************************************************************/
  180. /************************************************************************/
復制代碼

所有資料51hei提供下載:
1985486dht11.zip (1.83 KB, 下載次數: 146)


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

使用道具 舉報

沙發
ID:358458 發表于 2018-6-26 02:24 | 只看該作者
串口讀出01010101....
回復

使用道具 舉報

板凳
ID:382584 發表于 2018-8-3 15:48 | 只看該作者
學習學習,萌新
回復

使用道具 舉報

地板
ID:503018 發表于 2019-5-11 16:01 | 只看該作者
看不懂啊,能詳細一點不啊
回復

使用道具 舉報

5#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表