分享到:
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 )
发表回复
版
块
导
航
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖

发帖
回复