发 帖  
原厂入驻New

[经验] 【MAX32660试用体验】DHT11

2019-3-28 09:49:48  688 MAX32660 DHT11湿度传感器 传感器
分享
1
测试了下LP中的DeepSleep,代码如下
  1. LP_EnableGPIOWakeup((gpio_cfg_t*)&pb_pin[0]);printf("EnableGPIOWakeup .\n");

  2.                 MXC_GCR->scon |= 0x4000;  // Disable SWD

  3.                 printf("Entering DEEPSLEEP mode.\n");
  4.                 LP_Disablebandgap();
  5.                 LP_DisableVCorePORSignal();
  6.                 LP_EnableRamRetReg();
  7.                 LP_DisableBlockDetect();
  8.                 LP_EnableFastWk();
  9.                 LP_EnterDeepSleepMode();

  10.                 MXC_GCR->scon &= 0xBFFF;  // Enable SWD
  11.                 printf("Entering not DEEPSLEEP mode.\n");
  12.                 rDeepSleepMode=0;
  13.   
复制代码
进入和出SLEEP同时出现,没成功。


准备进行与DHT11湿度传感器连接的工作。
捕捉_3.jpg 捕捉_1.jpg 捕捉_3.jpg



  1. /***** Includes *****/
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include "mxc_config.h"
  5. #include "nvic_table.h"
  6. #include "board.h"
  7. #include "rtc.h"
  8. #include "LED.h"
  9. #include "pb.h"
  10. #include "tmr_utils.h"
  11. #include "gpio.h"
  12. #include "lp.h"
  13. #include "icc.h"

  14. #include "uart.h"


  15. /***** Definitions *****/
  16. #define LED_ALARM           0

  17. #define SUBSECOND_MSEC_0    250

  18. #define SECS_PER_MIN        60
  19. #define SECS_PER_HR         (60 * SECS_PER_MIN)
  20. #define SECS_PER_DAY        (24 * SECS_PER_HR)

  21. #define MSEC_TO_RSSA(x) (0 - ((x * 256) / 1000)) /* Converts a time in milleseconds to the equivalent RSSA register value. */

  22. #define DEEPSLEEP    1
  23. /*LED Control PIN red*/

  24. #define GPIO_PORT_OUT                PORT_0
  25. #define GPIO_PIN_OUT                 PIN_9

  26. /*DHT11 Control PIN */

  27. #define GPIO_PIN_OUT2                 PIN_4

  28. /***** Globals *****/
  29. uint32_t ss_interval = SUBSECOND_MSEC_0;
  30. volatile int buttonPressed = 0;
  31. volatile int rtcalarm = 0;
  32. volatile int rDeepSleepMode = 0;
  33.         gpio_cfg_t dht_in = {PORT_0, GPIO_PIN_OUT2, GPIO_FUNC_IN, GPIO_PAD_NONE};
  34. /***** Functions *****/

  35. void microSeconds(int us) {

  36.     /* Demonstrates the TMR driver delay */
  37.     //    TMR_Delay(MXC_TMR0, USEC(us), NULL); // todo check IF this is µsec or msec
  38.     uint32_t i = 0;
  39.     for( i=0; i < us * 4; i++) {
  40.         asm(" nop");
  41.     }
  42. }
  43. void RTC_IRQHandler(void)
  44. {
  45.     int flags = RTC_GetFlags();

  46.     rtcalarm = 1;
  47.     /* Check sub-second alarm flag. */
  48.     if (flags & MXC_F_RTC_CTRL_ALSF) {

  49.         RTC_CleaRFlags(MXC_F_RTC_CTRL_ALSF);

  50.     }

  51.     /* Check time-of-day alarm flag. */
  52.     if (flags & MXC_F_RTC_CTRL_ALDF) {
  53.         RTC_ClearFlags(MXC_F_RTC_CTRL_ALDF);


  54.         /* Set a new alarm 10 seconds from current time. */


  55.     }

  56. }

  57. void buttonHandler(void *pb)
  58. {
  59.     buttonPressed = 1;
  60. }


  61. /*从DHT11读取一个位,返回值:1/0。
  62. 每一bit数据都以50us的低电平时序开始,高电平的宽度决定了bit数据位的0或1,
  63. 高电平状态在26~28us时,表示数据位为0,高电平状态在70us时,表示数据位为1.
  64. DHT11_DQ_IN是读取对应端口引脚的输入电平,在读之前,该引脚要配置为上拉下拉输入模式
  65. */
  66. char DHT11_Read_Bit(void)
  67. {
  68.         char retry=0;
  69. while(GPIO_InGet(&dht_in)&&retry<100)//读取高电平中,等待变为低电平,/*&&与<的优先级是<高于&&*/
  70. {
  71. retry++;
  72. MicroSeconds(1);//SysTickDelay(1);
  73. }
  74. retry=0;
  75. while(!GPIO_InGet(&dht_in)&&retry<100)//读取低电平中,等待变高电平
  76. {
  77. retry++;
  78. MicroSeconds( 1);//SysTickDelay(1);
  79. }
  80. MicroSeconds( 40);//SysTickDelay(40);//等待40us
  81. if(GPIO_InGet(&dht_in))return 1;
  82. else return 0;
  83. }

  84. char DhtReadByte(void)
  85. {
  86.         char j,dat;
  87.     dat=0;

  88. for(j=0;j<8;j++)
  89. {
  90. /*while (!GPIO_InGet(&dht_in));   // 等待低电平结束
  91. MicroSeconds(uint32_t 25);   // 延时   Delay25us
  92. if(GPIO_InGet(&dht_in))     // 检测数据线是高电平还是低电平
  93. {    bit_i=1;    while(TRH);   }
  94.   else   {    bit_i=0;   }
  95. dat<<=1;       // 将该位移位保存到dat变量中
  96. dat|=bit_i;   */
  97.     dat<<=1;
  98.    dat|=DHT11_Read_Bit();
  99. }

  100. return(dat);  }

  101. void printTime(void)
  102. {
  103.     int day, hr, min, sec;
  104.     double subsec;

  105.     subsec = RTC_GetSubSecond() / 256.0;
  106.     sec = RTC_GetSecond();

  107.     day = sec / SECS_PER_DAY;
  108.     sec -= day * SECS_PER_DAY;

  109.     hr = sec / SECS_PER_HR;
  110.     sec -= hr * SECS_PER_HR;

  111.     min = sec / SECS_PER_MIN;
  112.     sec -= min * SECS_PER_MIN;

  113.     subsec += sec;

  114.     printf("Current Time (dd:hh:mm:ss): %02d:%02d:%02d:%05.2f\n", day, hr, min, subsec);
  115. }
  116. int main(void)
  117. {
  118.     const sys_cfg_tmr_t sys_tmr_cfg = {0};  // Do not enable timer output.
  119.     //sys_cfg_rtc_t sys_cfg;
  120.         gpio_cfg_t gpio_out0;
  121.         /* Setup output pin  FOR led. */
  122.         gpio_out0.port = GPIO_PORT_OUT;
  123.         gpio_out0.mask = GPIO_PIN_OUT;
  124.         gpio_out0.pad = GPIO_PAD_NONE;
  125.         gpio_out0.func = GPIO_FUNC_OUT;
  126.         GPIO_Config(&gpio_out0);
  127.         gpio_cfg_t dht_in = {PORT_0, GPIO_PIN_OUT2, GPIO_FUNC_IN, GPIO_PAD_NONE};
  128.         gpio_cfg_t dht_out = {PORT_0, GPIO_PIN_OUT2, GPIO_FUNC_OUT, GPIO_PAD_NONE};
  129.     /*
  130. gpio_cfg_t dht_in = {PORT_0, GPIO_PIN_OUT2, GPIO_FUNC_IN, GPIO_PAD_NONE};
  131. gpio_cfg_t dht_out = {PORT_0, GPIO_PIN_OUT2, GPIO_FUNC_OUT, GPIO_PAD_NONE};
  132. gpio_cfg_t d0 = {PORT_0, PIN_2, GPIO_FUNC_OUT, GPIO_PAD_NONE};
  133. gpio_cfg_t d1 = {PORT_0, PIN_3, GPIO_FUNC_OUT, GPIO_PAD_NONE};
  134. gpio_cfg_t d2 = {PORT_0, PIN_4, GPIO_FUNC_OUT, GPIO_PAD_NONE};
  135. gpio_cfg_t d3 = {PORT_0, PIN_5, GPIO_FUNC_OUT, GPIO_PAD_NONE};      */
  136.         int count = 0;
  137.         printf("\n\n***** DHT11  on P0.4 ******\n\n");
  138.         printf(
  139.                         "1.  An interrupt is set up on P0.12.  when that interrupt occurs.using a push button (S1) to start DHT11\n\n");
  140.         printf("2. This example outputs the same state onto P0.9 (led_R) and outputs the same  state onto P0.13 (led_G).\n\n");

  141.     printf("3.space led_G     Init led_R   15s       DATA_IN led_Y        %d ms.\n", SUBSECOND_MSEC_0);

  142.     NVIC_EnableIRQ(RTC_IRQn);

  143.     // Setup callback to receive notification of when button is pressed.
  144.     PB_RegisterCallback(0, buttonHandler);

  145.     // Turn LED off initially
  146.     GPIO_OutClr(&gpio_out0);
  147.     LED_Off(LED_ALARM);
  148.             TMR_Delay(MXC_TMR0, MSEC(1000), &sys_tmr_cfg);

  149.     int i=0;
  150.     while (1) {
  151.         if (buttonPressed) {
  152.             // Show the time elapsed.
  153.             printTime();
  154.             // Delay for switch debouncing.
  155.             TMR_Delay(MXC_TMR0, MSEC(100), &sys_tmr_cfg);
  156.             printf("buttonPressed    count = %d\n", count++);
  157.             // Re-arm switch detection.
  158.             i++;
  159.             buttonPressed = 0;
  160.             char check;    // 校验字节
  161.             char TemHig,TemLow,HumiHig,HumiLow;
  162.             GPIO_Config(&dht_out);
  163.             GPIO_OutClr(&dht_out);
  164.                   // 主机拉低18ms  DelayMs(18);
  165.             TMR_Delay(MXC_TMR0, MSEC(18), &sys_tmr_cfg);
  166.             GPIO_OutSet(&dht_out); // DATA总线由上拉电阻拉高 主机延时20us
  167.             MicroSeconds( 20);
  168.             GPIO_Config(&dht_in);            // 主机设为输入
  169.             TMR_Delay(MXC_TMR0, MSEC(15000), &sys_tmr_cfg);       //  主机延时15s
  170.             GPIO_Config(&dht_out);
  171.             GPIO_OutClr(&dht_out);
  172.                   // 主机拉低18ms  DelayMs(18);
  173.             TMR_Delay(MXC_TMR0, MSEC(18), &sys_tmr_cfg);
  174.             GPIO_OutSet(&dht_out); // DATA总线由上拉电阻拉高 主机延时20us
  175.             MicroSeconds( 20);
  176.             GPIO_Config(&dht_in);            // 主机设为输入
  177.             while (!GPIO_InGet(&dht_in));    // 等待DHT 80us的低电平结束
  178.             while (GPIO_InGet(&dht_in));    // 等待DHT 80us的高电平结束
  179.             HumiHig = DhtReadByte(); // 湿度高8位
  180.             HumiLow = DhtReadByte();  // 湿度低8为,总为0
  181.             TemHig  = DhtReadByte(); // 温度高8位
  182.             TemLow  = DhtReadByte();  // 温度低8为,总为0
  183.             check   = DhtReadByte(); // 8位校验码,其值等于读出的四个字节相加之和的低8位
  184.             //TRH=1;    // 释放总线
  185.             if(check==HumiHig + HumiLow + TemHig + TemLow)    // 如果收到的数据无误
  186.             {printf("HumiHig   = %d. %d\n", HumiHig,HumiLow);
  187.             printf("TemHig   = %d. %d\n", TemHig,TemLow);
  188.             printf("check   = %d\n", check);}


  189.         }

  190.     }
  191. }
复制代码
检测运行成功
5.png
捕捉_4.jpg
形象代言人o 2019-3-29 15:45:15
感谢楼主的热心分享
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

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