最近研究了DS18B20 数字温度传感器,它的时序控制确实有点小烦躁,参看了很多资料。
其中http://www.cnblogs.com/fengmk2/archive/2007/03/11/670955.html 这篇资料算是很详细的,十分感谢作者的无私奉献。

这里,只是对自己的理解做一个记录。

  1/**//*
  2程序说明:
  3    功能: 
  4    1、能用上位机控制单片机,具体来说
  5    发 握手命令   单片机回状态
  6    发 读温度命令 单片机回温度
  7    2、接多点温度的情况下,可以通过串口读到任何一个点的温度    
  8    
  9    说明:
 10    1、ds18b20 都接到p3.7脚
 11    2、延时在c程序中确实不好控制,看了网上一些资料,选了一个延时,
 12    单位时间大约能做到7.8us的,理论上说通过一定的设置可以满足时序的。
 13    
 14*/
 15
 16#include <reg51.h> 
 17#include <intrins.h>
 18
 19#define uchar       unsigned char
 20#define uint        unsigned int
 21sbit ds = P3^7;
 22bit  readflag=0;
 23
 24//Fuction declaration
 25
 26// 串口函数
 27void  initCom();
 28void  receiveCom(); 
 29void  sendcharCom(uchar);
 30
 31//延时函数
 32void  delayOne(uint);
 33void  temDealy(uint);
 34
 35//操作DS18B20函数
 36void  dsInit();
 37void  dsWait();
 38bit   readBit();
 39uchar readByte();
 40void  writeByte(uchar);
 41void  sendChangeCmd();
 42void  sendReadCmd();
 43int   getTmpValue();
 44
 45
 46void main()
 47{
 48    uchar tmpValue=0; 
 49    initCom();
 50
 51    while (1) 
 52    {
 53        sendChangeCmd();
 54        delayOne(1000);
 55        tmpValue=getTmpValue();
 56        
 57        if(readflag)
 58        {
 59            readflag=0;
 60            sendcharCom(tmpValue);
 61        }
 62
 63
 64    }
 65
 66
 67}//func main
 68
 69//串口初始化
 70void initCom()
 71{
 72     TMOD=0X20; //定时器1,工作方式2 
 73     TH1=0XFD; //9600bps 
 74     TL1=0XFD;
 75     TR1=1; //启动定时器 
 76     PCON=0X00; //波特率不倍频 
 77     SCON=0X50; //串口方式1
 78     EA=1; //开总中断 
 79     ES=1; //开串口中断 
 80}//func initcom
 81
 82//串口中断接受
 83void receiveCom() interrupt 4 using 3 
 84{
 85    uchar recChar;
 86    if(RI)
 87    {
 88        RI=0;
 89        recChar=SBUF;
 90        TI=1;
 91
 92        switch(recChar)
 93        {
 94            case 0xff:
 95                 SBUF=0xff;
 96                 TI=0;
 97                 break;
 98
 99            case 0x00:
100                 readflag=1;
101                 break;
102
103            default:
104                 readflag=0;
105                 break;    
106        }    
107    }
108}//func receivecom
109
110//串口发送程序
111void sendCharCom(uchar ch)
112{
113    SBUF=ch;
114    while(TI==0);
115    TI=0;
116}//func sendcharcom
117
118
119//延时1ms
120void delayOne(uint t)
121{
122     uint i=0;
123     while(t--)
124     {
125          while(i<125)i++;          
126     }    
127}//func delayOneMs
128
129//一个delay延时约7.8-8us,12Mhz/11.0592Mhz晶振
130void temDelay(uint i)
131{
132     while(i>0)i--;                                              
133}//func temDelay
134
135//初始化总线上的ds18b20  
136void dsInit()
137{  
138     uint i;
139     uchar etFlag;
140     ds=0;
141     temDelay(80); //延时约600us,符合协议480us的标准 
142     ds=1;//拉高总线
143     temDelay(5); //延时约40us,符合30us的标准,等待从机应答信号 
144     i++;
145     if (ds==0)
146        etFlag=1; //检测到18b20 
147     else
148        etFlag=0; //没有检测到18b20 
149     temDelay(20); //延时150us,等待18b20拉低总线
150     ds=1;
151}//func dsInit
152
153//读一位数据 
154bit readBit()
155{
156     uint i;
157     bit bValue; //一位数据 
158     ds=0;
159     i++;
160     ds=1; //根据读时序协议先拉低总线,延时8us后再拉高总线
161     //i++; 
162     i++; 
163     i++; //延时16us,可以读数
164     bValue=ds; //读出一位数据 
165     temDelay(10); //延时超过60us,保证读时隙长度 
166     return bValue;
167}//func readBit 
168
169//读一个字节的数据 
170uchar readByte()
171{
172     uint i;
173     uchar j;
174     uchar btValue; //一个字节数据 
175     btValue=0;
176     for(i=0;i<8;i++)
177     {
178          j=readBit();
179          btValue= (j<<7)|(btValue>>1);
180     }
181     return btValue;
182}//func readByte
183
184//写一个字节的数据到18b20
185void writeByte(uchar dat)        
186{
187     uint i;
188     uchar j;
189     bit oneBit;
190     for(j=0;j<8;j++)
191     {
192          oneBit=dat && 0x01;
193          dat=dat>>1;
194          if(oneBit) //写1操作
195          {
196               ds=0;
197               i++;
198               i++; //拉低15us后拉高总线
199               ds=1; //完成写1操作
200               temDelay(10); //延时70us以上,符合协议写1时隙 
201          }
202          else //写0操作
203          {
204               ds=0;
205               temDelay(10); //延时70us以上,产生写0时隙,并完成写0操作 
206               ds=1; 
207               i++;
208          }
209     }
210}//func writeByte
211
212//rom操作,发温度转换命令 
213void sendChangeCmd() 
214{
215     dsInit();
216     temDelay(125);
217     writeByte(0xcc); //写skip rom命令 
218     writeByte(0x44); //写温度转换命令 
219}//func sendChangeCmd
220
221//rom操作,发读存储器命令 
222void sendReadCmd()
223{
224     dsInit();
225     temDelay(125);
226     writeByte(0xcc);
227     writeByte(0xbe); //写读暂存器命令    
228}//func sendReadCmd
229
230//读温度 
231int getTmpValue()
232{
233     int tValue;
234     uchar tempLow,tempHigh;
235     sendReadCmd(); 
236     tempLow=readByte();
237     tempHigh=readByte();
238     tValue=(tempHigh<<8)|tempLow;
239     return tValue;
240}//func getTmpValue 

转载于:https://www.cnblogs.com/ezrax/archive/2008/07/24/1250509.html

DS18B20 理解与操作源码相关推荐

  1. 深入理解ceph-disk activate 源码逻辑

    文章目录 CEPH-DISK代码逻辑 `Activate osd`的主要逻辑如下 DEF main_activate激活osd的入口函数 DEF mount_activate挂载临时目录,分配osd ...

  2. Deep Compression阅读理解及Caffe源码修改

    Deep Compression阅读理解及Caffe源码修改 作者:may0324 更新:  没想到这篇文章写出后有这么多人关注和索要源码,有点受宠若惊.说来惭愧,这个工作当时做的很粗糙,源码修改的比 ...

  3. 数据库 记录php 全屏编辑,Thinkphp5数据库操作源码

    后台直接操作数据库,实现新建.编辑.删除数据表,新建.编辑.删除数据库字段,Thinkphp5数据库管理操作源码 下载资源 下载积分: 300 积分 1.使用前请配置虚拟主机:将整个文件放在根目录下面 ...

  4. 字符串固定长度 易语言_易语言字符串操作源码

    易语言字符串操作源码 系统结构:字符串_取长度,字符串_取中间,字符串_取左边,字符串_取右边,字符串_替换,到宽字符,到多字节,取文本数据地址,取字节集数据地址,MultiByteToWideCha ...

  5. 深入理解 AuthenticationManagerBuilder 【源码篇】

    咱们继续来撸 Spring Security 源码. 前面和大家分享了 SecurityBuilder 以及它的一个重要实现 HttpSecurity,在 SecurityBuilder 的实现类里边 ...

  6. 易语言 剪切板 html,易语言剪切板操作源码

    剪切板操作系统结构:清空,格式是否有效,置内容,取内容,EmptyClipboard,OpenClipboard,CloseClipboard,SetClipboardData,GetClipboar ...

  7. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 5 2.创建文件 5 3.删除文件 5 4.删除文件夹 6 5.删除一个文件下夹所有的文件夹 7 6.清空文件夹 8 7.读取文件 8 8.写入文件 9 9. ...

  8. 彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想

    OkHttp 现在统治了Android的网络请求领域,最常用的框架是:Retrofit+okhttp.OkHttp的实现原理和设计思想是必须要了解的,读懂和理解流行的框架也是程序员进阶的必经之路,代码 ...

  9. 深入理解RCU | RCU源码剖析

    hi, 上次分析了RCU核心思想:深入理解RCU|核心原理,后面说会分享一篇RCU的源码剖析,其实我这边已经总结得差不多: 但自己思考了一下,发现大部分都是代码分析,这样很多人其实并不喜欢看源代码分析 ...

最新文章

  1. 微信小程序左滑删除效果的实现完整源码附效果图
  2. [React Router v4] Intercept Route Changes
  3. 求数组的最大子数组和最大子数组的和
  4. valgrind 的使用简介
  5. LDAP Schema的概念和基本要素
  6. bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)
  7. 电大计算机网络网考,电大计算机网络(本)学习周期01任务A_0009答案
  8. python 调用shell 不阻塞_遇到问题---python调用shell脚本时subprocess.check_call不阻塞
  9. iOS中事件的传递和响应者链条
  10. codevs 1048 石子归并
  11. ​新冠疫情给 CTO 们带来的几点启示
  12. mysql where range_MYSQL explain详解之range
  13. wireshark读写pcap文件_使用wireshark分析tcpdump出来的pcap文件
  14. centos7下载,centos iso文件下载
  15. Java集合框架--学习目标 集合概念 Collection体系集合 Collection接口
  16. 802.11-2020协议学习__$12-Security__$12.5.2-TKIP__2
  17. HTB靶机01-Blue-WriteUp
  18. RationalDMIS 2020 叶片检测 -快速定义叶片截面线方法
  19. java JLabel改变大小后如何刷新_【基本功】Java动态追踪技术探究
  20. 一次性全部给你,这4款名不见经传的精品软件,用了就放不下

热门文章

  1. FPGA之道(46)数字电路中的隐患
  2. 漫谈时序设计(2)需要给复位足够的关心!
  3. Verilog 中如何无误使用 generate for?
  4. IC/FPGA笔试题分析(五)
  5. WordPress插件开发: 文章同步到OSC博客插件(OscPress) (四)
  6. __builtin__与__builtins__的区别与关系
  7. SQL Server 索引结构及其使用(二)
  8. struts2中用户登陆验证的常用方法
  9. python queue 多线程_Python如何实现并行的多线程?
  10. 关于xilinx fir use reloadable coefficient的用法