找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5986|回复: 4
收起左侧

C51单片机测温芯片DS18B20.H头文件驱动程序下载

[复制链接]
ID:478150 发表于 2019-2-19 16:17 | 显示全部楼层 |阅读模式
C51测温芯片DS18B20驱动程序,包含.C和.H文件,在自己的project里添加这两个文件,并在main函数中调用“DS18B20_Read_Temperature()”函数即可获得温度(℃)数据!

DS18B20.H头文件单片机源程序如下:
  1. #ifndef __DS18B20_H_
  2. #define __DS18B20_H_

  3. #include <STC15F2K60S2.H>                //STC15W单片机芯片硬件定义头文件
  4. #include <stdio.h>                                   //单片机C语言头文件
  5. #include <stdlib.h>                                  //单片机C语言头文件
  6. #include <ctype.h>                                   //单片机C语言头文件
  7. #include <string.h>                                  //单片机C语言头文件
  8. #include <float.h>                                  //单片机C语言头文件
  9. #include <absacc.h>                                  //单片机C语言头文件
  10. #include <math.h>                                  //单片机C语言头文件
  11. #include <intrins.h>                          //单片机C语言头文件  



  12. //定义对应 < *.C > 程序中的常数(同时供其它C模块调用)



  13. //以外部变量声明对应 < *.C > 程序中全局变量(同时供其它C模块调用)




  14. //以外部函数声明对应C程序中的函数(同时供其它C模块调用)
  15. extern void Delay_15us(unsigned int N);
  16. extern unsigned char DS18B20_Init(void);
  17. extern unsigned char DS18B20_Read_Byte(void);
  18. extern void DS18B20_Write_Byte(unsigned char Write_Data);
  19. extern signed int DS18B20_Read_Temperature(void);



  20. #endif
复制代码


  1. #include "DS18B20.H"

  2. sbit DS18B20_DQ=P1^5;


  3. void Delay_15us(unsigned int N);
  4. unsigned char DS18B20_Init(void);
  5. unsigned char DS18B20_Read_Byte(void);
  6. void DS18B20_Write_Byte(unsigned char Write_Data);
  7. signed int DS18B20_Read_Temperature(void);

  8. unsigned char T_Signed_Flag;//温度符号标志位:0为正温度,1为负温度。

  9. //STC15W56S4 @11.0592MHz 1T (由stc-isp-15xx-v6.85H生成)
  10. void Delay_15us(unsigned int N)
  11. {
  12.     unsigned char i;
  13.                 do
  14.     {
  15.             i = 39;
  16.             while (--i);
  17.     }while(--N);
  18. }

  19. //DS18B20初始化
  20. //返回1时DS18B20有响应,返回0时DS18B20无响应,
  21. unsigned char DS18B20_Init(void)
  22. {
  23.     unsigned char Temp_Count;
  24.     P6M0&=0xdf;
  25.           P6M1&=0xdf;
  26.           DS18B20_DQ=1;
  27.     DS18B20_DQ=0;
  28.     Delay_15us(48);//延时720μS。最小=480μS,最大=960μS   
  29.     DS18B20_DQ=1;     
  30.     Delay_15us(3);//延时45μS。最小=15,最大=60μS   

  31.     Delay_15us(3);//延时45μS。在45μS+45μS=90μS处检测DS18B20响应   
  32.     if (DS18B20_DQ==0)
  33.     {
  34.                         //DS18B20有响应  
  35.         Temp_Count=200;
  36.         while (DS18B20_DQ==0)
  37.         {
  38.             Delay_15us(1);
  39.             Temp_Count--;
  40.             if (Temp_Count==0)
  41.                 return 0;               
  42.         }
  43.         return 1;
  44.     }
  45.     else
  46.     {
  47.         //DS18B20无响应
  48.         return 0;
  49.     }

  50. }

  51. //主机从DS18B20读一个字节
  52. unsigned char DS18B20_Read_Byte(void)
  53. {
  54.     unsigned char Read_Data,i;
  55.     Read_Data=0;
  56.     for(i=0;i<8;i++)
  57.     {
  58.         DS18B20_DQ=0;//主机拉低   
  59.         Read_Data>>=1;//移位(低位在前)并兼有延时1μS以上功能
  60.         DS18B20_DQ=1;//主机拉高(电阻上拉)
  61.         Delay_15us(1);//延时15μS
  62.         if (DS18B20_DQ==1)//主机读数据
  63.         {
  64.             Read_Data|=0x80;//合成字节数据
  65.         }   
  66.         Delay_15us(8);//延时120μS
  67.            
  68.     }
  69.     return Read_Data;
  70. }

  71. //主机向DS18B20写一个字节
  72. void DS18B20_Write_Byte(unsigned char Write_Data)
  73. {
  74.     unsigned char i;
  75.     for(i=0;i<8;i++)
  76.     {
  77.         DS18B20_DQ=0;   
  78.         _nop_();_nop_();_nop_();        
  79.         if ((Write_Data&0x01)==1)
  80.         {
  81.             DS18B20_DQ=1;         
  82.         }
  83.         Delay_15us(7);//延时105μS
  84.         DS18B20_DQ=1;         
  85.         Write_Data>>=1;//略微延时大于1μS
  86.     }
  87.     Delay_15us(7);//延时105μS
  88. }

  89. /*读取温度
  90. 1、在DS18B20测温范围内,以温度扩大10倍返回带符号整形数。
  91.    例如返回+203时:实际温度为:+20.3℃
  92.          例如返回 -96时:实际温度为:- 9.6℃
  93. 2、当DS18B20没有接入或损坏时返回-3000


  94. */
  95. signed int DS18B20_Read_Temperature(void)
  96. {
  97.     unsigned int Temp_Value;         
  98.     signed int Temperature_Value;         
  99.     unsigned char DS18B20_Flag;
  100.                 float T_F_Value;         
  101.     unsigned char T_H_Byte,T_L_Byte;
  102.    
  103.     DS18B20_Flag=DS18B20_Init();                 //设备复位
  104.     if (DS18B20_Flag==0)                                                //判断DS18B20是否有响应
  105.                         return -3000;                                                                        //DS18B20无响应,返回-300
  106.                 DS18B20_Write_Byte(0xCC);                                //跳过ROM命令
  107.     DS18B20_Write_Byte(0x44);                                //启动转换命令
  108.     Delay_15us(50000);//延时
  109.    
  110.     DS18B20_Flag=DS18B20_Init();                //设备复位
  111.     if (DS18B20_Flag==0)                                                //判断DS18B20是否有响应
  112.                         return -3000;                                                                        //DS18B20无响应,返回-300
  113.     DS18B20_Write_Byte(0xCC);                                //跳过ROM命令
  114.     DS18B20_Write_Byte(0xBE);                                //读暂存存储器命令
  115.     T_L_Byte = DS18B20_Read_Byte();        //读温度低字节
  116.     T_H_Byte = DS18B20_Read_Byte();        //读温度高字节
  117.                 if ((T_H_Byte&0xfc)!=0)                                  //判断温度符号
  118.     {
  119.         T_Signed_Flag=1;                                                //1为负温度
  120.         Temp_Value=T_H_Byte;
  121.         Temp_Value=(Temp_Value<<8)+T_L_Byte;
  122.         Temp_Value=(~Temp_Value+1);//取反加1(负数的补码即负数的数值)

  123.                                 T_F_Value=Temp_Value;                                //转成浮点数(准备乘小数)
  124.         T_F_Value=T_F_Value*0.0625*10;//乘小数(1/16)并扩大10倍
  125.         Temp_Value=T_F_Value;                                        //转换成无符号整形(取整)                                
  126.                                 Temperature_Value=-Temp_Value;//转换成有符号整形数(负数)        

  127.                                 return Temperature_Value;
  128.     }
  129.     else
  130.     {
  131.                         T_Signed_Flag=0;//0为正温度
  132.                         Temp_Value=T_H_Byte;              
  133.                         Temp_Value=((Temp_Value<<8)+T_L_Byte);
  134.                         
  135.                         T_F_Value=Temp_Value;                                        //转成浮点数(准备乘小数)
  136.                         T_F_Value=T_F_Value*0.0625*10;//乘小数(1/16)并扩大10倍
  137.                         Temp_Value=T_F_Value;                                //转换成无符号整形(取整)

  138.                         Temperature_Value=Temp_Value;//转换成有符号整形数(正数)        

  139.                         return Temperature_Value;
  140.     }

  141. }
复制代码

所有资料51hei提供下载:
DS18B20.rar (2.02 KB, 下载次数: 69)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:434678 发表于 2019-2-20 10:07 | 显示全部楼层
        #include <STC15F2K60S2.H>  P6M1&=0xdf;           DS18B20_DQ=1;
回复

使用道具 举报

ID:434678 发表于 2019-2-20 10:08 | 显示全部楼层
这个头文件和这两个端口是什么意思呀。89c51要怎么改才可以用呀。
回复

使用道具 举报

ID:478150 发表于 2019-2-27 22:54 | 显示全部楼层
小傻白甜 发表于 2019-2-20 10:08
这个头文件和这两个端口是什么意思呀。89c51要怎么改才可以用呀。

头文件是STC15单片机用的,所以这个文件就没有放进压缩包了,51不能用的话改成51单片机可用的头文件即可。P6M1&=0xdf是初始化单片机IO口P6的,因为我用的P1口所以这句话没用(....忘记删掉了233)。在压缩包里的.c文件里面第二行是sbit DS18B20_DQ=P1^5,即我用单片机P15口来连接DS18B20的DQ脚,通过单片机赋值1或0来控制测温芯片工作。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:478150 发表于 2019-2-27 23:03 | 显示全部楼层
小傻白甜 发表于 2019-2-20 10:08
这个头文件和这两个端口是什么意思呀。89c51要怎么改才可以用呀。

89c51使用的话,假设你接P15口,那么把P6M0和P6M1改成P1M0和P1M1【&=0xdf(1101 1111)是将P1口的第六位即P15口清零设置成准双向口】,并在main函数中调用“DS18B20_Read_Temperature()”函数即可获得温度(℃)数据。

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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