第二个程序很少看到用,一般是计算时长,在过了相应的时间后直接去读取数据,楼主程序使用循环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
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)