ds18b20读写时序芯片在读时序中。数据是从最高位到最低位输出还是最低位到最高位输出。

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
基于ds18b20数字温度计设计论文(可编辑),数字温度计的设计,数字温度计设计,数字温度计课程设计,数字温度计,数字式温度计,精密数字温度计,数字贝克曼温度计,数字温度计的文献,温度计 教学设计
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于ds18b20数字温度计设计论文(可编辑)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
聪明屋所有四位数中,从最低位读到最高位和从最高位读到最低位的数都一样,这样的数有几个。
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
九个,。。。。
为您推荐:
扫描下载二维码博客分类:
#include "my51.h"
#include "smg.h"
#include "ds18b20.h"
void main()
//测试 ,6位数码管显示温度值
u16 temp=0;
temp=ds18b20_readTemperaData();
for(i=0;i&100;i++)
displaySMG(ds18b20_processTempData(temp));
_DS18B20_H
_DS18B20_H
extern u8 smgWela[7];
//数码管位选数据
sbit DQ=P2^2;
//总线定义
bool ds18b20_init();
//初始化函数
ds18b20_processTempData(u16 temp);//将temp数据处理成数码管可显示数据
ds18b20_readTemperaData();
ds18b20_readByte() ;
//读一个字节
void ds18b20_writeByte(u8 dat);
//mcu向18b20写一个字节
#include "ds18b20.h"
/******************************************************************
当主机总线t0时刻从高拉至低电平时就产生写时间隙
从to 时刻开始的1us之后,15us之前将所需写的位送到总线上
DSl820 在t0后的15-60us 对总线采样若低电平写入的位是0 ,若高电平写入的位是1
连续写2 个位之间的间隙应大于1us
写1,总时间大于60us,在t0开始延时1us就可以写1,15us之后ic来采样,采样时间最大45us
写0,总时间是60~120us,15~60us是ic在采样,120以外就没必要了,mcu总得释放总线吧
不管写1还是写0,大于60us的话,ic肯定已经采样完成了,那mcu就可以释放了
*******************************************************************/
void ds18b20_writeByte(u8 dat)
//mcu向ic写一个字节
for(i=0;i&8;i++)
//产生读写时序的起始信号
//要求至少1us的延时
DQ=dat & 0x01; //对总线赋值,从最低位开始写起
delayXus(10);//延时74us,写0在60~120us之间释放,写1的话大于60us均可释放
//释放总线,为下一次mcu送数据做准备,
//有效数据移动到最低位,2次写数据间隙至少需1us
/**************************************************************************
下降沿产生读时序
整个读时序必须至少有60us的持续时间,相邻两个读时序必须要有至少1us的恢复时间
DS18B20在读时序产生1us后输出数据到总线上,也有可能需要2~3个微秒,但不会更多
而要求主机释放总线和采样总线等动作要在15μs内完成,那么让mcu采样的最佳时机
是读时序产生后的5~13us之间,在15~60us这段时间是18b20的私有时间,它会在这段
时间内的任意时刻释放总线,是不稳定期,我们不要让mcu在这段时间里对总线操作
*******************************************************/
u8 ds18b20_readByte()
//mcu读一个字节
u8 i,value=0;
for(i=0;i&8;i++)
//起始信号
value&&=1;
//顺便延时3~4个机器周期
//mcu释放总线
_nop_();_nop_();_nop_(); //再延时3.3us
value|=0x80;//保存高电平数据,低电平的话不用保存,移位后默认是0
delayXus(8); //延时60.76us
u16 ds18b20_readTemperaData()
//读取温度值
u16 temp=0;
if(ds18b20_init())
ds18b20_writeByte(0xcc);
//写指令:跳过rom检测
ds18b20_writeByte(0x44);
//写指令:温度转换
//delayms(750);// 转换延时需要750ms以上,我们不等它
//首次转换未完成时,得到的初始化数据是85度,处理一下就可以了
//温度转换电路是硬件独立的,不会阻塞初始化功能
if(ds18b20_init())
ds18b20_writeByte(0xcc);
//写指令:跳过检测rom
ds18b20_writeByte(0xbe);
//写指令:读取温度值
temp=ds18b20_readByte();
//先读低8位数据
temp|=(u16)ds18b20_readByte()&&8; //再读高8位数据,然后合并
temp&= 0x0FFF; //高4位数据反正没用上,我们用来存放错误码
//调试代码
temp=0x2000; //错误码,初始化失败
//调试代码
temp=0x1000;
//错误码,初始化失败,可能器件损坏
bool ds18b20_init()
u8 checkState=0;
//总线初始状态
_nop_();_nop_();
//mcu先将总线拉低
delayXus(80);
//延时530us,要求480us~960us的低电平信号
//当ic接受到此复位信号后会回发一个存在信号
//mcu若要接收此存在信号则先要释放总线,让ic控制该总线
//当mcu释放总线后的15~60us之后,ic才向总线发一个低电平信号
//该信号存在时间为60~240us
//mcu释放总线
delayXus(10);
//mcu释放15~60us以上,(8+6*10)*1.085=73us,
//这时DS18B20已经拉低信号,大约60~240us应答保持时间,
checkState=DQ;
//在这段60~240us时间内,mcu采样是否有器件响应,0表示有响应
delayXus(70);
//延时464us,加上之前的73us,共537us
//虽然ic在拉低电平60~240us之后,会释放总线,但整个时间至少480us
//故我们共用时537us,这样是为了不影响后续的操作
if(checkState)
//checkstate为0说明有器件响应,为1无器件响应
return FALSE;
return TRUE;
//初始化成功
u8* ds18b20_processTempData(u16 temp) //返回数码管可直接显示的数据指针
if(0x0550==temp)
//如果初始化温度数据是85度的话
//亮灯报警,调试
smgWela[5]=18;
//当温度是85度,第6个数码管显示负号
//一般刚上电时能看到这个负号
if(1==(temp&0x0800))
//检测第11位是否为1,为1是负温度
temp&=0x07
//只取第0~10共11个位
temp=(~temp+1) & 0x07//将补码还原
smgWela[0]=18;
//第一个数码管显示18号元素,即负号
smgWela[0]=
//正温度的话这个数码管就不要显示了
temp=(u16)(temp*6.25);
//精度的1000倍,我们将小数点另外叠加显示
if(temp&=10000)
smgWela[1]=1;
//第二个数码管显示1,是百位上,100度以上啊
smgWela[1]=
//百位上是0的话不要显示这个0
smgWela[2]=temp%;
//第三个数码管 十位
smgWela[3]=temp%;
//第四个数码管 个位叠加小数点
smgWela[4]=temp%100/10;
//第五个数码管
smgWela[5]=temp%10;
//第六个数码管
smgWela[6]=0xf7;
//第4个数码管叠加小数点
return smgW
//返回数组
#ifndef _51SMG_H_
#define _51SMG_H_
#include &reg52.h&
#include "mytype.h"
sbit dula =P2^6;
//段选锁存器控制
sbit wela =P2^7;
//位选锁存器控制
#define dark 0x11//在段中,0x11是第17号元素,0x00是低电平,数码管不亮,即table[17]
#define dotDark 0xff//小数点全暗
void displaySMG(u8* pWela); //数码管显示函数,参数是数组指针
#include "smg.h"
#include "my51.h"
static u8 code table[]= {
//0~F外加小数点和空输出的数码管编码
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40
// . 空 负号
空为第17号元素
由于此表只能一次显示一个小数点,故已注释掉,仅供查询
例如想要第一个和第六个数码管小数点同时点亮,
则执行 pWela-&dot = 0xfe & 0xdf
u8 code dotTable[]={
//小数点位置,某一位置0时,小数点亮
0xfe , 0xfd , 0xfb ,
0xf7 , 0xef , 0xdf
u8 data smgWela[7]={0,0,0,0,0,0,0}; //第一位到第六位,最后一个是小数点位置控制
//P0口的数码管位选控制锁存器只用了低6位,我们保留高2位的数据,留作它用
void displaySMG(u8* pWela)
//控制6位数码管显示函数,不显示的位用参数dark
u8 preState=P0|0x3f;
//保存高2位状态,其中最高位是ADC0804的片选信号
wela=0;dula=0;_nop_();//先锁定数据,防止吴亮及位选锁存器高2位数据被改变
//由于数码管是共阴极的,阳极送低电平,灯不亮
dula=1;_nop_();
//段选数据清空并锁定
//共阴极数码管是阴极置高不亮,低6位置1,高2位保留
wela=1;_nop_();
//注:wela和dula上电默认为1
//位选锁定,初始保留高2位的数据,低6位置高不亮
for(i=0;i&6;i++)
//显示6位数码管
P0=table[pWela[i]]|(((1&&i) & pWela[6])?0x00:0x80);
dula=1;_nop_();
//送段数据,叠加小数点的显示,0x00点亮小数点
P0=preState&~(1&&i); //不影响高2位数据,低6位是数码管位选,低电平有效
wela=1; _nop_();
//送位选号
delayms(1);
//稍作延时,让灯管亮起来
//消除叠影及误亮,阴极置1不亮,低6位置1,高2位保留并锁定
wela=1; _nop_();
#ifndef _MY51_H
#define _MY51_H
#include &reg52.h&
//#include &math.h&
#include &intrins.h&
#include "mytype.h"
#define high 1
#define low
#define led P1
//灯总线控制
sbit led0=P1^0;
//8个led灯,阴极送低电平点亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //led锁存的状态,0锁定 ,1不锁定
sbit beep=P2^3;
void delayms(u16 ms);
void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
#include "MY51.h"
void delayms(u16 ms)
//毫秒级软延时函数
for(i=i&0;i--)
for(j=113;j&0;j--)
/****************************************************************
若使用12分频模式的mcu,晶振频率为Hz
则每个机器周期用时12/.085微秒
keil4编译,在默认的8级优化方式下
参数us=0时,函数执行9个机器周期,即t=9*1.085=9.77 us
参数us!=0时,函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085 us
*****************************************************************/
void delayXus(u8 us) //微秒级软延时函数
//这种写法有利于减小us=0时的机器周期
浏览 14566
楼主,你的 "mytype.h"&& 文件呢?
#ifndef&& _MYTYPE_H
#define&& _MYTYPE_H
/////////////////////////////////////////////
typedef float&&&&&&&&&&&&&&&&&&&&&&&&&&&& f32&& ;
typedef double
&&&&&&&&&&&&&&&&& d64& ;
typedef float& const&&&&&&&&&&&&&&&&&& fc32 ;
typedef double& const&&&&&&&&&&&&&& dc64& ;
typedef volatile float&&&&&&&&&&&&&&& vf32&& ;
typedef volatile double&&&&&&&&&&&& vd64& ;
//typedef volatile float&&&& const&& vfc32&& ;
//typedef volatile double& const&& vdc64& ;
//////////////////////////////////////////////
typedef signed long& s32;
typedef signed short s16;
typedef signed char&& s8;
typedef signed long& const sc32;& /* Read Only */
typedef signed short const sc16;& /* Read Only */
typedef signed char& const sc8;&& /* Read Only */
typedef volatile signed long& vs32;
typedef volatile signed short vs16;
typedef volatile signed char& vs8;
//typedef volatile signed long& const vsc32;& /* Read Only */
//typedef volatile signed short const vsc16;& /* Read Only */
//typedef volatile signed char& const vsc8;&& /* Read Only */
typedef unsigned long& u32;
typedef unsigned short u16;
typedef unsigned char& u8;
typedef unsigned long& const uc32;& /* Read Only */
typedef unsigned short const uc16;& /* Read Only */
typedef unsigned char& const uc8;&& /* Read Only */
typedef volatile unsigned long& vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char& vu8;
//typedef volatile unsigned long& const vuc32;& /* Read Only */
//typedef volatile unsigned short const vuc16;& /* Read Only */
//typedef volatile unsigned char& const vuc8;&& /* Read Only */
typedef enum {FALSE = 0, TRUE = !FALSE} BOOL;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITS
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalS
////////////////////////////////////////////////////////////////////////////////////////////
#define bool BOOL
#define false FALSE
#define true& TRUE
typedef enum {CLOSE = 0, OPEN = !CLOSE} OPEN_CLOSE;
typedef enum {GND = 0, VCC = !GND} GND_VCC;
typedef enum {NO = 0, YES = !NO} YES_NO;
typedef enum {STOP = 0, START = !STOP} START_STOP;
typedef enum {LOCK = 0, UNLOCK = !LOCK} LCOK_UNLOCK;
////////////////////////////////////////////////////////////////////////////////////////////
#define U8_MAX&&&& ((u8)255)
#define S8_MAX&&&& ((s8)127)
#define S8_MIN&&&& ((s8)-128)
#define U16_MAX&&& ((u16)65535u)
#define S16_MAX&&& ((s16)32767)
#define S16_MIN&&& ((s16)-32768)
#define U32_MAX&&& ((u32)uL)
#define S32_MAX&&& ((s32))
#define S32_MIN&&& ((s32)-)
xouou_53320
浏览: 379683 次
void T0_Work()
//T0定时器调用的工作函数
lastSeries 写道前辈,是不是在工作以后连System ...
前辈,是不是在工作以后连System.out.println( ...
chuanwang66 写道不过改了iconv.exe路径也不 ...
正在学习,多谢分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'后使用快捷导航没有帐号?
查看: 2283|回复: 22
DS18B20怎样使用?
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
如题,查看了DS18B20资料,仍不知道程序要干些什么。如果接3个DS18B20温度分别显示在1602上,怎么实现?
我想要个思路:
1、DS18B20本身要干些什么,是否只需硬件连好?所有数据线并一起连到& &&&单片机端口就可以了?
2、用STC的52单片机,单片机要干些什么,要写些什么子程序?
3、DS18B20输出与单片机怎样对接上?DS18B20输出什么,单片机接收后
& & 怎样处理,处理结果是什么形式,特别是怎样显示成有小数点?
另外,1602显示我知道,写指令和写数据,显示,我会弄,就是不知道怎样操作DS18B20,就算它有返回数据,我也不知道是什么数,还有看网上又怎么*10啦什么的,小数点在哪啊什么的,看不明白,希望大神帮助解答,资料可在论坛说,或发我邮箱:。谢谢啦!
在线时间979 小时
TA的帖子TA的资源
好不巧啊,网盘上没有找到我的程序,上次弄物联网耍耍的时候用到了久违的DS18B20了,不过上班的电脑上没程序。。。总的来说控制DS18B20应该是比较简单的了,没几个寄存器,主机发命令给从机,从机可以多个设备连接在总线上,然后主机通过芯片的ID来寻找对应的从机,数据手册上很清楚的。
亚里士缺德
在线时间3611 小时
威望31866分
芯币59551枚
TA的帖子TA的资源
本帖最后由 dontium 于
12:04 编辑
1、DS18B20本身要干些什么
你用这个芯片要干什么?
2、单片机要干些什么
& & 你学单片机了吗?
3、DS18B20输出与单片机怎样对接上?
&&手册上写得很清楚,如果还不知道: 1、请再读一遍。2、重复第一步
DS18B20是个广泛使用的芯片,网上有很多资料,楼主可以找一找,包括电路图及程序。
在线时间332 小时
E金币120枚
TA的帖子TA的资源
一粒金砂(中级), 积分 169, 距离下一级还需 31 积分
一粒金砂(中级), 积分 169, 距离下一级还需 31 积分
硬件:很简单,DS18B20一根数据线和单片机相连
软件:写个函数,网上有很多可以参考
在线时间1468 小时
威望6379分
芯币21930枚
E金币300枚
TA的帖子TA的资源
在线时间19 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
本帖最后由 zl2168 于
19:21 编辑
实例97&&一线式DS18B20测温
⒈ DS18B20简介
⑴ 内部组织结构& & …
⑵ 操作步骤和操作指令& & …
⒉ 电路设计& & …
⒊ 程序设计& & …
⒋ Keil调试& & …
⒌ Proteus仿真& & …
先Proteus仿真一下,确认有效。
(51.78 KB, 下载次数: 40)
19:21 上传
点击文件名下载附件
DS18B20 测温.jpg (143.04 KB, 下载次数: 4)
19:21 上传
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
实例97&&一线式DS18B20测温
⒈ DS18B20简介
⑴ 内部组织结构& & …
⑵ 操作步骤和操作指令& & …
这个仿真有效。有没有教程,C语言的程序参考呢?
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
1、DS18B20本身要干些什么
你用这个芯片要干什么?
2、单片机要干些什么
& & 你学单片机了吗?
3、DS18 ...
你这回复,我也是醉了。我知道用它采集并反馈温度啊,单片机怎样才算学了?芯片手册,是有写,但是是说一根的情况,多根的,我初学,想确认一下,希望大神们给点帮助。我不是要具体程序,我只要思路和一些详细点的资料。也正因为网上资料太多,且看不太明白,才在论坛问问看有没有通俗易懂的答复,哎。
在线时间3611 小时
威望31866分
芯币59551枚
TA的帖子TA的资源
你这回复,我也是醉了。我知道用它采集并反馈温度啊,单片机怎样才算学了?芯片手册,是有写,但是是说一 ...
呵呵,如有不妥,只当我没说。
要掌握一个新器件,除了有基础知识外,就也就是看它的手册,除此最好的办法外,没有它法,看别人做的东西,也是根据手册得来的,只是别人理解了。
对于新器件,全靠看别人的例程不是个好办法,因为它的很多细节例程中是说不到,到头来还需要看手册。
在线时间19 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
这个仿真有效。有没有教程,C语言的程序参考呢?
不是已经回复了你吗!
在线时间19 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
本帖最后由 zl2168 于
22:17 编辑
你这回复,我也是醉了。我知道用它采集并反馈温度啊,单片机怎样才算学了?芯片手册,是有写,但是是说一 ...
“也正因为网上资料太多,且看不太明白,才在论坛问问看有没有通俗易懂的答复”
张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有DS18B20测温的详细资料,还有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
好不巧啊,网盘上没有找到我的程序,上次弄物联网耍耍的时候用到了久违的DS18B20了,不过上班的电脑上没程 ...
能不能找到发现我邮箱,,感谢。
在线时间19 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
537224:你的悬赏是虚的!
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
537224:你的悬赏是虚的!
你的答复,没有什么资料,只是推荐什么书。还有给的例程只有仿真和HEX文件,没有C程序,你想让我就这样就悬赏吗?没解决。
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
你的答复,没有什么资料,只是推荐什么书。还有给的例程只有仿真和HEX文件,没有C程序,你想让我就这样就 ...
能否发些实用例子,资料?
在线时间556 小时
TA的帖子TA的资源
纯净的硅(中级), 积分 909, 距离下一级还需 291 积分
纯净的硅(中级), 积分 909, 距离下一级还需 291 积分
买一块开发板,带教程的,一百来块钱的板子常用的设备都会有,教程里的代码全做几遍,好好消化一下,想不会也难。
在线时间19 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
一粒金砂(中级), 积分 46, 距离下一级还需 154 积分
谁要你的悬赏!不过是调侃一下而已,但给你推荐的书上确有你所需的东东!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 6, 距离下一级还需 194 积分
一粒金砂(中级), 积分 6, 距离下一级还需 194 积分
DS18B20测温芯片,可以并一起,我用过50个芯片并一起的,单片机读串口,每个芯片有自己的地址,测温分辨率是0.5度的,我用过人家做好的成品,
在线时间273 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 112, 距离下一级还需 88 积分
一粒金砂(中级), 积分 112, 距离下一级还需 88 积分
郭天祥的那本书里有一个温度传感器的例程 多个的我没试过 收藏下 帮顶
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
对于新手要多点耐心,我们也是由不懂学习来的。
先说电路:
2---数据线(要加上拉电阻)
sbit DQ=P1^7; //单片机P1.7接数据口
& &//设置全局变量,专门用于严格延时
//函数功能:将DS18B20传感器初始化
Init_DS18B20(void)
&&DQ = 1;& && && &&&//先将数据线拉高
&&delay_us(6); //略微延时约6微秒
&&DQ = 0;& && && &&&//再将数据线从高拉低,要求保持480~960us
&&delay_us(600); //略微延时约600微秒,以向DS18B20发出一持续480~960us的低电平复位脉冲
&&DQ = 1;& && && && &&&//释放数据线(将数据线拉高)
&&delay_us(30);//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)& &
&&delay_us(200);
//从DS18B20读取一个字节数据
unsigned char ReadOneChar(void)
& &unsigned char i=0;
& & //储存读出的一个字节数据
& &for (i=0;i&8;i++)
& &&&DQ =1;& && & // 先将数据线拉高
& &&&_nop_();& &&&//等待一个机器周期
& &&&DQ = 0;& && &//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
& & dat&&=1;
& &&&_nop_();& &&&//等待一个机器周期& &&&
& &&&DQ = 1;& &&&//将数据线&人为&拉高,为单片机检测DS18B20的输出电平作准备
& & delay_us(6); //延时约6us,使主机在15us内采样
& &&&if(DQ==1)
& && &&&dat|=0x80; //如果读到的数据是1,则将1存入dat
& &&&dat|=0x00;//如果读到的数据是0,则将0存入dat
& && & //将单片机检测到的电平信号DQ存入r
& & delay_us(3);&&//延时3us,两个读时序之间必须有大于1us的恢复期
& &&&}& && && && && && && &
return(dat);& & //返回读出的十进制数据
//向DS18B20写入一个字节数据
WriteOneChar(unsigned char dat)
unsigned char i=0;
for (i=0; i&8; i++)
& & DQ =1;& && && &// 先将数据线拉高
& & _nop_();& && &//等待一个机器周期
& & DQ=0;& && && & //将数据线从高拉低时即启动写时序& && &
& & DQ=dat&0x01;& &//利用与运算取出要写的某位二进制数据,
& && && && && && && &&&//并将其送到数据线上等待DS18B20采样
& &delay_us(30);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
& & DQ=1;& && && & //释放数据线& && &
& & delay_us(3);//延时3us,两个写时序间至少需要1us的恢复期
& & dat&&=1;& && & //将dat中的各二进制位数据右移1位
& &delay_us(5); //稍作延时,给硬件一点反应时间
void ReadTemperature(unsigned char *p)
unsigned char tempL=0;
unsigned char tempH=0;
//测量到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
u//两位小数
bit&&fg=1;& && &&&//温度正负标志
& &Init_DS18B20();& &&&//将DS18B20初始化
& &WriteOneChar(0xCC); // 跳过读序号列号的操作
& &WriteOneChar(0x44); // 启动温度转换& &
& &delay_us(500); //温度转换需要一点时间
& &Init_DS18B20();& &&&//将DS18B20初始化
& &WriteOneChar(0xCC); //跳过读序号列号的操作
& &WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
& &tempL=ReadOneChar(); //读出温度的低位LSB
& &tempH=ReadOneChar(); //读出温度的高位MSB
& &if(tempH&0x7f)& && &//最高位为1时温度是负
& & & & & & & & {
& & & & & & & &&&tempL=~tempL;& && && &//补码转换,取反加一
& & & & & & & &&&tempH=~tempH+1;& && &
& & & & & & & &&&fg=0;& && &//读取温度为负时fg=0
& && && &}
& & & & sdate = tempL/16+tempH*16;& && &//整数部分
& & & & xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
& & & & xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
& & & & xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
& & & & if(fg==0) *p=1;
& & & & else *p=0;
& & & & *(p+1) =&&sdate/10;
& & & & *(p+2) =&&sdate%10;
& & & & *(p+3) =&&xiaoshu1;
& & & & *(p+4) =&&xiaoshu2;
unsigned char arTemperature[5];
void main(void)
& && &......
& &&&ReadTemperature(arTemperature);
& &&&......
那么在数组arTemperature中就是温度。
第一个元素是 正负温度,00是零上,01 是零下
第二、三个元素是温度的整数部分2位 二是十位 三是个位
第四、五个元素是温度的小数部分2位
如: 00&&02&&06&&08&&03& & 就是零上 26.83度。
后期数据处理自己看着办就行了。
(40.87 KB, 下载次数: 2)
09:33 上传
EEWORLD 官方微信
Powered by

我要回帖

更多关于 ds18b20读时序 的文章

 

随机推荐