DSP如何采集DHT11的信号-------急需,谢谢!

2019-03-26 15:21发布

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

各位大神好!最近 小妹正在调试DHT11的温湿度显示,从DHT11的输出管脚可以看到有波形,但是DSP2812这边不知 如何处理并显示 出来。单步执行时发现根本进不了循环,直接跳过了。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
qiushenghua
2019-03-27 03:54
本帖最后由 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!='')
  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] = '';
  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. }
复制代码

一周热门 更多>