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

📄 am2301.c

📁 温湿度传感器AM2301
💻 C
字号:
#include "AM2301.h"
int wendu=0;
unsigned int wet=0;
unsigned char check_flag=0;
void AN2301_init(void);

void int_am2301clk()
{
  unsigned char i;//定义局部变量i
  BCSCTL1&=~XT2OFF;//打开高频晶体震荡器
  BCSCTL2|=SELM1+SELS;//MCLK和SMCLK的时钟源都选择XT2CLK,即都是8MHZ
  do//(至少执行一次DO循环)
  {
    IFG1&=~OFIFG;//清除晶体震荡出错标志位
    for(i=0;i<100;i++)
      _NOP();//简单的延时等待
  }while((IFG1&OFIFG));//判断晶体震荡是否出错,如果还是出错,则继续执行DO循环
  IFG1&=~OFIFG;
}



void delay_1us(unsigned int time_temp)
{
  unsigned int i;
  for(i=time_temp;i>0;i--)
  {
    _NOP();
    _NOP();
    _NOP();
    _NOP();
  }
}

unsigned char get_40_bits(void)
{
  unsigned int time_h=0;
  unsigned int time_l=0;
  unsigned char wet_h=0;
  unsigned char wet_l=0;
  unsigned char wendu_h=0;
  unsigned char wendu_l=0;
  unsigned char check=0;
  unsigned char i=0;
  
  data_out;//置为输出
  data_down;
  delay_1us(1000);//至少500us
  data_up;
  //启动模块
  data_in;
  delay_1us(10);//主机拉高20~40us
  
  time_h=0;
  while(data_h&&(time_h<60000))
    time_h++;
  
  time_l=0;
  while(data_l&&(time_l<60000))
    time_l++;
  
  time_h=0;
  while(data_h&&(time_h<60000))
    time_h++;
  
  //准备接受数据
  for(i=0;i<8;i++)
  {
    time_h=0;
    time_l=0;
    while(data_l&&(time_l<60000))
      time_l++;
    while(data_h&&(time_h<60000))
      time_h++;
    if(time_l<time_h)//数据 1
      wet_h|=(0x80>>i);
  }
  for(i=0;i<8;i++)
  {
    time_h=0;
    time_l=0;
    while(data_l&&(time_l<60000))
      time_l++;
    while(data_h&&(time_h<60000))
      time_h++;
    if(time_l<time_h)//数据 1
      wet_l|=(0x80>>i);
  }
  for(i=0;i<8;i++)
  {
    time_h=0;
    time_l=0;
    while(data_l&&(time_l<60000))
      time_l++;
    while(data_h&&(time_h<60000))
      time_h++;
    if(time_l<time_h)//数据 1
      wendu_h|=(0x80>>i);
  }
  for(i=0;i<8;i++)
  {
    time_h=0;
    time_l=0;
    while(data_l&&(time_l<60000))
      time_l++;
    while(data_h&&(time_h<60000))
      time_h++;
    if(time_l<time_h)//数据 1
      wendu_l|=(0x80>>i);
  }
  for(i=0;i<8;i++)
  {
    time_h=0;
    time_l=0;
    while(data_l&&(time_l<60000))
      time_l++;
    while(data_h&&(time_h<60000))
      time_h++;
    if(time_l<time_h)//数据 1
      check|=(0x80>>i);
  }
  //接受40bit数据
  i=(unsigned char)(wet_h+wet_l+wendu_h+wendu_l);
  if(check==i)
  {
    wet=wet_h;
    wet<<=8;
    wet+=wet_l;
    if((wendu_h&0x80)==0x00)//温度为正
    {
      wendu=wendu_h;
      wendu<<=8;
      wendu+=wendu_l;
    }
    else
    {
      wendu_h&=0x80;
      wendu=wendu_h;
      wendu<<=8;
      wendu+=wendu_l;
      wendu=-wendu;
    }
    check_flag=1;
    return 1;
  }
  else
  {
    check_flag=0;
    return 0;
  }
}

void AM2301_init(void)
{
   P1SEL=0x00;
}

void AM2301()
{
    get_40_bits();
    delay_1us(60000);
}

⌨️ 快捷键说明

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