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