extern WORD T_SHI;
reset(void)
{
WORD presence=1;
DQT_HIGH();
while(presence)
{
DQT_LOW() ;
__delay_us(503);
DQT_HIGH();
__delay_us(70);
if(DQT==1) presence=1;
else presence=0;
__delay_us(430);
}
}
//************** 从18B20中读一个字节**************//
WORD read_byte()
{
WORD i;
WORD data;
static bit j;
for(i=0;i<8;i++)
{
data>>=1;
DQT_LOW();
__delay_us(6);
DQT_HIGH();
__delay_us(6);
j=DQT;
if(j)data|=0x80;
__delay_us(63); //延时61us(从拉低电平开始60-120us之内释放总线)
}
return(data);
}
//*********************向18B20中 写一个字节**************//
void write_byte(WORD val)
{
WORD i,temp;
for(i=8;i>0;i--) //写8位数据
{
temp=val&0x01; //先写低位数据
DQT_LOW(); //RA1输出低电平
__delay_us(6); //延时6us(15us之内把数据送到总线上)
if(temp){DQT_HIGH();} //设置RE0为输入口(写1时序)
__delay_us(63); //延时61us(总线采样时间15-60us)
DQT_HIGH(); //设置RA1为输入口(写0时序)
__delay_us(6); //延时6us(写第二位时间间隙大于1us)
val=val>>1; //右移一位
}
}
void Get_Temp(void)
{
WORD i,TEMP1=0,TEMP2=0;
reset();
write_byte(0XCC); //忽略ROM匹配
write_byte(0X44);
reset(); //再次复位,等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0XBE); //发送读温度命令
TEMP1=read_byte();
TEMP2=read_byte();
//TEMP1=TEMP1>>4;
//TEMP2=TEMP2<<4;
if(TEMP1>0)
{T_SHI=0x3f; //此处我想验证temp1是否得到了数值,
ShowTempHum(); //取得了数值,就应该执行该句。
} //但是问题是temp1和temp2一直是0。
else
{T_SHI=0x22;
ShowTempHum();
}
}
上面是我的函数,其中
#define nop asm("nop")
# define DQT RA1 //定义18B20数据端口
# define DQT_DIR TRISA1 //定义18B20D口方向寄存器
//# define W1_INPUT 1
//# define W1_OUTPUT 0
# define FALSE 0
# define TRUE !FALSE
# define DQT_HIGH() DQT_DIR = 1
# define DQT_LOW() DQT = 0; DQT_DIR = 0
都定义好了。
我按照网上的n多例子,程序。,延时函数也是通过软件和示波器观察的,都很准确。,
我不知道为什么我一直读不出数据。
temp1和temp2一直是0.我弄了好几天了 郁闷死了。这个最基本的应用我也羞于问同事。谁能帮帮我,必有重谢。
单片机是pic16F1936.电路我也查过了,没问题。传感器也是好的。 |