// 从DTH11读取一个字节的数据 unsigned char getOneByte(void) { unsigned char i, temp, returnData, loopCount; for(i=0;i<8;i++) { loopCount = 200; while( !DHT11 && loopCount-- ); delay10us(); delay10us(); delay10us(); temp= DHT11?1:0; loopCount = 200; while( DHT11 && loopCount-- ); //超时则跳出for循环 returnData<<=1; returnData|=temp; }//rof return returnData; }
// 读取DHT11传送的5个字节,但只返回湿度值 unsigned char getAllBytes(void) { unsigned char temp, loopCount; unsigned char tempHHigh, tempHLow, tempTHigh, tempTLow, tempCheckSum; unsigned char returnData; //如果读取湿度不成功,则返回0xff,否则返回相对湿度值 returnData = 0xff; //主机拉低20ms (要求大于18ms) DHT11=0; delay100us(200); DHT11=1; //总线由上拉电阻拉高 主机延时20us delay10us(); delay10us(); delay10us(); delay10us(); //主机设为输入 判断从机响应信号 DHT11=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DHT11) { loopCount = 200; //判断从机是否发出 80us 的低电平响应信号是否结束,或是否超时 while( !DHT11 && loopCount-- ); loopCount = 200; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态,或是否超时 while( DHT11 && loopCount-- ); //数据接收状态 tempHHigh = getOneByte(); tempHLow = getOneByte(); tempTHigh = getOneByte(); tempTLow = getOneByte(); tempCheckSum = getOneByte(); DHT11=1; //数据校验 temp = tempHHigh + tempHLow + tempTHigh + tempTLow; if( temp == tempCheckSum && temp>0 ) { // 数据有效 返回湿度 returnData = tempHHigh; } }// end if return returnData; }
/*-------------- 18b20初始化 返回1则初始化成功 返回0则初始化失败 ----------------*/ bit initDS18B20(void) { bit returnData; DS18B20 = 1; //DQ复位 delay10us(); //稍做延时 DS18B20 = 0; //单片机将DQ拉低 delay100us(6); //精确延时 大于 480us 小于960us DS18B20 = 1; //拉高总线 delay100us(1); //15~60us 后 接收60-240us的存在脉冲 returnData=~DS18B20; //如果x=1则初始化成功, x=0则初始化失败 delay10us(); //稍作延时返回 delay10us(); delay10us(); return returnData; }
/*------------ 读取一个字节 -------------*/ byte readOneByte(void) { byte i=0; byte returnData = 0; for (i=8;i>0;i--) { DS18B20 = 0; // 给脉冲信号 returnData>>=1; DS18B20 = 1; // 给脉冲信号 if(DS18B20) returnData|=0x80; //DelayUs2x(25); delay10us(); delay10us(); delay10us(); delay10us(); delay10us(); } return(returnData); }
u08 I2C_write(u08 b) { u08 i; I2C_SDA_WR(); // SDA na zapis for (i=0; i<8; i++) // zapis 8 bitów { if (b & 0x80) I2C_SDA_H(); else I2C_SDA_L(); delay10us(); I2C_SCL_H(); delay10us(); I2C_SCL_L(); b <<= 1; // przesuñ o 1 bit } I2C_SDA_RD(); // w³¹cz czytanie SDA I2C_SDA_H(); // podci¹gnij SDA delay10us(); I2C_SCL_H(); // SCL=1 delay10us(); i=0xFF; do { if (bit_is_clear(I2C_PORT_I,I2C_SDA)) break; // je¿eli jest potwierdzenie delay10us(); } while(--i>0); I2C_SCL_L(); // SCL=0 delay10us(); return(i); }
/*----------- 写入一个字节 -----------*/ void writeOneByte( byte writeByte) { byte i=0; for (i=8; i>0; i--) { DS18B20 = 0; DS18B20 = writeByte & 0x01; //DelayUs2x(25); delay10us(); delay10us(); delay10us(); delay10us(); delay10us(); DS18B20 = 1; writeByte >>= 1; } //DelayUs2x(25); delay10us(); delay10us(); delay10us(); delay10us(); delay10us(); }
/*----------- 写入一个字节 -----------*/ void writeOneByte( unsigned char writeByte) { unsigned char i=0; for (i=8; i>0; i--) { DS18B20 = 0; DS18B20 = writeByte & 0x01; //DelayUs2x(25); delay10us(); delay10us(); delay10us(); delay10us(); delay10us(); DS18B20 = 1; writeByte >>= 1; } //DelayUs2x(25); delay10us(); delay10us(); delay10us(); delay10us(); delay10us(); }