OpenEdv-开源电子网

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

原子哥,能不能帮我看下这个DS18B20的程序为什么不行,检查了好久,每次仿真的时候,复位程序中给DQ高电平,再延时以后总是读不到低电平

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-1-18
在线时间
0 小时
发表于 2014-1-18 22:30:30 | 显示全部楼层 |阅读模式

/*Include---------------------------*/
#include"stm32f10x_lib.h"  //包含所有的头文件
#include<stdio.h>
#include"delay.h"
//----------------函数声明--------------------
void RCC_Configuration(void);
void DS18B20_RESET();
void DS18B20_Write(u8 Data);
void DS18B20_init();
u8 DS18B20_Read();
void GPIOA0_INPUT_Congiguration(void);
void GPIOA0_OUTPUT_Congiguration(void);

#define INPUT GPIOA0_INPUT_Congiguration()
#define OUTPUT GPIOA0_OUTPUT_Congiguration()

#define DQ_H GPIO_SetBits(GPIOA, GPIO_Pin_0)
#define DQ_L GPIO_ResetBits(GPIOA, GPIO_Pin_0)
#define DQ GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)

u8 tem[2];
/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
 int i;
    /*GPIO初始化*/
 delay_init(72);
 RCC_Configuration();//打开系统时钟
    DS18B20_init();
 while(1)
 {
  DS18B20_RESET();//复位
  DS18B20_Write(0xcc);//跳过ROM
  DS18B20_Write(0x44);//温度转换命令
  
  DS18B20_RESET();//复位
  DS18B20_Write(0xcc);//跳过ROM
  DS18B20_Write(0xbe);//温度暂存器命令
  
  for(i=0;i<2;i++)
  {
   tem=DS18B20_Read(); 
  }
  DS18B20_RESET();//fuwei,read is over
  //display(); 
 }
 return 0;
}

///*******************************************************************************
//* Function Name  : RCC_Configuration
//* Description    : Configures the different system clocks.
//* Input          : None
//* Output         : None
//* Return         : None
//*******************************************************************************/
void RCC_Configuration(void)
{
 //----------使用外部RC晶振-----------
 RCC_DeInit();   //初始化为缺省值
 RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟
 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪
 
 //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
 //FLASH_SetLatency(FLASH_Latency_2);  //Flash 2 wait state
 
 RCC_HCLKConfig(RCC_SYSCLK_Div1);  //HCLK = SYSCLK
 RCC_PCLK2Config(RCC_HCLK_Div1);   //PCLK2 =  HCLK
 RCC_PCLK1Config(RCC_HCLK_Div2);   //PCLK1 = HCLK/2
 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
 RCC_PLLCmd(ENABLE);   //Enable PLLCLK

 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
 while(RCC_GetSYSCLKSource()!=0x08);  //Wait till PLL is used as system clock source
 
 //---------打开相应外设时钟--------------------
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟   
}
//
///*******************************************************************************
//* Function Name  : GPIO_Configuration
//* Description    : 初始化GPIO外设
//* Input          : None
//* Output         : None
//* Return         : None
//*******************************************************************************/
void GPIOA0_INPUT_Congiguration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体就可以了
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//设置引脚0
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU   ;//PA0为推挽输出
 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0 
}
void GPIOA0_OUTPUT_Congiguration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体就可以了
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//设置引脚0
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度是10MHZ
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP   ;//PA0为推挽输出
 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0 
}
void DS18B20_RESET()
{
 OUTPUT;
 DQ_L;//拉低总线
 delay_us(750);//延时480微秒
 DQ_H;//释放总线
 INPUT;
 delay_ms(15);
 while(DQ);
 delay_us(490);
}
void DS18B20_Write(u8 Data)
{
 int i;
 OUTPUT;
 for(i=0;i<8;i++)
 {
  DQ_L;
  delay_us(4);//create write signal
  if((Data&0x01)==0x01)
   DQ_H;
  else
   DQ_L;
  delay_us(62);
  DQ_H;//release the mainline
  delay_us(2);
  Data=Data>>1;
 }
}
u8 DS18B20_Read()
{
 u8 TemData,i;
 for(i=0;i<8;i++)
 {
  OUTPUT;
  TemData=TemData>>1;
  DQ_H;
  delay_us(2);
  DQ_L;
  delay_us(2);
  DQ_H;
  INPUT;
  delay_us(4);
  if(DQ==1)
   TemData=(TemData|0x80);
  delay_us(60);  
 }
 return TemData;
}
void DS18B20_init()
{
 OUTPUT;
 DQ_H;
 DS18B20_RESET();

 DS18B20_Write(0xcc);
 DS18B20_Write(0x4e);
 DS18B20_Write(0x20);
 DS18B20_Write(0x00);
 DS18B20_Write(0x1F);//nine-bit JINGDU

 DS18B20_RESET();
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-18 23:27:27 | 显示全部楼层
何不直接用我们的例程试试?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-1-18
在线时间
0 小时
 楼主| 发表于 2014-1-18 23:43:29 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥的东西一定是没问题的,但是我想自己试着写一下,你能不能帮我看下有什么问题,谢了。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-1-18
在线时间
0 小时
 楼主| 发表于 2014-1-19 00:00:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------原子哥,我找到问题了,复位函数里面的DQ给高电平以后,延时时间太长了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-19 12:50:05 | 显示全部楼层
回复【4楼】huanglixing:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 03:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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