导航:首页 > 编程语言 > dht11c51液晶显示程序

dht11c51液晶显示程序

发布时间:2022-08-19 03:05:18

Ⅰ dht11程序

#include <reg51.h>
#include <intrins.h>
//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variablexd 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variablexd 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variablexd 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variablexd 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variablexd 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variablexd 有符号32位整型变量 */
typedef float F32; /* single precision floating point variablexd (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variablexd (64bits) 双精度浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4

//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit P2_0 = P2^0 ;

//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
{
outdata[0] = a[0];
outdata[1] = a[1];
outdata[2] = a[2];
outdata[3] = a[3];
outdata[4] = a[4];
count = 1;
SBUF=outdata[0];
}

void Delay(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_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)
U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是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_0=0;
Delay(180);
P2_0=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!P2_0) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((P2_0)&&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_0=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

}

//----------------------------------------------
//main()功能描述: AT89C51 11.0592MHz 串口发
//送温湿度数据,波特率 9600
//----------------------------------------------
void main()
{
U8 i,j;

//uchar str[6]={"RS232"};
/* 系统初始化 */
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 253; // 设置初值
TL1 = 253;
TR1 = 1; // 开始计时
SCON = 0x50; //工作方式1,波特率9600bps,允许接收
ES = 1;
EA = 1; // 打开所以中断
TI = 0;
RI = 0;
SendData(str) ; //发送到串口
Delay(1); //延时100US(12M晶振)
while(1)
{

//------------------------
//调用温湿度读取子程序
RH();
//串口显示程序
//--------------------------

str[0]=U8RH_data_H;
str[1]=U8RH_data_L;
str[2]=U8T_data_H;
str[3]=U8T_data_L;
str[4]=U8checkdata;
SendData(str) ; //发送到串口
//读取模块数据周期不易小于 2S
Delay(20000);
}//elihw

}// main

void RSINTR() interrupt 4 using 2
{
U8 InPut3;
if(TI==1) //发送中断
{
TI=0;
if(count!=5) //发送完5位数据
{
SBUF= outdata[count];
count++;
}
}

if(RI==1) //接收中断
{
InPut3=SBUF;
indata[count_r]=InPut3;
count_r++;
RI=0;
if (count_r==5)//接收完4位数据
{
//数据接收完毕处理。
count_r=0;
str[0]=indata[0];
str[1]=indata[1];
str[2]=indata[2];
str[3]=indata[3];
str[4]=indata[4];
P0=0;
}
}
}
看不懂再问我

Ⅱ 基于89C51的温湿度计(传感器DHT11),LCD1602什么显示也没有,有哪几种可能问题求赐教

一般不会是传感器问题的 ,问题就是1程序卡死了,2 读取不对转换代码不对,把程序发过来看看
这是我编写的你看看正常显示前两位为温度然后湿度然后效验和
/* 本程序适用于DHT11温湿度传感器由于DHT11使用拉高总线的不同时常来代替0和1 0 28US 1 70us 同时数据送入1602a显示 */
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#define Data P0//数据端口
sbit RS = P2^4;//Pin4
sbit RW = P2^5;//Pin5
sbit E = P2^6; //Pin6
sbit dat=P1^2;
unsigned int shi_h=0,shi_l=0,wen_h=0,wen_l=0,i,xiaoyan=0;//定义湿度温度变量
unsigned char codetab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//定义1602a显示0-9
unsigned inta[16]={0} ;
voiddelayus(unsigned char i) //延时2us
{
while(--i);
}
voiddelayms(unsigned char j) //延时1ms
{
while(--j)
{
delayus(125);
delayus(125);
delayus(125);
delayus(125);
}
}
/******************************************************************/
/* 写入命令函数 1602 */
/******************************************************************/
voidWriteCommand(unsigned int c)
{
delayms(10);//操作前短暂延时,保证信号稳定代替状态监测
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/* 写入数据函数 */
/******************************************************************/
voidWriteData(unsigned char c)
{
delayms(10);;//操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/* 写入字节函数 */
/******************************************************************/
voidShowChar(unsigned char pos,unsigned int c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行则命令代码高4位为0xc p低两位表示位置显示代码只用DDRAM前16位
else
p=pos+0x80; //是第一行则命令代码高4位为0x8 p低两位表示位置显示代码只用DDRAM前16位
WriteCommand (p);//写命令写入数据指针确定行中哪一位显示
WriteData (c); //写数据
}
/******************************************************************/
/* 写入字符串函数 */
/******************************************************************/
void ShowString(unsigned char line,unsigned int *ptr)
{
unsigned char l,i;//l表示行中某一位显示
l=line<<4; //L为0x01时左移四位为了与b0H相加变为0xc
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/******************************************************************/
/* 初始化函数 */
/******************************************************************/
void InitLcd()
{
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0c); //显示开及光标设置
WriteCommand(0x01); //显示清屏

}

void main(void)
{
InitLcd(); //初始化LCD
delayms(30);
while(1)
{
dat=0;
delayms(18);//延时18ms拉低主线
dat=1;//主机拉高总线
/*delayus(20);*/
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
while(!dat);//判断从机是否相应完毕相应完毕会拉高总线
while(dat);//等待从机拉高总线准备开始传送数据
while(!dat);//判断是否开始1bit 开始会拉高总线
for(i=0;i<8;i++)
{
shi_h<<=1;//右移1位
delayus(14); //延时30us判断是否为1
if(dat)
{
shi_h++;
}
while(dat);//为一则等待从机拉低总线为零直接跳出
while(!dat);//判断是否开始1bit 开始会拉高总线
}
for(i=0;i<8;i++)
{
delayus(14);
shi_l<<=1;
if(dat)
{
shi_l++;
}
while(dat);
while(!dat);
}
for(i=0;i<8;i++)
{
delayus(14);
wen_h<<=1;
if(dat)
{
wen_h++;
}
while(dat);
while(!dat);
}
for(i=0;i<8;i++)
{
delayus(14);
wen_l<<=1;
if(dat)
{
wen_l++;
}
while(dat);
while(!dat);
}
for(i=0;i<8;i++)
{
delayus(14);
xiaoyan<<=1;
if(dat)
{
xiaoyan++;
}
while(dat);
while(!dat);
}
{
a[0]=tab[(wen_h)/10];

a[1]=tab[(wen_h)%10];

a[2]=tab[(shi_h)/10];

a[3]=tab[(shi_h)%10];
a[4]=tab[xiaoyan/10];

a[5]=tab[xiaoyan%10];
ShowString(0,a);
}
delayms(100);
shi_h=0;
wen_h=0;
shi_l=0;
wen_l=0;
xiaoyan=0;
}
}

Ⅲ 求一个AT89C51的DHT11温湿度传感器在液晶1602上显示的完整程序

我只有例程,呵呵

Ⅳ DHT11的实例程序

//****************************************************************////DHT21使用范例//单片机:AT89S52或STC89C52RC//功能:串口发送温湿度数据波特率9600//硬件连接:P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑#include<reg51.h>#include<intrins.h>//typedefunsignedcharU8;/*definedforunsigned8-bitsintegervariable无符号8位整型变量*/typedefsignedcharS8;/*definedforsigned8-bitsintegervariable有符号8位整型变量*/typedefunsignedintU16;/*definedforunsigned16-bitsintegervariable无符号16位整型变量*/typedefsignedintS16;/*definedforsigned16-bitsintegervariable有符号16位整型变量*/typedefunsignedlongU32;/*definedforunsigned32-bitsintegervariable无符号32位整型变量*/typedefsignedlongS32;/*definedforsigned32-bitsintegervariable有符号32位整型变量*/typedeffloatF32;/*(32bits)单精度浮点数(32位长度)*/typedefdoubleF64;/*(64bits)双精度浮点数(64位长度)*///#defineucharunsignedchar#defineuintunsignedint#defineData_0_time4//-----------------------------------////----------------IO口定义区--------------------////----------------------------------------//sbitP2_0=P2^0;//DATAsbitP2_1=P2^1;sbitP2_2=P2^2;sbitP2_3=P2^3;//---------------------------------------------////----------------定义区--------------------////--------------------------------------------//U8U8FLAG,k;U8U8count,U8temp;U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8U8comdata;U8outdata[5];//定义发送的字节数U8indata[5];U8count,count_r=0;U8str[5]={RS232};U16U16temp1,U16temp2;SendData(U8*a){outdata[0]=a[0];outdata[1]=a[1];outdata[2]=a[2];outdata[3]=a[3];outdata[4]=a[4];count=1;SBUF=outdata[0];}voidDelay(U16j){U8i;for(;j>0;j--){for(i=0;i<27;i++);}}voidDelay_10us(void){U8i;i--;i--;i--;i--;i--;i--;}voidCOM(void){U8i;for(i=0;i<8;i++){U8FLAG=2;//----------------------P2_1=0;//TP2_1=1;//T//----------------------while((!P2_0)&&U8FLAG++);Delay_10us();Delay_10us();//Delay_10us();U8temp=0;if(P2_0)U8temp=1;U8FLAG=2;while((P2_0)&&U8FLAG++);//----------------------P2_1=0;//TP2_1=1;//T//----------------------//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1//如果高电平高过预定0高电平值则数据位为1U8comdata<<=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();//--------------------------------voidRH(void){//主机拉低18msP2_0=0;Delay(180);P2_0=1;//总线由上拉电阻拉高主机延时20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();//主机设为输入判断从机响应信号P2_0=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_0)//T!{U8FLAG=2;//判断从机是否发出80us的低电平响应信号是否结束while((!P2_0)&&U8FLAG++);U8FLAG=2;//判断从机是否发出80us的高电平,如发出则进入数据接收状态while((P2_0)&&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_0=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}//---------------------------------------//main()功能描述:AT89C5111.0592MHz串口发//送温湿度数据,波特率9600//----------------------------------------------voidmain(){U8i,j;//ucharstr[6]={RS232};/*系统初始化*/TMOD=0x20;//定时器T1使用工作方式2TH1=253;//设置初值TL1=253;TR1=1;//开始计时SCON=0x50;//工作方式1,波特率9600bps,允许接收ES=1;EA=1;//打开所以中断TI=0;RI=0;SendData(str);//发送到串口Delay(1);//延时100US(12M晶振)while(1){//------------------------//调用温湿度读取子程序RH();//串口显示程序//--------------------------str[0]=U8RH_data_H;str[1]=U8RH_data_L;str[2]=U8T_data_H;str[3]=U8T_data_L;str[4]=U8checkdata;SendData(str);//发送到串口//读取模块数据周期不易小于2SDelay(20000);}//elihw}//mainvoidRSINTR()interrupt4using2{U8InPut3;if(TI==1)//发送中断{TI=0;if(count!=5)//发送完5位数据{SBUF=outdata[count];count++;}}if(RI==1)//接收中断{InPut3=SBUF;indata[count_r]=InPut3;count_r++;RI=0;if(count_r==5)//接收完4位数据{//数据接收完毕处理。count_r=0;str[0]=indata[0];str[1]=indata[1];str[2]=indata[2];str[3]=indata[3];str[4]=indata[4];P0=0;}}}

Ⅳ 单片机控制DHT11的程序

首先!是非的意思,&&是与的意思,这段程序的意思是如果数据口一直为低并且u8flag不为0 则u8flag一直自加一,如果数据口为高则跳出,这个实际是在等数据口的跳变。

Ⅵ 基于单片机AT89C51的温湿度采集系统,用的温湿度模块是dht11,显示器是LCD1602,要 c程序仿真hex文件

在淘宝买个模块,他会教你怎么编程序的。

Ⅶ 求单片机程序关于温湿度。传感器采用DHT11,按键四个可以设置温湿度的上下限,显示用lcd1602,超限报警

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {" Xh RH: "}; //定义数组
unsigned char code dis2[] = {" DO T: "};
sbit buz=P1^0;
sbit TRH = P1^7;//温湿度传感器DHT11数据接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}

void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}

void sendwd()
{
//send wen
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}

void sendsd()
{
//send shi
SBUF=RH_data;
while(!TI);
TI=0;
}
/*********************************************************************************/
void delayNOP() //延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/

/*********************************************************************************/
// 毫秒级延时子程序
/*********************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/

/*********************************************************************************/
//5us级延时程序
/*********************************************************************************/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/

/********************************************************************************/
// 测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
/********************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************************/

/*******************************************************************************/
// 写入指令数据到LCD
/*******************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
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=数据。
/*****************************************************************************/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/****************************************************************************/

/****************************************************************************/
//LCD初始化设定
/****************************************************************************/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x06); //移动光标
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
//delay_ms(5);
}
/****************************************************************************/

/****************************************************************************/
//设定LCD显示位置
/****************************************************************************/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/****************************************************************************/

/****************************************************************************/
//收发信号检测,数据读取
/****************************************************************************/
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/

/****************************************************************************/
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高 主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入 判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//湿度整数部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小数点
//湿度小数部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//温度整数部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小数点
//温度小数部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
/****************************************************************************/
//冬天适宜温湿度 夏天适宜温湿度
//湿度:30%--80% 30%--60%
//温度:18℃--25℃ 23℃--28℃
/****************************************************************************/
void baoj()//报警函数
{
if(RH_data>=80) //湿度上限80%
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(RH_data<=30) //湿度下限30%
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(TH_data>=25) //温度上限25℃
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(TH_data<=18) //温度下限18℃
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else
{
buz=1;
}
}

/****************************************************************************/
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
/****************************************************************************/
void main()
{

lcd_init();
initcom();
delay_us();

while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//写字符
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //显示字符
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //显示字符
lcd_wdata(dis2[i]);
}
//写湿度数据
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//写温度数据
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延时
delay_ms(500);
baoj();//报警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}

Ⅷ 51单片机使用dht11

//硬件连接: P2.0口为通讯口连接DHT1
#include <reg51.h>
#include <intrins.h>

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位整型变量 */

#define uchar unsigned char
#define uint unsigned int

sbit P2_0 = P2^0 ;
sbit P2_1 = P2^1 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8 U8FLAG;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 indata[5];
U8 count, count_r=0;
U16 U16temp1,U16temp2;

sbit d1=P2^4;
sbit d2=P2^5;
sbit d3=P2^6;
sbit d4=P2^7;
uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff};
uchar data display[5] = {0x00,0x00,0x00,0x00,0x00};

void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void delay(unsigned int num)//延时函数
{
while( --num );
}
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;
//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------

while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
// Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);

//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是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_0=0;
Delay(180);
P2_0=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!P2_0) //T !
{
U8FLAG=2;////////////////////////////////////////////////////
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((P2_0)&&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_0=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

}

Disp_Temperature()//显示温度
{
unsigned char n=0;

// display[4]=temp_data[0]&0x0f;
// display[0]=ditab[display[4]]; //查表得小数位的值

// display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

display[4]=U8RH_data_H;
display[4]=display[4]%100;
display[3]=display[4]/10;
display[2]=display[1]%10;

display[4]=U8T_data_H;
display[4]=display[4]%100;
display[1]=display[4]/10;
display[0]=display[4]%10;

if(!display[3]) //高位为0,不显示
{
display[3]=0x0a;
if(!display[1]) //次次高位为0,不显示
display[1]=0x0a;
}

d1=1;
P0=LEDData[display[0]];
delay(5);d1=0;

d2=1;
P0=LEDData[display[1]];
delay(5);d2=0;

d3=1;
P0=LEDData[display[2]];
delay(5);d3=0;

d4=1;
P0=LEDData[display[3]];
delay(5);d4=0;
}

void main(void)
{
while(1)
{
RH();
Disp_Temperature();
//读取模块数据周期不易小于 2S
Delay(20000);
}
}

测试通过的,加分噢

Ⅸ 急求一份DHT11+STC89C52Rc十LCD1602程序(c语言)你能发给我一份吗谢谢5

#include "reg52.h"
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit DHTIO = P2^7; //管脚定义,DHT11总线输入输出;
sbit LCDRS = P2^3; //管脚定义,1602液晶RS控制端;
sbit LCDWR = P2^4; //管脚定义,1602液晶W/R控制端;
sbit LCDEN = P2^5; //管脚定义,1602液晶EN使能端;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
uchar data_byte;
uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check;
void LCD_Init(); //声明LCD_Init液晶初始化函数;
void LCD_Display(); //声明LCD_Display液晶显示函数;
void Rec_DHT(); //声明Rec_DHT,DHT11接收数据函数;

//主函数
void main()
{
LCD_Init();
while(1)
{
Rec_DHT();
LCD_Display();
}
}
/*********延时函数********/
void delay(uchar ms)
{
uchar i ;
while(ms--)
{
for(i=0;i<250;i++);
}
}
/***延时10us***/
void delay1()
{
uchar i;
i--;i--;i--;
i--;i--;i--;
}

/********主机发出开始信号*******/
void DHT11_Start() //请结合时序图分析
{
DHTIO=1;
delay1();
DHTIO=0;
delay(20); //保持电平时间大于18ms
DHTIO=1;
delay1(); //延迟等待20-40us
delay1();
delay1();
delay1();
delay1();
}
/********DHT11接收一个字节数据*******/
uchar receive_data()
{
uchar i,temp,count;
data_byte=0;
for(i=0;i<8;i++)
{
count=2;
while((!DHTIO)&&count++);//等待50us低电平结束
temp=0;
delay1();delay1();delay1();delay1();
if(DHTIO==1)
{
temp=1;
count=2;
while((DHTIO)&&count++);
}
if(count==1) break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
/********DHT11接收数据*******/
void Rec_DHT()
{
uchar flag;
DHT11_Start();//主机发出开始信号
DHTIO=1; //拉高等待DHT11响应
if(!DHTIO) //从机发出响应信号
{
flag = 2;
while((!DHTIO) && flag++);
//判断从机是否发出 80us 的低电平响应信号是否结束
flag = 2;
while(DHTIO && flag++);
//判断从机是否发出 80us 的高电平,若发出则开始采集数据
Tem_Z = receive_data(); //采集湿度整数部分
Tem_X = receive_data(); //采集湿度小数部分
Hum_Z = receive_data(); //采集温度整数部分
Hum_X = receive_data(); //采集温度小数部分
Check = receive_data(); //采集校验位
DHTIO = 1;
}
}
/*******指令码*******/
void write_com(uchar com)
{
com=((com&0x01)<<7)|((com&0x02)<<5)|((com&0x04)<<3)|((com&0x08)<<1)|((com&0x10)>>1)|((com&0x20)>>3)|((com&0x40)>>5)|((com&0x80)>>7); //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
LCDRS=0;
LCDEN=0;
delay(2);
LCDEN=1;
P0=com;
delay(2);
LCDEN=0;
}
/*******数据码*******/
void write_data(uchar date)
{
date=((date&0x01)<<7)|((date&0x02)<<5)|((date&0x04)<<3)|((date&0x08)<<1)|((date&0x10)>>1)|((date&0x20)>>3)|((date&0x40)>>5)|((date&0x80)>>7); //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
LCDRS=1;
LCDEN=0;
delay(2);
LCDEN=1;
P0=date;
delay(2);
LCDEN=0;
}
/*********************/
/********1602液晶显示初始化*******/
void LCD_Init()
{
LCDEN=0; //使能低电平
LCDWR=0;
write_com(0x38); //显示模式设置,设置16*2显示,5*7点阵,8位数据接口
delay(2);
write_com(0x0c); //显示开关及光标设置
delay(2);
write_com(0x06);
delay(2);
write_com(0x01); //清屏
delay(2);
}
/**********1602液晶显示*********/
void LCD_Display()
{
//液晶显示第一行:温度显示;
write_com(0x0c);
write_com(0x81);delay(2);
write_data('T');delay(2);
write_data('e');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0x86);delay(2);
write_data(table[(Tem_Z/10)]);delay(2); //输出温度的十位
write_data(table[(Tem_Z%10)]);delay(2); //输出温度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0x8c);delay(2);
write_data(0xdf);delay(2); //输出℃
write_data(0x43);delay(2);
//液晶第二行:湿度显示;
write_com(0xc1);delay(2);
write_data('H');delay(2);
write_data('u');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0xc6);delay(2);
write_data(table[(Hum_Z/10)]);delay(2); //输出湿度的十位
write_data(table[(Hum_Z%10)]);delay(2); //输出湿度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0xcc);delay(2);
write_data('%');delay(2);
}

Ⅹ 如何把dht11温度数据显示在16824液晶显示屏上

用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。
从模式下,DHT11接收到开始信号触发一次温湿度采集,
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。
主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面示。
如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。
当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

阅读全文

与dht11c51液晶显示程序相关的资料

热点内容
承德电影院今日影讯 浏览:302
传说中的乡巴佬女切腹6部合集 浏览:10
香港打真军电影1001香港打真军电影 浏览:730
类似于天才枪手 浏览:41
韩国李采妮电影有哪些 浏览:255
天堂网站在线免费看 浏览:639
ck电影网免费 浏览:432
韩国电影帮邻居搬圣诞树的片段 浏览:467
如饥似渴电影完整手机观看 浏览:171
母乳汁理沦片 浏览:796
烧烤聚会2电影中文字 浏览:185
谁有手机小电影网址 浏览:514
在线高清影视网站入口 浏览:332
日本电影女明星和女助理戴面具的 浏览:614
泰国船长罪孽在线sb影视 浏览:416
影视解析网站 浏览:750
余男《狂怒之拳》 浏览:372
韩国爱情电影中文版推荐 浏览:327
尺度大的欧美同性恋电影 浏览:751
童鞋真好妖精世界 浏览:990

友情链接