Ejemplo n.º 1
0
// 从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;

}
Ejemplo n.º 2
0
// 读取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;

}
Ejemplo n.º 3
0
/*--------------
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;
}
Ejemplo n.º 4
0
/*------------
读取一个字节
-------------*/
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);
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
/*-----------
写入一个字节
-----------*/
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();
}
Ejemplo n.º 7
0
/*-----------
写入一个字节
-----------*/
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();
}