DHT21和DHT11的C编程.docx

上传人:b****2 文档编号:2988722 上传时间:2023-05-05 格式:DOCX 页数:20 大小:18.91KB
下载 相关 举报
DHT21和DHT11的C编程.docx_第1页
第1页 / 共20页
DHT21和DHT11的C编程.docx_第2页
第2页 / 共20页
DHT21和DHT11的C编程.docx_第3页
第3页 / 共20页
DHT21和DHT11的C编程.docx_第4页
第4页 / 共20页
DHT21和DHT11的C编程.docx_第5页
第5页 / 共20页
DHT21和DHT11的C编程.docx_第6页
第6页 / 共20页
DHT21和DHT11的C编程.docx_第7页
第7页 / 共20页
DHT21和DHT11的C编程.docx_第8页
第8页 / 共20页
DHT21和DHT11的C编程.docx_第9页
第9页 / 共20页
DHT21和DHT11的C编程.docx_第10页
第10页 / 共20页
DHT21和DHT11的C编程.docx_第11页
第11页 / 共20页
DHT21和DHT11的C编程.docx_第12页
第12页 / 共20页
DHT21和DHT11的C编程.docx_第13页
第13页 / 共20页
DHT21和DHT11的C编程.docx_第14页
第14页 / 共20页
DHT21和DHT11的C编程.docx_第15页
第15页 / 共20页
DHT21和DHT11的C编程.docx_第16页
第16页 / 共20页
DHT21和DHT11的C编程.docx_第17页
第17页 / 共20页
DHT21和DHT11的C编程.docx_第18页
第18页 / 共20页
DHT21和DHT11的C编程.docx_第19页
第19页 / 共20页
DHT21和DHT11的C编程.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DHT21和DHT11的C编程.docx

《DHT21和DHT11的C编程.docx》由会员分享,可在线阅读,更多相关《DHT21和DHT11的C编程.docx(20页珍藏版)》请在冰点文库上搜索。

DHT21和DHT11的C编程.docx

DHT21和DHT11的C编程

DHT11DHT21

C编程

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

//DHT21使用范例

//单片机:

AT89S52或STC89C52RC

//功能:

串口发送温湿度数据晶振11.0592M波特率9600

//硬件连接:

P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑

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

#include

#include

//

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;/*singleprecisionfloatingpointvariable(32bits)单精度浮点数(32位长度)*/

typedefdoubleF64;/*doubleprecisionfloatingpointvariable(64bits)双精度浮点数(64位长度)*/

//

#defineucharunsignedchar

#defineuintunsignedint

#defineData_0_time4

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

//----------------IO口定义区--------------------//

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

sbitP2_0=P2^0;

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

//----------------定义区--------------------//

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

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;

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();

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

voidRH(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()功能描述:

AT89C5111.0592MHz串口发

//送温湿度数据,波特率9600

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

voidmain()

{

U8i,j;

//ucharstr[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

voidRSINTR()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及其LCD1602的C编程

DHT11温湿度1602液晶显示程序示例

主程序:

#include

#include

#include

#include

#include

typedefunsignedcharU8;

typedefunsignedintU16;

U8U8FLAG;

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;

sbitP2_0=P2^0;

sbitP2_1=P2^1;

sbitP2_2=P2^2;

sbitP2_3=P2^3;

unsignedcharstr1[]="ShiDu:

";

unsignedcharstr2[]="WenDu:

";

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;//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();

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

voidRH(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

}

voidmain()

{

U8shidu_shi,shidu_ge,wendu_shi,wendu_ge;

LCD_init();

delay_nms

(2);

LCD_write_string(0,LINE1,str1);

LCD_write_string(0,LINE2,str2);

while

(1)

{

RH();

shidu_shi=0x30+U8RH_data_H/10;

shidu_ge=0x30+U8RH_data_H%10;

//shidu_xs=0x30+U8RH_data_L/10;

wendu_shi=0x30+U8T_data_H/10;

wendu_ge=0x30+U8T_data_H%10;

//wendu_xs=0x30+U8T_data_L/10;

LCD_write_char(6,0,shidu_shi);

LCD_write_char(7,0,shidu_ge);

//LCD_write_char(9,0,shidu_xs);

LCD_write_char(6,1,wendu_shi);

LCD_write_char(7,1,wendu_ge);

//LCD_write_char(9,1,wendu_xs);

}

}

H文件

ifndeflcd_H

#definelcd_H

#include

#include

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

//commonpart

#defineHIGH1

#defineLOW0

#defineTRUE1

#defineFALSE0

#defineZERO0

#defineMSB0x80

#defineLSB0x01

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

//lcdpart

#defineLINE10

#defineLINE21

#defineLINE1_HEAD0x80

#defineLINE2_HEAD0xC0

#defineDATA_MODE0x38

#defineOPEN_SCREEN0x0C

#defineDISPLAY_ADDRESS0x80

#defineCLEARSCREENLCD_en_com(0x01)

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

//changethispartatdifferentboard

#defineLCDIOP1

sbitLCD1602_RS=P2^4;

sbitLCD1602_RW=P2^5;

sbitLCD1602_EN=P2^6;

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

voidLCD_Read_BF(void)

{

unsignedcharread=0;

LCD1602_RS=LOW;//RS0

LCD1602_RW=HIGH;//RW1

LCD1602_EN=HIGH;//EN1ReadBF

LCDIO=0xFF;

do{

read=LCDIO;

}while(read&MSB);

}

voidLCD_en_com(unsignedcharcommand)//写指令

{

LCD_Read_BF();

LCD1602_RS=LOW;//RS0

LCD1602_RW=LOW;//RW0

LCD1602_EN=HIGH;//EN--\|/__Writecommand

LCDIO=command;

LCD1602_EN=LOW;

}

voidLCD_en_dat(unsignedchardat)//写数据

{

LCD_Read_BF();

LCD1602_RS=HIGH;//RS1

LCD1602_RW=LOW;//RW0

LCD1602_EN=HIGH;//EN--\|/__Writedata

LCDIO=dat;

LCD1602_EN=LOW;

}

voidLCD_set_xy(unsignedcharx,unsignedchary)

{

unsignedcharaddress;

if(y==LINE1)

address=LINE1_HEAD+x;

else

address=LINE2_HEAD+x;

LCD_en_com(address);

}

voidLCD_write_char(unsignedx,unsignedchary,unsignedchardat)

{

LCD_set_xy(x,y);

LCD_en_dat(dat);

}

voidLCD_write_string(unsignedcharx,unsignedchary,unsignedchar*s)

{

LCD_set_xy(x,y);

while(*s)

{

LCDIO=*s;

LCD_en_dat(*s);

s++;

}

}

vo

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2