您好,欢迎访问三七文档
DHT11对时钟要求特别高,以下两个程序前者时钟是22.1184MHz;后者是11.0592MHz,请注意区分...//****************************************************************////DHT11使用范例//单片机:AT89S52或STC89C52RC//功能:串口发送温湿度数据晶振22.1184M//****************************************************************//#includereg52.h//----------------------------------------------////----------------IO口定义区--------------------////----------------------------------------------//sbitP2_0=P2^0;//----------------------------------------------////----------------定义区--------------------////----------------------------------------------//unsignedcharU8FLAG=0,U8temp=0;unsignedcharU8T_data_H=0,U8T_data_L=0,U8RH_data_H=0,U8RH_data_L=0,U8checkdata=0;unsignedcharstr[5];voidDelay2(unsignedintj){unsignedinti;for(;j0;j--){for(i=0;i150;i++);}}voidDelay_10us(void){unsignedi;for(i=16;i0;i--);}unsignedcharCOM(void){unsignedchari,U8comdata;for(i=0;i8;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高电平值则数据位为1U8comdata=1;U8comdata|=U8temp;//0}//rofreturnU8comdata;}//--------------------------------//-----湿度读取子程序------------//--------------------------------//----以下变量均为全局变量--------//----温度高8位==U8T_data_H------//----温度低8位==U8T_data_L------//----湿度高8位==U8RH_data_H-----//----湿度低8位==U8RH_data_L-----//----校验8位==U8checkdata-----//----调用相关子程序如下----------//----Delay();,Delay_10us();,COM();//--------------------------------voidRH(void){unsignedcharU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;//主机拉低18msP2_0=0;Delay2(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++);//数据接收状态U8RH_data_H_temp=COM();U8RH_data_L_temp=COM();U8T_data_H_temp=COM();U8T_data_L_temp=COM();U8checkdata_temp=COM();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()功能描述:AT89C5122.1184MHz串口发//送温湿度数据,波特率9600//----------------------------------------------voidmain(){Delay2(1);//延时100US(22.1184M晶振)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;//读取模块数据周期不易小于2SDelay2(20000);}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////****************************************************************////DHT11使用范例//单片机:AT89S52或STC89C52RC//功能:串口发送温湿度数据晶振11.0592M波特率9600//硬件连接:P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑//公司:奥松电子//****************************************************************//#includereg51.h#includeintrins.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;/*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(;j0;j--){for(i=0;i27;i++);}}voidDelay_10us(void){U8i;i--;i--;i--;i--;i--;i--;}voidCOM(void){U8i;for(i=0;i8;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高电平值则数据位为1U8comdata=1;U8comdata|=U8temp;//0}//rof}//--------------------------------//-----湿度读取子程序------------//--------------------------------//----以下变量均为全局变量--------//----温度高8位==U8
本文标题:DHT11程序
链接地址:https://www.777doc.com/doc-4296084 .html