新唐单片机ds18b20里ds18b02的转换时间是指从采集到转换成数据的时间吗

为什么我写的DS18B02程序,不能测出温度呢?C语言写的,用的是51单片机_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
为什么我写的DS18B02程序,不能测出温度呢?C语言写的,用的是51单片机
#include&reg52.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int #define convert_ram 0x44#define read_ram 0xbe#define copy_ram 0x48#define recall_ram 0xb8#define skip_rom 0xcc#define alam_ron 0xecsbit d=P...
我有更好的答案
/&#47, 符合协议要求的至少延时15us以上
while(i&gt,i;}/7)|(dat&&1),0xba,0xd8;/延时函数;
/**********************************************************************************//
i++; /}//**********************************************************************************&#47, 对于12MHz时钟, 例z=10, 进入等待应答状态
while(i&gt?us
ds=0;/小数点sbit sound=P3^3;延时约16us.h&#include&stdio.h&#define uchar unsigned char#define uint
unsigned intsbit ds=P1^7;让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动void dsreset(void)
//y&0;y--);x&0;x--),t.0592MHz时钟;
/&#47,0xa8,0/向DS18B20读取一位数据/
i++,b;0)i--;初始化DS18B20//
/&/**********************************************************************************/
///向DS18B20写入一字节数据void tempwritebyte(uchar dat)
for(j=1;j&=8;j++)
testb=dat&0x01;
dat=dat&&1;
//写&1&, 将ds拉低15us后, 在15us~60us内将ds拉高, 即完成写1
//拉低约16us, 符号要求15~60us内
i=8;while(i&0)i--;
//延时约64us, 符合写时隙不低于60us要求
//写&0&, 将ds拉低60us~120us
i=8;while(i&0)i--;
//拉低约64us, 符号要求
i++;i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
}}//**********************************************************************************//**********************************************************************************//向DS18B20发送温度转换命令void tempchange(void)
dsreset();
//初始化DS18B20, 无论什么命令, 首先都要发起初始化
//延时1ms, 因为DS18B20会拉低ds 60~240us作为应答信号
tempwritebyte(0xcc);
//写跳过读ROM指令
tempwritebyte(0x44);
//写温度转换指令}//**********************************************************************************//**********************************************************************************//向DS18B20发送读取数据命令
获取当前温度值uint tmp()
uchar low,
dsreset();
tempwritebyte(0xcc); //写入跳过序列号命令字 Skip Rom
tempwritebyte(0xbe); //写入读取数据令字 Read Scratchpad
//连续读取两个字节数据
low =tempread();
high=tempread();
//高8位赋予temp
//将高低两个字节合成一个整形变量 temp为16位 高8位左移8位 低8位补0
temp=temp|
//高低8位相或=temp为16位=高8位+低8位
xs=low&0x0f; //低4位为小数部分
tt=temp&&4; //整数部分
temp=tt*100+xs*100/16;
temp=tt*10+((((xs*5)&&2)+1)&&1);
**************************************
//y=(((x*5)&&2)+1)&&1;
//等效y=((x*5)/4+1)/2;
//再等效y=((x*20)/16+1)/2;
//y=2*(x*10/16+0.5)/2;
//实际上y=x*10/16+0.5;
//+0.5为 四舍五入 //
**********************************************
// tt=temp*0.0625;
//DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
// temp = tt * 100 + (temp & 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
temp=tt*100;
//将它放大100倍, 使显示时可显示小数点后两位(t=11.0625,计算得temp = 1106, 即11.06 度) //temp是整型}//**********************************************************************************//**********************************************************************************//显示函数 void display(uint t){
unsigned char a1=0,a2=0,a3=0,a4=0; //临时变量
static int k=0;
a1=t/1000;
//取t的千位//
a2=t%;//取t的百位//
a3=t%100/10; //取t的十位//
//取t的个位//
(k==0){A1=1;A2=0;A3=0;A4=0;P0=yima[a1];}
else if(k==1){A1=0;A2=1;A3=0;A4=0;P0=yima[a2];}
else if(k==2){A1=0;A2=0;A3=1;A4=0;P0=yima[a3];}
else if(k==3){A1=0;A2=0;A3=0;A4=1;P0=yima[a4];}
if(k&3) k=0;}
//**********************************************************************************main(){ /*
TMOD=0X01;
TH0=()/256;
TL0=()%256;
tempchange();
//启动温度转换
//启动温度转换以后需要延时,大概在750ms
for(i=0;i&40;i++) //显示5次(不加for 前面3位数码管很暗)或者显示函数改用中断写
display(t);
}} /*void t0()interrupt 1 using 1
//中断程序负责显示t的值 {
unsigned char a1=0,a2=0,a3=0,a4=0; //临时变量
static int k=0;
TH0=()/256;
TL0=()%256;
a1=t/1000;
//取t的千位//
a2=t%;//取t的百位//
a3=t%100/10; //取t的十位//
//取t的个位//
(k==0){A1=1;A2=0;A3=0;A4=0;P0=yima[a4];}
else if(k==1){A1=0;A2=1;A3=0;A4=0;P0=yima[a3];}
else if(k==2){A1=0;A2=0;A3=1;A4=0;P0=yima[a2];}
else if(k==3){A1=0;A2=0;A3=0;A4=1;P0=yima[a1];}
if(k&3) k=0;
// TH0=240;//扫描速度}
*/;/定义控制蜂鸣器的单片机引脚。
uint temp, 然后两小周期高电平,&#47.
void delay(uint z){0)i--;
i=103;/**********************************************************************************/**********************************************************************************/&#47,0x7a,0x7b;
//**********************************************************************************/读出的数据最低位在最前面,这样刚好一个字节在dat里
return(dat); /*延时函数*//
/reg52;/**********************************************************************************/
for(x=z;百sbit A3=P1^2,0xfa}, unsigned int型的i, 作一个i++操作的时间大于;/温度传感器信号线sbit A1=P1^0;/**********************************************************************************&#47/=8;i++)
j=tempreadbit();/读取一字节数据, 通过调用tempreadbit()来实现uchar tempread(void)
uchar i,j,
for(i=1;i&lt,y;/**********************************************************************************//千sbit A2=P1^1;
//i++;/对于11;i++起延迟作用
延时约8us, 符合协议要求至少保持1us
ds=1,0x88,0xb3,则大概延时10/延时约64us, 符合读时隙不低于60us要求
return(dat),
unsigned char yima[]={0/之后DS18B20则会输出持续一段时间的一位数据bit tempreadbit(void) {
ds=0;}//十sbit A4=P1^3;
/产生一个上升沿;拉低约800us, 符合协议要求的480us以上
while(i&0)i--;
for(y=124;/段选控制sbit D =P0^2;void delayms(unsigned int i);/个sbit A5=P1^4;/DS18B20温度计C语言程序#include&/读一位, 让DS18B20一小周期低电平
采纳率:49%
delay_ds(1);
a|=0x80; cmd_ds(0x44);i&8;i++) {
cmd_ds(0xcc);}ds18();
delay_ds(10);
_nop_(); init_ds(); cmd_ds(0xcc); cmd_ds(0xbe); a=rdata_ds(); b=rdata_ds(); c=b;就是温度值; delay_ds(250); ds=1; delay_ds(100);}uint ds18(){ =1;
delay_ds(1); }}void init_ds(){ ds=1; delay_ds(1); ds=0;i++) {
ds=a&0x01;
delay_ds(10);8,b.5,i;}void cmd_ds(uchar a){
for (i=0;i&lt我给你发一个我写的吧;& for (i=0.0625; c=t+0; return c,11.0592的晶振, void delay_ds(uchar g){ while(--g);}uchar rdata_ds(){ =8; c|=a; t=c*0;
init_ds(); c&
肯定是程序问题,你先保证硬件没问题,再用别人的程序试试...
为您推荐:
其他类似问题
51单片机的相关知识
等待您来回答匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。单片机数据采集系统_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机数据采集系统
&&本设计做了很大努力,在文字校对方面很注重,基本符合毕业论文要求,其次是程序验证过,没有什么错误,可以作为模版下载参考或者使用。
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 ds18b20怎么接单片机 的文章

 

随机推荐