//----------------------------包含头文件----------------------
#include
#include
#include
#define CLR_DIR_1WIRE DDRB &=~ BIT(4) //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRB |= BIT(4) //里面什么都不用改!
#define CLR_OP_1WIRE PORTB &=~ BIT(4) //选定PB4口
#define SET_OP_1WIRE PORTB |= BIT(4)
#define CHECK_IP_1WIRE (PINB & BIT(4)) //位检测
static uchar test_bit;//---------正负检测位,--BIT(0)--负=1,正=0
/****************************************************************************
函数功能:DS18B20初始化子程序
****************************************************************************/
void init_1820(void)
{
SET_DIR_1WIRE;//-------------设置PB4 为输出
SET_OP_1WIRE;//--------------输出1
CLR_OP_1WIRE;//--------------输出0
delayus(480);//----------------480us以上
SET_OP_1WIRE;//--------------输出1,释放总线
CLR_DIR_1WIRE;//-------------设置PB4 为输入
delayus(20);//-----------------15~60us
while(CHECK_IP_1WIRE);//-----等待回应0信号
SET_DIR_1WIRE;//-------------设置PB4 为输出
SET_OP_1WIRE;//--------------输出1
delayus(140);//----------------60~240us
}
/****************************************************************************
函数功能:向DS18B20读一字节数据
****************************************************************************/
unsigned char read_1820(void)
{
unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CLR_OP_1WIRE;//-----------输出0,读时隙
SET_OP_1WIRE;//-----------输出1
CLR_DIR_1WIRE;//----------设置PB4为输入
k=(CHECK_IP_1WIRE);//-----读数据,从低位开始
if(k)
temp|=(1< else
temp&=~(1< delayus(50);//--------------60~120us
SET_DIR_1WIRE;//----------设置PB4为输出
}
return (temp);
}
/****************************************************************************
函数功能:向DS18B20写一字节数据
****************************************************************************/
void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
CLR_OP_1WIRE;//-----------输出0,写时隙
if(x&(1< SET_OP_1WIRE;//-------若第m位为1,就输出1
else
{
CLR_OP_1WIRE;//---否则就输出0
}
delayus(40);//--------------15~60us
SET_OP_1WIRE;//-----------输出1,为下一次写时隙置0做准备
}
SET_OP_1WIRE;//---------------输出1
}
/****************************************************************************
函数功能:向DS18B20读温度值
****************************************************************************/
uint ReadTemperature(void)
{
uchar a=0,b=0;
int t=0;
init_1820();//---------------复位信号
write_1820(0xcc);//----------跳跃ROM指令
write_1820(0x44);//----------发出温度转换命令
init_1820(); //--------------复位信号
write_1820(0xcc);//----------跳跃ROM指令
write_1820(0xbe);//----------从RAM读数据命令
a=read_1820();//-------------读数据
b=read_1820();
t=b;
t<<=8;
t=t|a;
if(t<0)
{
t=~t; t=t+1;
test_bit|=BIT(0);//------------正负检测,负=1
}
else
test_bit&=~BIT(0);//---------正负检测,正=0
t=t*0.625;
return(t);
}