📄 freescale
字号:
#include "DS18B20.h"
Uchar TLV=0 ; //采集到的温度高8位
Uchar THV=0; //采集到的温度低8位
Uchar TZ=0; //转换后的温度值整数部分
//---------------------------------------------------------------------*
//函数名: delay *
//功 能: 延时函数: *
//参 数: t; *
// t:需延时的ms数; *
//返 回: 无 *
//---------------------------------------------------------------------*
void delay(Uint t)
{
Uint z;
for ( z=0; z<t; z++)
;
}
//循环一次大约25个cpu时钟,50个busclk,所以延时50*1/8M=6.25uS
//---------------------------------------------------------------------*
//函数名: reset *
//功 能: DS18B20复位函数: *
//参 数: None; *
//返 回: 无 *
//---------------------------------------------------------------------*
void reset(void)
{
char presence=1;
while(presence)
{
// DQ_DIR=1;
//DQ=1;
DQ_SetDir(1);
DQ_ClrVal() ; //主机拉至低电平
delay(112); //延时700us
DQ_SetDir(0); //释放总线等电阻拉高总线,并保持15~60us
delay(11); //延时70us
if(DQ_GetVal() ==1) //没有接收到应答信号,继续复位
{
presence=1;
}
else
{
presence=0; //接收到应答信号
}
delay(80); //延时500us
}
}
//-----------------------------------------------
//写18b20写字节函数
void write_byte(Uchar val)
{
Uchar i;
Uchar temp;
for(i=8;i>0;i--)
{
temp=val&0x01; //最低位移出
DQ_SetDir(1);
DQ_ClrVal();
asm{
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
//从高拉至低电平,产生写时间隙
if(temp==1)
DQ_SetDir(0); //如果写1,拉高电平
delay(12); //延时63us
DQ_SetDir(0);
asm{
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
val=val>>1; //右移一位
}
}
//------------------------------------------------
//18b20读字节函数
Uchar read_byte(void)
{
static byte j;
Uchar i;
Uchar value=0; //读出温度
for(i=8;i>0;i--)
{
value>>=1;
DQ_ClrVal();
asm
{
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
DQ_SetDir(0); //拉至高电平
asm
{
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
j=DQ_GetVal();
if(j) value|=0x80;
delay(12); //63us
}
return(value);
}
//-------------------------------------------------
//启动温度转换函数
Uchar get_temp(void) //外接5V电源情况
{
int i;
DQ_SetDir(0);
reset(); //复位等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0X44); //发送温度转化命令
for(i=50;i>0;i--)
{
// feedCOP(); //确保温度转换完成所需要的时间
}
reset(); //再次复位,等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0XBE); //发送读温度命令
TLV=read_byte(); //读出温度低8
THV=read_byte(); //读出温度高8位
DQ_SetVal(); //释放总线
TZ=(TLV>>4)|(THV<<4)&0X3f; //温度整数部分
asm
{
NOP
NOP
NOP
NOP
}
return TZ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -