查看: 2653|回复: 8

[原创] LY_KL26Z板学习之 单总线 18B20温度传感器

[复制链接]
  • TA的每日心情
    开心
    2019-7-11 19:28
  • 签到天数: 141 天

    连续签到: 1 天

    [LV.7]常住居民III

    34

    主题

    1067

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2492
    最后登录
    2020-9-16
    发表于 2015-10-5 10:55:06 | 显示全部楼层 |阅读模式
    本帖最后由 chifen 于 2015-10-5 11:14 编辑

    DS18B20的资料这里就不介绍了,这里只说怎么使用
    1, 硬件,18B20要用一条线就可以实现 读取,所 先要找一个IO做连线,这里使用的是PA13
    2,   软件的实现 ,这里主要是移植一些现成的程序代码,KL26与别的ARM的IO操作是差不多的, ARM 的IO不能像8位单片机一样 在使用的时候 也可以输出 和输入 , 我在现有的源码中,只发现 二种状态 ,输出和输入模式,这里我在每次操用IO前,做一个状态转换,比如我要用输入模式时,改成输入模式
    附个代码  :
       
    1.   //数据线强制拉低
    2. #define        CLR_DS18B20            GPIO_CLR(MKL_PORTA, 13)  
    3.       //数据线强制拉高,上拉
    4. #define        SET_DS18B20            GPIO_SET(MKL_PORTA,13 )      
    5. //输出
    6. #define        HLD_DS18B20            GPIO_DDR_OUTPUT(MKL_PORTA,13) //M0控制总线
    7. //输入
    8. #define        RLS_DS18B20             GPIO_DDR_INPUT(MKL_PORTA,13)   //释放总线
    9. //查询
    10. #define        STU_DS18B20           GPIO_GET_VALUE(MKL_PORTA,13)          //数据线的状态
    复制代码
    3,如何读取,这里主要是延时,这里我有一个延时函数做处理,精度不高,但只要满足18B20总线的唤醒条件就可以,我是用逻辑分析仪测到的延时时间是delay_nus(480)时 580US左右  附代码:

    //延时函数
    1. void delay_nus(uint32_t count)

    2. {

    3. uint32_t i,j;

    4. for(i=count;i>0;i--)

    5. for(j=9;j>0;j--);

    6. }
    复制代码



    4,其它部分没有改动

    1. /***************************************************/


    2. /*-------------------------------------------------*/
    3. //#include "..\..\App\includes.h"
    4. #include "ds18b20.h"
    5. //#include "DrvSYS.h"
    6. unsigned char DS18B20_sign_flag=0;


    7. void  gpio_18B20 (void)
    8. {
    9.     /*
    10.      *  开启PB PD GPIO时钟
    11.      */
    12.     SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK  ;

    13.           PORTA_PCR13 |= (PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK);   

    14.     FGPIOA_PSOR |= 1<<13;  
    15.           FGPIOA_PDDR |= 1<<13;     /* 配置GPIO为输出               */
    16.    
    17.          

    18. }


    19. /*************************************************************************************

    20. ** Function name: delay_ms

    21. ** Descriptions: 大约40us(晶振为12MHZ)延时子程序

    22. ** input parameters: count

    23. ** output parameters: 无

    24. ** Returned value: 无

    25. *************************************************************************************/

    26. void delay_nus(uint32_t count)

    27. {

    28. uint32_t i,j;

    29. for(i=count;i>0;i--)

    30. for(j=9;j>0;j--);

    31. }

    32. /**********************************************************************
    33. functionName: unsigned char resetDS18B20(void)
    34. description :DS18B20初始化
    35. **********************************************************************/
    36. unsigned char resetDS18B20(void)
    37. {
    38.     unsigned char errTime=0;
    39.     HLD_DS18B20;                   //控制总线
    40.     CLR_DS18B20;                   //强制拉低
    41.            //3us
    42.     delay_nus(480);               //以上延时大于480us
    43.    
    44.     SET_DS18B20;
    45.     RLS_DS18B20;                   //释放总线,总线自动上拉 DDR
    46.     delay_nus(10);          //15~60us
    47.          
    48.     while (STU_DS18B20)
    49.     {
    50.         delay_nus(3);           //5.15us
    51.         errTime++;
    52.         if (errTime>25)
    53.             return(0x00);  //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
    54.     }
    55.     errTime=0;
    56.     while (!(STU_DS18B20))
    57.     {
    58.         delay_nus(3);           //5.15us
    59.         errTime++;
    60.         if (errTime>50)
    61.             return(0x00);  //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
    62.     }
    63.     HLD_DS18B20;                   //控制总线
    64.     SET_DS18B20;                   //强制拉高
    65.      delay_nus(300);
    66.     return(0xff);
    67. }

    68. /**********************************************************************
    69. functionName: unsigned char readByteDS18B20(void)
    70. description :读DS18B20一个字节
    71. **********************************************************************/
    72. unsigned char readByteDS18B20(void)
    73. {
    74.     unsigned char i;
    75.     unsigned char retVal=0;
    76.     //RLS_DS18B20;                   //释放总线
    77.     for (i=8;i>0;i--)
    78.     {

    79.         HLD_DS18B20;           //控制总线
    80.         CLR_DS18B20;           //强制拉低
    81.         delay_nus(2);           //延时大于1us
    82.         SET_DS18B20;           //释放总线,DS18B20会将总线强制拉低
    83.         RLS_DS18B20;           //释放总线
    84.         delay_nus(2);
    85.                   retVal>>=1;
    86.         if (STU_DS18B20)
    87.             retVal|=0x80;
    88.         delay_nus(40);   //31us

    89.     }
    90.     HLD_DS18B20;                   //控制总线
    91.     SET_DS18B20;                   //强制拉高
    92.     return(retVal);
    93. }

    94. /**********************************************************************
    95. functionName: unsigned char readByteDS18B20(void)
    96. description :写DS18B20一个字节
    97. **********************************************************************/
    98. void writeByteDS18B20(unsigned char wb)
    99. {
    100.     unsigned char i;
    101.     unsigned char temp;

    102.     //RLS_DS18B20;                //释放总线
    103.     for (i=0;i<8;i++)
    104.     {
    105.         HLD_DS18B20;                //控制总线
    106.         CLR_DS18B20;                //强制拉低
    107.         delay_nus(12);                 //14.92us
    108.         temp=wb>>i;
    109.         if (temp&=0x01)
    110.             SET_DS18B20;    //释放总线
    111.         else
    112.             CLR_DS18B20;        //强制拉低
    113.          delay_nus(30);            //30.38us
    114.         SET_DS18B20;                //释放总线
    115.         delay_nus(2);                 //2.71us(大于1us就行了)
    116.     }
    117. }

    118. /**********************************************************************
    119. functionName: get_rom(unsigned char* p)
    120. description :读ROM
    121. **********************************************************************/
    122. void get_rom(unsigned char* p)
    123. {
    124.     unsigned char i;
    125.     if (resetDS18B20()==0xff)
    126.     {
    127.         writeByteDS18B20(ds18b20_read_rom);
    128.         for (i=0;i<8;i++)
    129.         {
    130.             *p++ = readByteDS18B20();
    131.         }
    132.     }
    133. }

    134. /**********************************************************************
    135. functionName: void set_ds18b20(char th,char tl,unsigned char config)
    136. description :设定DS18B20模式
    137. **********************************************************************/
    138. void set_ds18b20(char th,char tl,unsigned char config)
    139. {
    140.     if (resetDS18B20()==0xff)
    141.     {
    142.         writeByteDS18B20(ds18b20_skip_rom);
    143.         writeByteDS18B20(ds18b20_write_ram);
    144.         writeByteDS18B20(th);
    145.         writeByteDS18B20(tl);
    146.         writeByteDS18B20(config);
    147.     }
    148. }
    149. /**********************************************************************
    150. functionName: convert_ds18b20(void)
    151. description :写DS18B20一个字节
    152. **********************************************************************/
    153. void convert_ds18b20(void)
    154. {
    155.     if (resetDS18B20()==0xff)
    156.     {
    157.         writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
    158.         writeByteDS18B20(ds18b20_convert_tem);        //启动温度转换
    159.     }
    160. }

    161. /**********************************************************************
    162. functionName: unsigned int readTempDS18B20(void)
    163. description :读DS18B20温度   有正负符号标志和两个小数点精度
    164. **********************************************************************/
    165. unsigned int readTempDS18B20(void)
    166. {
    167.     unsigned char tempL,tempH,wm0,wm2;
    168.     unsigned int x;

    169.     if (resetDS18B20()==0)
    170.                 { SET_DS18B20;  return 0;}
    171.     writeByteDS18B20(ds18b20_skip_rom);        //跳过ROM
    172.     writeByteDS18B20(ds18b20_read_ram);        //读数据
    173.     tempL=readByteDS18B20();
    174.     tempH=readByteDS18B20();

    175.     wm0=tempL;
    176.     wm0=wm0>>4;
    177.     tempH=tempH<<4;
    178.     wm2=wm0+tempH; //温度的整数值
    179.     if (wm2&0x80)  //测试符号位
    180.     {
    181.         DS18B20_sign_flag=1;
    182.         wm2=256-wm2;
    183.     }
    184.     else
    185.         DS18B20_sign_flag=0;

    186.     x = wm2*100;   //字符型赋给整形,扩大100倍
    187.                 //进精度转换
    188.     if (tempL&0x08) //提高测试精度
    189.     {
    190.         x=x+50;
    191.     }
    192.     if (tempL&0x04)
    193.     {
    194.         x=x+25;
    195.     }
    196.     if (tempL&0x02)
    197.     {
    198.         x=x+12;
    199.     }
    200.     if (tempL&0x01)
    201.     {
    202.         x=x+6;
    203.     }

    204.     convert_ds18b20();//启动温度转换
    205. //        x=tempH*256        ;
    206. //        x=x+ tempL;
    207.     return(x);
    208. }
    复制代码
    18B20.H

    1. #ifndef        __DS18B20__H
    2. #define        __DS18B20__H
    3. //#include "..\..\App\includes.h"
    4. #include "includes.h"

    5.   //数据线强制拉低
    6. #define        CLR_DS18B20            GPIO_CLR(MKL_PORTA, 13)  
    7.       //数据线强制拉高,上拉
    8. #define        SET_DS18B20            GPIO_SET(MKL_PORTA,13 )      
    9. //输出
    10. #define        HLD_DS18B20            GPIO_DDR_OUTPUT(MKL_PORTA,13) //M0控制总线
    11. //输入
    12. #define        RLS_DS18B20             GPIO_DDR_INPUT(MKL_PORTA,13)   //释放总线
    13. //查询
    14. #define        STU_DS18B20           GPIO_GET_VALUE(MKL_PORTA,13)          //数据线的状态


    15. #define ds18b20_read_rom           0x33
    16. #define ds18b20_match_rom          0x55
    17. #define ds18b20_skip_rom           0xcc
    18. #define ds18b20_search_rom         0xf0
    19. #define ds18b20_alarm_search_rom   0xec
    20. #define ds18b20_write_ram          0x4e
    21. #define ds18b20_read_ram           0xbe
    22. #define ds18b20_copy_ram           0x48
    23. #define ds18b20_convert_tem        0x44
    24. #define ds18b20_eecall_eeprom      0xb8
    25. #define ds18b20_read_power_supply  0xb4

    26. extern unsigned char DS18B20_sign_flag;
    27. void gpio_18B20(void);
    28. void delay_nus(unsigned int t);
    29. unsigned char resetDS18B20(void);
    30. void get_rom(unsigned char* p);
    31. void set_ds18b20(char th,char tl,unsigned char config);
    32. void convert_ds18b20(void);
    复制代码

    硬件连接图
    124.jpg









    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 20:56
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    12

    主题

    449

    帖子

    0

    高级会员

    Rank: 4

    积分
    984
    最后登录
    2018-9-20
    发表于 2015-10-5 12:18:35 | 显示全部楼层
    支持一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2015-10-5 12:27:05 | 显示全部楼层
    +个显示屏,把温度显示出来
        154120hhw0q0e0hpw374yw.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-22 20:50
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    7

    主题

    171

    帖子

    0

    高级会员

    Rank: 4

    积分
    612
    最后登录
    2021-2-6
    发表于 2015-10-7 21:21:34 | 显示全部楼层
    用串口调试工具显示,还不加硬件。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    364

    帖子

    0

    高级会员

    Rank: 4

    积分
    760
    最后登录
    2021-4-2
    发表于 2015-10-7 21:24:34 | 显示全部楼层
    这个应用够简单
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-11 19:28
  • 签到天数: 141 天

    连续签到: 1 天

    [LV.7]常住居民III

    34

    主题

    1067

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2492
    最后登录
    2020-9-16
     楼主| 发表于 2015-10-7 22:30:11 | 显示全部楼层
    这是一个实现方法,调出来怎么显示 就不用这里说了吧
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 20:56
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    12

    主题

    449

    帖子

    0

    高级会员

    Rank: 4

    积分
    984
    最后登录
    2018-9-20
    发表于 2015-10-7 22:35:38 | 显示全部楼层
    支持一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-10-8 10:38:30 | 显示全部楼层
    不错,谢谢分享
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-10-8 12:34:36 | 显示全部楼层
    支持            
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-29 05:01 , Processed in 0.103230 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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