各校大侠:我用的是PIC18F97J60,时钟为25M,DS18B20接的端口为PH5(是一个模拟通道口,开发板上固定的),写了一段程序,但是读不出转换后的值,不知道为什么?
#include<p18f97j60.h>
#define uchar unsigned char
#define uint unsigned int
#define Temp_DQ_TRIS (TRISHbits.TRISH5)
#define DQ (PORTHbits.RH5)
#define SkipROM 0xcc
#define ReadScratchpad 0xbe
#define ConvertT 0x44
uchar TP=0,TP_H=0,TP_L=0;
uchar presence=1;
void delay(uchar n)
{
uchar i;
for(i = 0; i < n; i++)
{
Nop();
}
}
/**********************Reset*********************/
void Bus_reset(void)
{
while(presence)
{
DQ = 0;
Temp_DQ_TRIS = 0;
delay(250);
delay(250); //master keep 480~960 us
DQ = 1;
Temp_DQ_TRIS = 1;
delay(85); // DS18B20 wait 15~60 us ,then active low
presence = DQ;
delay(150);
}
}
/********************Write one bit*************************/
void Write_bit(uchar bit_value)
{
DQ = 0;
Temp_DQ_TRIS = 0;
delay(13);
if(bit_value == 1)
DQ = 1;
delay(72); //delay 58us
Temp_DQ_TRIS = 1;
}
/**********************Write one byte*********************/
void Write_byte(uchar bytevalue)
{
uchar i;
uchar temp;
for(i = 0; i < 8; i++)
{
temp = bytevalue >> i;
temp = temp&0x01;
Write_bit(temp);
}
delay(2);
}
/**********************Read one bit*********************/
uchar Read_bit(void)
{
uchar bit_value;
DQ = 0;
Temp_DQ_TRIS = 0;
delay(13); // delay 0~15us
DQ = 1;
Temp_DQ_TRIS = 1;
bit_value = DQ;
delay(72); //delay 55us
return bit_value;
}
/********************Read one byte*******/
uchar Read_byte(void)
{
uchar i;
uchar value = 0;
for(i = 0; i < 8; i++)
{
if(Read_bit())
value = value | (0x01 << i); //ds18b20的数据输出从第0位开始输出
}
delay(2);
return value;
}
void main(void)
{
int i;
ADCON1=0x0f;
DQ = 0;
Temp_DQ_TRIS = 1;
Bus_reset(); //复位
Write_byte(SkipROM); //跳过ROM指令
Write_byte(ConvertT); //温度转换
delay(250);
delay(250); //延时500uS以上
Bus_reset(); //复位
Write_byte(SkipROM); //跳过ROM指令
Write_byte(ReadScratchpad); //执行读RAM存储器指令
TP_L=Read_byte(); //读RAM数据
TP_H=Read_byte();
Bus_reset();
while(1);
}
运行后,通过view看TP_L和TP_H看到的值均为0 |