STM32 DS18B20 程序

#include"stm32f10x.h"
#include"PinInit.h"
#include"G_OS.h"
#include"Timer.h"

/*--------------------------------------------------------------------------
* 函数名称 : gUINT8 Ds18Init(void)
* 功能描述 : 18B20初始化函数
* 入口参数 : 无
* 出口参数 : 0	初始化成功
			 1	初始化失败
-----------------------------------------------------------*/
gUINT8 Ds18Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_OD;		/*开漏输出,外加上拉双向IO*/
  	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_SetBits(DS18_PORT,DS18_IO); 						/*使初始状态是高电平20us*/
	TimeDelayUs(20);       			
	GPIO_ResetBits(DS18_PORT,DS18_IO);						/*480us<拉低<960us  这里500us*/
	TimeDelayUs(500);				
	GPIO_SetBits(DS18_PORT,DS18_IO);						/*拉高等待ds18应答低电平,时序要求等待15-60us 这里60us 比较保险*/
	TimeDelayUs(60);					

	if(GPIO_ReadInputDataBit(DS18_PORT,DS18_IO) == 0) 		/*读*/
	{			
		TimeDelayUs(240);									/*延时240us把ds18发出的低电平(时序指出:低电平时间60~240us)耽搁过去*/
		if(GPIO_ReadInputDataBit(DS18_PORT,DS18_IO) == 1)
		{
			return 0; 										/*初始化成功*/
		}
	}														/*初始化失败*/
	return 1;
}

/*--------------------------------------------------------------------------
* 函数名称 : gUINT8 Ds18Read(void)
* 功能描述 : 18B20读函数
* 入口参数 : 无
* 出口参数 : 无
-----------------------------------------------------------*/
gUINT8 Ds18Read(void)
{
	gUINT32 CPUStatus;
	gUINT8 i,Temp;
		
	for(i=0;i<8;i++)
	{	
		G_ENTER_CRITICAL();									/*不想让G/OS心跳打断,不可以放到循环外,关中断时间太长,有闪烁感*/
		Temp = Temp>>1;

		GPIO_ResetBits(DS18_PORT,DS18_IO);
		TimeDelayUs(4);										/*时序要求至少1us这里拉低3-4us再拉高产生读时隙*/

		GPIO_SetBits(DS18_PORT,DS18_IO);					/*拉高,等数据*/
		TimeDelayUs(8);									   	/*时序要求从上次拉低算起15us后出数据,这里疑问。。。。。?过大导致读出错误*/

		if(GPIO_ReadInputDataBit(DS18_PORT,DS18_IO))
		{
			Temp |= 0x80;	
		}
		TimeDelayUs(60);  									/*读一位的时间是60us,还要至少1us的恢复时间,这里延时60us*/
		G_EXIT_CRITICAL();									/*注意:这里开中断,有可能切换到其他任务,或者执行Tick中断*/
	}
	return Temp;
}

/*--------------------------------------------------------------------------
* 函数名称 : void Ds18Write(gUINT8 Data)
* 功能描述 : 18B20写函数
* 入口参数 : 无
* 出口参数 : 无
-----------------------------------------------------------*/
void Ds18Write(gUINT8 Data)
{
	gUINT32 CPUStatus;
	gUINT8 i;

	for(i=0;i<8;i++)
	{
		G_ENTER_CRITICAL();	 								/*不想让G/OS心跳打断,不可以放到循环外,关中断时间太长,有闪烁感*/
		if(Data & 0x01)
		{	
			GPIO_ResetBits(DS18_PORT,DS18_IO);			   	/*写1,时序要求拉低至少1us,这里4us*/
			TimeDelayUs(4);
			GPIO_SetBits(DS18_PORT,DS18_IO);
			TimeDelayUs(60);							 	/*写时间是60us + 至少1us恢复时间*/	
		}
		else
		{
			GPIO_ResetBits(DS18_PORT,DS18_IO);			 	/*写0,拉低60us*/
			TimeDelayUs(60);
		}
		Data = Data>>1;
		GPIO_SetBits(DS18_PORT,DS18_IO);					/*最后拉高*/
		TimeDelayUs(5);								  		/*恢复时间至少1us,这里5us*/
		G_EXIT_CRITICAL();									/*注意:这里开中断,有可能切换到其他任务,或者执行Tick中断*/
	}
}



你可能感兴趣的:(STM32)