搜索
bottom↓
回复: 1

关于DHT11与msp430间的数据传输

[复制链接]

出0入0汤圆

发表于 2013-8-11 18:00:37 | 显示全部楼层 |阅读模式
#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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-8-11 18:12:16 | 显示全部楼层
不好意思 第一次发帖 标题打错了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 07:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表