OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3068|回复: 5

DS18B20求助

[复制链接]

5

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-13
在线时间
12 小时
发表于 2016-10-7 17:58:50 | 显示全部楼层 |阅读模式
1金钱
void GPIOC11_IN()//设置PC11输入状态
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_DeInit(GPIOC);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void GPIOC11_OUT()//设置PC11输出状态
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_DeInit(GPIOC);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void DS18B20_Start()
{
        GPIOC11_OUT();
        GPIO_ResetBits(GPIOC,GPIO_Pin_11);//拉至低电平
        delay_us(500);
        GPIO_SetBits(GPIOC,GPIO_Pin_11);//释放总线
        GPIOC11_IN();
        delay_us(65);
        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11))
                USART_SendData(USART1,0X39);//DS18B20没有响应
        else
                while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11));//等待响应结束
        GPIOC11_OUT();
        GPIO_SetBits(GPIOC,GPIO_Pin_11);//拉至低电平
}
void DS18B20_Write(u8 k)
{
        u8 i,temp;                               
        GPIOC11_OUT();
        for(i=0;i<8;i++)
        {
                temp = k&0x01;
                k = k>>1;
                GPIO_ResetBits(GPIOC,GPIO_Pin_11);//拉为低电平
                delay_us(2);
                if(temp == 0x01)
                        GPIO_SetBits(GPIOC,GPIO_Pin_11);
                delay_us(60);
                GPIO_SetBits(GPIOC,GPIO_Pin_11);
                delay_us(5);
        }
}
u8 DS18B20_Read()
{
        u8 i,k,temp;
        k = 0;
        for(i=0;i<8;i++)
        {
                GPIOC11_OUT();
                GPIO_ResetBits(GPIOC,GPIO_Pin_11);//拉为低电平
                delay_us(2);
                GPIO_SetBits(GPIOC,GPIO_Pin_11);//释放总线
                GPIOC11_IN();
                delay_us(5);
                temp = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11);
                k = k+(temp<<7);                               
                if(i != 7)
                        k = k>>1;                       
                delay_us(60);
                GPIOC11_OUT();
                GPIO_SetBits(GPIOC,GPIO_Pin_11);//释放总线
        }
        return k;
}

int main()
{
        u8 a,b,c;
        u8 t1,t2,d1,d2,d3;
        u16 t;
        RCC_Configuration();
        NVIC_Configuration();
        GPIO_Configuration();
        USART_Configuration();
        SysTick_Configuration();
        while(1)
        {
                delay_us(1000000);
                DS18B20_Start();
                DS18B20_Write(0xcc);//跳过ROM
                DS18B20_Write(0x44);//温度变换
                delay_us(1000000);//延时1s

                DS18B20_Start();
                DS18B20_Write(0xcc);//跳过ROM
                DS18B20_Write(0xbe);//读暂存器
                t1 = DS18B20_Read();//LSB
                t2 = DS18B20_Read();//MSB
                t = t2;
                t = (t<<8)|t1;
                if(t&0x8000==0x8000)
                        t = (~t)+1;
                t = t>>4;               
                d1 = t/100;
                d2 = (t%100)/10;
                d3 = (t%100)%10;
                USART_SendData(USART1,0x30+d1);
                delay_us(1000000);
                USART_SendData(USART1,0x30+d2);
                delay_us(1000000);
                USART_SendData(USART1,0x30+d3);
                delay_us(1000000);
        }
}

主要程序就是上面几个,测出来温度是000,麻烦大神们看下

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-13
在线时间
12 小时
 楼主| 发表于 2016-10-7 20:12:56 | 显示全部楼层
求解答啊,困扰很久了
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2016-10-7 20:44:58 | 显示全部楼层
原子不是有例程吗?参考一下对着找原因!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-8 19:08:26 | 显示全部楼层
参考我们例程即可 啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-4-19
在线时间
137 小时
发表于 2016-10-8 21:04:53 来自手机 | 显示全部楼层
谁叫你浮空输入的
回复

使用道具 举报

14

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-4-19
在线时间
137 小时
发表于 2016-10-8 21:15:22 来自手机 | 显示全部楼层
本帖最后由 电子&mcu爱好者 于 2016-10-8 21:21 编辑

start函数可能有问题,你拉低释放以后,应该要等待他拉低,而不是直接if,这样很容易出问题,还有读函数写的好复杂,这样简单一些,如果读到1 ,k自增否则不自增,然后k不断移位,读到的数据就出来了,释放总线以后久点去读,这样更可靠
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 01:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表