找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2529|回复: 0
收起左侧

普中51单片机DHT11温湿度测量程序,LCD显示

[复制链接]
ID:707731 发表于 2020-9-20 16:15 | 显示全部楼层 |阅读模式
根据别的代码更改的一些东西,然后适用于普中的51单片机,有新手需要学习DHT11和lcd显示的可以根据这个代码学习一下,
一些重要代码有注释,能够帮助学习者更好的理解代码的意思,
代码及别的都放在压缩包里面了。
仅供学习。

单片机源程序如下:
  1. # include <reg52.h>
  2. #include <lcd.h>
  3. typedef unsigned char BYTE;    //字节
  4. typedef unsigned int WORD;     //数据
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. sbit io=P2^0;//dht11data端接单片机的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;   //独立按键
  15. sbit key2=P3^0;
  16. sbit key3=P3^2;
  17. sbit key4=P3^3;

  18. typedef bit BOOL;//此声明一个布尔型变量即真或假//

  19. uchar data_byte;    //数据字节

  20. uchar RH,RL,TH,TL;    //温湿度的字节高八位,第八位

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


  22. void delay(uchar ms) //延时模块//

  23. {

  24.   uchar i;

  25.   while(ms--)                 

  26.         

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

  28. }


  29. void delay1()//一个for循环大概需要8个多机器周期一个机器周期为1us晶振为12MHz也就是说本函数延时8us多此延时函数必须德稍微精确一点

  30. {

  31.   uchar i;

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

  33. }

  34. //**************************dht11测试某块*************************************//

  35. void start()//开始信号   

  36. {

  37.   io=1;

  38.   delay1();

  39.   io=0;

  40.   delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号

  41.   io=1;    //发送开始信号结束后拉高电平延时20-40us

  42.   delay1();//以下三个延时函数差不多为24us符合要求

  43.   delay1();

  44.   delay1();

  45. }

  46. uchar receive_byte()//接收一个字节//   //接受一个字节,改

  47. {

  48.   uchar i,temp;

  49.   for(i=0;i<8;i++)//接收8bit的数据

  50.   {

  51.         while(!io);//等待50us的低电平开始信号结束

  52.         delay1();//开始信号结束之后延时26us-28us以下三个延时函数

  53.          delay1();

  54.         delay1();

  55.         temp=0;//时间为26us-28us表示接收的为数据'0'

  56.         if(io==1)

  57.          temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'

  58.     while(io);//等待数据信号高电平'0'为26us-28us'1'为70us

  59.         data_byte<<=1;//接收的数据为高位在前右移

  60.          data_byte|=temp;

  61.   }

  62.   return data_byte;

  63. }


  64. void receive()//接收数据//     //接受数据,改

  65. {

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

  67.   start();//开始信号//

  68.   io=1;   //主机设为输入判断从机DHT11响应信号

  69.   if(!io)//判断从机是否有低电平响应信号//

  70.   {  
  71.         while(!io);//判断从机发出 80us 的低电平响应信号是否结束//

  72.         while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态

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

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

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

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

  77.         check=receive_byte();//校验位

  78.         io=0; //当最后一bit数据接完毕后从机拉低电平50us//

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

  80.         delay1();

  81.         io=1;//总线由上拉电阻拉高进入空闲状态

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

  83.         if(num_check==check)//判断读到的四个数据之和是否与校验位相同

  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()//主函数模块//

  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)    //如果按下了独立按键1,则响一下蜂鸣器
  116.   {
  117.   beep=1;
  118.   delay(100);   //延时一段时间
  119.   if(key1==0)
  120.   {
  121.   flag++;    //flag+1
  122.   LcdWriteCom(0x01);    //写指令         
  123.   display(0x00,'B');//LCD的第一行显示     //显示测得的温湿度,全在第一行显示
  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');   ///显示了个1,??
  152.    if(key2==0)         //按下按键2
  153.    {
  154.            delay(100);
  155.     if(key2==0)
  156.         {
  157.         BRH++;        //这个东西+1,设置他的数值的吧,增加
  158.        
  159.         display(0x04,BRH/10+0x30);
  160.     display(0x05,BRH%10+0x30);
  161.         }
  162.    }
  163.          if(key3==0)       //k3设置数值,减少
  164.    {
  165.            delay(100);
  166.     if(key3==0)
  167.         {
  168.         if(BRH>BRL)   
  169.         {
  170.         BRH--;  
  171.         }
  172.         else
  173.         {
  174.         beep=0;    //如果高的比低的小了,则蜂鸣器报警
  175.         delay(100);
  176.         delay(100);
  177.         beep=1;   //延时一会,响一会,就自动停止
  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;    //同样,如果低的比高的大的话,就报警
  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)   //四个一轮
  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();//接收数据

  329. display(0x00,'R');//LCD的第一行显示    //刚才是设置最高和最低吧,现在才是测量值的显示

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

  331. display(0x02,RH/10+0x30); //0x30表示带字库的LCD1602中0x30的位置放有数字0RH/10+0x30即表示湿度的十位数字在字库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);//以下两个是温度单位的处理

  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. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
温湿度DHT11----这个对普中的实现可以实现的.zip (51.56 KB, 下载次数: 102)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表