/*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();
} |