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

標題: DHT11溫濕度傳感器程序 [打印本頁]

作者: 1112W    時間: 2020-11-13 18:09
標題: DHT11溫濕度傳感器程序
  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


作者: aide51    時間: 2021-7-2 17:28
有原理圖配上
作者: sk1    時間: 2021-8-11 11:11
為什么我顯示的一直是0,我用這個程序和我原來的程序都是顯示0,求解?謝謝




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 狠狠干狠狠操 | 中文字幕第一区综合 | av一二三| 99久久综合 | 欧美在线免费观看视频 | 成人在线一区二区 | 欧美精品国产 | av黄色在线观看 | 三级黄色网址 | 91免费视频 | 成人在线视频免费 | 欧美视频免费 | 久久精品欧美一区 | 色激情网| 性做久久 | 真人毛片免费看 | 91免费福利视频 | 51av视频| 国产成人午夜 | 天天操天天操 | 久久成人av | 欧美爱爱视频 | 久草热视频| 一区二区欧美日韩 | 特级丰满少妇一级aaaa爱毛片 | 亚洲一级在线 | 日韩黄色片 | 亚洲成人免费在线 | 精品第一页 | 亚洲天堂久久 | 毛片在线视频 | 插少妇| 肉丝美脚视频一区二区 | 国内av在线 | 日韩欧美一级 | 日韩欧美在线免费观看 | 国产成人av网站 | 午夜拍拍 | 亚洲一区二区精品视频 | 久久日本 | 欧美成人一区二区 |