#define DQ_IO_LOW() gpio_set (PTA8,0)
#define DQ_IO_HIGH() gpio_set (PTA8,1)
#define DQ_IO_GET gpio_get (PTA8)
#define DQ_get_IO() gpio_ddr (PTA8,GPI)
#define DQ_put_IO() gpio_ddr (PTA8,GPO)
void ds1820rst()/*ds1820复位*/
{char presence=1;
while(presence)
{
DQ_put_IO();
DQ_IO_HIGH(); //DQ复位
pit_delay_us(PIT1,10); //延时
DQ_IO_LOW(); //DQ拉低
pit_delay_us(PIT1,500); //精确延时大于480us
DQ_IO_HIGH(); //拉高
pit_delay_us(PIT1,50);
DQ_get_IO();
presence=DQ_IO_GET;
}
pit_delay_us(PIT1,500);
DQ_put_IO();
DQ_IO_HIGH(); //DQ复位
}
unsigned char ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ_put_IO();
DQ_IO_HIGH(); //给脉冲信号
pit_delay_us(PIT1,2);
dat>>=1;
DQ_IO_LOW(); //给脉冲信号
pit_delay_us(PIT1,4);
DQ_IO_HIGH(); //给脉冲信号
pit_delay_us(PIT1,4);
DQ_get_IO();
if(DQ_IO_GET)
dat|=0x80;
pit_delay_us(PIT1,66);
}
DQ_put_IO();
DQ_IO_HIGH(); //给脉冲信号
return(dat);
}
void ds1820wr(unsigned char wdata)/*写数据*/
{
unsigned char i=0;
DQ_put_IO();
for (i=8; i>0; i--)
{
DQ_IO_HIGH();
pit_delay_us(PIT1,2);
DQ_IO_LOW();
pit_delay_us(PIT1,5);
gpio_set(PTA8,wdata&0x01);
pit_delay_us(PIT1,66);
wdata>>=1;
}
DQ_IO_HIGH();
}
int read_temp()/*读取温度值并转换*/
{
unsigned char a,b;
float t;
value1=0;
ds1820rst();
pit_delay_us(PIT1,2000);
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
value=b;
value<<=8;
value=value|a;
if(value>6348)
value=65536-value;
t=value*(0.0625)+0.5;
temperature=t;
// value=(unsigned int)(value*(0.625));
// printf("水温值 %d.%d\n",value/10,value%100);
return((int)(t*100));
}