⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 利用32单片机lpc2104通过18b20对外面的温度进行采样程序.学习18b20的新手可以参考
💻 C
字号:
/****************************************Copyright (c)**************************************************
**
**
**功能:P0.2作为GPIO口,用做数字信号输出接收的,I2C结构,所以他要接个上拉电阻
**		左端口接地,右端口接5V
**日期:2008-08-31
**
********************************************************************************************************/
#include "config.h"


#define TEMPPIN 1<<2             //p0.2作为IO口使用
/***********************************************************************
函数名:DelayNs(uint32 dly)
功  能:延时子程序
输  入:循环次数
返  回:
备  注:当x=1时,延时9us左右(晶振为11.0592M)                        
**********************************************************************/	
void DelayNS(uint32 dly)
{
	while(dly--);
}
/***********************************************************************
函数名:init_18B20()
功  能:DS18B20初 始 化
输  入:
返  回:
备  注:先对总线置1,然后清0,并延时400~960us,再次对总线置1,进入接收
        状态,DS18B20在检测到上升沿后,等待15~60us,然后发出一脉冲(低
		电平,维持60~240us),表明DS18B20能正常工作                       
**********************************************************************/	
uint8 DS18B20_Init(void)
{
	uint32 i,j;
	uint32 status;               
	
	PINSEL0=(PINSEL0&(~0x30))|0x00;  		 //选择p0.2作为IO口使用,不影响其他引脚
	IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;		 //p0.2设为输出
	
	for(i=5;i;i--)
	{
		IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;	 //p0.2输出
		IO0SET=TEMPPIN;
		//DelayNS(1);						//延迟1us,使信号稳定
		IO0CLR=TEMPPIN;
		//DelayNS(6000);					//驱动信号,输出低电平6000/11059200us
		for(j=6000;j;j--);
		
		IO0SET=TEMPPIN;
		IO0DIR=(IO0DIR&(~TEMPPIN));			//p0.2设为输入,接收DS18B20回馈信号
		
		//DelayNS(60);						//延迟60us,开始检测回馈信号有效性15-60us
		
		for(j=80;j;j--)						//在60-240us内,如果持续为低电平,表示回馈信号有效
		{
			status=IO0PIN&TEMPPIN;
			if(!status)
				break;
		}
		if(!j)
			continue;
		
		for(j=6000;j;j--)
		{
			status=IO0PIN&TEMPPIN;
			if(status)
				break;
		}	
		status=IO0PIN&TEMPPIN;
		if(status)
			break;
	}
	if(!i)
		return 1;							//返回1,初始化失败 					
		return 0;							//返回零,初始化成功
}
/***********************************************************************
函数名:Read_Data(void)
功  能:读DS18B20
输  入:
返  回:
备  注: 先对总线置1,然后清0,延时3us, 再对总线置1,产生读信号,在
         15us内读取数据,并在60~120us内把总线置1                     
**********************************************************************/	
uint32 Read_Data(void)
{
	uint32 result,status;
	uint32 i,j;
	result=0;
	
	IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;
	IO0SET=TEMPPIN;
	for(i=15;i;i--)								//DS18B20返回数据为16位
	{
		IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;	
		IO0SET=TEMPPIN;
		//DelayNS(3);
		IO0SET=TEMPPIN;
		IO0CLR=TEMPPIN;
		IO0CLR=TEMPPIN;
		IO0CLR=TEMPPIN;
		IO0CLR=TEMPPIN;
		//DelayNS(3);
		IO0SET=TEMPPIN;
		IO0SET=TEMPPIN;
		//DelayNS(25);
		for(j=25;j;j--);
		IO0DIR=(IO0DIR&(~TEMPPIN));
		status=IO0PIN&TEMPPIN;
		if(status)
		result|=0x8000;
		result>>=1;
		//DelayNS(600);			
		for(j=600;j;j--);
	}
	
	IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;
	IO0SET=TEMPPIN;
	return result;
}
/***********************************************************************
函数名:Write_Data(uint8 cmd)
功  能:写DS18B20
输  入:
返  回:
备  注:先对总线置1,然后清0,在15us内将一位数据送到总线上,DS18B20
        在15~60us(传送数据的15us包括再内)后对总线采样,若为0,则写入
		0,为1,则写入1,连续写两位的时间间隔应大于1us,                      
**********************************************************************/	
void Write_Data(uint8 cmd)
{
	uint32 i,j;
	for(i=8;i;i--)
	{
		IO0DIR=(IO0DIR&(~TEMPPIN))|TEMPPIN;	
		IO0SET=TEMPPIN;
		IO0SET=TEMPPIN;
		IO0SET=TEMPPIN;
		IO0SET=TEMPPIN;
		//DelayNS(12);
		IO0CLR=TEMPPIN;
		//DelayNS(12);
		IO0CLR=TEMPPIN;
		IO0CLR=TEMPPIN;
		IO0CLR=TEMPPIN;
		if(cmd&0x01)
			IO0SET=TEMPPIN;
		else
			IO0CLR=TEMPPIN;
		cmd>>=1;
		
		for(j=600;j;j--);
	}
	IO0SET=TEMPPIN;
}

/***********************************************************************
函数名:read_temp(void)
功  能:读DS18B20温度值
输  入:
返  回:
备  注: 
**********************************************************************/	
uint32 read_temp(void)
{
	uint32 result;
	if(DS18B20_Init()) 
	return 0xffffffff;
	Write_Data(0xcc);
	Write_Data(0x44);
	if(DS18B20_Init())
		return 0xffffffff;
	Write_Data(0xcc);
	Write_Data(0xbe);
	result=Read_Data();
	if(result&0xf000)
	{
		result=~result;
		result>>=4;
		result|=0x80000000;
	}
	
	else
		result>>=4;
		
	return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -