关于STM8S调DS18B20的时序问题!

2019-07-19 20:42发布

各位大神,小弟用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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
正点原子
1楼-- · 2019-07-19 23:42
慢慢调试时序了
oywjex
2楼-- · 2019-07-20 00:33
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-20 03:16
 精彩回答 2  元偷偷看……
liushiming82
4楼-- · 2019-07-20 05:24
这种需要用时序的最好用示波器看一下,时序,如果时序时对的,一般都没有什么问题
oywjex
5楼-- · 2019-07-20 10:25
 精彩回答 2  元偷偷看……

一周热门 更多>