[资料] MSP430平台 AM2301测量光强(已测试)
727 查看
4 回复
 楼主 | 发布于 2018-08-29 | 只看楼主
分享到:

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);
}

(0 ) (0 )
回复 举报

楼主 | 回复于 2018-08-29 沙发

AM2301.h

#include "msp430x14x.h"
#define    data_out     (P1DIR|=0x01)
#define    data_in      (P1DIR&=0xFE)
#define    data_up      (P1OUT|=0x01)
#define    data_down    (P1OUT&=0xFE)
#define    data_h       ((P1IN&0x01)==0x01)
#define    data_l       ((P1IN&0x01)==0x00)

void AM2301(void);
void delay_1us(unsigned int time_temp);
unsigned char get_40_bits(void);

(0 )
评论 (0) 举报

楼主 | 回复于 2018-08-29 2#

自己顶一下
(0 )
评论 (0) 举报

回复于 2018-08-30 3#

谢谢分享
(0 )
评论 (0) 举报

楼主 | 回复于 2018-08-30 4#

感谢支持
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部