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

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

QQ登錄

只需一步,快速開始

搜索
查看: 2977|回復(fù): 0
收起左側(cè)

普中51單片機(jī)DHT11溫濕度測(cè)量程序,LCD顯示

[復(fù)制鏈接]
ID:707731 發(fā)表于 2020-9-20 16:15 | 顯示全部樓層 |閱讀模式
根據(jù)別的代碼更改的一些東西,然后適用于普中的51單片機(jī),有新手需要學(xué)習(xí)DHT11和lcd顯示的可以根據(jù)這個(gè)代碼學(xué)習(xí)一下,
一些重要代碼有注釋,能夠幫助學(xué)習(xí)者更好的理解代碼的意思,
代碼及別的都放在壓縮包里面了。
僅供學(xué)習(xí)。

單片機(jī)源程序如下:
  1. # include <reg52.h>
  2. #include <lcd.h>
  3. typedef unsigned char BYTE;    //字節(jié)
  4. typedef unsigned int WORD;     //數(shù)據(jù)
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. sbit io=P2^0;//dht11data端接單片機(jī)的P2^7口//

  8. sbit jd1=P2^5;   //??
  9. sbit jd2=P2^4;
  10. sbit jd3=P2^3;
  11. sbit jd4=P2^2;

  12. sbit beep=P2^6;  //蜂鳴器
  13. sbit dj=P2^1;    //??

  14. sbit key1=P3^1;   //獨(dú)立按鍵
  15. sbit key2=P3^0;
  16. sbit key3=P3^2;
  17. sbit key4=P3^3;

  18. typedef bit BOOL;//此聲明一個(gè)布爾型變量即真或假//

  19. uchar data_byte;    //數(shù)據(jù)字節(jié)

  20. uchar RH,RL,TH,TL;    //溫濕度的字節(jié)高八位,第八位

  21. char BRH=70,BRL=50,BTH=33,BTL=29;    //??


  22. void delay(uchar ms) //延時(shí)模塊//

  23. {

  24.   uchar i;

  25.   while(ms--)                 

  26.         

  27. for(i=0;i<100;i++);

  28. }


  29. void delay1()//一個(gè)for循環(huán)大概需要8個(gè)多機(jī)器周期一個(gè)機(jī)器周期為1us晶振為12MHz也就是說本函數(shù)延時(shí)8us多此延時(shí)函數(shù)必須德稍微精確一點(diǎn)

  30. {

  31.   uchar i;

  32.   for(i=0;i<1;i++);

  33. }

  34. //**************************dht11測(cè)試某塊*************************************//

  35. void start()//開始信號(hào)   

  36. {

  37.   io=1;

  38.   delay1();

  39.   io=0;

  40.   delay(25);// 主機(jī)把總線拉低必須大于18ms保證DHT11能檢測(cè)到起始信號(hào)

  41.   io=1;    //發(fā)送開始信號(hào)結(jié)束后拉高電平延時(shí)20-40us

  42.   delay1();//以下三個(gè)延時(shí)函數(shù)差不多為24us符合要求

  43.   delay1();

  44.   delay1();

  45. }

  46. uchar receive_byte()//接收一個(gè)字節(jié)//   //接受一個(gè)字節(jié),改

  47. {

  48.   uchar i,temp;

  49.   for(i=0;i<8;i++)//接收8bit的數(shù)據(jù)

  50.   {

  51.         while(!io);//等待50us的低電平開始信號(hào)結(jié)束

  52.         delay1();//開始信號(hào)結(jié)束之后延時(shí)26us-28us以下三個(gè)延時(shí)函數(shù)

  53.          delay1();

  54.         delay1();

  55.         temp=0;//時(shí)間為26us-28us表示接收的為數(shù)據(jù)'0'

  56.         if(io==1)

  57.          temp=1; //如果26us-28us之后還為高電平則表示接收的數(shù)據(jù)為'1'

  58.     while(io);//等待數(shù)據(jù)信號(hào)高電平'0'為26us-28us'1'為70us

  59.         data_byte<<=1;//接收的數(shù)據(jù)為高位在前右移

  60.          data_byte|=temp;

  61.   }

  62.   return data_byte;

  63. }


  64. void receive()//接收數(shù)據(jù)//     //接受數(shù)據(jù),改

  65. {

  66.   uchar T_H,T_L,R_H,R_L,check,num_check,i;

  67.   start();//開始信號(hào)//

  68.   io=1;   //主機(jī)設(shè)為輸入判斷從機(jī)DHT11響應(yīng)信號(hào)

  69.   if(!io)//判斷從機(jī)是否有低電平響應(yīng)信號(hào)//

  70.   {  
  71.         while(!io);//判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束//

  72.         while(io);//判斷從機(jī)發(fā)出 80us 的高電平是否結(jié)束如結(jié)束則主機(jī)進(jìn)入數(shù)據(jù)接收狀態(tài)

  73.         R_H=receive_byte();//濕度高位

  74.         R_L=receive_byte();//濕度低位

  75.         T_H=receive_byte();//溫度高位

  76.         T_L=receive_byte();//溫度低位

  77.         check=receive_byte();//校驗(yàn)位

  78.         io=0; //當(dāng)最后一bit數(shù)據(jù)接完畢后從機(jī)拉低電平50us//

  79.         for(i=0;i<7;i++)//差不多50us的延時(shí)

  80.         delay1();

  81.         io=1;//總線由上拉電阻拉高進(jìn)入空閑狀態(tài)

  82.         num_check=R_H+R_L+T_H+T_L;

  83.         if(num_check==check)//判斷讀到的四個(gè)數(shù)據(jù)之和是否與校驗(yàn)位相同

  84.         {

  85.    RH=R_H;

  86.    RL=R_L;

  87.    TH=T_H;

  88.    TL=T_L;

  89.    check=num_check;

  90.         }

  91.   }

  92. }


  93. void main()//主函數(shù)模塊//

  94. {
  95.   uchar flag=0;
  96.   jd1=jd2=jd3=jd4=0;
  97.   beep=1;

  98.   LcdInit();//初始化LCD
  99.   display(0x40,'R');     //顯示的初始的東西
  100.   display(0x41,'1');
  101.   display(0x42,':');
  102.   display(0x44,'R');
  103.   display(0x45,'2');
  104.   display(0x46,':');
  105.   display(0x48,'R');
  106.   display(0x49,'3');
  107.   display(0x4a,':');
  108.   display(0x4c,'R');
  109.   display(0x4d,'4');
  110.   display(0x4e,':');
  111.   display(0x0d,'Z');
  112.   display(0x0e,':');
  113. while(1)

  114.   {
  115.   if(key1==0)    //如果按下了獨(dú)立按鍵1,則響一下蜂鳴器
  116.   {
  117.   beep=1;
  118.   delay(100);   //延時(shí)一段時(shí)間
  119.   if(key1==0)
  120.   {
  121.   flag++;    //flag+1
  122.   LcdWriteCom(0x01);    //寫指令         
  123.   display(0x00,'B');//LCD的第一行顯示     //顯示測(cè)得的溫濕度,全在第一行顯示
  124.   display(0x01,'R');//LCD的第一行顯示
  125.   display(0x02,'H');//LCD的第一行顯示
  126.   display(0x03,':');
  127.   display(0x04,BRH/10+0x30);
  128.   display(0x05,BRH%10+0x30);

  129.   display(0x09,'B');//LCD的第一行顯示
  130.   display(0x0a,'R');//LCD的第一行顯示
  131.   display(0x0b,'L');//LCD的第一行顯示
  132.   display(0x0c,':');
  133.   display(0x0d,BRL/10+0x30);
  134.   display(0x0e,BRL%10+0x30);

  135.   display(0x40,'B');//LCD的第一行顯示
  136.   display(0x41,'T');//LCD的第一行顯示
  137.   display(0x42,'H');//LCD的第一行顯示
  138.   display(0x43,':');
  139.   display(0x44,BTH/10+0x30);
  140.   display(0x45,BTH%10+0x30);

  141.   display(0x49,'B');//LCD的第一行顯示
  142.   display(0x4a,'T');//LCD的第一行顯示
  143.   display(0x4b,'L');//LCD的第一行顯示
  144.   display(0x4c,':');
  145.   display(0x4d,BTL/10+0x30);
  146.   display(0x4e,BTL%10+0x30);
  147.   }
  148.   }

  149.   if(flag==1)   //說明k1按過了
  150.   {
  151.    display(0x47,'1');   ///顯示了個(gè)1,??
  152.    if(key2==0)         //按下按鍵2
  153.    {
  154.            delay(100);
  155.     if(key2==0)
  156.         {
  157.         BRH++;        //這個(gè)東西+1,設(shè)置他的數(shù)值的吧,增加
  158.        
  159.         display(0x04,BRH/10+0x30);
  160.     display(0x05,BRH%10+0x30);
  161.         }
  162.    }
  163.          if(key3==0)       //k3設(shè)置數(shù)值,減少
  164.    {
  165.            delay(100);
  166.     if(key3==0)
  167.         {
  168.         if(BRH>BRL)   
  169.         {
  170.         BRH--;  
  171.         }
  172.         else
  173.         {
  174.         beep=0;    //如果高的比低的小了,則蜂鳴器報(bào)警
  175.         delay(100);
  176.         delay(100);
  177.         beep=1;   //延時(shí)一會(huì),響一會(huì),就自動(dòng)停止
  178.         }

  179.         display(0x04,BRH/10+0x30);
  180.     display(0x05,BRH%10+0x30);
  181.         }
  182.    }
  183.   }

  184.   if(flag==2)  //k1按了兩次
  185.   {
  186.            display(0x47,'2');  //顯示2
  187.    if(key2==0)
  188.    {
  189.            delay(100);
  190.     if(key2==0)
  191.         {
  192.         if(BRL<BRH)
  193.         {
  194.         BRL++;    //按兩次的話,是低的+1,前面按一次的話,是高的-1
  195.         }
  196.         else
  197.         {       
  198.         beep=0;    //同樣,如果低的比高的大的話,就報(bào)警
  199.         delay(100);
  200.         delay(100);
  201.         beep=1;
  202.         }

  203.         display(0x0d,BRL/10+0x30);
  204.     display(0x0e,BRL%10+0x30);
  205.         }
  206.    }
  207.          if(key3==0)  //??
  208.    {
  209.            delay(100);
  210.     if(key3==0)
  211.         {
  212.         if(BRL>0)
  213.         {
  214.         BRL--;
  215.         }
  216.         else
  217.         {       
  218.         beep=0;
  219.         delay(100);
  220.         delay(100);
  221.         beep=1;
  222.         }
  223.         display(0x0d,BRL/10+0x30);
  224.     display(0x0e,BRL%10+0x30);
  225.         }
  226.    }
  227.   }

  228.     if(flag==3)   //如果k1按了三次的話
  229.   {
  230.    display(0x47,'3');
  231.    if(key2==0)
  232.    {
  233.            delay(100);
  234.     if(key2==0)
  235.         {
  236.         BTH++;
  237.         display(0x44,BTH/10+0x30);
  238.     display(0x45,BTH%10+0x30);
  239.         }
  240.    }
  241.          if(key3==0)
  242.    {
  243.            delay(100);
  244.     if(key3==0)
  245.         {
  246.         if(BTH>BTL)
  247.         {
  248.         BTH--;
  249.         }
  250.         else
  251.         {       
  252.         beep=0;
  253.         delay(100);
  254.         delay(100);
  255.         beep=1;
  256.         }
  257.         display(0x44,BTH/10+0x30);
  258.     display(0x45,BTH%10+0x30);
  259.         }
  260.    }
  261.   }

  262.   if(flag==4)
  263.   {
  264.    display(0x47,'4');
  265.    if(key2==0)
  266.    {
  267.            delay(100);
  268.     if(key2==0)
  269.         {
  270.         if(BTL<BTH)
  271.         {
  272.         BTL++;
  273.         }
  274.         else
  275.         {       
  276.         beep=0;
  277.         delay(100);
  278.         delay(100);
  279.         beep=1;
  280.         }
  281.   display(0x4d,BTL/10+0x30);
  282.   display(0x4e,BTL%10+0x30);
  283.         }
  284.    }
  285.          if(key3==0)
  286.    {
  287.            delay(100);
  288.     if(key3==0)
  289.         {
  290.         if(BTL>0)
  291.         {
  292.         BTL--;
  293.         }
  294.         else
  295.         {       
  296.         beep=0;
  297.         delay(100);
  298.         delay(100);
  299.         beep=1;
  300.         }
  301.    display(0x4d,BTL/10+0x30);
  302.    display(0x4e,BTL%10+0x30);
  303.         }
  304.    }
  305.   }
  306.   
  307.   if(flag>4)   //四個(gè)一輪
  308.   {
  309.   flag=0;
  310.   LcdWriteCom(0x01);
  311.   }

  312.   if(flag==0)
  313.   {

  314.   display(0x40,'R');
  315.   display(0x41,'1');
  316.   display(0x42,':');
  317.   display(0x44,'R');
  318.   display(0x45,'2');
  319.   display(0x46,':');
  320.   display(0x48,'R');
  321.   display(0x49,'3');
  322.   display(0x4a,':');
  323.   display(0x4c,'R');
  324.   display(0x4d,'4');
  325.   display(0x4e,':');
  326.   display(0x0d,'Z');
  327.   display(0x0e,':');
  328. receive();//接收數(shù)據(jù)

  329. display(0x00,'R');//LCD的第一行顯示    //剛才是設(shè)置最高和最低吧,現(xiàn)在才是測(cè)量值的顯示

  330. display(0x01,':');

  331. display(0x02,RH/10+0x30); //0x30表示帶字庫的LCD1602中0x30的位置放有數(shù)字0RH/10+0x30即表示濕度的十位數(shù)字在字庫RH/10+0x30的位置處放著

  332. display(0x03,RH%10+0x30);

  333. display(0X04,'%');

  334. display(0x06,'T');

  335. display(0x07,':');

  336. display(0x08,TH/10+0x30);

  337. display(0x09,TH%10+0x30);

  338. display(0x0a,0xdf);//以下兩個(gè)是溫度單位的處理

  339. display(0x0b,0x43);
  340.   delay(100);
  341.   delay(100);


  342. if(RH>BRH||RH<BRL||TH>BTH||TH<BTL)
  343. {
  344.   beep=0;
  345. ……………………

  346. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
溫濕度DHT11----這個(gè)對(duì)普中的實(shí)現(xiàn)可以實(shí)現(xiàn)的.zip (51.56 KB, 下載次數(shù): 102)



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91av在线免费播放 | 国产成人综合亚洲欧美94在线 | 国产精品久久亚洲7777 | 毛片一级片 | 不卡一区 | 欧美11一13sex性hd | 老牛嫩草一区二区三区av | 欧美精品久久久久久久久久 | 99re热精品视频 | 国产一区二区精品在线 | 欧美国产视频一区二区 | 中文字幕亚洲精品 | 国产一区精品 | 一区二区三区回区在观看免费视频 | 古典武侠第一页久久777 | 日韩精品一区二区三区老鸭窝 | 电影午夜精品一区二区三区 | 一级片成人 | 毛片a级毛片免费播放100 | 毛片在线免费 | 成人性视频免费网站 | 国产一区二区三区四区 | 久久免费精品视频 | 99视频在线 | 国产精品免费一区二区三区四区 | 天天综合网永久 | 欧美激情一区二区三区 | 一级欧美| 欧美成视频 | 日韩国产精品一区二区三区 | 久草在线在线精品观看 | 7777精品伊人久久精品影视 | www.日韩| 天天操夜夜操免费视频 | 99精品视频在线观看 | 久久一本| 美女天堂 | 亚洲高清视频一区二区 | 日韩精品免费一区 | 少妇av片 | 成人网av |