|
#include<msp430x14x.h>
#include"system.h"
//sbit DHT11 = P4^0; /用哪个I/O口自选,注意不要用P3口
#define DHT11 P4DIR & BIT7
#define DHT11_IN P4DIR &= ~BIT7
#define DHT11_OUT P4DIR |= BIT7
#define SET_DHT11 P4OUT |= BIT7
#define CLR_DHT11 P4OUT &= ~BIT7
//防止在与硬件通信时发生死循环的计数范围
#define NUMBER 20
#define SIZE 5
#define OK 1
#define ERROR 0
uchar status;
//存放五字节数据的数组
uchar value_array;
/*可在其他的文件引用温湿度值,实际是温度的整数的 10 倍
*如 dht11 读回的温度是 26,则 temp_value = 260, 湿度同理*/
uint temp_value,temp_value1,humi_value,humi_value1;
uchar ReadValue(void);
void DHT11_ReadTempAndHumi(void);
void Delay(uint ms)
{
uint x,t;
for(x=ms;x>0;x--)
{
for(t=124;t>0;t--);
}
}
void DHT11_Delay_10us(void)
{
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
/*读一个字节的数据*/
unsigned char DHT11_ReadValue(void)
{
unsigned char count, value = 0, i;
status = OK; //设定标志为正常状态
for(i = 8; i > 0; i--)
{
value <<= 1;//高位在先
count = 0;
DHT11_IN;
while(DHT11==0&&count++<NUMBER);//每一位数据前会有一个 50us 的低电平时间.等待 50us 低电平结束
DHT11_OUT;
if(count >= NUMBER)
{
status = ERROR; //设定错误标志
return 0;//函数执行过程发生错误就退出函数
}
DHT11_Delay_10us();//26-28us 的高电平表示该位是 0,为 70us 高电平表该位 1
DHT11_Delay_10us();
DHT11_Delay_10us();
/*延时 30us 后检测数据线是否还是高电平*/
DHT11_IN;
if(DHT11 != 0)
{
/*进入这里表示该位是 1*/
value++;
/*等待剩余(约 40us)的高电平结束*/
while(DHT11 != 0 && count++ < NUMBER)
{
SET_DHT11;
}
if(count >= NUMBER)
{
status = ERROR; //设定错误标志
return 0;
}
DHT11_OUT;
}
}
return (value);
}
//读温度和湿度函数,读一次的数据,共五字节,读出成功函数返回 OK, 错误返回 ERROR
void DHT11_ReadTempAndHumi(void)
{
unsigned char i = 0, check_value = 0,count = 0;
CLR_DHT11; //拉低数据线大于 18ms 发送开始信号
Delay(20); //需大于 18 毫秒
SET_DHT11; //释放数据线,用于检测低电平的应答信号
/*延时 20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线 80us*/
DHT11_Delay_10us();
DHT11_Delay_10us();
DHT11_Delay_10us();
DHT11_Delay_10us();
DHT11_IN;
if(DHT11!=0) //检测应答信号,应答信号是低电平
{
/*没应答信号*/
}
else
{/*有应答信号*/
while(DHT11==0&&count++<NUMBER); //等待应答信号结束
if(count>=NUMBER) //检测计数器是否超过了设定的范围
{
DHT11_OUT;
SET_DHT11;
}
count=0;
SET_DHT11;//释放数据线
/*应答信号后会有一个 80us 的高电平,等待高电平结束*/
DHT11_IN;
while(DHT11!=0&&count++<NUMBER);
if(count>=NUMBER)
{
DHT11_OUT;
}
/******读出湿.温度值******/
for(i=0;i<SIZE;i++)
{
value_array[i]= DHT11_ReadValue();
if(status == ERROR)//调用 ReadValue()读数据出错会设定 status 为 ERROR
{
SET_DHT11;
}
//读出的最后一个值是校验值不需加上去
if(i!=SIZE-1)
{
/*读出的五字节数据中的前四字节数据和等于第五字节数据表示成功*/
check_value+=value_array[i];
}
}//end for
/*在没用发生函数调用失败时进行校验*/
if(check_value==value_array[SIZE - 1])
{
humi_value=value_array[0];
humi_value1=value_array[1];
temp_value=value_array[2];
temp_value1=value_array[3];
SET_DHT11;
}
else
{}
}
}
这是DHT11的子程序,不知道为什么,数据就是没办法送出来。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|