18B20中关键的地方关定时中断或外部中断就好,请参考下列代码!
//往DS18B20中写一个字节
void Ds18B20::Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; //关systick中断
SetDir_PortSensorA_Out();
SA_DQ0; delay_us(7); //==延时0us---25us===
if((n&0X01)==0X01)
{
SetDir_PortSensorA_IN();
if(ParSeting==0) SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; //开systick中断
delay_us(100); //64us delay_us(192)
}
else
{
if(ParSeting==0) SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; //开systick中断
delay_us(100); //60uS delay_us(160);
SetDir_PortSensorA_IN();
delay_us(16); //10uS delay_us(32);
}
n=n>>1;
}
}
//从DS18B20读取一个字节
unsigned char Ds18B20::Read_18B20(void)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=temp>>1;
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; //关systick中断
SetDir_PortSensorA_Out();
SA_DQ0; delay_us(2); //==延时0us---4us===
SetDir_PortSensorA_IN(); delay_us(1); //==延时0us---25us===
if((InPortBit)==0)
{
temp=temp&0x7F;
}else
{
temp=temp|0x80;
}
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; //开systick中断
delay_us(90); //==延时55us===
}
return temp;
}
|