找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS18B20.H文件下载

  [复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-25 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DS18B20.H文件是温度传感器的驱动 大家可以另存为到硬盘下载到电脑


  1. /*把我一直珍藏的程序全部拿出来,给大家共享,这也让我想起来,我刚学的时候,搜集资料是那么辛苦,而且找不到完整的资料,我将把我整理的和自己制作的H文件共享出来,只要修改定义端口,便可以随意的调用,以后我还会慢慢完善我的C资料,也希望大家给我指出程序的漏洞和缺点,已达到相互学习目地。*/

  2. #ifndef __DS18B20_H__
  3. #define __DS18B20_H__

  4. #include<intrins.h>

  5. #define uch unsigned char //给unsigned char 起别名 uch

  6. sbit DQ=P2^3;///////////////定义一个数据端口

  7. unsigned char TLV_ds=0 ; ///采集到的温度高8 位
  8. unsigned char THV_ds=0; ////采集到的温度低8 位

  9. unsigned char bwei_ds; /////整数百位
  10. unsigned char shwei_ds; ////整数十位
  11. unsigned char gwei_ds; /////整数个位
  12. unsigned char shfen_ds; ////十分位
  13. unsigned char bfen_ds; /////百分位

  14. //------------------------------------------------
  15. //延时函数
  16. void delay_ds(uch x,uch y)   //误差0,12M
  17. {
  18.     uch a,b;
  19. for(b=x;b>0;b--)
  20.         for(a=y;a>0;a--);
  21. }
  22. //-----------------------------------------------
  23. //复位DS18B20 函数
  24. void reset_ds(void)
  25. {
  26. char presence=1;
  27. while(presence)
  28. {
  29.   DQ=0; //////////////////主机拉至低电平
  30.   delay_ds(1,80); ///////延时大于480us

  31.   DQ=1; //////////////////释放总线等电阻拉高总线,并保持15~60us
  32.   delay_ds(1,7); /////////延时20us
  33.                                    
  34.   if(DQ==1) presence=1; //没有接收到应答信号,继续复位
  35.   else presence=0; ///////接收到应答信号
  36.   delay_ds(1,64); ////////延时430us
  37. }
  38. }
  39. //-----------------------------------------------
  40. //写18b20 写字节函数
  41. void write_byte_ds(uch val_ds)
  42. {
  43. uch i;
  44. uch temp_ds;
  45. for(i=8;i>0;i--)
  46. {
  47.   temp_ds=val_ds&0x01; //最低位移出
  48.   DQ=0;
  49.   if(temp_ds==1) DQ=1; //如果写1,拉高电平
  50.   delay_ds(1,11); ///////延时63us

  51.   DQ=1;
  52.   _nop_();
  53.   _nop_(); //////////////延时6us

  54.   val_ds=val_ds>>1; /////右移一位
  55. }
  56. }
  57. //------------------------------------------------
  58. //18b20 读字节函数
  59. uch read_byte_ds(void)
  60. {
  61. uch i;
  62. uch value_ds=0; ///读出温度
  63. static bit j;//////静态变量
  64. for(i=8;i>0;i--)
  65. {
  66.   DQ=0; /////////拉低给脉冲信号
  67.   value_ds>>=1;//右移并起到延时作用
  68.   DQ=1; /////////拉至高电平
  69.   _nop_();  /////延时6us等待响应

  70.   j=DQ;
  71.   if(j) value_ds|=0x80;//写入高电平
  72.   delay_ds(1,11); ///////延时63us
  73. }
  74. return(value_ds);
  75. }
  76. //-------------------------------------------------
  77. //启动温度转换函数
  78. void get_temp_ds()
  79. {
  80. int i=10;
  81. int T_ds;
  82. float tt;

  83. DQ=1;
  84. reset_ds(); ///////////复位等待从机应答
  85. write_byte_ds(0XCC); //忽略ROM 匹配
  86. write_byte_ds(0X44); //发送温度转化命令
  87. while(i--)
  88. {
  89.   delay_ds(50,100); //确保温度转换完成所需要的时间
  90. }
  91. reset_ds(); /////////////再次复位,等待从机应答
  92. write_byte_ds(0XCC); ////忽略ROM 匹配
  93. write_byte_ds(0XBE); ////发送读温度命令
  94. TLV_ds=read_byte_ds(); //读出温度低8
  95. THV_ds=read_byte_ds(); //读出温度高8 位
  96. DQ=1;////////////////////释放总线

  97. T_ds=THV_ds;////////写入高八位
  98.     T_ds<<=8;///////////高八位上移
  99.     T_ds=T_ds|TLV_ds;///写入低八位
  100.     tt=T_ds*0.0625;/////直接计算,单位万分之一度
  101.     T_ds= tt*100+0.5; //可校准,单位0.01度

  102. bwei_ds=T_ds/10000;////////显示百位
  103.     shwei_ds=T_ds%10000/1000;//显示十位
  104.     gwei_ds=T_ds%1000/100;/////显示个位
  105.     shfen_ds=T_ds%100/10;//////显示十分位
  106.     bfen_ds=T_ds%10;///////////显示百分位
  107. }

  108. #endif
复制代码

调用方法研究:http://www.51hei.com/bbs/dpj-218922-1.html


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

使用道具 举报

沙发
ID:77146 发表于 2015-4-16 13:20 | 只看该作者
现在下载看看
回复

使用道具 举报

板凳
ID:184107 发表于 2017-5-24 11:44 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:199814 发表于 2017-10-3 22:09 | 只看该作者
非常感谢
回复

使用道具 举报

5#
ID:864872 发表于 2022-4-2 17:28 | 只看该作者
你好,我想问一下怎么在主函数里面读取ds18b20测的温度啊
回复

使用道具 举报

6#
ID:161164 发表于 2022-4-2 19:19 | 只看该作者
hempfish 发表于 2022-4-2 17:28
你好,我想问一下怎么在主函数里面读取ds18b20测的温度啊

在主函数运行get_temp_ds()
然后读取
bwei_ds; /////整数百位
shwei_ds; ////整数十位
gwei_ds; /////整数个位
shfen_ds; ////十分位
bfen_ds; /////百分位
回复

使用道具 举报

7#
ID:161164 发表于 2022-4-2 19:20 来自手机 | 只看该作者
hempfish 发表于 2022-4-2 17:28
你好,我想问一下怎么在主函数里面读取ds18b20测的温度啊

已回~等审核
回复

使用道具 举报

8#
ID:864872 发表于 2022-4-2 23:49 来自手机 | 只看该作者
lkc8210 发表于 2022-4-2 19:19
在主函数运行get_temp_ds()
然后读取
bwei_ds; /////整数百位

后头这些是直接放在get_temp_ds()后面嘛?还是要再定个参数将这些数赋参数里
回复

使用道具 举报

9#
ID:161164 发表于 2022-4-3 09:57 来自手机 | 只看该作者
hempfish 发表于 2022-4-2 23:49
后头这些是直接放在get_temp_ds()后面嘛?还是要再定个参数将这些数赋参数里

单片机跑完get_temp_ds()后会自动把对应的数值放入那几个变数里,你就用那几个变数做你想做的事
回复

使用道具 举报

10#
ID:864872 发表于 2022-4-3 12:58 来自手机 | 只看该作者
lkc8210 发表于 2022-4-3 09:57
单片机跑完get_temp_ds()后会自动把对应的数值放入那几个变数里,你就用那几个变数做你想做的事

我直接使用这几个变数到LCD1602里面它不显示怎么回事啊
回复

使用道具 举报

11#
ID:161164 发表于 2022-4-3 14:00 | 只看该作者
hempfish 发表于 2022-4-3 12:58
我直接使用这几个变数到LCD1602里面它不显示怎么回事啊

上代码上照片上仿真截图啊~
回复

使用道具 举报

12#
ID:864872 发表于 2022-4-3 15:01 | 只看该作者
lkc8210 发表于 2022-4-3 14:00
上代码上照片上仿真截图啊~
  1.               wr_com(0xc9);               
  2.                 wr_dat(shwei_ds);
  3.                 wr_dat(gwei_ds);
  4.                 wr_dat('.');
  5.               wr_dat(shfen_ds);
  6.                 wr_dat(0xdf);
  7.                 wr_dat(0x43);
复制代码

这是我想输出的三位数,就直接引用的
这是仿真结果:(未上传附件)
回复

使用道具 举报

13#
ID:161164 发表于 2022-4-4 12:46 | 只看该作者
试试在47行"}"之后加DQ=1;
和在86行"}"之前加DQ=1;
回复

使用道具 举报

14#
ID:864872 发表于 2022-4-4 14:18 | 只看该作者
lkc8210 发表于 2022-4-4 12:46
试试在47行"}"之后加DQ=1;
和在86行"}"之前加DQ=1;

还是感觉传感器没有工作,变化传感器的值显示屏上个不变,且没有读出测量值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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