找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2336|回复: 0
打印 上一主题 下一主题
收起左侧

分享一份STM32单片机驱动DS13B20的程序

[复制链接]
跳转到指定楼层
楼主
ID:440534 发表于 2020-1-29 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
①芯片型号:STM32C8T6(STM32F103系列均可使用)
②引脚使用:PA8
③DS13B20供电电压:3.3V
④数据精度:0.1C。

单片机源程序如下:
  1. #include "ds18b20.h"

  2. //复位DS18B20
  3. //u8 Temp[15];
  4. void DS18B20_Rst(void)          
  5. {                 
  6.         DS18B20_IO_OUT();         //SET PG11 OUTPUT
  7.     DS18B20_DQ_OUT=0;         //拉低DQ
  8.     delay_us(750);            //拉低750us
  9.     DS18B20_DQ_OUT=1;         //DQ=1
  10.         delay_us(15);             //15US
  11. }
  12. //等待DS18B20的回应
  13. //返回1:未检测到DS18B20的存在
  14. //返回0:存在
  15. u8 DS18B20_Check(void)           
  16. {   
  17.         u8 retry=0;
  18.         DS18B20_IO_IN();        //SET PG11 INPUT         
  19.     while (DS18B20_DQ_IN&&retry<200)
  20.         {
  21.                 retry++;
  22.                 delay_us(1);
  23.         };         
  24.         if(retry>=200)return 1;
  25.         else retry=0;
  26.     while (!DS18B20_DQ_IN&&retry<240)
  27.         {
  28.                 retry++;
  29.                 delay_us(1);
  30.         };
  31.         if(retry>=240)return 1;            
  32.         return 0;
  33. }
  34. //从DS18B20读取一个位
  35. //返回值:1/0
  36. u8 DS18B20_Read_Bit(void)          
  37. {
  38.     u8 data;
  39.         DS18B20_IO_OUT();        //SET PG11 OUTPUT
  40.     DS18B20_DQ_OUT=0;
  41.         delay_us(2);
  42.     DS18B20_DQ_OUT=1;
  43.         DS18B20_IO_IN();        //SET PG11 INPUT
  44.         delay_us(12);
  45.         if(DS18B20_DQ_IN)data=1;
  46.     else data=0;         
  47.     delay_us(50);           
  48.     return data;
  49. }
  50. //从DS18B20读取一个字节
  51. //返回值:读到的数据
  52. u8 DS18B20_Read_Byte(void)     
  53. {        
  54.     u8 i,j,dat;
  55.     dat=0;
  56.         for (i=1;i<=8;i++)
  57.         {
  58.         j=DS18B20_Read_Bit();
  59.         dat=(j<<7)|(dat>>1);
  60.     }                                                    
  61.     return dat;
  62. }
  63. //写一个字节到DS18B20
  64. //dat:要写入的字节
  65. void DS18B20_Write_Byte(u8 dat)     
  66. {            
  67.     u8 j;
  68.     u8 testb;
  69.         DS18B20_IO_OUT();        //SET PG11 OUTPUT;
  70.     for (j=1;j<=8;j++)
  71.         {
  72.         testb=dat&0x01;
  73.         dat=dat>>1;
  74.         if (testb)
  75.         {
  76.             DS18B20_DQ_OUT=0;        // Write 1
  77.             delay_us(2);                           
  78.             DS18B20_DQ_OUT=1;
  79.             delay_us(60);            
  80.         }
  81.         else
  82.         {
  83.             DS18B20_DQ_OUT=0;        // Write 0
  84.             delay_us(60);            
  85.             DS18B20_DQ_OUT=1;
  86.             delay_us(2);                          
  87.         }
  88.     }
  89. }
  90. //开始温度转换
  91. void DS18B20_Start(void)
  92. {                                                                 
  93.     DS18B20_Rst();          
  94.         DS18B20_Check();         
  95.     DS18B20_Write_Byte(0xcc);        // skip rom
  96.     DS18B20_Write_Byte(0x44);        // convert
  97. }

  98. //初始化DS18B20的IO口 DQ 同时检测DS的存在
  99. //返回1:不存在
  100. //返回0:存在             
  101. u8 DS18B20_Init(void)
  102. {
  103.         GPIO_InitTypeDef  GPIO_InitStructure;
  104.        
  105.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PORTG口时钟
  106.        
  107.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                //PORTG.11 推挽输出
  108.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                   
  109.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  110.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  111.         GPIO_SetBits(GPIOA,GPIO_Pin_8);    //输出1

  112.         DS18B20_Rst();

  113.         return DS18B20_Check();
  114. }  
  115. //从ds18b20得到温度值
  116. //精度:0.1C
  117. //返回值:温度值 (-550~1250)
  118. short DS18B20_Get_Temp(void)
  119. {
  120.     u8 temp;
  121.     u8 TL,TH;
  122.         short tem;
  123.     DS18B20_Start ();                          // ds1820 start convert
  124.     DS18B20_Rst();
  125.     DS18B20_Check();         
  126.     DS18B20_Write_Byte(0xcc);        // skip rom
  127.     DS18B20_Write_Byte(0xbe);        // convert            
  128.     TL=DS18B20_Read_Byte();         // LSB   
  129.     TH=DS18B20_Read_Byte();         // MSB  
  130.                       
  131.     if(TH>7)
  132.     {
  133.         TH=~TH;
  134.         TL=~TL;
  135.         temp=0;                                        //温度为负  
  136.     }else temp=1;                                //温度为正                    
  137.     tem=TH;                                         //获得高八位
  138. ……………………

  139. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
DS18B20_A8.zip (2.56 KB, 下载次数: 17)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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