基于单片机温湿度测量电路的设计
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位长度) */ //
#define uchar unsigned char #define uint unsigned int
#define Data_0_time 4 //相当于用Data_0_time代替4.
//----------------------------------------------//
//----------------IO口定义区--------------------// //----------------------------------------------// sbit DQ = P3^0 ;
//----------------------------------------------//
//----------------定义区--------------------// //----------------------------------------------// U8 U8FLAG,k; U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
29
基于单片机温湿度测量电路的设计
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; U16 U16temp1,U16temp2; //以上为变量的定义. void COM(void);
void Delay2(U16 j) //延时函数 { U8 i;
for(;j>0;j--) { }
for(i=0;i<27;i++);
}
void Delay_10us(void) //延时10us的延时函数. { U8 i; i--; i--; i--;
i--; i--; i--; }
30
基于单片机温湿度测量电路的设计
void COM(void) {
U8 i;
for(i=0;i<8;i++) 中.
} }
//-------------------------------- //-----湿度读取子程序 ------------ //-------------------------------- //----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
{
U8FLAG=2;
while((!DQ)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us(); U8temp=0;
if(DQ)U8temp=1;
U8FLAG=2;
while((DQ)&&U8FLAG++);
//超时则跳出for循环 if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1; //左移1位
U8comdata|=U8temp; //U8comdata与U8temp相或,结果保存在U8comdata
//----温度低8位== U8T_data_L------
31
基于单片机温湿度测量电路的设计
//----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM(); //--------------------------------
void RH(void)
{
//主机拉低18ms
DQ=0;
Delay2(180); DQ=1;
//总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us();
//主机设为输入 判断从机响应信号 DQ=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DQ) { U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束 while((!DQ)&&U8FLAG++); U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((DQ)&&U8FLAG++); //数据接收状态
//T !
COM(); //调用COM函数
32
基于单片机温湿度测量电路的设计
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; DQ=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; }//对数据作出相应的处理与运算. } }
33