sbit DQ=P1^6; //采集温度数据线
unsigned char tflag;
unsigned int tive;
float temper;
/****************************************
函数功能:短暂延时
入口参数:num
出口参数:
*****************************************/
void delay(unsigned int num)
{
while(num--);
}
/****************************************
函数功能:DS18B20初始化
入口参数:
出口参数:
*****************************************/
void init_DS18B20(void)
{
//主机发送复位脉冲
DQ=1;
DQ=0;
delay(600); //x
DQ=1;
//等待DS18B20发送应答信号
delay(60); //防止DS18B20本身问题而读不出数据采用确认法
while(!DQ);
// delay(480); //DS18B20本身没有问题,可以延时将应答过程忽略
}
/****************************************
函数功能:读一个字节
入口参数:
出口参数:
*****************************************/
readchar(void) //从低位开始读
{
unsigned char i=0;
unsigned char dat=0;
for(i=0;i<8;i++)
{
DQ=1;
DQ=0;
delay(10); //CPU缓冲时间 采样时间
dat>>=1; //从高到低先存放一位数据
DQ=1;
if(DQ) //如果是1,将数据存放
dat|=0x80;
DQ=1;
delay(9); //数据读取时间,下一次数据读取前需要延时
}
return(dat);
}
/****************************************
函数功能:写一个字节
入口参数:
出口参数:
*****************************************/
writechar(unsigned char dat)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DQ=1;
DQ=0; //等待接收缓冲区的来临,整个过程的时间为60~120us
delay(15); //
DQ=dat&0x01; //第一次写最低位,将字节变为位
delay(15); //
dat>>=1; //准备写入下一位数据。
}
}
/****************************************
函数功能:读取温度
入口参数:
出口参数:
*****************************************/
read_temperature(void)
{
unsigned int a,b;
init_DS18B20(); //初始化子程序
writechar(0xcc); //写入指令
writechar(0x44);
init_DS18B20();
writechar(0xcc);
writechar(0xbe);
a=readchar(); //低八位
b=readchar(); //高八位
tive=b;
tive<<=8;
tive=tive|a;
if(tive>0x0800) //温度为负温度第13位到15为为1,温度为正温度 //第13位到15为为0,所以值小于0x800说明为正温度
tive=~tive+1;
else
tive=tive;
temper=tive*0.0625; //采用12位分辨率所以每次的增量是0.0625
temper=temper*10; //保留小数点后面一位
return(temper);
}
汇编语言行么?这是我大三的课程设计。图是protel的。
已加你Q