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

📄 tsensor.c

📁 ARM_CORTEX-M3应用实例开发详解光盘
💻 C
📖 第 1 页 / 共 2 页
字号:

  /* 检测 EV7事件并清除*/
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
  
  /* 存储I2C1接收的数据 */
  RegValue = I2C_ReceiveData(I2C1) << 8;
  
  /* 关闭应答 */
  I2C_AcknowledgeConfig(I2C1, DISABLE);
  
  /* 发送停止状态位*/
  I2C_GenerateSTOP(I2C1, ENABLE);
  
  /* 检测 EV7事件并清除*/
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
  
  /* 存储I2C1接收的数据*/
  RegValue |= I2C_ReceiveData(I2C1);

  /* 返回值 */
  return (RegValue >> 5);
}

/*******************************************************************************
* 函数名  : I2C_LM75_ConfReg_Read
* 描述    : 读STLM75配置寄存器
* 输入         : 无
* 输出         : 无
* 返回         : 无
*******************************************************************************/
u8 I2C_LM75_ConfReg_Read(void)
{
  u32 RegValue = 0;

  /*----- 传送过程 -----*/
  /* 发送I2C1起始状态位 */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* 检测 EV5事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }

  /* 发送STLM75从设备地址(写)*/
  I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
  
  /* 检测 EV6事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }

  /* 发送配置寄存器指针数据 */
  I2C_SendData(I2C1, LM75_CONF_Reg);
  
  /* 检测 EV8事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /*----- 接收过程 -----*/
  /* 发送启动起始状态位 */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* 检测 EV5事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  
  /* 发送STLM75从设备地址(读) */
  I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Receiver);
  
  /* 检测 EV6事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))  /* EV6 */
  {
  }

  /* 关闭应答 */
  I2C_AcknowledgeConfig(I2C1, DISABLE);
  
  /* 发送I2C1停止状态位 */
  I2C_GenerateSTOP(I2C1, ENABLE);

  /* 检测 EV7事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
  
  /* 存储I2C1接收的数据 */
  RegValue = I2C_ReceiveData(I2C1);

  /* 返回寄存器值 */
  return (RegValue);    
}

/*******************************************************************************
* 函数名  : I2C_LM75_ConfReg_Write
* 描述    : 写STLM75配置寄存器
* 输入         : 无
* 输出         : 无
* 返回         : 无
*******************************************************************************/
void I2C_LM75_ConfReg_Write(u8 RegValue)
{
  /*----- 传送过程 -----*/
  /* 发送I2C1起始状态位 */
  I2C_GenerateSTART(I2C1, ENABLE);

  /* 检测 EV5事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  
  /* 发送STLM75从设备地址(写) */
  I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
  
  /* 检测 EV6事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }

  /* 发送配置寄存器指针数据 */
  I2C_SendData(I2C1, LM75_CONF_Reg);
  
  /* 检测 EV8事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /* 发送I2C1数据*/
  I2C_SendData(I2C1, RegValue);
  
  /* 检测 EV8事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /* 发送I2C1 停止条件位 */
  I2C_GenerateSTOP(I2C1, ENABLE);     
}

/*******************************************************************************
* 函数名  : I2C_LM75_ShutDown
* 描述    : 打开或关断STLM75
* 输入         : 无
* 输出         : 无
* 返回         : 无
*******************************************************************************/
void I2C_LM75_ShutDown(FunctionalState NewState)
{
  u32 RegValue = 0;

  /*----- Transmission Phase -----*/
  /* 发送I2C1起始状态位 */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* 检测 EV5事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }

  /* 发送STLM75从设备地址(写) */
  I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
  
  /* 检测 EV6事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }

  /* 发送配置寄存器指针数据 */
  I2C_SendData(I2C1, LM75_CONF_Reg);
  
  /* 检测 EV8事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))  /* EV8 */
  {
  }

  /*----- 接收过程 -----*/
  /* 发送开始起始位条件 */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* 检测 EV5事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  
  /* 发送STLM75从设备地址(读) */
  I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Receiver);
  
  /* 检测 EV6事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))  /* EV6 */
  {
  }
  
  /* 关闭应答 */
  I2C_AcknowledgeConfig(I2C1, DISABLE);
  
  /* 发送I2C1 停止条件位 */
  I2C_GenerateSTOP(I2C1, ENABLE);

  /* 检测 EV7事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
  
  /* 存储I2C1 接收的数据 */
  RegValue = I2C_ReceiveData(I2C1);

  /*----- 传送过程 -----*/
  /* 发送I2C1起始状态位 */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* 检测 EV5事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  
  /* 发送STLM75从设备地址(写) */
  I2C_Send7bitAddress(I2C1, LM75_Addr, I2C_Direction_Transmitter);
  
  /* 检测 EV6事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }
  
  /* 发送配置寄存器指针数据 */
  I2C_SendData(I2C1, LM75_CONF_Reg);
  
  /* 检测 EV8事件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /* 打开或禁止SD位 */
  if (NewState != DISABLE)
  {
    /* 禁止LM75 */
    I2C_SendData(I2C1, RegValue | LM75_SD_Set);
  }
  else
  {
    /* 使能LM75 */
    I2C_SendData(I2C1, RegValue & LM75_SD_Reset);
  }

  /* 检测 EV8件并清除 */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /* 发送I2C1停止状态位 */
  I2C_GenerateSTOP(I2C1, ENABLE);     
}
/*******************************************************************************
* 函数名  : Thermometer_Temperature
* 描述    : 用摄氏度及华氏度来显示温度值
* 输入         : 无
* 输出         : 无
* 返回         : 无
*******************************************************************************/
void Thermometer_Temperature(void)
{

  if(I2C_LM75_Status() == SUCCESS)
  {
   TempCelsius_Value = I2C_LM75_Temp_Read();
   }
  if(TempCelsius_Value <= 1023)
      {
        /* 正温度测量值 */
        TempCelsius_Display[5] = '+';
        TempFahrenheit_Display[5] = '+'; 
      }
      else
      {
        /* 负温度测量值 */
        TempCelsius_Display[5] = '-'; 
        TempFahrenheit_Display[5] = '-'; 
        /* 去除温度值符号 */
        TempCelsius_Value = 0x800 - TempCelsius_Value;
     }

      /* 计算温度数字输出 */
      Temp_Decimal = ((TempCelsius_Value & 7) * 1000 / 8);
      TempCelsius_Display[10] = (Temp_Decimal / 100) + 0x30;
      TempCelsius_Display[11] = ((Temp_Decimal % 100) / 10) + 0x30;
      TempCelsius_Display[12] = ((Temp_Decimal % 100) % 10) + 0x30;
      TempCelsius_Value >>= 3;
      TempCelsius_Display[6] = (TempCelsius_Value / 100) + 0x30;
      TempCelsius_Display[7] = ((TempCelsius_Value % 100) / 10) + 0x30;
      TempCelsius_Display[8] = ((TempCelsius_Value % 100) % 10) + 0x30;

      /* 将温度转换为华氏温度值 */
      Temp_Value_Fahrenheit = ((9 * ((TempCelsius_Value * 1000) + Temp_Decimal)) / 5) + 32000;

      /* 计算温度值*/
      TempFahrenheit_Display[6] = (Temp_Value_Fahrenheit / 100000) + 0x30;
      TempFahrenheit_Display[7] = ((Temp_Value_Fahrenheit % 100000) /10000) + 0x30;
      TempFahrenheit_Display[8] = ((Temp_Value_Fahrenheit % 100000) %10000/1000) + 0x30;
      TempFahrenheit_Display[10] = ((((Temp_Value_Fahrenheit % 100000) %10000) %1000) /100) + 0x30;
      TempFahrenheit_Display[11] = (((((Temp_Value_Fahrenheit % 100000) %10000) %1000) %100) /10) + 0x30;
      TempFahrenheit_Display[12] = (((((Temp_Value_Fahrenheit % 100000) %10000) %1000) %100) %10) + 0x30;

      /* 将温度值显示在LCD中 */
     printf("\r\nTemperature is %s",TempCelsius_Display) ;
	 printf("\r\nTemperature is %s",TempFahrenheit_Display);
  }	  


/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/	  

⌨️ 快捷键说明

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