新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2016-12-3
- 在线时间
- 21 小时
|
20金钱
各位大神,小弟用STM8S103F3调DS18B20很多天了。就是读不出数据,初始化DS18B20的时序比较宽 ,我能够收到DS18B20的回应,但是之后读数据的时候始终只能读到1,不知道为什么。我怀疑是延时不准确导致时序的问题。我用示波器测了我的延时程序,根据示波器显示的时间来调用对应的延时函数,但是依然没有效果。请问大神们 这个是为什么啊?这个的时序要求到底有多严格?我有什么办法来测试到底是哪个环节出了问题呢?[mw_shl_code=c,true]while (1)
{
Put_Data((u8)readTemp());
Start_Tx();
Delay_ms(1000);
}
void DS_check(void)
{
u8 retry=0;
PA3_OUT;
SET_DQ;
//GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
DS18B20_Delay_Us(1);
CLR_DQ;
//GPIO_WriteLow(GPIOA,GPIO_PIN_3);
DS18B20_Delay_Us(400);//580us
SET_DQ;
//GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
//DS18B20_Delay_Us(50);
DS18B20_Delay_Us(6);//19us
PA3_IN;
while((DQ_IN==1)&&(retry<200))
{
retry++;
DS18B20_Delay_Us(1);
//delay_us(1);
}
if(retry>=200)
{
ds_check_flag=0;//check failed
}
else
{
ds_check_flag=1;//check success
}
PA3_OUT;
//GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
SET_DQ;
}
u8 DS_readbit(void)
{
u8 data;
PA3_OUT;
CLR_DQ;
DS18B20_Delay_Us(1);
SET_DQ;
PA3_IN;
DS18B20_Delay_Us(2);
if(DQ_IN)data=1;
else data=0;
DS18B20_Delay_Us(20);
return data;
}
u8 DS_readByte(void)
{
u8 data=0;
u8 i,j;
//DS18B20_Delay_Us(5);
for(i=0;i<8;i++)
{
j=DS_readbit();
data=(j<<7)|(data>>1);
}
return data;
}
void DS_writeByte(u8 data)
{
u8 j;
u8 testb;
PA3_OUT;
for(j=0;j<8;j++)
{
testb=data&0x01;
data=data>>1;
if(testb)
{
CLR_DQ;
DS18B20_Delay_Us(1);
SET_DQ;
DS18B20_Delay_Us(25);
}
else
{
CLR_DQ;
DS18B20_Delay_Us(25);
SET_DQ;
DS18B20_Delay_Us(1);
}
}
}
void convert_ds(void)
{
DS_check();
DS_writeByte(0xcc);
DS_writeByte(0x44);
}
short readTemp(void)
{
u8 temp;
u8 TL,TH;
short tem;
convert_ds();
DS_check();
DS_writeByte(0xcc);
DS_writeByte(0xbe);
TL=DS_readByte();
TH=DS_readByte();
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;
}else temp=1;
tem=TH;
tem<<=8;
tem+=TL;
tem=(float)tem*0.625;
if(temp)return tem;
else return -tem;
}
//void Delay(u16 nCount)
//{
//while (nCount != 0)
//{
// nCount--;
// }
void DS18B20_Delay_Us(u16 i)//7us
{
while(--i);
}
void DS18B20_Delay_Ms(u16 i)
{
while(i--)
DS18B20_Delay_Us(1000);
}
//}[/mw_shl_code]
|
|