在ds18b20驱动程序当中,程序DQ=CY是什么意思

ds18b20序列号读程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ds18b20序列号读程序
上传于||文档简介
&&网​摘
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
你可能喜欢君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
DS18B20程序
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口后使用快捷导航没有帐号?
查看: 8858|回复: 21
写个DS18B20初始化程序,死活没反应
在线时间1534 小时
威望23069 分
芯币9587 枚
E金币380 枚
TA的帖子TA的资源
周末开始做毕业设计。
首先是要用单片机读取DS18B20的数据。
看了一两天时序,基本看懂了,首先想写一个初始化程序,让单片机发现DS18B20的存在。结果发现压根没反应。
说说我做的情况。
DS18B20的硬件情况:
额,引脚是 有字的一面朝着自己,然后从左往右是 地,数据,电;
我试过直接连IO,也试过从电拉一个5.1K的上拉电阻给数据口。但是都不行。
(总不能说,PDF上给的是4.7K,我用5.1K就不行吧?)
程序,那个时序图就是一般资料里面的。
480到960us的复位脉冲。然后中间停止15到60us.
这个过程,我试过,先拉高再等待,或者先等待再拉高,貌似没啥区别。
然后,DS18B20在60到240us内发出一个低电平的存在脉冲。
而单片机要做的就是把那条线先拉高,再读取该低电平。
我试过自己写的C语言不行,那时我怀疑是时间没控制好,后来改了一个汇编的,还是不行。
再后来,我用了PDF中的一个例程,还是不行。
例程是这样的:
RESET:&&&&& MOV&&& A,&&& #4 ;设置循环次数&&&&& CLR&&& P1.0 ;发出复位脉冲&&&&& MOV&&& B,&&& #250 ;计数250 次&&&&& DJNZ&& B,&&& $ ;保持低电平500us&&&&& SETB&& P1.0 ;释放总线&&&&& MOV&&& B,&&& #6 ;设置时间常数&&&&& CLR&&& C ;清存在信号标志WAITL:JB&&&& P1.0, WH ;若总线释放跳出循环&&&&& DJNZ&& B,&&& WAITL ;总线低等待&&&&& DJNZ&& ACC,& WAITL;释放总线等待一段时间&&&&& SJMP&& SHORT& WH: MOV&&& B,&&& #111& WH1:ORL&&& C,&&& P1.0&&&&& DJNZ&& B,&&& WH1 ;存在时间等待SHORT:RET
这个例程,作用应该是,如果存在脉冲存在,则它会与CY位相或,因而,CY会是低电平。否则是高。
所以,我在主程序中,这么写:
&&&&& ORG&&& 0100HSTART:&&&&& CALL&& RESET;&&&&& JC&&&& $;&&&&& CLR&&& P1.5;&&&&& SJMP&& $;
可是,事实上,没用,灯没亮。
想不通为什么。
难道引脚错了?
难道是坏的?我昨天刚买的说。
本人变态,生物勿近
在线时间53 小时
威望100 分
芯币178 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 100, 距离下一级还需 100 积分
一粒金砂(中级), 积分 100, 距离下一级还需 100 积分
关键是延时有问题,还有转换时间,我有c语言的,你要的话,传一个上来,avr的和51的都有
在线时间228 小时
威望358 分
芯币2878 枚
TA的帖子TA的资源
一粒金砂(高级), 积分 358, 距离下一级还需 142 积分
一粒金砂(高级), 积分 358, 距离下一级还需 142 积分
单总线对时序要求比较严格,慢慢调试吧
在线时间109 小时
威望1646 分
芯币796 枚
E金币100 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1646, 距离下一级还需 354 积分
纯净的硅(高级), 积分 1646, 距离下一级还需 354 积分
当时我读那个缝隙怎么都定不准时间,用了个笨办法:多读几次缝隙,然后取几个值的逻辑与作为结果(有0出0),就准了。
Python全文搜索引擎:&url&/p/ming-search/&/url&
在线时间1534 小时
威望23069 分
芯币9587 枚
E金币380 枚
TA的帖子TA的资源
报告一下,汇编的通过了,C的还是没通过
下午郁闷了一会,先缓下,在淘宝上买nRF24L01的时候,因为感觉卖家也是个51中人,顺带就跟他吐了一下槽。
对方提示我,延时时间拉长一些,我有点奇怪。心想这时序不是要求挺高么。
然后我百无聊赖地打了好一会的打豆豆。
然后继续调试。我现在仔细看了那个例程,汇编的,感觉还是怪怪的,调长了时间,发现还是不行。
不死心,拿我自己写的汇编的,调长了 复位脉冲的时间(我挑成了大概5 到 6毫秒),结果居然可以了,我担心是意外,怕是幻觉。
我再仔细看程序,因为挺简单,几经确认,果然没错。我又用了一个办法,确认,我拔了DS18B20的DQ,发现果然就没亮LED,至此我确定了应该真的是实现了。
然后我开始着手调试C版本的,结果直到现在还是不行,郁闷的不行。
期间,跟朋友吃了晚饭,聊了一会,还看了 anqi90和鑫海宝贝提交给我的文档,给他们提出了若干建议,然后是发第二个规整贴,因为明天上班,明天是来不及发了的......
总之就是相当郁闷。C的为啥就是不行,我在仿真里仿真了好多遍,逻辑上应该是没问题了。我又反复调整了延时长度,但是始终不行。
我想,C的话应该是更难控制时间。所以我打算下一步,或许是明天晚上,或许是下周末,谁知道呢?
我会就着汇编的版本,再对比C的仿真过程中,定时器的计数状态,找出修改的方法。
本人变态,生物勿近
在线时间109 小时
威望1646 分
芯币796 枚
E金币100 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1646, 距离下一级还需 354 积分
纯净的硅(高级), 积分 1646, 距离下一级还需 354 积分
回复 5楼 辛昕 的帖子
用C的延时可能时间不容易控制。不如读时在拉高以后不延时了,立即连续读个20毫秒甚至更多,有0出0,无0出1。这样只要芯片好的肯定能读出来了吧。。。
Python全文搜索引擎:&url&/p/ming-search/&/url&
在线时间2815 小时
威望13561 分
芯币11294 枚
E金币270 枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13561, 距离下一级还需 6439 积分
裸片初长成(初级), 积分 13561, 距离下一级还需 6439 积分
假如逻辑没错,汇编行C不行的话,有一种可能是被编译器优化掉了,需用volitale救场。
在线时间7361 小时
威望10400 分
芯币9667 枚
TA的帖子TA的资源
找一个网上的DS18B20的C观摩下.
在线时间1534 小时
威望23069 分
芯币9587 枚
E金币380 枚
TA的帖子TA的资源
回复 7楼 仙猫 的帖子
额,这个,这个,,我前阵子看STM32固件库里碰到这个东东,不过不是太明白。
我想,大叔的意思是否:子程序中保存的数据出了子程序就挂掉?还是说别的,我不是很懂。
还是说,编译过程中,这个量不知道因为什么变得乱七八糟。
有点奇怪的是,我也试过在子程序里丢失数据,所以我干脆在子程序中也点亮一个LED灯。
额,elulis,你这个可真狠,20毫秒啊!!行,我回去试试。
本人变态,生物勿近
在线时间2815 小时
威望13561 分
芯币11294 枚
E金币270 枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13561, 距离下一级还需 6439 积分
裸片初长成(初级), 积分 13561, 距离下一级还需 6439 积分
这只是猜测
常有这样的情形,比如你用C写了个简易循环做延迟:
 c = 1000;
 while (c--);
编译器一看你在干嘛呢,帮你改写成给c赋值-1不就完了吗?于是你的循环体被杀掉,延迟也做不成了。
再有就是对I/O的操作,比如读键或读状态,原本的意图是想反复读查看变化的,结果编译器觉得你在瞎折腾,读完一次之后就帮你记忆在变量里,以后再读到的其实不是真的I/O而是不变的变量值,那就出问题了。
如果碰到这种情形,可以用volitale修饰子禁止对该变量或(I/O)的优化。
在线时间36 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 28, 距离下一级还需 172 积分
一粒金砂(中级), 积分 28, 距离下一级还需 172 积分
时序问题 时序要掌握好 上拉电阻最好接
在线时间1534 小时
威望23069 分
芯币9587 枚
E金币380 枚
TA的帖子TA的资源
回复 10楼 仙猫 的帖子
前几天看固件库,刚好看到这玩意,没想到哈,马上就用上了,我的天。
PS:太为他人着想,原来真的很成问题,比如编译器同学。
本人变态,生物勿近
在线时间14 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 18, 距离下一级还需 182 积分
一粒金砂(中级), 积分 18, 距离下一级还需 182 积分
唉,LZ,俺是个汇编盲啊,回帖是美德,顺便赚赚钱
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
DS18B20供应
本帖子中包含更多资源
才可以下载或查看,没有帐号?
TMS320DM642AGDK6 200片 原装深圳库存现货... 价优
接受TI全系列DSP订货...
在线时间50 小时
威望180 分
芯币434 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 180, 距离下一级还需 20 积分
一粒金砂(中级), 积分 180, 距离下一级还需 20 积分
DS18B20对时序要求非常严格。我有C的
在线时间1534 小时
威望23069 分
芯币9587 枚
E金币380 枚
TA的帖子TA的资源
回复 15楼 烟雨 的帖子
额,各位有C的老大,麻烦发一份给我,谢谢。
可以回帖或者编辑帖子的,然后上传附件。。。也给有需要的童鞋留着哈~~
本人变态,生物勿近
在线时间1081 小时
威望11118 分
芯币18994 枚
E金币179 枚
TA的帖子TA的资源
基于DS18B20的温度控制系统仿真及程序
我这儿正好有一个,也是帮别人做的毕设,压缩包里有protues仿真工程和keil 工程文件,可以使用protues和keil连调,DS18B20部分的函数也写的很清楚,自己看看吧。
另外,针对这个仿真我也做了实物,用的是STC89C52RC,下载的就是这个程序,应该没有错的!希望能对你提供一些帮助!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
在线时间24 小时
芯币177 枚
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
调时序最好用示波器!
科学家研究已有的世界,工程师创造未来的世界!
在线时间1534 小时
威望23069 分
芯币9587 枚
E金币380 枚
TA的帖子TA的资源
回复 18楼 luckfrog 的帖子
我也想有示波器,有示波器事情就好玩多了。。。也许我就不会一直停留在直流线路了
本人变态,生物勿近
在线时间1081 小时
威望11118 分
芯币18994 枚
E金币179 枚
TA的帖子TA的资源
调时序用逻辑分析仪就行了,论坛里有介绍的,一二百块钱就行了
Powered by
逛了这许久,何不进去瞧瞧?C51 DS18B20程序 - 电子元器件基础知识 - 21IC中国电子网
您当前的位置:&>&&>&&>&&>&
C51 DS18B20程序
&1、头文件
[cpp] view plaincopy#ifndef _DS18B20_H_
#define _DS18B20_H_
#define uchar unsigned char
#define uint unsigned int
void DS18B20_Delayus(uint us);
void DS18B20_reset();
void DS18B20_write(uchar dat);
uchar DS18B20_data();
uint read_temperature();
[c-sharp] view plaincopy#include
#include &DS18B20.h&
uint TT; //1820温度变量
sbit DQ = P2^1;
uchar table_temp[5];
uchar temp_
/*******************************************************************/
/*us级延时函数 */
/*******************************************************************/
void DS18B20_Delayus(uint us)
while(--us);
void DS18B20_reset()
uchar x = 0;
DS18B20_Delayus(16); //稍做延时
DQ = 0; //将DQ拉低
DS18B20_Delayus(160);//延时400us~960us
DQ = 1; //拉高总线
DS18B20_Delayus(28);//延时15us~60us
x = DQ; //如果=0则初始化成功 =1则初始化失败
DS18B20_Delayus(40);//延时60us~240us
/*******************************************************************/
/* 写一个字节 */
/*******************************************************************/
void DS18B20_write(uchar dat)
for(i = 8; i & 0; i--)
DQ = dat & 0x01;
DS18B20_Delayus(10);
dat &&= 1;
/*******************************************************************/
/* 读一个字节 */
/*******************************************************************/
uchar DS18B20_data()
for (i = 8; i & 0; i--)
DQ = 0; // 给脉冲信号
dat &&= 1;
DQ = 1; // 给脉冲信号
dat |= 0x80;
DS18B20_Delayus(8);
/*******************************************************************/
/* 读取温度 */
/*******************************************************************/
uint read_temperature()
uchar a,b;
uint t = 0;
float tt = 0;
DS18B20_reset();//DS18B20复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0x44); //启动温度转换
DS18B20_reset();//DS18B20复位
DS18B20_write(0xcc); //跳过读序号列号的操作
DS18B20_write(0xbe); //读取温度寄存器
a = DS18B20_data(); //读低8位
b = DS18B20_data(); //读高8位
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
void main()
uchar i_1,tab1,tab2,tab3;
LCD_init();
DS18B20_reset();
LCD_write_com(0x80);
for(i_1 = 0; i_1 & 5; i_1++)
LCD_write_data(table[i_1]);
TT = read_temperature(); //读温度
tab1 = TT / 100;
table_temp[0] = tab1 + 0x30; // 十位
tab2= TT / 10 - tab1*10;
table_temp[1] = tab2 + 0x30; //个位
table_temp[2] = '.';
tab3 = TT - tab1*100 - tab2*10;
table_temp[3] = tab3 + 0x30; //小数点一位
table_temp[4] = 'C'; //显示温度符号℃
LCD_write_com(0x80+0x06);
for(i_1 = 0; i_1 & 5; i_1++)
LCD_write_data(table_temp[i_1]);DS18B20采集温度程序求翻译要一行一行啊_百度知道
DS18B20采集温度程序求翻译要一行一行啊
在读出时需进行CRC校验;放大10倍输出并四舍五入return(t);单片机将DQ拉低Delay_DS18B20(80);t=t|a;*****读一个字节*****/ /0;void Delay_DS18B20(int num){while(num--) ; /
/读高8位t=b;&
Delay_DS18B20(5);}/跳过读序号列号的操作WriteOneChar(0xBE);=1; i--){
DQ = 0; /稍做延时后;for (i=8;t&//*****读取温度*****/x = DQ;unsigned char b=0.0625;拉高总线Delay_DS18B20(14);//启动温度转换Init_DS18B20(),校验有错时不进行温度数据的改写;}return(dat); /精确延时;/
/&#47,如果x=0则初始化成功; 读取18B20的程序;}/void Init_DS18B20(void){unsigned char x=0;}}//
/DQ = 1;/i&*****END*****/unsigned char dat = 0,x=1则初始化失败Delay_DS18B20(20);&
//0;&/}/
///稍做延时DQ = 0; 给脉冲信号
dat|=0x80;O/
/}/for (i=8;
dat&gt.5。读出温度子程序的主要功能是读出RAM中的9字节;
Delay_DS18B20(4);定义DS18B20总线I/读低8位b=ReadOneChar();tt=t*0;/
DQ = 1;/Init_DS18B20();unsigned int t=0;
/=8;&#47,需要单片机发送读命令和写命令;WriteOneChar(0xCC);
/WriteOneChar(0xCC);void WriteOneChar(unsigned char dat){unsigned char i=0;
/跳过读序号列号的操作WriteOneChar(0x44); i&unsigned char ReadOneChar(void){unsigned char i=0;i--){
DQ = 0;*****初始化DS18B20*****/读取温度寄存器a=ReadOneChar();t= tt*10+0;=1;*****写一个字节*****/unsigned int ReadTemperature(void){unsigned char a=0;DQ复位Delay_DS18B20(8);
DQ = dat&0x01;
DQ = 1;&#47,大于480usDQ = 1;*****延时子程序*****/float tt=0; 给脉冲信号
dat&gt#define DQ P3_4
提问者采纳
/精确延时; i 大于0;定义数据变量for (i=8;拉高总线Delay_DS18B20(14);定义复位成功标志DQ = 1;/
/unsigned char ReadOneChar(void){unsigned char i=0以下把你的程序中没有翻译的给你补全一下#define DQ P3_4
/ 给脉冲信号
/0;//定义温度低位寄存器unsigned char b=0;unsigned int ReadTemperature(void){unsigned char a=0;定义for变量for (i=8;/
DQ = 1; i--)
///void WriteOneChar(unsigned char dat){unsigned char i=0;
/数据右移}}/void Init_DS18B20(void){unsigned char x=0;
/调用DS18B20复位程序WriteOneChar(0xCC),
dat|=0x80;数据左移8位t=t|a;/=1;
/=8;稍做延时DQ = 0;/
/如果DQ=1;/拉高DQ
dat&启动温度转换Init_DS18B20();*****延时子程序*****/高8位温度数据送温度寄存器t&&
///稍作延时}return(dat);num不等于零继续减1作时延}///void Delay_DS18B20(int num){while(num--) ;定义温度高位寄存器unsigned int t=0;返回读到的数据}/读低8位b=ReadOneChar();调用DS18B20复位程序WriteOneChar(0xCC),如果x=0则初始化成功;//
/跳过读序号列号的操作WriteOneChar(0xBE);/十进制与十六进制数据转换t= tt*10+0.0625;&gt.5;数据或入0x80
Delay_DS18B20(4);
//&#47,大于480usDQ = 1;//定义DS18B20总线I///
//*****读一个字节*****/
输出数据最低位
Delay_DS18B20(5);//
&#47,i减1,i=0时重新把输值i=8{
DQ = 0,x=1则初始化失败Delay_DS18B20(20); i&
/ / 给脉冲信号
dat& /DQ复位Delay_DS18B20(8);/跳过读序号列号的操作WriteOneChar(0x44);*****写一个字节*****//
//*****初始化DS18B20*****/
//定义整形温度寄存器float tt=0;//读高8位t=b;或入低8位温度数据tt=t*0;
/*****读取温度*****//O//
//定义for的读数变量unsigned char dat = 0;延时30~60usx = DQ;
&#47,i=0时重新把输值i=8{
DQ = 0;=1;数据右移
DQ = 1; /i--)
DQ = dat&0x01;/稍做延时后; /0;
/读取温度寄存器a=ReadOneChar(),i减1;
//延时120us左右}/
/*****END*****/
/放大10倍输出并四舍五入return(t);i 大于0;单片机将DQ拉低Delay_DS18B20(80);/
/定义实形(浮点形)温度寄存器Init_DS18B20();&
///返回带一位小数的温度值}/&#47
提问者评价
感谢大神了
其他类似问题
为您推荐:
ds18b20的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 ds18b20读取温度程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信