/* 从传感器中读一个字节 */
void read_byte(unchar *ReadByte)
{
int i;
unchar temp="0";
unint loopindex="0";
PIN_HIGH();
for(i=0;i<8;i++)
{
temp="temp">>1;
PIN_LOW();
nop();nop();nop();nop(); /*延时2us */
nop();nop();nop();nop();
PIN_HIGH();
for(loopindex=0;loopindex<6;loopindex++){;} /* 延时14us */
PIN_LEAVE();
nop();
if((DATA_PORT & DATA_BIT) == 0x0000)
{ temp="temp" & 0x7F; }
else
{ temp="temp" | 0x80; }
PIN_HIGH();
for(loopindex=0;loopindex<26;loopindex++){;} /* 延时60us */
}
*ReadByte=temp;
return;
}
/* 将读得的温度转化为十进制 */
float transform(unchar *T)
{
unchar temp="0";
float temprature="0";
temp=temp|(*(T+1)<<8);
temp=temp|*T;
if((temp&0x0F800)==0x0F800)
{ temprature="0-"((~temp)+1)*0.0625; }
else
{ temprature="temp"*0.0625; }
return(temprature);
}
/* 读取温度主函数,返回十进制温度数 */
float read_temp()
{
Unchar buff[2];
float temprature="0";
unint loopindex="0";
while (reset()==1){}; /* 复位等待从机应答 */
write_byte(0xCC); /* 忽略ROM匹配 */
write_byte(0x44); /* 发送温度转化命令 */
for(loopindex=0;loopindex<65535;loopindex++){;} /* 延时300ms,等待数模转换 */
for(loopindex=0;loopindex<65535;loopindex++){;}
while(reset()==1){}; /* 再次复位,等待从机应答 */
write_byte(0xCC); /* 忽略ROM匹配 */
write_byte(0xBE); /* 发送读温度命令 */
read_byte(buff); /* 读出温度低8位 */
read_byte(buff+1); /* 读出温度高8位 */
temprature="transform"(buff);
PIN_HIGH(); /* 释放总线 */
return(temprature);
}
4 结束语
DS18B20是一款非常优秀的单总线数字式传感器。硬件设计简单,运行可靠。通过分析C语言编译后的汇编语言可以很明确的计算出软件延时的时间,从而满足单线总线通讯的时序要求,从而可以出色的完成DSP与DS18B20通讯的软件设计。
5 本文创新点有两个:
1、通过C编译器编译出来的相应的C语言的延时程序,从而得到其对应的汇编语言,再通过定时器计时,能够知道单指令周期的时间,从而能够精确的计算出软件延时程序的延时时间。
2、通常DS18B20都是与单片机配合使用的,而本文则详细的介绍了DS18B20与DSP的结合使用方法,其区别主要是在端口的操作上和延时的控制上。