⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sht.c

📁 温湿度传感器SHT的AVR ICC源代码
💻 C
字号:
#include <iom32v.h>
#include <macros.h>
#include "main.h"
#include "SHT.h"

void SHT_init(void)
{
  Setb_SHT_DATA;
  Clr_SHT_SCL;
}

void Write8BitsData(uchar uData) 
{ 
	unsigned char i;
	BYTE error=0;
    for(i=0;i<8;i++)
    {
      if((uData & BIT(7-i)) == 0)
	     Clr_SHT_DATA;
	  else
	     Setb_SHT_DATA;	
	  Setb_SHT_SCL;
	  delay_us(5);
	  Clr_SHT_SCL;
    }
	//Receive Ack
	Setb_SHT_DATA;
	DDRA &= ~BIT(SHT_DATA_PIN);
	Setb_SHT_SCL;
	delay_us(5);
	error = PINA & BIT(SHT_DATA_PIN);
	Clr_SHT_SCL;
	DDRA |= BIT(SHT_DATA_PIN);
	
	if(error==4) 
	{
	  Nothing= TRUE;
	  Temperature=0;
	  HIH3610_value=0;;
	}
	else
	  Nothing = FALSE;
	//Setb_SHT_DATA;
}

BYTE Read8BitsData(BYTE ack) 
{
 	unsigned char i,temp=0;
	WORD RData=0x00;
	Setb_SHT_DATA;
	DDRA &= ~BIT(SHT_DATA_PIN);
	for (i=0;i<8;i++)//i=0x80;i>0;i/=2)
	{	
	    RData <<= 1;
		Setb_SHT_SCL;
		delay_us(5);
		temp = PINA & BIT(SHT_DATA_PIN);
		if (temp != 0x00)
		   RData |= 1; 
		Clr_SHT_SCL;	
	}
	DDRA |= BIT(SHT_DATA_PIN);
	//Send Ack
	if(ack==1) Clr_SHT_DATA;
	else
	   Setb_SHT_DATA;
	Setb_SHT_SCL;
	delay_us(5);
	Clr_SHT_SCL;
	Setb_SHT_DATA;
	return RData;
}

void s_transstart(void)
{  
   SHT_init();                    //Initial state
   delay_us(5);
   Setb_SHT_SCL;
   delay_us(5);
   Clr_SHT_DATA;
   delay_us(5);
   Clr_SHT_SCL;
   delay_us(5); 
   Setb_SHT_SCL;
   delay_us(5);
   Setb_SHT_DATA;
   delay_us(5);
   Clr_SHT_SCL;		   
}
/*
void s_connectionreset(void)
{
  unsigned char i; 
  SHT_init();                   //Initial state
  for(i=0;i<9;i++)                  //9 SCK cycles
  { 
  	Setb_SHT_SCL;
    Clr_SHT_SCL;
  }
  s_transstart();                   //transmission start
}

void s_softreset(void)
{ 
  unsigned char error=0;  
  s_connectionreset();              //reset communication
  error+=Write8BitsData(RESET);       //send RESET-command to sensor
  if(error==1) return;                     //error=1 in case of no response form the sensor
}
*/

void WriteSHTReg(void)
{
  s_transstart();
  Write8BitsData(STATUS_REG_W);
  Write8BitsData(0x01);
}

void ReadSHTReg(void)
{
  BYTE tem=0;
  s_transstart();
  Write8BitsData(STATUS_REG_R);
  tem = Read8BitsData(0);
 
}

void MeaTemperature(void)
{
  s_transstart();
  Write8BitsData(MEASURE_TEMP);
}

void MeaRH(void)
{
  s_transstart();
  Write8BitsData(MEASURE_HUMI);
  
}

void GetTemperature(void)
{
  WORD temtem=0;
  float cData=0,bData=0;
  BYTE uData=0;
  BYTE i=0;//,temp=0;
  temtem |= Read8BitsData(1);
  temtem <<= 8;
  temtem |= Read8BitsData(0);
  //temp = Read8BitsData(0);//crc
  //tem &= 0x3FFF;
  //tem &= 0xFFF;
  if(temtem!=0)
  {
  cData = (float)(temtem);
  bData = cData*0.01;
  //bData = cData*0.04;
  uData = (BYTE)(bData);
  uData -= 40; 
  }
  else
  {
   uData=0;
  }
  if(uData>99) uData=99;
  if(uData>0) Temperature = uData;
}

void GetHumi(void)
{
  WORD temtem=0;
  float cData=0;
  float rData=0,bData=0;
  char uData=0;
  //BYTE temp=0;
  temtem |= Read8BitsData(1);
  temtem <<= 8;
  temtem |= Read8BitsData(0);
  //temp = Read8BitsData(0);//crc
  //tem &= 0xFFF;
  if(temtem!=0)
  {
  cData = (float)temtem;
  rData = cData*0.0405 - 4.0 - cData*cData*0.0000028;
  bData = (Temperature-25)*(0.01+0.00008*cData)+rData;
  //rData = cData*0.648 - 4.0 - cData*cData*0.00072;
  //bData = (Temperature-25)*(0.01+0.00128*cData)+rData;
  uData = (char)(bData);
  }
  else
  {
   uData=0;
  }
  if(uData>99) uData=99;
  if(uData>0) HIH3610_value = uData;
}

void Wait_Ok(void)
{
    BYTE temp=4;
	DWORD i=0;
    DDRA &= ~BIT(SHT_DATA_PIN);
	for (;i<100000;i++)
	{
	  temp = PINA & BIT(SHT_DATA_PIN);
	  if(temp==0) 
	    break;
	}
	DDRA |= BIT(SHT_DATA_PIN);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -