查看: 1121|回复: 5

[原创] LPC51U68开发板测评__DHT11温湿度检测

[复制链接]
  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7090
    最后登录
    2023-4-20
    发表于 2019-12-7 09:00:55 | 显示全部楼层 |阅读模式
    本帖最后由 jinglixixi 于 2019-12-7 09:02 编辑

    OLED屏的显示中,是使用GPIO口来模拟I2C通讯以驱动OLED屏进行显示。
    此外,使用GPIO口与延时程序相配合还能驱动单总线器件来工作,如DHT11这类的单总线器件,其使用效果如图所示。
    IMG_20191205_083257_resized_20191205_083325076.jpg
    在这当中延时程序的作用比较关键,微秒级的延时程序为:
    1. void Delay_us(unsigned int us)
    2. {
    3.        unsigned int a;
    4.        while(us)
    5.        {
    6.               a=12;
    7.               while(a--)
    8.               { __asm("NOP");}
    9.               us--;
    10.        }
    11. }
    复制代码
    毫秒级的延时程序为:
    1. void delay_1ms(unsigned int ms)
    2. {                        
    3.        while(ms)
    4.        {
    5.                Delay_us(1000);
    6.                ms--;
    7.        }
    8.        return;
    9. }
    复制代码

    由于没有示波器之类的工具验证,延时值不很精确,期待有此类工具者能对其加以修正。
    另外,与驱动OLED屏不同的是,驱动OLED屏只控制GPIO输出信号;而单总线的信号是双向的,需要在使用过程中对信号传送方向进行切换。
    DHT11数据引脚的定义如下:
    #define       DHT11_Port          1     
    #define       DHT11_Pin              14U                                                
    #define       DHT11_DQ_OUT  GPIO->B[DHT11_Port][DHT11_Pin]
    #define       DHT11_DQ_IN    GPIO_PinRead(GPIO,DHT11_Port,DHT11_Pin)
    相应的DHT11的初始化函数为:
    1. uint8_t DHT11_Init(void)
    2. {     
    3.        GPIO->DIR[DHT11_Port] |= 1U << DHT11_Pin;
    4.        GPIO->B[DHT11_Port][DHT11_Pin];
    5.        DHT11_Rst();
    6.        return DHT11_Check();
    7. }
    复制代码

    读取DHT11温湿度值得函数为:
    1. uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)   
    2. {      
    3.        uint8_t buf[5];
    4.        uint8_t i;
    5.        DHT11_Rst();
    6.        if(DHT11_Check()==0)
    7.        {
    8.               for(i=0;i<5;i++)
    9.               {
    10.                      buf[i]=DHT11_Read_Byte();
    11.               }
    12.               if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    13.               {
    14.                      *humi=buf[0];
    15.                      *temp=buf[2];
    16.               }
    17.        }else return 1;
    18.        return 0;         
    19. }
    复制代码

    显示DHT11温湿度的主程序为:
    1. int main(void)
    2. {
    3.     uint8_t temp;
    4.     uint8_t humi;

    5.     /* Board pin, clock, debug console init */
    6.     /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    7.     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    8.     /* enable clock for GPIO*/
    9.     CLOCK_EnableClock(kCLOCK_Gpio0);
    10.     CLOCK_EnableClock(kCLOCK_Gpio1);

    11.     BOARD_InitPins();
    12.     BOARD_BootClockFROHF48M();
    13.     BOARD_InitDebugConsole();
    14.     OLED_Init();
    15.     OLED_Clear();
    16.     while (1)
    17.     {
    18.             OLED_ShowString(0,2,"Temperate:",16);
    19.             OLED_ShowString(0,4,"Humidity:",16);
    20.             DHT11_Read_Data(&temp,&humi);
    21.             OLED_ShowNum(88,2,temp,3,16);
    22.             OLED_ShowNum(88,4,humi,3,16);
    23.             delay_1ms(2000);
    24.     }
    25. }
    复制代码


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2019-12-7 10:08:02 | 显示全部楼层
    使用定时器 + 状态机的软件设计模式可以解决此类通讯
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2019-12-7 10:08:02 | 显示全部楼层
    使用定时器 + 状态机的软件设计模式可以解决此类通讯
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7090
    最后登录
    2023-4-20
     楼主| 发表于 2019-12-8 10:24:37 | 显示全部楼层
    jobszheng5 发表于 2019-12-7 10:08
    使用定时器 + 状态机的软件设计模式可以解决此类通讯

    能具体说一下?想试一试解决这类问题。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2019-12-8 11:52:37 | 显示全部楼层
    这个还不是一两句能说清楚的。
    可以了解一下有限状态机的设计模型
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7090
    最后登录
    2023-4-20
     楼主| 发表于 2019-12-8 13:39:55 | 显示全部楼层
    jobszheng5 发表于 2019-12-8 11:52
    这个还不是一两句能说清楚的。
    可以了解一下有限状态机的设计模型

    好的,谢谢。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 08:19 , Processed in 0.125464 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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