18b20初始化程序解释

18b20初始化程序解释,第1张

其实你的程序的注释写的已经很清楚了。首先需要明确的是,ds18B20作为单总线器件,它对时序要求比较高,否则是不能正常工作的。至于你问的程序注释,我说过了,本身写的已经很清楚了,大没有在去解释的必要。估计你有这样的问题,是本身对ds18b20的数据手册还不是很清楚,建议自己看看他的资料和用法,先把时序和一些概念搞清楚就好了。至于你问的while(--delay)这句程序,意思就是只要“--delay”非零(while语句非零即为真),那程序就会停到这里一直执行,执行一次delay减1,直到--delay最后变成0。然后程序才能跳到下一句去执行。本身这个地方很好理解的,看来你的c语言还有待在看看。不过也没事,程序写多了自然这些东西就明白了。最后给你举个例子吧,比如程序前面给delay赋值为5,那么while(--delay)这句程序会执行5次,第一次while(4),第二次while(3),while(2),while(1),最后成了while(0),到了这时候,while(0)为假,程序就不执行了,然后就转到了下面。这样你应该就明白了,就是让程序在while这个地方循环多执行几次,起到一个延时的作用。

第一个程序是初始化DS18B20用的,是根据时序先置0后置1的过程,这个过程中延时时间的精度很重要,需要根据实际使用的硬件情况时行计算,置0需要保持480-960us

第二个程序很少看到用,一般是计算时长,在过了相应的时间后直接去读取数据,楼主程序使用循环255次的时间需要根据编译后的汇编代码来计算,请楼主行算一下;感觉楼主的这个程序采用不停检测和循环的做法有些夸张。

楼主要深入了解这个程序,最好还是直接看MAXIM-IC.COM网站上DS18B20的相关资料,重点是时序图和相关的命令流程图,看懂了是很有帮助的。

这是延时时间的问题

#include<reg52.h>

#include"ds18b20.h"

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^3

uchar temp_data[4]

/********************************************************

*函数名: void delay_us(uint xus)

*功能:延时时间为6us

*调用函数:无

*输入参数:xms,6us计数

*输出参数:无

*说明:总共延时时间为6us乘以xms,crystal=12Mhz

********************************************************/

void delay_us(uint xus)

{

while(xus--)

}

/********************************************************

*函数名: DS18B20_init(void)

*功能: DS18B20初始化

*调用函数: void delay_us(uint xus);

*输入参数: 无

*输出参数: yes0

********************************************************/

DS18B20_init(void)

{

uchar yes0

DQ=1 //复位

delay_us(8) //延时

DQ=0 //单片机将DQ拉低

delay_us(90) //精确延时大于480us

DQ=1 //拉高总线

delay_us(8)

yes0=DQ //如果yse0=0;则初始化成功,否则失败

delay_us(100)

DQ=1

return(yes0) //返回信号

}

/********************************************************

*函数名: void Write_onebyte(uchar dat)

*功能: 写入数据

*调用函数: void delay_us(uint xus);

*输入参数: uchar dat

*输出参数: 无

********************************************************/

void Write_onebyte(uchar dat)

{

uchar i

for(i=0i<8i++)

{

DQ=0

DQ=dat&0x01

delay_us(4)

DQ=1

dat>>=1

}

delay_us(4)

}

/********************************************************

*函数名: Read_onebyte(void)

*功能: 读取数据

*调用函数: void delay_us(uint xus);

*输入参数: 无

*输出参数: dat

********************************************************/

Read_onebyte(void)

{

uchar i,dat=0

for(i=0i<8i++)

{

DQ=0

dat>>=1

DQ=1

if(DQ)

dat|=0x80

delay_us(4)

}

return(dat)

}

/********************************************************

*函数名: void get_temperature()

*功能: 读取温度值,处理温度数据

*调用函数: Read_onebyte(void);void Write_onebyte(uchar dat);

void delay_us(uint xus);

*输入参数: 无

*输出参数: 无

********************************************************/

void get_temperature()

{

uchar sign=0 //定义符号标志位

uint temp //定义温度数据暂存

uchar temp_comp //用来存放测量温度的整数部分

while(DS18B20_init()) //等待18B20初始化

Write_onebyte(0xcc) // 跳过rom

Write_onebyte(0x44) //启动温度检测

delay_us(300) //延时等待转换结束

while(DS18B20_init())

Write_onebyte(0xcc)

Write_onebyte(0xbe)

temp_data[0]=Read_onebyte() //温度低8位

temp_data[1]=Read_onebyte() //温度高8位

if(temp_data[1]>127)

{

temp_data[0]=(~temp_data[0])+1

if((~temp_data[0])>=0xff)

{

temp_data[1]=(~temp_data[1])+1

}

else

{

temp_data[1]=~temp_data[1]

sign=1

}

}

temp=(temp_data[0]&0x0f)*625

temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) //取温度整数部分

disp_temp[0]=temp_comp/100+'0'

disp_temp[1]=temp_comp/10%10+'0'

disp_temp[2]=temp_comp%10+'0'

disp_temp[3]='.'

disp_temp[4]=temp/1000+'0'

disp_temp[5]=temp/100%10+'0'

disp_temp[6]=temp/10%10+'0'

disp_temp[7]=temp%10+'0'

disp_temp[8]='\0'

if(disp_temp[0]=='0')

{

disp_temp[0]=0x20

if(disp_temp[1]=='0')

{

disp_temp[1]=0x20

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11066366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存