4561|12

17

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DSP如何采集DHT11的信号-------急需,谢谢! [复制链接]

本帖最后由 qingtenglei 于 2015-9-7 15:53 编辑

各位大神好!最近 小妹正在调试DHT11的温湿度显示,从DHT11的输出管脚可以看到有波形,但是DSP2812这边不知 如何处理并显示 出来。单步执行时发现根本进不了循环,直接跳过了。

DHT11温湿度采集(1).docx

21.53 KB, 下载次数: 25

最新回复

想问一下,楼主问题解决了吗,我最近也在做这个小项目,也是在If那里进不去,到现在都不知道怎么回事  详情 回复 发表于 2015-11-3 11:23
点赞 关注
 

回复
举报

17

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
请求各位大神帮忙支招,非常感谢。
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

板凳
 
传感器DHT11可用程序.pdf (87.83 KB, 下载次数: 44) DHT11程序.docx (19.95 KB, 下载次数: 37)
感觉你基础不太好啊。在DSP的程序里面移植DHT11的驱动程序就可以了,附件仅供参考!
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

4
 
本帖最后由 qiushenghua 于 2015-9-7 16:40 编辑

楼主的问题:
1、在主程序中的do  while语句无法进入运行。改为if语句可以进入但是采集的不对
2、个人觉得在数据传输这块有点问题,但是师兄说是时序配置问题。因为此模块要时序启动。
3、DSP2812是150M,拷的程序30M的,假如延时30ms。
4、请问数据缓存这块程序有没有

液晶显示相关函数
  1. #include"DSP281x_Device.h"
  2. #include "DSP281x_Examples.h"

  3. typedef enum
  4. {
  5.        ERR = 0,
  6.            OK
  7. }RESULT;

  8. typedef struct
  9. {
  10.    Uint16 HumiH:8;
  11.    Uint16 HumiL:8;
  12.    Uint16 TempH:8;
  13.    Uint16 TempL:8;
  14.    RESULT flag;
  15. }Obj_Sensor;

  16. #define   UNDEF   0xFF
  17. #define          DATA           GpioDataRegs.GPDDAT.bit.GPIOD0
  18. #define   Data_O  GpioMuxRegs.GPDDIR.bit.GPIOD0 = 1;


  19. #define   Data_I  GpioMuxRegs.GPDDIR.bit.GPIOD0 = 0;

  20. #define          EN         GpioDataRegs.GPFDAT.bit.GPIOF2
  21. #define          RW         GpioDataRegs.GPFDAT.bit.GPIOF1
  22. #define          RS         GpioDataRegs.GPFDAT.bit.GPIOF0
  23. #define   RST   GpioDataRegs.GPFDAT.bit.GPIOF3
  24. #define          uchar         unsigned char
  25. #define          unit             unsigned int

  26. Uint16 Temp[]={0,0,0,0,0};

  27. void delay(Uint16 t);

  28. void LCD_DATA(unit d)//将数据赋值给DSP的响应控制管脚
  29. {
  30.    GpioDataRegs.GPBDAT.all=d;
  31. }


  32. void Write_order(Uint16 order)
  33. {
  34.    RS=0;delay(1);
  35.    RW=0;delay(1);
  36.    EN=1;delay(1);
  37.    LCD_DATA(order);
  38.    delay(10);
  39.    EN=0;delay(1);
  40. }

  41. void Write_data(Uint16 data)
  42. {
  43.    RS=1;delay(1);
  44.    RW=0;delay(1);
  45.    EN=1;delay(1);
  46.    LCD_DATA(data);
  47.    delay(10);
  48.    EN=0;delay(1);
  49. }

  50. void LCDInit(void)
  51. {
  52.   delay(500);
  53.   Write_order(0x30);// 功能设定:基本指令动作
  54.   delay(5);
  55.   Write_order(0x0c);//显示状态:开
  56.   delay(5);
  57.   Write_order(0x01);//清屏
  58.   delay(6);
  59.   Write_order(0x02);//地址归位:AC=0x00
  60.   delay(4);
  61. }

  62. void Gpio_Set(void)
  63. {
  64.         EALLOW;
  65.         GpioMuxRegs.GPBMUX.all=0X000;
  66.         GpioMuxRegs.GPBDIR.all =0xffff;
  67.         GpioMuxRegs.GPADIR.all =0xffff;
  68.         GpioMuxRegs.GPFMUX.all=0X000;
  69.         GpioMuxRegs.GPFDIR.bit.GPIOF0 = 1;
  70.         GpioMuxRegs.GPFDIR.bit.GPIOF1 = 1;
  71.         GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1;

  72.         EDIS;
  73. }

  74. void display(char *hz)
  75. {
  76.    while(*hz!='\0')
  77.     {
  78.        Write_data(*hz);
  79.        hz++;
  80.        delay(2);
  81.     }
  82. }

  83. //函数功能:显示十进制数据(最大9999 9999 9)
  84. //输入参数:   v:要显示的十进制数据
  85. //           add: 显示起始地址
  86. //           Len:十进制数据长度(最长9位)
  87. //输出参数:无
  88. void DisDec(Uint32 v, Uint16 add, unsigned char Len)
  89. {
  90.   Uint32 GUI_Pow10[] =
  91.   {
  92.    10, 100, 1000, 10000,
  93.   100000, 1000000, 10000000, 100000000, 1000000000
  94.   };
  95.   char c[10], g;
  96.   unsigned char s=0;
  97.   if (Len > 9)
  98.   {
  99.     Len = 9;
  100.   }
  101.   if(v == 0) Len = 1;
  102.   while(Len--)
  103.   {
  104.     //d = GUI_Pow10[Len];
  105.     g = (char) (v / GUI_Pow10[Len]);
  106.     v -= g * GUI_Pow10[Len];
  107.     c[s++] = g + '0';//数字加’0’可以转化为字符
  108.   }
  109.   c[s] = '\0';
  110.   g=0;
  111.   while(g<s-1)
  112.   {
  113.     if(c[g]=='0') c[g]=' ';
  114.         else break;
  115.         g++;
  116.   }
  117.     if(add != UNDEF) Write_order(add);
  118.     delay(5);
  119.     display(c);
  120.     GpioDataRegs.GPADAT.bit.GPIOA6=0;
  121.           DELAY_US(50000);
  122. }

复制代码


数据采集部分:
  1. void Read_Temp(Uint16 *pot)
  2. {
  3.    Uint16 a=0,b,x;
  4.    Uint16 Time_out=0;
  5.    for(;a<5;a++)
  6.    {   //0
  7.      for(b=0;b<8;b++)
  8. {  //1
  9.        while(!DATA);  //等待拉高
  10.            DELAY_US(30);  //waiting 30us
  11.            x = 0;
  12.            if(DATA) x = 1;
  13.            Time_out = 2;
  14.            while(DATA && Time_out++); //数据变为0或者超时可以结束该while
  15.            if(Time_out == 1) break;  //已经超时 跳出循环
  16.            (*pot) <<= 1;
  17.            if(x) (*pot)++;
  18.          }  //1
  19.          pot++;
  20.          GpioDataRegs.GPADAT.bit.GPIOA5=0;
  21.                   DELAY_US(50000);
  22.    }  //0

  23. }

  24. Obj_Sensor GET_Dev(void)
  25. {
  26.    Obj_Sensor Obj_x;
  27.    Uint16 u=0, sum=0;
  28.    Data_O;      //配置为输出
  29.    DATA = 0;
  30.    DELAY_US(20000);  //拉低延时20ms
  31.    DATA = 1;
  32.    DELAY_US(40);     //拉高延时40us
  33.    Data_I;      //配置为输入
  34.    Obj_x.flag = ERR;
  35.    if(DATA == 0)
  36.    {  //DHT11发送响应拉低80us
  37.       while(!DATA);  //等待拉高
  38.           while(DATA);   //等待拉低
  39.           Read_Temp(Temp);
  40.           for(;u<4;u++)
  41.         sum += Temp[u];
  42.           Obj_x.HumiH = Temp[0];
  43.           Obj_x.HumiL = Temp[1];
  44.           Obj_x.TempH = Temp[2];
  45.           Obj_x.TempL = Temp[3];
  46.           if(sum != Temp[4]) //校验和
  47.              Obj_x.flag = ERR;
  48.           else
  49.              Obj_x.flag = OK;
  50.    }
  51.    GpioDataRegs.GPADAT.bit.GPIOA4=0;
  52.       DELAY_US(50000);
  53.    return Obj_x;
  54. }
复制代码


主函数:
  1. void main(void)
  2. {
  3.     Obj_Sensor o;
  4.     InitSysCtrl();
  5.     DINT;
  6.     InitPieCtrl();
  7.     IER=0x0000;
  8.     IFR=0x0000;
  9.     Gpio_Set();
  10.         RS=0;
  11.     delay(5);
  12.     RW=0;
  13.     delay(5);
  14.     EN=0;
  15.     LCDInit();
  16.     delay(5);
  17.     Write_order(0x01);
  18.     delay(50);
  19.     Write_order(0x80);
  20.     delay(5);
  21.     display("*******");
  22.     Write_order(0x90);
  23.     delay(5);
  24.     display("*******");
  25.     Write_order(0x88);
  26.     delay(5);
  27.     display("湿度      %RH");
  28.     Write_order(0x98);
  29.     delay(5);
  30.     display("温度      ℃");
  31.     while(1)
  32.     {
  33.      /* do{
  34.          o = GET_Dev();
  35.          DELAY_US(1000000);
  36.           }


  37.       while( o.flag != OK);
  38.       */


  39.      if(o.flag != OK)
  40.     {
  41.        o = GET_Dev();
  42.        DELAY_US(1000000);
  43.     }
  44.           Write_order(0x8A);
  45.       delay(5);
  46.       display(":");
  47.       DisDec(o.HumiH, UNDEF, 2);
  48.           display(".");
  49.           DisDec(o.HumiL, UNDEF, 1);
  50.           Write_order(0x9A);
  51.       delay(5);
  52.       display(":");
  53.       DisDec(o.TempH, UNDEF, 2);
  54.           display(".");
  55.           DisDec(o.TempL, UNDEF, 1);
  56.           GpioDataRegs.GPADAT.bit.GPIOA7=0;
  57.           DELAY_US(50000);
  58.           GpioDataRegs.GPADAT.bit.GPIOA7=1;
  59.           DELAY_US(50000);
  60.       }
  61. }
复制代码

 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

5
 
将word的内容转发一下
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

6
 
jishuaihu 发表于 2015-9-7 16:28
感觉你基础不太好啊。在DSP的程序里面移植DHT11的驱动程序就可以了,附件仅供参考!

谢谢!我是刚开始接触。
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

7
 
qiushenghua 发表于 2015-9-7 16:30
将word的内容转发一下

请问您的意思是我给您发一份吗?谢谢!
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

8
 
[code]unsigned char COM(void)
{
        unsigned char i,U8comdata=0;

        for(i=0;i<8;i++)
        {
                U8FLAG=2;
                while((DATA==0)&&U8FLAG++);
                DELAY_US(30);
                U8comdata=U8comdata<<1;
                if(DATA==1){


                U8FLAG=2;
                U8comdata=U8comdata|0x01;
                while((DATA==1)&&U8FLAG++);
                }
        }
        return U8comdata;
}
在while((DATA==1)&&U8FLAG++);就出不去了
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

9
 
  1. void RH(void)
  2. {
  3. unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  4.          EALLOW;
  5.      Data_O;      //配置为输出

  6.      EDIS;
  7.      DATA=0;
  8.      DELAY_US(20000);
  9. //    DATA=1;
  10. //    DELAY_US(20);
  11.      EALLOW;
  12.      Data_I;      //配置为输入
  13.      EDIS;
  14.      DELAY_US(40);
  15.      if(DATA==0)
  16.      {
  17.              U8FLAG=2;
  18.              while((DATA==0)&&U8FLAG++);
  19.              U8FLAG=2;
  20.              while((DATA==1)&&U8FLAG++);
  21.              U8T_data_H_temp=COM();
复制代码

在if那就进不去,改成1进去后 while((DATA==1)&&U8FLAG++);跳不出。
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

10
 
while((DATA==1)&&U8FLAG++);
——这样的语句你从哪看来的?想实现什么功能?怎么越看越觉得怪怪的呢?

while里面是空语句,那么只有当while失效的时候会跳出
DATA==1如果成立,你们这半句就恒真,如果DATA==0,那么这半句恒假,和后面语句逻辑与之后亦假,直接失效跳出。

那么我们看如果DATA==1,那么它会在什么时候失效跳出吧
后面半句U8FLAG++,U8FLAG初值2,每执行一次空循环自增1,不管U8FLAG等于多少,只要它不是0那么就算逻辑真,那么它什么时候会等于0呢?只有当U8FLAG溢出的时候才能等于0。但是,你将一个变量从2自增到溢出,又不调用这个变量,反正我没看懂你想实现什么功能……
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

11
 
qiushenghua 发表于 2015-9-9 11:05
while((DATA==1)&&U8FLAG++);
——这样的语句你从哪看来的?想实现什么功能?怎么越看越觉得怪怪的呢?

...

搞不懂为什么要这样,看单片机的DHT11可用程序上是这样的。总觉得怪。
uchar dht_readat() //接收一个8 位数据,先高位后低位
{
uchar i=0,dat=0;
for(i=0;i<8;i++)
{
dht_num=2;
while((dht_dat==0)&&(dht_num++));
dht_delay_10us();dht_delay_10us();dht_delay_10us();dht_delay_10us();
dat=dat<<1;
if(dht_dat==1)
{
dht_num=2;
dat=dat|0x01;
while((dht_dat==1)&&(dht_num++));
}
}
return dat;
}
void dht_getdat() //给DHT11 一个开始信号,然后读取一次数据,共五个8 位字节
{
uchar i=0;
dht_dat=0;
dht_delay_10ms(4);
dht_dat=1; //单片机给起始脉冲信号
dht_delay_10us();dht_delay_10us();dht_delay_10us();dht_delay_10us();
dht_dat=1; //稍作延时,等待DHT11 返回响应(响应为低电平)
if(dht_dat==0) //有响应才接收数据,否则不作处理
{
dht_num=2;while((dht_dat==0)&&(dht_num++));
dht_num=2;while((dht_dat==1)&&(dht_num++));
dht_d1=dht_readat();
dht_d2=dht_readat();
dht_t1=dht_readat();
dht_t2=dht_readat();
dht_chk=dht_readat();//一次读出五个数据
}
dht_dat=1; //释放总线
dht_delay_10ms(10); //稍作延时
}
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

12
 
网上说DSP不能直接采TTL电平,要加什么滞回电路。我在想是不是我没有将信号保存还是怎么的?
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

13
 
qingtenglei 发表于 2015-9-9 10:27
在if那就进不去,改成1进去后 while((DATA==1)&&U8FLAG++);跳不出。

想问一下,楼主问题解决了吗,我最近也在做这个小项目,也是在If那里进不去,到现在都不知道怎么回事
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表