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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2701|回復: 2
收起左側

DHT11溫濕度傳感器程序

[復制鏈接]
ID:843201 發表于 2020-11-13 18:09 | 顯示全部樓層 |閱讀模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit IO=P3^2;
  6. sbit lcden=P3^4;
  7. sbit lcdrs=P3^5;
  8. sbit lcdrw=P3^6;
  9. uchar data_byte;
  10. uchar RH,RL,TH,TL;

  11. void delay(uchar ms) // 延時模塊
  12. {
  13.         uint i,j;
  14.         for(i=ms;i>0;i--)
  15.                 for(j=110;j>0;j--);
  16. }
  17. void delayms()        //一個for循環大概需要8個多機器周期一個機器周期為1us  
  18. {                    //本函數延時8us多
  19.    uchar i;                        
  20.    for(i=0;i<1;i++);
  21. }
  22. void writecom(uchar com)
  23. {
  24.         lcdrs=0;
  25.         P0=com;
  26.         delay(5);
  27.         lcden=1;
  28.         delay(5);
  29.         lcden=0;
  30. }
  31. void writedata(uchar date)
  32. {
  33.         lcdrs=1;
  34.         P0=date;
  35.         delay(5);
  36.         lcden=1;
  37.         delay(5);
  38.         lcden=0;
  39. }
  40. void lcd_init()
  41. {
  42.         lcden=0;
  43.         lcdrw=0;
  44.         writecom(0x38);
  45.         writecom(0x0c);
  46.         writecom(0x06);
  47.         writecom(0x01);
  48. }
  49. void display(uchar addr,uchar q)
  50. {
  51.         delay(10);
  52.         writecom(addr|0x80);
  53.         writedata(q);
  54.         delay(1);
  55. }
  56.                 //DHT11測試
  57. void start()// 開始信號
  58. {
  59.         IO=1;
  60.         delayms();
  61.         IO=0;
  62.         delay(25);        // 主機把總線拉低必須大于 18ms 保證 DHT11 能檢測到起始信號
  63.         IO=1;                         //發送開始信號結束后 拉高電平延時 20-40us
  64.         delayms();        // 以下三個延時函數差不多為 24us 符合要求
  65.         delayms();
  66.         delayms();
  67. }
  68. uchar receive_byte()//接收一個字節
  69. {
  70.     uchar i,temp;
  71.     for(i=0;i<8;i++)        // 接收 8bit 的數據
  72.         {
  73.         while(!IO);        // 等待 50us的低電平開始信號結束
  74.         delayms();        //開始信號結束之后 延時 26us-28us 以下三個延時函數
  75.         delayms();        
  76.         delayms();
  77.         temp=0;                        //時間為 26us-28us 表示接收的為數據 '0'
  78.         if(IO==1)
  79.         temp=1;                 //如果 26us-28us之后 還為高電平 則表示接收的數據為 '1'
  80.         while(IO);        // 等待數據信號高電平 '0'為 26us-28us '1'為 70us
  81.         data_byte<<=1;        // 接收的數據為高位在前 右移
  82.         data_byte|=temp;
  83.         }                                           
  84.                 return data_byte;
  85. }
  86. void receive()// 接收數據
  87. {
  88.     uchar T_H,T_L,R_H,R_L,check,num_check,i;
  89.     start();// 開始信號
  90.     IO=1;         //主機設為輸入 判斷從機 DHT11 響應信號
  91.     if(!IO)        // 判斷從機是否有低電平響應信號
  92.         {
  93.                 while(!IO);                        // 判斷從機發出 80us 的低電平響應信號是否結束
  94.         while(IO);        // 判斷從機發出 80us 的高電平是否結束 如結束則主機進入數據接收狀態
  95.         R_H=receive_byte();// 濕度高位
  96.         R_L=receive_byte();// 濕度低位
  97.         T_H=receive_byte();// 溫度高位
  98.         T_L=receive_byte();// 溫度低位
  99.         check=receive_byte();// 校驗位
  100.         IO=0;                                         // 當最后一 bit 數據接完畢后 從機拉低電平 50us
  101.             for(i=0;i<7;i++)// 差不多 50us 的延時
  102.                 delayms();
  103.         IO=1;                // 總線由上拉電阻拉高 進入空閑狀態
  104.         num_check=R_H+R_L+T_H+T_L;
  105.         if(num_check==check)                // 判斷讀到的四個數據之和是否與校驗位相同
  106.                 {
  107.                 RH=R_H;
  108.                 RL=R_L;
  109.                 TH=T_H;
  110.                 TL=T_L;
  111.                 check=num_check;
  112.                 }}}

  113. void main()
  114. {
  115.         lcd_init();// 初始化LCD
  116.         while(1)
  117.         {
  118.                 receive();// 接收數據       
  119.                 display(0x00,'R');//LCD 的第一行顯示
  120.                 display(0x01,':');
  121.                 display(0x02,RH/10+0x30);         //0x30 表示 帶字庫的 LCD1602 中 0x30 的位置放有數字 0 RH/10+0x30 即表示濕度的十位數字在字庫 RH/10+0x30 的位置處放著
  122.                 display(0x03,RH%10+0x30);
  123.                 display(0x04,'.');
  124.                 display(0x05,RL+0x30);        
  125.                 display(0X06,'%');

  126.                 display(0x40,'T');
  127.                 display(0x41,':');
  128.                 display(0x42,TH/10+0x30);
  129.                 display(0x43,TH%10+0x30);                 
  130.                 display(0x44,'.');
  131.                 display(0x45,TL+0x30);           //溫度的小數部分就一位數,范圍0-9
  132.                 display(0x46,0xdf);                        //溫度單位
  133.                 display(0x47,0x43);
  134.         } }
復制代碼

DHT11.zip

3.52 KB, 下載次數: 45, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:372579 發表于 2021-7-2 17:28 來自手機 | 顯示全部樓層
有原理圖配上
回復

使用道具 舉報

ID:918298 發表于 2021-8-11 11:11 | 顯示全部樓層
為什么我顯示的一直是0,我用這個程序和我原來的程序都是顯示0,求解?謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲天堂中文字幕 | 中文字幕日韩一区 | 国产电影一区二区三区爱妃记 | 日韩精品在线播放 | 欧美日韩国产精品激情在线播放 | 成人动漫视频网站 | 91精品国产手机 | 国产激情视频网 | 国产精品福利在线观看 | 二区在线观看 | 日本精品久久久久久久 | 国产99视频精品免视看9 | 日韩视频在线免费观看 | 国产探花在线精品一区二区 | 精品国产乱码久久久久久果冻传媒 | 在线日韩中文字幕 | 一区二区三区不卡视频 | 国产精品影视在线观看 | 在线免费观看日本视频 | 午夜网 | 日本三级黄视频 | 国产一级一级毛片 | 久久欧美高清二区三区 | 久久蜜桃av | 国产乱码精品一品二品 | 久久精品色欧美aⅴ一区二区 | 韩国av一区二区 | 一区二区视频在线 | 九九热在线视频 | 欧美久久久久久 | 亚洲国产精品视频一区 | 一区二区三区国产精品 | 亚洲国产成人av好男人在线观看 | 欧美在线视频一区二区 | 免费看黄色国产 | 春色av| 亚州无限乱码 | 国产精品一区三区 | 日韩一区二区三区视频在线播放 | 欧美激情欧美激情在线五月 | 日本午夜精品 |