0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Proteus教程:DHT11读取和显示

Harmony&嵌入式学习 来源:Harmony&嵌入式学习 作者:Harmony&嵌入式学 2023-06-14 11:37 次阅读

视频教程::https://www.bilibili.com/video/BV1xb4y187rF

poYBAGSJNdKAUtpJAAJ-N6UVQmo260.pngpYYBAGSJNdeATEg5AADyNbZ-DGk852.png
#include< reg51.h >
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;

sbit Data=P3^0;   //定义数据线
uchar T_RH,T_TH;
/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能		   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //选择发送命令
	LCD1602_RW = 0;	   //选择写入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待数据稳定

	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(5);	  //保持时间
	LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/		   	   
void LcdWriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;	//使能清零
	LCD1602_RS = 1;	//选择输入数据
	LCD1602_RW = 0;	//选择写入

	LCD1602_DATAPINS = dat; //写入数据
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   //写入时序
	Lcd1602_Delay1ms(5);   //保持时间
	LCD1602_E = 0;
}


/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能		 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/		   
void LcdInit()						  //LCD初始化子程序
{
 	LcdWriteCom(0x38);  //开显示
	LcdWriteCom(0x0c);  //开显示不显示光标
	LcdWriteCom(0x06);  //写一个指针加1
	LcdWriteCom(0x01);  //清屏
	LcdWriteCom(0x80);  //设置数据指针起点
}




//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 X |= 0x80; // 算出指令码
 LcdWriteCom(X); //这里不检测信号,发送地址码
 LcdWriteData(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
 unsigned char ListLength;

  ListLength = 0;
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 while (DData[ListLength]>=0x20) //若到达字串尾则退出
  {
   if (X <= 0xF) //X坐标应小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
     ListLength++;
     X++;
    }
  }
}


void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i >0;i--)
      for(j=110;j>0;j--);
}
void DHT11_delay_us(uchar n)
{
    while(--n);
}

void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(30);   //延时18ms以上
   Data=1;
   DHT11_delay_us(30);
}

uchar DHT11_rec_byte()      //接收一个字节
{
   uchar i,dat=0;
  for(i=0;i< 8;i++)    //从高到低依次接收8位数据
   {          
      while(!Data);   ////等待50us低电平过去
      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 
      dat< <=1;           //移位使正确接收8位数据,数据为0时直接移位
      if(Data==1)    //数据为1时,使dat加1来接收数据1
         dat+=1;
      while(Data);  //等待数据线拉低    
    }  
    return dat;
}

void DHT11_receive()      //接收40位的数据
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);   //等待拉高     
        DHT11_delay_us(40);  //拉高后延时80us
        R_H=DHT11_rec_byte();    //接收湿度高八位  
        R_L=DHT11_rec_byte();    //接收湿度低八位  
        T_H=DHT11_rec_byte();    //接收温度高八位  
        T_L=DHT11_rec_byte();    //接收温度低八位
        revise=DHT11_rec_byte(); //接收校正位

        DHT11_delay_us(25);    //结束

        if((R_H+R_L+T_H+T_L)==revise)      //校正
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        } 
			T_RH = RH;
			T_TH = TH;
    }
}

void main()
{
	LcdInit();
	DisplayListChar(0,0,"asd");
	while(1)
	{
		DHT11_receive();
		DisplayOneChar(0,1,(char)(T_RH/10 + '0'));
		DisplayOneChar(1,1,(char)(T_RH%10 + '0'));
		
		DisplayOneChar(5,1,(char)(T_TH/10 + '0'));
		DisplayOneChar(6,1,(char)(T_TH%10 + '0'));
		Lcd1602_Delay1ms(100);
	}
}


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2545

    文章

    50384

    浏览量

    750670
  • Proteus
    +关注

    关注

    79

    文章

    1692

    浏览量

    106254
  • DHT11
    +关注

    关注

    19

    文章

    276

    浏览量

    57507
收藏 人收藏

    评论

    相关推荐

    采用STMCubeMX+Proteus仿真DHT11的方法

    本文说明开发工具:STM32CubeMX+Keil5开发芯片:STM32F103R6采温模块:DHT11数显屏幕:LCD1602仿真软件:Proteus 8.12项目目标:DHT11读取
    发表于 11-30 08:03

    如何通过控制DHT11模块时序来对DHT11传感器进行控制和数据的读取

    如何通过控制DHT11模块时序来对DHT11传感器进行控制和数据的读取
    发表于 01-17 06:40

    DHT11模块资料

    DHT11模块资料,关于如何使用dht11温湿度传感器的方法以及相关例程。
    发表于 03-16 15:31 93次下载

    DHT11(51数码管显示

    DHT11温湿度传感器(51数码管显示)测试程序。
    发表于 05-06 11:47 74次下载

    DHT11程序

    DHT11学习
    发表于 12-28 11:07 38次下载

    dht11的工作原理_dht11接线图

    本文介绍了DHT11技术参数、DHT11的特性与dht11典型应用电路,其次详细的介绍了dht11工作原理与引脚说明,最后介绍了dht11
    发表于 01-22 16:11 23.6w次阅读

    DHT11的使用注意事项

    本文介绍了DHT11传感器性能参数、DHT11传感器电气特性以及 DHT11封装形式及接口说明,最后详细用例子来说明DHT11的使用以及DHT11
    发表于 01-26 14:27 6.2w次阅读

    为什么加入dht11的例程读取不到dht11的数据应该如何解决

     最近遇到了一个十分坑爹的问题,就是在调试我的毕业设计时候。在加入dht11的例程时,怎么都读取不到dht11的数据。
    发表于 07-02 17:42 24次下载
    为什么加入<b class='flag-5'>dht11</b>的例程<b class='flag-5'>读取</b>不到<b class='flag-5'>dht11</b>的数据应该如何解决

    STMCubeMX+Proteus仿真DHT11(LCD1602显示)

    本文说明开发工具:STM32CubeMX+Keil5开发芯片:STM32F103R6采温模块:DHT11数显屏幕:LCD1602仿真软件:Proteus 8.12项目目标:DHT11读取
    发表于 11-21 14:06 49次下载
    STMCubeMX+<b class='flag-5'>Proteus</b>仿真<b class='flag-5'>DHT11</b>(LCD1602<b class='flag-5'>显示</b>)

    DHT11温湿度传感器(详细)

    DHT11温度传感器——使用LCD1602显示先上效果图,以及简单的和室内温度对比图,相交而言测量的值还是非常准的。原理讲解◎外设读取步骤主机和从机之间的通信可通过如下几个步骤完成(外设(如微处理器
    发表于 12-02 21:06 85次下载
    <b class='flag-5'>DHT11</b>温湿度传感器(详细)

    Stm32 DHT11

    DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。Stm32 驱动DHT11读取环境温湿度
    发表于 12-17 18:23 79次下载
    Stm32 <b class='flag-5'>DHT11</b>

    FPGA在OLED上显示DHT11数据

    这是FPGA之旅设计的第十三例啦,本例是一个综合性的例程,基于OLED屏幕显示,和DHT11温湿度采集,将DHT11采集到的温湿度显示到OLED屏幕上。
    的头像 发表于 09-09 10:33 1688次阅读

    用Arduino读取DHT22(或DHT11

    电子发烧友网站提供《用Arduino读取DHT22(或DHT11).zip》资料免费下载
    发表于 11-16 11:02 1次下载
    用Arduino<b class='flag-5'>读取</b><b class='flag-5'>DHT</b>22(或<b class='flag-5'>DHT11</b>)

    如何使用Blynk从DHT11读取温度和湿度

    电子发烧友网站提供《如何使用Blynk从DHT11读取温度和湿度.zip》资料免费下载
    发表于 02-07 13:56 0次下载
    如何使用Blynk从<b class='flag-5'>DHT11</b><b class='flag-5'>读取</b>温度和湿度

    Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示

    Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示
    的头像 发表于 08-13 18:04 852次阅读
    Arduino Nano 和 NodeMCU ESP8266 <b class='flag-5'>读取</b> <b class='flag-5'>DHT11</b> 环境温湿度数据及 OLED<b class='flag-5'>显示</b>