//******write1820********
void write1820(uchar a,uchar wrdq)
{
uchar i;
for(i=0;i<8;i++)
{
if(a & 0x01) //低位在前,1;
{
if(wrdq==0)
DQ = 0; //结束Recovery time;
else
DQ1 = 0;
_nop_();
_nop_();
// _nop_();
if(wrdq==0)
DQ = 1; //结束Recovery time;
else
DQ1 = 1;
} //发送数据;
else //0
{
if(wrdq==0)
DQ = 0; //结束Recovery time;
else
DQ1 = 0; //结束Rec time;
}
_nop_();
_nop_();
// _nop_();
//DQ = 0; } //发送数据;
delay_us(30); //等待Slave Device采样;
if(wrdq==0)
DQ = 1; //结束Recovery time;
else
DQ1 = 1; //Recovery;
_nop_(); //Recovery Time Start;
a >>= 1;
}
}
/*******************************************************************************
*** 函 数 名: static unsigned char read1820(void)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输 入: NO
*** 输 出: tmp: 8bit
*** 函数说明:
/******************************************************************************/
//*******read1820************
uint read1820(uchar rddq)
{
uint i;
uint tmp="0";
if(rddq==0)
DQ = 1; //结束Recovery time;
else
DQ1 = 1;
_nop_(); //准备读;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先发;
if(rddq==0)
{
DQ = 0; //Read init;
// _nop_();
_nop_(); //2ms;
DQ = 1; //必须写1,否则读出来的将是不预期的数据;
delay_us(2); //延时9us;
_nop_();
if(DQ) //在12us处读取数据;
tmp |= 0x80;
delay_us(30); //延时65us;
DQ = 1;
}
else
{
DQ1 = 0; //Read init;
_nop_();
_nop_(); //2ms;
DQ1 = 1; //必须写1,否则读出来的将是不预期的数据;
delay_us(2); //延时9us;
_nop_();
if(DQ1) //在12us处读取数据;
tmp |= 0x80;
delay_us(30); //延时65us;
DQ1 = 1;
}
_nop_(); //恢复One Wire Bus;
delay_us(2); //延时9us;
}
return tmp;
}
/*******************************************************************************
*** 函 数 名: tatic void init1820(void)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输 入: NO
*** 输 出: NO
*** 创 建 人:qingdao_mcu 日期:2007-12-5
*** 修 改 人: 日期:2007-12-5
*** 函数说明:
/******************************************************************************/
//*******initial**********
void init1820(uchar initdq)
{
uint init_i=0;
if(initdq==0)
{
DQ = 1;
_nop_();
DQ = 0; //拉低数据线,准备Reset OneWire Bus;
}
else
{
DQ1 = 1;
_nop_();
DQ1 = 0; //拉低数据线,准备Reset OneWire Bus;
}
delay_us(125); //延时510us,Reset One-Wire Bus.
// delay_us(125);
if(initdq==0)
{
DQ = 1; //提升数据线;
delay_us(5); //延时35us;
while(DQ) //等待Slave 器件Ack 信号;
{
if(init_i<0x1000)
init_i++;
else
DQ=0;
}
}
else
{
DQ1 = 1; //提升数据线;
delay_us(5); //延时35us;
while(DQ1) //等待Slave 器件Ack 信号;
{
}
}
delay_us(60); //延时125us;
if(initdq==0)
DQ = 1; //提升数据线;
else
DQ1 = 1; //提升数据线;
}
//*** 函 数 名: void gettemp(void)
//*******************DS18B20***************获得温度******************
uint gettemp(uchar getdq) //读取温度函数
{
unsigned int tp,tp0;
init1820(getdq);
write1820(0xcc,getdq); //跳过 ROM
write1820(0x44,getdq); //温度变换
delay_ms(30);
init1820(getdq);
write1820(0xcc,getdq);
write1820(0xbe,getdq); //读暂存存储器
tp0=read1820(getdq)>>4;
tp=read1820(getdq)<<4;
return tp+tp0;
}
文章评论(0条评论)
登录后参与讨论