请选择 进入手机版 | 继续访问电脑版
查看: 1959|回复: 3

[主题月] i.MX RT1010开发板驱动DS18B20温度传感器在LED上显示

[复制链接]
  • TA的每日心情
    开心
    前天 08:28
  • 签到天数: 1313 天

    [LV.10]以坛为家III

    124

    主题

    2825

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7552
    最后登录
    2024-3-27
    发表于 2021-5-31 17:34:54 | 显示全部楼层 |阅读模式
    本帖最后由 TLLED 于 2021-6-1 08:14 编辑

         赶在五月的末班车来驱动DS18B20温度传感器读取环境温度,并显示在LED数码管上。


       一、功能
         
        1.1、i.MX RT1010开发板驱动TM1638模块显示屏,显示数字温度。
        1.2、i.MX RT1010开发板驱动DS18B20读取环境温度。
        1.3、i.MX RT1010开发板串口输出DS18B20温度值。




       二、使用的模块


        2.1、rt1010开发板


        004.jpg
       
        2.2、DS18B20
       
        002.jpg


        2.2、TM1638模块


        003.jpg




       三、工作流程


        定时500ms -> 中断处理(读取DS18B20温度,显示LED数码管,串口打印温度)。


        四、程序代码


        4.1、TM1638.C
       

    1. #include "pin_mux.h"
    2. #include "clock_config.h"
    3. #include "board.h"
    4. #include "fsl_debug_console.h"
    5. #include "fsl_gpio.h"
    6. #include "tm1638.h"

    7. const uint8_t  tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
    8.                            0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

    9. const uint8_t  tabb[]={0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF,0x77,0x7C,0x39,0x5E,0x79,0x71};

    10. gpio_pin_config_t tm1638_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
    11. gpio_pin_config_t tm1638_in_config = {kGPIO_DigitalInput, 0, kGPIO_NoIntmode};

    12. void tm1638_writedata(uint8_t        dat)               
    13. {
    14.         uint8_t i;
    15.         for(i=0;i<8;i++)
    16.         {
    17.                 CLK_L();
    18.                 if(dat&0X01)
    19.                 {
    20.                         DIO_H();
    21.                 }
    22.                 else
    23.                 {
    24.                         DIO_L();
    25.                 }
    26.                 dat>>=1;
    27.                 SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    28.                 CLK_H();
    29.                 SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    30.         }
    31. }

    32. uint8_t tm1638_readdata(void)                                       
    33. {
    34.         uint8_t i;
    35.         uint8_t temp=0;
    36.         
    37.         GPIO_PinInit(TM1638_GPIO, TM1638_DIO_PIN, &tm1638_in_config);
    38.         
    39.         for(i=0;i<8;i++)
    40.         {
    41.                 temp>>=1;
    42.                 CLK_L();
    43.                 SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    44.                 if(GPIO_PinRead(TM1638_GPIO, TM1638_DIO_PIN))   
    45.                         temp|=0x80;
    46.                 CLK_H();
    47.                 SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    48.         }
    49.         
    50.         GPIO_PinInit(TM1638_GPIO, TM1638_DIO_PIN, &tm1638_config);
    51.         
    52.         return temp;
    53. }

    54. void tm1638_writecmd(uint8_t cmd)               
    55. {
    56.         STB_L();
    57.         tm1638_writedata(cmd);
    58.         STB_H();
    59. }

    60. void tm1638_addr_writedata(uint8_t addr,uint8_t dat)               
    61. {
    62.         tm1638_writecmd(0x44);
    63.         STB_L();
    64.         tm1638_writedata(0xc0|addr);
    65.         tm1638_writedata(dat);
    66.         STB_H();
    67. }

    68. void tm1638_writeallLED(uint8_t LED_flag)                                       
    69. {
    70.         uint8_t i;
    71.         for(i=0;i<8;i++)
    72.         {
    73.                 if(LED_flag&(1<<i))
    74.                         tm1638_addr_writedata(2*i+1,1);
    75.                 else
    76.                         tm1638_addr_writedata(2*i+1,0);
    77.         }
    78. }

    79. void TM1638_Disp(char* dat)
    80. {
    81.         uint8_t i;
    82.         for(i=0;i<3;i++)
    83.         {
    84.                         tm1638_addr_writedata(i<<1,tab[dat[i]]);                        
    85.         }
    86. }

    87. void TM1638_DispTemp(char* dat)
    88. {
    89.         uint8_t i;
    90.         for(i=0;i<3;i++)
    91.         {
    92.                 if(i==1)
    93.                 {
    94.                         tm1638_addr_writedata(i<<1,tabb[dat[i]]);
    95.                 }
    96.                 else
    97.                 {
    98.                         tm1638_addr_writedata(i<<1,tab[dat[i]]);
    99.                 }
    100.                                                 
    101.         }
    102. }


    103. uint8_t tm1638_readkey(void)
    104. {
    105.         uint8_t c[4],i,key_value=0;
    106.         STB_L();
    107.         tm1638_writedata(0x42);                           
    108.         for(i=0;i<4;i++)               
    109.                 c[i]=tm1638_readdata();
    110.         STB_H();                                                   //4个字节数据合成一个字节
    111.         for(i=0;i<4;i++)
    112.                 key_value|=c[i]<<i;
    113.         for(i=0;i<8;i++)
    114.                 if((0x01<<i)==key_value)
    115.                         break;
    116.         return i;
    117. }

    118. void init_tm1638(void)
    119. {
    120.         uint8_t i;

    121.         GPIO_PinInit(TM1638_GPIO, TM1638_DIO_PIN, &tm1638_config);
    122.         GPIO_PinInit(TM1638_GPIO, TM1638_CLK_PIN, &tm1638_config);
    123.         GPIO_PinInit(TM1638_GPIO, TM1638_STB_PIN, &tm1638_config);
    124.         
    125.         tm1638_writecmd(0x8b);       //亮度 (0x88-0x8f)8级亮度可调
    126.         tm1638_writecmd(0x40);       //采用地址自动加1
    127.         STB_L();                           //
    128.         tm1638_writedata(0xc0);    //设置起始地址

    129.         for(i=0;i<16;i++)           //传送16个字节的数据
    130.                 tm1638_writedata(0x00);
    131.         STB_H();
    132.         
    133.         
    134.         for(i=0;i<8;i++)
    135.         {
    136.                 tm1638_addr_writedata(i<<1,0x00);   
    137.         }
    138. }
    复制代码

        4.2、DS18B20.C
       
    1. #include "pin_mux.h"
    2. #include "clock_config.h"
    3. #include "board.h"
    4. #include "fsl_debug_console.h"
    5. #include "fsl_gpio.h"
    6. #include "ds18b20.h"

    7. gpio_pin_config_t ds18b20_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
    8. gpio_pin_config_t ds18b20_in_config = {kGPIO_DigitalInput, 0, kGPIO_NoIntmode};

    9. //DS18B20复位
    10. void DS18B20_Rst(void)        
    11. {
    12.         GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出
    13.         DS18B20_DIO_L();  //DQ=0
    14.         SDK_DelayAtLeastUs(750, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    15.         DS18B20_DIO_H();        //DQ=1
    16.         SDK_DelayAtLeastUs(15, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    17. }

    18. //检测DS18B20
    19. uint8_t DS18B20_Check(void)            
    20. {   
    21.         uint8_t retry=0;
    22.         GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_in_config); //设置为输入
    23.         while ( (GPIO_PinRead(DS18B20_GPIO, DS18B20_DIO_PIN)) &&retry<200)
    24.         {
    25.                 retry++;
    26.                 SDK_DelayAtLeastUs(1, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    27.         };         
    28.         if(retry>=200)
    29.                 return 1;
    30.         else
    31.                 retry=0;
    32.    
    33.         while (!(GPIO_PinRead(DS18B20_GPIO, DS18B20_DIO_PIN))&&retry<240)
    34.         {
    35.                 retry++;
    36.                 SDK_DelayAtLeastUs(1, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    37.         };
    38.         if(retry>=240)return 1;            
    39.         return 0;
    40. }

    41. //从DS18B20读取一个位
    42. //返回值:1/0
    43. uint8_t DS18B20_Read_Bit(void)         
    44. {
    45.         uint8_t data;
    46.         GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出
    47.         DS18B20_DIO_L();
    48.         SDK_DelayAtLeastUs(2, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    49.         DS18B20_DIO_H();
    50.         
    51.         GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_in_config); //设置为输入
    52.         SDK_DelayAtLeastUs(12, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    53.         

    54.         if( GPIO_PinRead(DS18B20_GPIO, DS18B20_DIO_PIN) ) data=1;
    55.     else data=0;        
    56.                 SDK_DelayAtLeastUs(50, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);        
    57.     return data;
    58. }


    59. //从DS18B20读取一个字节
    60. //返回值:读到的数据
    61. uint8_t DS18B20_Read_Byte(void)     
    62. {        
    63.         uint8_t i,j,dat;
    64.         dat=0;
    65.         for (i=1;i<=8;i++)
    66.         {
    67.                 j=DS18B20_Read_Bit();
    68.                 dat=(j<<7)|(dat>>1);
    69.         }                                                   
    70.         return dat;
    71. }

    72. //写一个字节到DS18B20
    73. //dat:要写入的字节
    74. void DS18B20_Write_Byte(uint8_t dat)     
    75. {            
    76.         uint8_t j;
    77.         uint8_t testb;
    78.         GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出
    79.         
    80.         for (j=1;j<=8;j++)
    81.         {
    82.                 testb=dat&0x01;
    83.                 dat=dat>>1;
    84.                 if (testb)
    85.                 {
    86.                         DS18B20_DIO_L();
    87.                         SDK_DelayAtLeastUs(2, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);   
    88.       DS18B20_DIO_H();                    
    89.                         SDK_DelayAtLeastUs(60, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);            
    90.                 }
    91.                 else
    92.                 {
    93.                         DS18B20_DIO_L();
    94.                         SDK_DelayAtLeastUs(60, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);   
    95.                         DS18B20_DIO_H();              
    96.                         SDK_DelayAtLeastUs(2, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);                        
    97.                 }
    98.         }
    99. }


    100. //开始温度转换
    101. void DS18B20_Start(void)
    102. {                                                                  
    103.         DS18B20_Rst();           
    104.         DS18B20_Check();         
    105.         DS18B20_Write_Byte(0xcc);        // skip rom
    106.         DS18B20_Write_Byte(0x44);        // convert
    107. }

    108. //初始化DS18B20的IO口 DQ 同时检测DS的存在
    109. //返回1:不存在
    110. //返回0:存在            
    111. uint8_t DS18B20_Init(void)
    112. {
    113.          GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出

    114.         DS18B20_Rst();

    115.         return DS18B20_Check();
    116. }  
    117. //从ds18b20得到温度值
    118. //精度:0.1C
    119. //返回值:温度值 (-550~1250)
    120. short DS18B20_Get_Temp(void)
    121. {
    122.         uint8_t temp;
    123.         uint8_t TL,TH;
    124.         short tem;
    125.         DS18B20_Start ();                          // ds1820 start convert
    126.         DS18B20_Rst();
    127.         DS18B20_Check();         
    128.         DS18B20_Write_Byte(0xcc);        // skip rom
    129.         DS18B20_Write_Byte(0xbe);        // convert            
    130.         TL=DS18B20_Read_Byte();         // LSB   
    131.         TH=DS18B20_Read_Byte();         // MSB  
    132.                      
    133.         if(TH>7)
    134.         {
    135.                         TH=~TH;
    136.                         TL=~TL;
    137.                         temp=0;                                        //温度为负  
    138.         }else temp=1;                                //温度为正                    
    139.         tem=TH;                                         //获得高八位
    140.         tem<<=8;   
    141.         tem+=TL;                                        //获得底八位
    142.         tem=(float)tem*0.625;                //转换     
    143.         if(temp)return tem;                 //返回温度值
    144.         else return -tem;   
    145. }
    复制代码

        4.3、pit.c
       
    1. #include "fsl_debug_console.h"
    2. #include "pin_mux.h"
    3. #include "clock_config.h"
    4. #include "board.h"
    5. #include "fsl_pit.h"
    6. #include "ds18b20.h"
    7. #include "tm1638.h"

    8. #define DEMO_PIT_BASEADDR                                 PIT
    9. #define DEMO_PIT_CHANNEL                                  kPIT_Chnl_0
    10. #define PIT_LED_HANDLER                                   PIT_IRQHandler
    11. #define PIT_IRQ_ID                                        PIT_IRQn
    12. #define PIT_SOURCE_CLOCK                                         CLOCK_GetFreq(kCLOCK_OscClk)

    13. volatile bool pitIsrFlag = false;


    14. void PIT_LED_HANDLER(void)
    15. {
    16.     /* Clear interrupt flag.*/
    17.     PIT_ClearStatusFlags(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, kPIT_TimerFlag);
    18.     pitIsrFlag = true;

    19.     __DSB();
    20. }


    21. void init_pit(void)
    22. {
    23.                 pit_config_t pitConfig;
    24.     /* Set PERCLK_CLK source to OSC_CLK*/
    25.     CLOCK_SetMux(kCLOCK_PerclkMux, 1U);
    26.     /* Set PERCLK_CLK divider to 1 */
    27.     CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U);
    28.         
    29.     /*
    30.      * pitConfig.enableRunInDebug = false;
    31.      */
    32.     PIT_GetDefaultConfig(&pitConfig);

    33.     /* Init pit module */
    34.     PIT_Init(DEMO_PIT_BASEADDR, &pitConfig);

    35.     /* Set timer period for channel 0 */
    36.     PIT_SetTimerPeriod(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));

    37.     /* Enable timer interrupts for channel 0 */
    38.     PIT_EnableInterrupts(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, kPIT_TimerInterruptEnable);

    39.     /* Enable at the NVIC */
    40.     EnableIRQ(PIT_IRQ_ID);
    41.                  /* Start channel 0 */
    42.     PRINTF("\r\nStarting channel No.0 ...");
    43.     PIT_StartTimer(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL);
    44. }


    45. void pit_hdl(void)
    46. {
    47.         short temperature;
    48.         uint8_t temp[8];
    49.         
    50.         if (true == pitIsrFlag)
    51.         {
    52.                
    53.                 temperature=DS18B20_Get_Temp();        
    54.                 if(temperature<0)
    55.                 {
    56.                         temperature=-temperature;                                        //转为正数
    57.                 }
    58.                 PRINTF("\r\n temperature = %d !",temperature);
    59.                 temp[0]=temperature/100;
    60.                 temp[1]=(temperature%100)/10;
    61.                 temp[2]=(temperature%100)%10;
    62.                
    63.                 TM1638_DispTemp(temp);
    64.                
    65.                         
    66.                         //LED_TOGGLE();
    67.                         pitIsrFlag = false;
    68.         }
    69. }


    复制代码

        4.4、程序源代码
            
        ds18b20-20210531.rar (587.56 KB, 下载次数: 12)
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3296

    主题

    6541

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31904
    最后登录
    2024-3-28
    发表于 2021-5-31 17:48:05 | 显示全部楼层
    阔以,也赶上了末班车
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 08:28
  • 签到天数: 1313 天

    [LV.10]以坛为家III

    124

    主题

    2825

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7552
    最后登录
    2024-3-27
     楼主| 发表于 2021-6-1 08:01:27 | 显示全部楼层
    NXP管管 发表于 2021-5-31 17:48
    阔以,也赶上了末班车

                           
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:00
  • 签到天数: 554 天

    [LV.9]以坛为家II

    34

    主题

    5904

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5604
    最后登录
    2024-3-28
    发表于 2021-6-8 18:23:54 | 显示全部楼层
    很棒,谢谢分享
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-3-29 02:44 , Processed in 0.115608 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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