[求助] DSP如何采集DHT11的信号-------急需,谢谢!

qingtenglei   2015-9-7 15:49 楼主
各位大神好!最近 小妹正在调试DHT11的温湿度显示,从DHT11的输出管脚可以看到有波形,但是DSP2812这边不知 如何处理并显示 出来。单步执行时发现根本进不了循环,直接跳过了。 本帖最后由 qingtenglei 于 2015-9-7 15:53 编辑

回复评论 (12)

请求各位大神帮忙支招,非常感谢。
点赞  2015-9-7 15:54
传感器DHT11可用程序.pdf (87.83 KB)
(下载次数: 44, 2015-9-7 16:28 上传)
DHT11程序.docx (19.95 KB)
(下载次数: 37, 2015-9-7 16:28 上传)

感觉你基础不太好啊。在DSP的程序里面移植DHT11的驱动程序就可以了,附件仅供参考!
点赞  2015-9-7 16:28
楼主的问题: 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. }
本帖最后由 qiushenghua 于 2015-9-7 16:40 编辑
点赞  2015-9-7 16:29
将word的内容转发一下
点赞  2015-9-7 16:30
引用: jishuaihu 发表于 2015-9-7 16:28
感觉你基础不太好啊。在DSP的程序里面移植DHT11的驱动程序就可以了,附件仅供参考!

谢谢!我是刚开始接触。
点赞  2015-9-8 20:33
引用: qiushenghua 发表于 2015-9-7 16:30
将word的内容转发一下

请问您的意思是我给您发一份吗?谢谢!
点赞  2015-9-8 20:33
[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++);就出不去了
点赞  2015-9-9 10:23
  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++);跳不出。
点赞  2015-9-9 10:27
while((DATA==1)&&U8FLAG++);
——这样的语句你从哪看来的?想实现什么功能?怎么越看越觉得怪怪的呢?

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

那么我们看如果DATA==1,那么它会在什么时候失效跳出吧
后面半句U8FLAG++,U8FLAG初值2,每执行一次空循环自增1,不管U8FLAG等于多少,只要它不是0那么就算逻辑真,那么它什么时候会等于0呢?只有当U8FLAG溢出的时候才能等于0。但是,你将一个变量从2自增到溢出,又不调用这个变量,反正我没看懂你想实现什么功能……
点赞  2015-9-9 11:05
引用: 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); //稍作延时
}
点赞  2015-9-9 15:55
网上说DSP不能直接采TTL电平,要加什么滞回电路。我在想是不是我没有将信号保存还是怎么的?
点赞  2015-9-14 17:11
引用: qingtenglei 发表于 2015-9-9 10:27
在if那就进不去,改成1进去后 while((DATA==1)&&U8FLAG++);跳不出。

想问一下,楼主问题解决了吗,我最近也在做这个小项目,也是在If那里进不去,到现在都不知道怎么回事
点赞  2015-11-3 11:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复