C51温湿度传感器DHT11驱动LCD1602显示程序.docx

上传人:b****5 文档编号:12213569 上传时间:2023-04-17 格式:DOCX 页数:20 大小:18.75KB
下载 相关 举报
C51温湿度传感器DHT11驱动LCD1602显示程序.docx_第1页
第1页 / 共20页
C51温湿度传感器DHT11驱动LCD1602显示程序.docx_第2页
第2页 / 共20页
C51温湿度传感器DHT11驱动LCD1602显示程序.docx_第3页
第3页 / 共20页
C51温湿度传感器DHT11驱动LCD1602显示程序.docx_第4页
第4页 / 共20页
C51温湿度传感器DHT11驱动LCD1602显示程序.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

C51温湿度传感器DHT11驱动LCD1602显示程序.docx

《C51温湿度传感器DHT11驱动LCD1602显示程序.docx》由会员分享,可在线阅读,更多相关《C51温湿度传感器DHT11驱动LCD1602显示程序.docx(20页珍藏版)》请在冰豆网上搜索。

C51温湿度传感器DHT11驱动LCD1602显示程序.docx

C51温湿度传感器DHT11驱动LCD1602显示程序

       

DHT11.c 文件 

 

#include  

#include  

//the main only needs to call getDHT11(),then the temperature and huminity was geted in  

//F16T,F16RH as float  

sbit bit11=P2^0;  

unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;  

//用于最终读取的温湿度数据 

// read 8 bits onice  

char COM(void)  

{  

  

char i,U8temp,U8comdata; 

 for(i=0;i<8;i++)  {  

     

while(!

bit11); //表示 读取的高电位延时大于20多us则读取的是1否则读取的是 

0  

//通过U8FLAG可判断

Delay_us(35);  

U8temp=0;    

if(bit11)U8temp=1;  

  

while(bit11);  

U8comdata<<=1;  

U8comdata|=U8temp; //0  }//rof  

return U8comdata;

  }  

  

//--------------------------------  

//-----温湿度读取子程序------------  //--------------------------------  //----以下变量均为全局变量--------  //----温度高8位== U8T_data_H------  //----温度低8位== U8T_data_L------  //----湿度高8位== U8RH_data_H-----  //----湿度低8位== U8RH_data_L-----  //----校验8位== U8checkdata-----  //----调用相关子程序如下----------  //---- Delay();, Delay_10us();,COM();

//--------------------------------  

  

void getDHT11(void)  {  

//主机拉低18ms  

GO1:

 

bit11=0;  

Delay_ms(20);  

bit11=1;  

//总线由上拉电阻拉高 主机延时20us  

Delay_us(60);  

 

//主机设为输入 判断从机响应信号 // 

bit11=1;  

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 

if(!

bit11)  {  

 

 while(!

bit11);  

  

while(bit11);  //数据接收状态 

//T !

     

//wait DHT goto high  

  

U8RH_data_H=COM();  

  U8RH_data_L=COM();    

U8T_data_H=COM();    

U8T_data_L=COM();    

U8checkdata=COM();  

bit11=1;  //数据校验 

  

 

if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!

=U8checkdata)  

//Ifcheck wrong,read again  

goto GO1;  }//fi  

F16T=U8T_data_H+(float)U8T_data_L/256; //change integer to float  

F16RH=U8RH_data_H+(float)U8RH_data_L/256; 

 }

LCD1602 文件 

 

#include  

#include   

#include   

#include   

#include   

#define LCD_DATA P0  

  

#define uint unsigned int  

#define uchar unsigned char 

 /*只由主函数调用的 有 Init_Lcd()  

LCD_write_str(uchar X,uchar Y,uchar *s)  //LCD1602 data transfer define  

LCD_value(unsigned char x,unsigned char y,float f)  

*/  

  

sbit LCD_RS = P2^5;  

sbit RW = P2^6;  

sbit LCD_E = P2^7;  

//1602 control define  

     

/*************************************************************************** 

 

//显示开 

//显示关 

#define LCD_CURSOR_ON 0x0A //显示光标 

//无光标 //有光标,光标闪动 //有光标,光标不闪动 

//进入模式设置指令 

//新数据后光标右移 

//新数据后光标左移 //画面可平移 //画面不可平移 

//设定显示屏或光标移动方向指令 

//光标左移1格,且AC值减1  //光标右移1格,且AC值加1  

//显示器上字符全部左移一格,但光标不动 //显示器上字符全部右移一格,但光标不动 

***************************************************************************/  

//注 有主函数调用的函数都已作说明 其他函数一般不由主函数调用

       

/**************************************************************************** 

 

*名  

*功  称:

Init_Lcd()主函数调用 能:

Lcd初始化 *入口参数:

无 *出口参数:

无 *范 

例:

在主函数中直接调用 

  

****************************************************************************/ 

 

 

//LCD初始化 

{  

  

LCD_write_char(0x38,0);  Delay_ms

(1);  

LCD_write_char(0x38,0);  Delay_ms

(1);  

LCD_write_char(0x38,0);  Delay_ms

(1);  

LCD_write_char(0x0c,0);  Delay_ms

(1);  

LCD_write_char(0x06,0);  Delay_ms

(1);  

LCD_write_char(0x0c,0);  Delay_ms

(1);  //  

}  

  

/***********************

*名  

*功  

称:

LCD_write_str(uchar X,uchar Y,uchar *s)主函数调用 能:

在指定地址写一个字符串eg:

Y=0,1,2,3,4,5,6,7,8,9,10...15。

X=0,1。

 *入口参数:

X:

横坐标Y:

纵坐标*s:

字符串首地址 *出口参数:

无 *范 

例:

 LCD_write_str(1,1,uchar *s)  

  

****************************************************************************/  

void LCD_write_str(unsigned char X,unsigned char Y,unsigned char *s)  

{  

LCD_write_char(0,' ');  

//写地址 //写显示字符 

{  

LCD_write_char( 0, *s );  s ++;  

}  

     

/***** 

 

*名  

*功  

称:

LCD_set_xy( uchar x, uchar y )  能:

指定一个地址 the optic sign flash?

  *入口参数:

X:

横坐标Y:

纵坐标 *出口参数:

无 *范 

例:

 LCD_set_xy(5,1)  CD_set_xy*********************************************************  

******/  

void LCD_set_xy( uchar x, uchar y ) //写地址函数

 {  

unsigned char address;  

if (y == 0) address = 0x80 + x; 

 else  

address = 0xc0 + x;  

LCD_write_char( address, 0 );  

}  

     

/**************************************************************************** 

 

*名  

*功  称:

LCD_en_write(void)  能:

液晶使能 *入口参数:

无 *出口参数:

无 *范 

例:

直接调用 

  

*************CD_set_xy*********************************************************  

******/  

//液晶使能 

{  

_nop_();  

LCD_E=1;//EN=1  

_nop_(); 

 LCD_E=0;//EN=0

  }  

//------------------------------------------------  

  

/****************************************************************************  

*名 称:

LCD_write_char(uchar cd,uchar ab)

*功  无效 

能:

写指令或数据 当写ab时 应使cd=0

当cd不为0则写cd且ab的赋值  

*入口参数:

cd:

指令内容ab:

数据内容 指令常量已在上面定义 但一般不用 *出口参数:

无 *范 

例:

 LCD_write_char( 0,‘f’ ) 

  

*************CD_set_xy*********************************************************  

******/  

void LCD_write_char(uchar cd,uchar ab) //写数据 

{  

Delay_us(20);  if(cd==0) 

 {  

//RS=1,写显示内容 

LCD_byte(ab); 

 }  

else  

{  

//RS=0,写命令 

LCD_byte(cd);  

}  

     

/**************************************************************************** 

 

*名  

*功  称:

LCD_byte(abc);  能:

写一个字符到or called one byte to LCD中 *入口参数:

 *出口参数:

无 

 

  

*************CD_set_xy*********************************************************  

******/  

void LCD_byte(unsigned char abc)  

{  

RW = 0;  

LCD_E = 0; 

 LCD_DATA = abc; 

 LCD_en_write();  

}  

 

//在液晶中显示浮点数函数 

LCD_value(unsigned char x,unsigned char y,float f)     

{  

//不能定义为char* str,数组长度一定要大于浮点  

数的总位数 

//1表示小数位数 小数太多 自动四舍五入 

LCD_write_str( x, y, str);  

return 0;  

  

主函数文件 

 

#include   

#include   

#include   

#include   

#include"DHT11.h"  

   

//全局变量声明 

void main ()  

{  

Init_Lcd();  

LCD_write_str(0,1,"abc"); //液晶预显示测试 

LCD_value(0,0,34.345);  

Delay_ms(2000);  

  Init_Lcd();    

while

(1)  

{  

  

getDHT11();  

LCD_write_str(0,0,"T=");  

//字符"应用转义格式 

LCD_write_str(0,1,"RH=");  

LCD_value(4,1,F16RH);  

Delay_ms(500);  

}    

}  

//以下为延时函数 

LCD_write_str(9,1,"%");             

//this is fit to old C51 12MHz, 12 devide freqency  void Delay_ms(unsigned int n)//n毫秒延时      

{  

unsigned char j;  while(n--) 

 {  

for(j=0;j<125;j++); 

 }  

}  

 

//N us延时函数 

void Delay_us(unsigned char n)  

{  

n=n/2;  

while(--n); 

 }

#include

#include

typedefunsignedcharuchar;

typedefunsignedintunint;

unsignedcharstr1[]={""};

unsignedcharstr2[]={""};

unsignedcharcodedis1[]={"TRHRH:

"};

unsignedcharcodedis2[]={"TRH  T:

"};

sbitTRH=P2^7;//温湿度传感器DHT11数据接入

sbitLCD_RS=P3^5;         

sbitLCD_RW=P3^6;

sbitLCD_EN=P3^4;

ucharTH_data,TL_data,RH_data,RL_data,CK_data;

ucharTH_temp,TL_temp,RH_temp,RL_temp,CK_temp;

ucharcom_data,untemp,temp;

ucharrespond;

/*********************************************************************************/

voiddelayNOP()

{

      _nop_();

      _nop_();

      _nop_();

      _nop_();

}

/*********************************************************************************/

/*********************************************************************************/

//毫秒级延时子程序

/*********************************************************************************/

voiddelay_ms(unsignedcharms)

{     

      unsignedchari;

      while(ms--)

      {

          for(i=0;i<150;i++)

          {

                _nop_();

                _nop_();

                _nop_();

                _nop_();

          }

      }

}

/*********************************************************************************/

/*********************************************************************************/

//5us级延时程序

/*********************************************************************************/

voiddelay_us()

{

      uchari;

      i--;

      i--;

      i--;

      i--;

      i--;

      i--;

/********************************************************************************/

/********************************************************************************/

//测试LCD忙碌状态

//lcd_busy()为1时,忙,等待。

lcd_busy()为0时,闲,可写指令与数据。

/********************************************************************************/

bitlcd_busy()

{     

      bitresult;

      LCD_RS=0;

      LCD_RW=1;

      LCD_EN=1;

      delayNOP();

      result=(bit)(P0&0x80);

      LCD_EN=0;

      return(result);

}

/*******************************************************************************/

/*******************************************************************************/

//写入指令数据到LCD

/*******************************************************************************/

voidlcd_wcmd(unsignedcharcmd)

{     

      while(lcd_busy());

      LCD_RS=0;

      LCD_RW=0;

      LCD_EN=0;

      _nop_();

      _nop_(); 

      P0=cmd;

      delayNOP();

      LCD_EN=1;

      delayNOP();

      LCD_EN=0; 

}

/*****************************************************************************/

/*****************************************************************************/

//写显示数据到LCD                                

//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。

                    

/*****************************************************************************/

voidlcd_wdata(unsignedchardat)

{                  

      while(lcd_busy());

      LCD_RS=1;

      LCD_RW=0;

      LCD_EN=0;

      P0=dat;

      delayNOP();

      LCD_EN=1;

      delayNOP();

      LCD_EN=0; 

}

/****************************************************************************/

/****************************************************************************/

//LCD初始化设定

/****************************************************************************/

voidlcd_init()

      delay_ms(15);         

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1