第一次拉低要求至少18ms,之后拉高20-40us,之后DHT拉低80us后再拉高80us..之后进入数据阶段.每个数据,0,1以高电平的 时间长短区分.0数据高电平时间为26-28us,1为70us..不论1或者0,之前都先输出50us的低电平..数据传输完成后拉高总线.
在此次的程序中用P2.1作为信息口.
程序如下
#include <msp430x14x.h>
#define HIGH P2OUT|=BIT1;
#define LOW P2OUT&=~BIT1;
void DelayNus(int n)
{
CCR0 = n;
TACTL |= MC_1; //增计数到CCR0
while(!(TACTL & BIT0)); //等待
TACTL &= ~MC_1; //停止计数
TACTL &= ~BIT0; //清除中断标志
}
char receive(void) //接受函数
{
char tem,cnt=0; //临时变量用于存储接受数据
while(cnt<8)
{
while(!(P2IN&BIT1)); //等待50us的低电平结束
DelayNus(45);
if(P2IN&BIT1) //长于30us定义为1
{
tem++;
tem<<=1;
while(P2IN&BIT1); //结束高电平
}
else
{
tem<<=1;
}
if(cnt!=7)
while(!(P2IN&BIT1)); //最后一次给函数返回留下时间
cnt++;
}
return tem;
}
int main( void )
{
int i;
char temph,templ,humdh,humdl,check,cal;
WDTCTL=WDTPW+WDTHOLD;
_DINT();
BCSCTL1&=~XT2OFF;
do
{
IFG1&=~OFIFG;
for(i=0xff;i>0;i--);
}
while(IFG1&OFIFG);
_EINT();
BCSCTL2|=SELM_2+SELS; //SMCLK 8分频
P2DIR|=BIT1;
P2OUT|=BIT1;
TACTL|=TASSEL_2+ID_3;
//inited
LOW;
DelayNus(18000);
HIGH;
DelayNus(30);
P2DIR&=~BIT1;
while(P2IN&BIT1);
while(!(P2IN&BIT1));
while(P2IN&BIT1);
//Data comes
humdh=receive();
humdl=receive();
temph=receive();
templ=receive();
check=receive();
cal=humdh+humdl+temph+templ;
if(check==cal)
{
LPM0;
}
return 0;
}
dht11-msp430f149.zip_DHT11_dht11 149_dht11 msp430f149_msp430f149
版权申诉
75 浏览量
2022-09-21
17:57:55
上传
评论
收藏 1KB ZIP 举报
林当时
- 粉丝: 98
- 资源: 1万+
最新资源
- style.scss
- Windows 系统下 Xshell 安装使用教程
- Windows 系统下 Xshell 安装使用教程
- 223010121屈阳计算机2201 6.ipynb
- Windows 系统下 Xshell 安装使用教程
- 艾宾浩斯计划表的C语言实现
- tensorflow-gpu-2.2.1-cp38-cp38-win-amd64.whl
- 在CentOS系统上安装Docker 步骤
- tensorflow-gpu-2.6.5-cp38-cp38-manylinux2010-x86-64.whl
- tensorflow-gpu-2.6.5-cp37-cp37m-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈