DS18B20 理解与操作源码
最近研究了DS18B20 数字温度传感器,它的时序控制确实有点小烦躁,参看了很多资料。
其中http://www.cnblogs.com/fengmk2/archive/2007/03/11/670955.html 这篇资料算是很详细的,十分感谢作者的无私奉献。
这里,只是对自己的理解做一个记录。
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 理解与操作源码相关推荐
- 深入理解ceph-disk activate 源码逻辑
文章目录 CEPH-DISK代码逻辑 `Activate osd`的主要逻辑如下 DEF main_activate激活osd的入口函数 DEF mount_activate挂载临时目录,分配osd ...
- Deep Compression阅读理解及Caffe源码修改
Deep Compression阅读理解及Caffe源码修改 作者:may0324 更新: 没想到这篇文章写出后有这么多人关注和索要源码,有点受宠若惊.说来惭愧,这个工作当时做的很粗糙,源码修改的比 ...
- 数据库 记录php 全屏编辑,Thinkphp5数据库操作源码
后台直接操作数据库,实现新建.编辑.删除数据表,新建.编辑.删除数据库字段,Thinkphp5数据库管理操作源码 下载资源 下载积分: 300 积分 1.使用前请配置虚拟主机:将整个文件放在根目录下面 ...
- 字符串固定长度 易语言_易语言字符串操作源码
易语言字符串操作源码 系统结构:字符串_取长度,字符串_取中间,字符串_取左边,字符串_取右边,字符串_替换,到宽字符,到多字节,取文本数据地址,取字节集数据地址,MultiByteToWideCha ...
- 深入理解 AuthenticationManagerBuilder 【源码篇】
咱们继续来撸 Spring Security 源码. 前面和大家分享了 SecurityBuilder 以及它的一个重要实现 HttpSecurity,在 SecurityBuilder 的实现类里边 ...
- 易语言 剪切板 html,易语言剪切板操作源码
剪切板操作系统结构:清空,格式是否有效,置内容,取内容,EmptyClipboard,OpenClipboard,CloseClipboard,SetClipboardData,GetClipboar ...
- Java文件操作源码大全
Java文件操作源码大全 1.创建文件夹 5 2.创建文件 5 3.删除文件 5 4.删除文件夹 6 5.删除一个文件下夹所有的文件夹 7 6.清空文件夹 8 7.读取文件 8 8.写入文件 9 9. ...
- 彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想
OkHttp 现在统治了Android的网络请求领域,最常用的框架是:Retrofit+okhttp.OkHttp的实现原理和设计思想是必须要了解的,读懂和理解流行的框架也是程序员进阶的必经之路,代码 ...
- 深入理解RCU | RCU源码剖析
hi, 上次分析了RCU核心思想:深入理解RCU|核心原理,后面说会分享一篇RCU的源码剖析,其实我这边已经总结得差不多: 但自己思考了一下,发现大部分都是代码分析,这样很多人其实并不喜欢看源代码分析 ...
最新文章
- 微信小程序左滑删除效果的实现完整源码附效果图
- [React Router v4] Intercept Route Changes
- 求数组的最大子数组和最大子数组的和
- valgrind 的使用简介
- LDAP Schema的概念和基本要素
- bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)
- 电大计算机网络网考,电大计算机网络(本)学习周期01任务A_0009答案
- python 调用shell 不阻塞_遇到问题---python调用shell脚本时subprocess.check_call不阻塞
- iOS中事件的传递和响应者链条
- codevs 1048 石子归并
- ​新冠疫情给 CTO 们带来的几点启示
- mysql where range_MYSQL explain详解之range
- wireshark读写pcap文件_使用wireshark分析tcpdump出来的pcap文件
- centos7下载,centos iso文件下载
- Java集合框架--学习目标 集合概念 Collection体系集合 Collection接口
- 802.11-2020协议学习__$12-Security__$12.5.2-TKIP__2
- HTB靶机01-Blue-WriteUp
- RationalDMIS 2020 叶片检测 -快速定义叶片截面线方法
- java JLabel改变大小后如何刷新_【基本功】Java动态追踪技术探究
- 一次性全部给你,这4款名不见经传的精品软件,用了就放不下
热门文章
- FPGA之道(46)数字电路中的隐患
- 漫谈时序设计(2)需要给复位足够的关心!
- Verilog 中如何无误使用 generate for?
- IC/FPGA笔试题分析(五)
- WordPress插件开发: 文章同步到OSC博客插件(OscPress) (四)
- __builtin__与__builtins__的区别与关系
- SQL Server 索引结构及其使用(二)
- struts2中用户登陆验证的常用方法
- python queue 多线程_Python如何实现并行的多线程?
- 关于xilinx fir use reloadable coefficient的用法