最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

1602的DHT11温湿度显示程序

IT圈 admin 25浏览 0评论

2024年4月2日发(作者:折静竹)

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

DHT11使用范例

单片机: STC89C52RC

功能 :1602实时显示温湿度

硬件连接: P2.7口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地

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

#include

#include

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符

号8位整型变量 */

//typedef signed char S8; /* defined for signed 8-bits integer variable 有符

号8位整型变量 */

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符

号16位整型变量 */

//typedef signed int S16; /* defined for signed 16-bits integer variable 有符

号16位整型变量 */

//typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符

号32位整型变量 */

//typedef signed long S32; /* defined for signed 32-bits integer variable 有符

号32位整型变量 */

//typedef float F32; /* single precision floating point variable (32bits) 单精度

浮点数(32位长度) */

//typedef double F64; /* double precision floating point variable (64bits) 双精

度浮点数(64位长度) */

sbit P2_7 = P2^7 ;//定义DHT11通信IO口

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

变量定义

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

U8 U8FLAG,k;

U8 U8count,U8temp;

U8

U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata,RH_shi,RH_ge,T_shi,T_ge;

U8

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_te

mp;

U8 U8comdata;

void Delay_1(U16 j)

{ U8 i;

for(;j>0;j--)

{

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

}

}

void Delay_10us(void)

{

U8 i;

i--;

i--;

i--;

i--;

i--;

i--;

}

void COM(void)

{

U8 i;

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

{

U8FLAG=2;

while((!P2_7)&&U8FLAG++);

Delay_10us();

Delay_10us();

Delay_10us();

U8temp=0;

if(P2_7)U8temp=1;

U8FLAG=2;

while((P2_7)&&U8FLAG++);

if(U8FLAG==1)break; //超时则跳出for循环

//判断数据位是0还是1

// 如果高电平高过预定0高电平值则数据位为 1

U8comdata<<=1;

U8comdata|=U8temp; //0

}//rof

}

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

-----湿度读取子程序 ------------

--------------------------------

----以下变量均为全局变量--------

----温度高8位== U8T_data_H------

----温度低8位== U8T_data_L------

----湿度高8位== U8RH_data_H-----

----湿度低8位== U8RH_data_L-----

----校验 8位 == U8checkdata-----

----调用相关子程序如下----------

---- Delay();, Delay_10us();,COM();

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

void RH(void)

{

//主机拉低18ms

P2_7=0;

Delay_1(180);

P2_7=1;

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

Delay_10us();

Delay_10us();

Delay_10us();

Delay_10us();

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

P2_7=1;

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

if(!P2_7) //T !

{

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束

while((!P2_7)&&U8FLAG++);

U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

while((P2_7)&&U8FLAG++);

//数据接收状态

COM();

U8RH_data_H_temp=U8comdata;

COM();

U8RH_data_L_temp=U8comdata;

COM();

U8T_data_H_temp=U8comdata;

COM();

U8T_data_L_temp=U8comdata;

COM();

U8checkdata_temp=U8comdata;

P2_7=1;

//数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp)

{

U8RH_data_H=U8RH_data_H_temp;

U8RH_data_L=U8RH_data_L_temp;

U8T_data_H=U8T_data_H_temp;

U8T_data_L=U8T_data_L_temp;

U8checkdata=U8checkdata_temp;

}//fi

}//fi

}

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

函数功能:数进制转换

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

void Shuzhuanhuan()

{

RH_shi=(unsigned char)U8RH_data_H/10;

RH_ge=U8RH_data_H%10;

T_shi=U8T_data_H/10;

T_ge=U8T_data_H%10;

}

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

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

sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚

unsigned char code digit[ ]={""}; //定义字符数组显示数字,液晶只能显示ASCII,其

中的7为0011 0111

//RH_shi中7是0000 0111,

unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃ */

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

函数功能:延时1ms

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

void delay1ms()

{

unsigned char i,j;

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

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

;

}

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

函数功能:延时若干毫秒

入口参数:n

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

void delay(unsigned int n)

{

unsigned int i;

for(i=0;i

delay1ms();

}

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

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

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

bit BusyTest(void)

{

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1; //E=1,才允许读写

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

result=BF; //将忙碌标志电平赋给result

E=0;

return result;

}

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

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

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

void Write_com (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0; //E置低电平(写指令时,

// 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_(); //空操作两个机器周期,给硬件反应时间

P0=dictate; //将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:指定字符显示的实际地址

入口参数:x

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

void WriteAddress(unsigned char x)

{

Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

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

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

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

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0; //E置低电平(写指令时,,

// 就是让E从0到1发生正跳变,所以应先置"0"

P0=y; //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:对LCD的显示模式进行初始化设置

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

void LcdInt(void)

{

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

Write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5); //延时5ms

Write_com(0x38);

delay(5);

Write_com(0x38); //3次写 设置模式

delay(5);

Write_com(0x0F); //显示模式设置:显示开,有光标,光标闪烁

delay(5);

Write_com(0x06); //显示模式设置:光标右移,字符不移

delay(5);

Write_com(0x01); //清屏幕指令,将以前的显示内容清除

delay(5);

}

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

函数功能:显示自定义图形 ℃

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

void Zidingyi(void)

{ unsigned char j;

Write_com(0x40); //设定CGRAM地址

delay(5);

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

{

WriteData(User[j]);//写入自定义图形 ℃

}

WriteAddress(0x4c);//设定屏幕上的显示位置

delay(5);

WriteData(0x00); //从CGRAM里取出自定义图形显示

}

void main (void)

{

LcdInt();

delay(10);

while(1)

{

RH();

Shuzhuanhuan();

WriteAddress(0x02);//从第一行第三列开始显示

WriteData('s');

WriteAddress(0x03);

WriteData('h');

WriteAddress(0x04);

WriteData('i');

WriteAddress(0x05);

WriteData('d');

WriteAddress(0x06);

WriteData('u');

WriteAddress(0x07);

WriteData(':');

WriteAddress(0x08);

WriteData(digit[RH_shi]);

WriteAddress(0x09);

WriteData(digit[RH_ge]);

WriteAddress(0x0a);

WriteData('.');

WriteAddress(0x0b);

WriteData('2');

WriteAddress(0x0c);

WriteData('%');

WriteAddress(0x42);//从第一行第三列开始显示

WriteData('w');

WriteAddress(0x43);

WriteData('e');

WriteAddress(0x44);

WriteData('n');

WriteAddress(0x45);

WriteData('d');

WriteAddress(0x46);

WriteData('u');

WriteAddress(0x47);

WriteData(':');

WriteAddress(0x48);

//

}

WriteData(digit[T_shi]);

WriteAddress(0x49);

WriteData(digit[T_ge]);

WriteAddress(0x4a);

WriteData('.');

WriteAddress(0x4b);

WriteData('4');

WriteAddress(0x4c);

Zidingyi();

delay(500);

}

2024年4月2日发(作者:折静竹)

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

DHT11使用范例

单片机: STC89C52RC

功能 :1602实时显示温湿度

硬件连接: P2.7口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地

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

#include

#include

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符

号8位整型变量 */

//typedef signed char S8; /* defined for signed 8-bits integer variable 有符

号8位整型变量 */

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符

号16位整型变量 */

//typedef signed int S16; /* defined for signed 16-bits integer variable 有符

号16位整型变量 */

//typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符

号32位整型变量 */

//typedef signed long S32; /* defined for signed 32-bits integer variable 有符

号32位整型变量 */

//typedef float F32; /* single precision floating point variable (32bits) 单精度

浮点数(32位长度) */

//typedef double F64; /* double precision floating point variable (64bits) 双精

度浮点数(64位长度) */

sbit P2_7 = P2^7 ;//定义DHT11通信IO口

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

变量定义

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

U8 U8FLAG,k;

U8 U8count,U8temp;

U8

U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata,RH_shi,RH_ge,T_shi,T_ge;

U8

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_te

mp;

U8 U8comdata;

void Delay_1(U16 j)

{ U8 i;

for(;j>0;j--)

{

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

}

}

void Delay_10us(void)

{

U8 i;

i--;

i--;

i--;

i--;

i--;

i--;

}

void COM(void)

{

U8 i;

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

{

U8FLAG=2;

while((!P2_7)&&U8FLAG++);

Delay_10us();

Delay_10us();

Delay_10us();

U8temp=0;

if(P2_7)U8temp=1;

U8FLAG=2;

while((P2_7)&&U8FLAG++);

if(U8FLAG==1)break; //超时则跳出for循环

//判断数据位是0还是1

// 如果高电平高过预定0高电平值则数据位为 1

U8comdata<<=1;

U8comdata|=U8temp; //0

}//rof

}

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

-----湿度读取子程序 ------------

--------------------------------

----以下变量均为全局变量--------

----温度高8位== U8T_data_H------

----温度低8位== U8T_data_L------

----湿度高8位== U8RH_data_H-----

----湿度低8位== U8RH_data_L-----

----校验 8位 == U8checkdata-----

----调用相关子程序如下----------

---- Delay();, Delay_10us();,COM();

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

void RH(void)

{

//主机拉低18ms

P2_7=0;

Delay_1(180);

P2_7=1;

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

Delay_10us();

Delay_10us();

Delay_10us();

Delay_10us();

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

P2_7=1;

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

if(!P2_7) //T !

{

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束

while((!P2_7)&&U8FLAG++);

U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

while((P2_7)&&U8FLAG++);

//数据接收状态

COM();

U8RH_data_H_temp=U8comdata;

COM();

U8RH_data_L_temp=U8comdata;

COM();

U8T_data_H_temp=U8comdata;

COM();

U8T_data_L_temp=U8comdata;

COM();

U8checkdata_temp=U8comdata;

P2_7=1;

//数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp)

{

U8RH_data_H=U8RH_data_H_temp;

U8RH_data_L=U8RH_data_L_temp;

U8T_data_H=U8T_data_H_temp;

U8T_data_L=U8T_data_L_temp;

U8checkdata=U8checkdata_temp;

}//fi

}//fi

}

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

函数功能:数进制转换

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

void Shuzhuanhuan()

{

RH_shi=(unsigned char)U8RH_data_H/10;

RH_ge=U8RH_data_H%10;

T_shi=U8T_data_H/10;

T_ge=U8T_data_H%10;

}

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

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

sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚

unsigned char code digit[ ]={""}; //定义字符数组显示数字,液晶只能显示ASCII,其

中的7为0011 0111

//RH_shi中7是0000 0111,

unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃ */

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

函数功能:延时1ms

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

void delay1ms()

{

unsigned char i,j;

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

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

;

}

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

函数功能:延时若干毫秒

入口参数:n

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

void delay(unsigned int n)

{

unsigned int i;

for(i=0;i

delay1ms();

}

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

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

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

bit BusyTest(void)

{

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1; //E=1,才允许读写

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

result=BF; //将忙碌标志电平赋给result

E=0;

return result;

}

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

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

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

void Write_com (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0; //E置低电平(写指令时,

// 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_(); //空操作两个机器周期,给硬件反应时间

P0=dictate; //将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:指定字符显示的实际地址

入口参数:x

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

void WriteAddress(unsigned char x)

{

Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

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

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

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

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0; //E置低电平(写指令时,,

// 就是让E从0到1发生正跳变,所以应先置"0"

P0=y; //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:对LCD的显示模式进行初始化设置

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

void LcdInt(void)

{

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

Write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5); //延时5ms

Write_com(0x38);

delay(5);

Write_com(0x38); //3次写 设置模式

delay(5);

Write_com(0x0F); //显示模式设置:显示开,有光标,光标闪烁

delay(5);

Write_com(0x06); //显示模式设置:光标右移,字符不移

delay(5);

Write_com(0x01); //清屏幕指令,将以前的显示内容清除

delay(5);

}

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

函数功能:显示自定义图形 ℃

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

void Zidingyi(void)

{ unsigned char j;

Write_com(0x40); //设定CGRAM地址

delay(5);

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

{

WriteData(User[j]);//写入自定义图形 ℃

}

WriteAddress(0x4c);//设定屏幕上的显示位置

delay(5);

WriteData(0x00); //从CGRAM里取出自定义图形显示

}

void main (void)

{

LcdInt();

delay(10);

while(1)

{

RH();

Shuzhuanhuan();

WriteAddress(0x02);//从第一行第三列开始显示

WriteData('s');

WriteAddress(0x03);

WriteData('h');

WriteAddress(0x04);

WriteData('i');

WriteAddress(0x05);

WriteData('d');

WriteAddress(0x06);

WriteData('u');

WriteAddress(0x07);

WriteData(':');

WriteAddress(0x08);

WriteData(digit[RH_shi]);

WriteAddress(0x09);

WriteData(digit[RH_ge]);

WriteAddress(0x0a);

WriteData('.');

WriteAddress(0x0b);

WriteData('2');

WriteAddress(0x0c);

WriteData('%');

WriteAddress(0x42);//从第一行第三列开始显示

WriteData('w');

WriteAddress(0x43);

WriteData('e');

WriteAddress(0x44);

WriteData('n');

WriteAddress(0x45);

WriteData('d');

WriteAddress(0x46);

WriteData('u');

WriteAddress(0x47);

WriteData(':');

WriteAddress(0x48);

//

}

WriteData(digit[T_shi]);

WriteAddress(0x49);

WriteData(digit[T_ge]);

WriteAddress(0x4a);

WriteData('.');

WriteAddress(0x4b);

WriteData('4');

WriteAddress(0x4c);

Zidingyi();

delay(500);

}

发布评论

评论列表 (0)

  1. 暂无评论