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

📄 hct11.c

📁 430单片机的部分源代码
💻 C
字号:
#include "myinclude.h"

#define DATA_ACK 0x01
#define DATA_noACK 0x00

char s_softreset(void);
char s_read_statusreg(unsigned int *p_value);

void start_cale(void);	//开始加热
void stop_cale(void);	//停止加热
void init_wdt(void);	//初始化定时器
float com_dp(float t0,float r0);

void main(void)
{
  unsigned int tem = 0x0000;
  unsigned int rh  = 0x0000;
  float dp=0.0;
  float rh_linear = 0.0;
  float rh_true = 0.0;
  float tem_true = 0.0;

  
  init();
  while(1)
  {
    tem = read_t();
    rh  = read_rh();

    rh_linear = (0.0405 * (float)rh) + ((-2.8 * 0.000001) * rh * rh) - 4;
    tem_true  = (0.01 * (float)tem) - 39.64;
    rh_true   = ((float)tem_true - 25.0) * (0.01 + (0.00008 * (float)rh)) + rh_linear;
    dp = com_dp(tem_true,rh_true);
   // tem = (int)(dp * 100);
  //  rh = (int)(rh_linear * 100);
  // tem = (int)(tem_true * 100);

    _BIS_SR(CPUOFF);                    // Enter LPM0
  }
}

/*名称:读取温度                     */
/*输入:无                           */
/*返回:温度值,数据是int型,温度是  */
/*      从传感器读回来的值,未做处理 */
int read_t(void)
{
  unsigned int ret_t = 0x0000;
  unsigned char temp0 = 0x00;
  unsigned char temp1 = 0x00;
  unsigned int i;

  sck_start();
  send_data(MEA_T);
  P2DIR &= ~DATA;
  temp0 = P2IN & DATA;
  for(i=0;i<0xFFF0;i++)
  {
    if(temp0!=DATA)
    {
      i = 0xFFFF;
      break;
    }
  }
  temp0 = read_su(DATA_ACK);
  temp1 = read_su(DATA_ACK);
  ret_t = (((unsigned int)(temp0 & 0x3F)) << 0x08) | ((unsigned int)temp1);
    
  return ret_t;
}

/*名称:读取湿度                    */
/*输入:无                          */
/*返回:湿度值,数据是int型,湿度是 */
/*      从传感器读回来的值,未做处理*/
int read_rh(void)
{
  unsigned int ret_rh = 0x0000;
  unsigned char temp0 = 0x00;
  unsigned char temp1 = 0x00;
  unsigned int i;
  
  sck_start();
  send_data(MEA_RH);
  P2DIR &= ~DATA;
  temp0 = P2IN & DATA;
  for(i=0;i<0xFFF0;i++)
  {
    if(temp0!=DATA)
    {
      i = 0xFFFF;
      break;
    }
  }
  temp0 = read_su(DATA_ACK);
  temp1 = read_su(DATA_ACK);
  ret_rh = (((unsigned int)(temp0 & 0x0F)) << 0x08) | ((unsigned int)temp1);
    
  return ret_rh;
}

/*名称:sck信号线启动             */
/*输入:无                        */
/*返回:无                        */
/*功能:在传感器信号复位后再此通讯*/
/*      前要发送的信号            */
void sck_start(void)
{
  P2OUT |= DATA_H;
  P2OUT &= SCK_L;
  P2DIR |= SCK | DATA;
  P2OUT |= SCK_H;
  P2OUT &= DATA_L;
  P2OUT &= SCK_L;
  P2OUT |= SCK_H;
  P2OUT |= DATA_H;
  P2OUT &= SCK_L;
}

/*名称:发送数据                   */
/*输入:要发送的数据,数据是uchar型*/
/*返回:是否成功,成功为1,不成功为*/
/*      0 ,char型返回             */
/*功能:向传感器发送数据,包括对传 */
/*      感器操作的命令             */
char send_data(unsigned char com)
{
  unsigned char i;
  unsigned char error = 0x00;
  P2OUT &= SCK_L;
  P2DIR |= SCK | DATA;
  for(i=0;i<8;i++)
  {
    if((com & BIT7)==BIT7)
    {
      P2OUT |= DATA_H;
    }
    else
    {
      P2OUT &= DATA_L;
    }
    com = com << 0x01;
    P2OUT |= SCK_H;
    P2OUT &= SCK_L;
  }
  P2OUT |= DATA_H;
  P2OUT |= SCK_H;  
  P2DIR &= ~DATA;
  error = P2IN & DATA;
  P2OUT &= SCK_L;
  
  return error;
}

/*名称:读取传感器数据       */
/*输入:输入ACK信号,是否启  */
/*      用crc校验,ACK是bit  */
/*      信号,但输入是char型 */
/*返回:从传感器中读取的数据 */
/*      数据类型是uchar      */
/*功能:从传感器读取回来的值 */
unsigned char read_su(unsigned char ack)
{
  unsigned char temp = 0x00;
  unsigned char i;

  P2OUT &= SCK_L;
  P2OUT |= DATA_H;
  P2DIR |= SCK | DATA;
  P2DIR &= ~DATA;
  for(i=0;i<8;i++)
  {
    P2OUT |= SCK_H;
    temp = temp << 0x01;
    temp |= P2IN & DATA;
    P2OUT &= SCK_L;
  }
  P2OUT &= ~DATA_ACK;
  P2OUT |= SCK_H;
  P2DIR |= DATA | SCK;
  P2OUT &= SCK_L;
  P2OUT |= DATA_H;
  
  return temp;
}

/*名称:传感器信号线复位 */
/*输入:无               */
/*返回:无               */
/*功能:对传感器信号进行 */
/*      复位             */
void reset_su(void)
{
  unsigned char j;
  
  P2OUT |= DATA_H;
  P2OUT &= SCK_L;
  P2DIR |= DATA | SCK;
  for(j=0;j<10;j++)
  {
    P2OUT |= SCK_H;
    P2OUT &= SCK_L;
  }
  sck_start();
}

/*名称:开始加热函数           */
/*输入:无                     */
/*返回:无                     */
/*功能:使用传感器内部加热功能 */
/*      开始加热               */
void start_cale(void)
{
  unsigned char temp = 0x00;
  
  send_data(RD_RAM);
  temp = read_su(DATA_ACK);
  temp |= CALE_BIT;
  send_data(WR_RAM);
  send_data(temp);
}

/*名称:停止加热函数           */
/*输入:无                     */
/*返回:无                     */
/*功能:使用传感器内部加热功能 */
/*      停止加热               */
void stop_cale(void)
{
  unsigned char temp = 0x00;
  
  send_data(RD_RAM);
  temp = read_su(DATA_ACK);
  temp &= ~CALE_BIT;
  send_data(WR_RAM);
  send_data(temp);
}

/*名称:露点计算函数           */
/*输入:温度,湿度,都是浮点型 */
/*返回:露点值,浮点型         */
float com_dp(float t0,float r0)
{
  double logew = 0.0;
  double dp0 = 0.0;
  
  logew = 0.66077 + (7.5 * (double)t0 /(237.3 + (double)t0)) + log10((double)r0) - 2;
  dp0   = (0.66077 - logew) * 237.3 / (logew - 8.16077);
  
  return (float)dp0;
}

/*名称:传感器初始化 */
/*输入:无           */
/*返回:无           */
/*功能:对传感器进行 */
/*      初始化       */
void init_su(void)
{
  reset_su();
  send_data(WR_RAM);
  send_data(0x00);
}

/*名称:初始化定时器       */
/*输入:无                 */
/*返回:无                 */
/*功能:对定时器进行初始化 */
void init_wdt(void)
{
//  WDTCTL = 0X00;
  WDTCTL = WDT_ADLY_250 | WDTTMSEL;               // Set Watchdog Timer to exactly 250ms
  IE1 |= WDTIE;                         // Enable WDT interrupt
  _EINT();                              // Enable interrupts
}

/*名称:初始化       */
/*输入:无           */
/*返回:无           */
/*功能:cpu上电初始化*/
void init(void)
{
  init_wdt();
  init_su();
}

/*名称:软件复位传感器  */
/*输入:无              */
/*返回:是否复位成功,  */
/*      成功是1,不成功 */
/*      是0,是char型   */
/* 2007年03月22日新增加 */
char s_softreset(void)
{
  unsigned char error = 0x00;
  
  reset_su();
  error += send_data(RESET);
  
  return error;
}

/*名称:读传感器内部寄存器函数 */
/*输入:存储读回来的传感器内部 */
/*      的寄存器的值           */
/*返回:是否读取成功,成功是1,*/
/*      不成功是0,是char型    */
char s_read_statusreg(unsigned int *p_value)
{
  unsigned char error = 0x00;
  
  sck_start();
  error = send_data(RD_RAM);
  *p_value = (unsigned int)(read_su(DATA_ACK));
  *p_value = ((*p_value) << 0x08) & 0xF0;
  *p_value |= (unsigned int)(read_su(DATA_ACK)); 
  
  return error;
}

// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
  _NOP();
  _BIC_SR_IRQ(CPUOFF);                // Clear CPUOFF bit from 0(SR)
}

/*名称:延时函数     */
/*输入:延时的周期数 */
/*返回:无           */
void dele(unsigned int dddd)
{
  unsigned int dele_n;
  for(dele_n=0x0000;dele_n>=dddd;dele_n++)
  {
    reset_su();
    _NOP();
  }
}

⌨️ 快捷键说明

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