找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2213|回复: 1
收起左侧

基于51单片机的1602液晶屏显示DHT11温湿度程序

[复制链接]
ID:439115 发表于 2018-12-4 12:09 | 显示全部楼层 |阅读模式
基于51单片机的1602液晶屏显示DHT11温湿度

单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit leden=P1^0;   //EN使能
  6. sbit ledrs=P1^2;   //高写指令低写数据
  7. sbit ledbj=P1^4;
  8. sbit Data=P3^6;   //定义数据线
  9. uchar rec_dat[11];   //用于显示的接收数据数组
  10. uchar num,i;
  11. uchar code table[]="I LIKE QAU";
  12. void csh();
  13. void delay1ms(uint a);
  14. void DHT11_delay_us(uchar n);
  15. void DHT11_delay_ms(uint z);
  16. void DHT11_start();
  17. void DHT11_receive();
  18. void com(uchar c);
  19. void dat(uchar d);        
  20. void main()
  21.         {  

  22.                 com(0x01);         //清屏
  23.                 csh();         
  24.                 while(1)
  25.                 {
  26.                 DHT11_delay_ms(1500);    //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
  27.                 com(0x80+0x02);
  28.                 DHT11_receive();
  29.                 for(i=0;i<11;i++)                //显示温度数据
  30.                 dat(rec_dat[i]);
  31.                 }  
  32.                                                         
  33. }
  34. void csh()         //1602初始化
  35. {        ledbj=0;
  36.         leden=0;
  37.         com(0x38);
  38.         com(0x0C);
  39.         com(0x06);
  40.         com(0x80);
  41.         com(0x80+0x43);
  42.                 for(num=0;num<10;num++)          //显示table1值
  43.         {
  44.                 dat(table[num]);
  45.                 delay1ms(200);
  46.         }         
  47. }
  48. void delay1ms(uint a) //100000=1s,1ms=100
  49. {        uint i,j;
  50.         for(i=a;i>0;i--)
  51.         for(j=100;j>0;j--);
  52. }
  53. void com(uchar com)          //写指令
  54. {
  55.         ledrs=0;
  56.         P2=com;
  57.         delay1ms(5); //
  58.         leden=1;
  59.         delay1ms(5);
  60.         leden=0;        
  61. }
  62. void dat(uchar dat)          //写数据
  63. {
  64.         ledrs=1;
  65.         P2=dat;
  66.         delay1ms(5);
  67.         leden=1;
  68.         delay1ms(5);
  69.         leden=0;        
  70. }

  71. void DHT11_delay_us(uchar n)
  72. {
  73.     while(--n);
  74. }

  75. void DHT11_delay_ms(uint z)
  76. {
  77.    uint i,j;
  78.    for(i=z;i>0;i--)
  79.       for(j=110;j>0;j--);
  80. }
  81. void DHT11_start()
  82. {
  83.    Data=1;
  84.    DHT11_delay_us(2);
  85.    Data=0;
  86.    DHT11_delay_ms(20);   //延时18ms以上
  87.    Data=1;
  88.    DHT11_delay_us(30);
  89. }
  90. uchar DHT11_rec_byte()      //接收一个字节
  91. {
  92.    uchar i,dat=0;
  93.   for(i=0;i<8;i++)    //从高到低依次接收8位数据
  94.    {         
  95.       while(!Data);   ////等待50us低电平过去
  96.       DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0
  97.       dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
  98.       if(Data==1)    //数据为1时,使dat加1来接收数据1
  99.          dat+=1;
  100.       while(Data);  //等待数据线拉低   
  101.     }  
  102.     return dat;
  103. }  
  104. void DHT11_receive()      //接收40位的数据
  105. {
  106.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  107.     DHT11_start();
  108.     if(Data==0)
  109.     {
  110.         while(Data==0);   //等待拉高     
  111.         DHT11_delay_us(40);  //拉高后延时80us
  112.         R_H=DHT11_rec_byte();    //接收湿度高八位  
  113.         R_L=DHT11_rec_byte();    //接收湿度低八位  
  114.         T_H=DHT11_rec_byte();    //接收温度高八位  
  115.         T_L=DHT11_rec_byte();    //接收温度低八位
  116.         revise=DHT11_rec_byte(); //接收校正位

  117.         DHT11_delay_us(25);    //结束

  118.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  119.         {
  120.             RH=R_H;
  121.             RL=R_L;
  122.             TH=T_H;
  123.             TL=T_L;
  124.         }
  125.         /*数据处理*/
  126.             rec_dat[0]=' ';
  127.         rec_dat[1]='T';
  128.         rec_dat[2]='E';
  129.         rec_dat[3]='M';
  130.         rec_dat[4]=' ';
  131.                 rec_dat[5]=' ';
  132.         rec_dat[6]='0'+(TH/10);
  133.         rec_dat[7]='0'+(TH%10);        
  134.                 rec_dat[8]='.';
  135.                 rec_dat[9]='0'+TL;
  136.                 rec_dat[10]='C';

  137.                 if(TH>=32)
  138.                 {
  139.                 ledbj=1;
  140.                 }
  141.                 else
  142.                 {
  143.                 ledbj=0;
  144.                 }
  145.     }
  146. }
复制代码

所有资料51hei提供下载:
测量温度显示.zip (90.98 KB, 下载次数: 41)
回复

使用道具 举报

ID:303240 发表于 2018-12-19 23:38 | 显示全部楼层
你写的是些什么东西啊 直接乱搞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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