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

📄 ds18b20.c

📁 DS18B20多点测温
💻 C
字号:
#include<C8051F020.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

/*DS18B20功能命令*/
#define SEARCH_ROM 			0xf0	//搜索ROM
#define READ_ROM 			0x33	//读DS18B20序列号
#define MATCH_ROM 			0x55	//匹配ROM
#define SKIP_ROM 			0xcc	//跳过读序列号的操作
#define ALARM_SEARCH 		0xec	//报警搜索
#define CONVERT_T 			0x44	//启动温度转换
#define WRITE_SCRATCHPAD	0x4e	//可写暂存器,即高温,低温触发器
#define READ_SCRATCHPAD	    0xbe	//读取温度寄存器
#define READ_POWER_SUPPLY	0xb4	//读供电方式,0为寄生方式,1为外部电源
#define COPY_SCRATCHPAD		0x48	//拷贝存储器

sbit DQ =P0^0;   					//模拟1_Wire总线DQ

uchar High_limit=30;					//代表初始上限30
uchar Low_limit =10;					//代表初始下限27

/*--------------------------------------------------------------------------------
	函数名称:void Wire_delay(uint T_us);
	函数功能:初始化DS18B20; 
---------------------------------------------------------------------------------*/
void Wire_delay(uint T_us)			 //延时T_us,us
{
	while(T_us)
	{
		_nop_();_nop_(); 
			_nop_();_nop_();_nop_();
				_nop_();_nop_();_nop_();
	//				_nop_();_nop_();_nop_();
	//					_nop_();_nop_();_nop_();
	//						_nop_();_nop_();_nop_();
		--T_us;
	}
}

/*--------------------------------------------------------------------------------
	函数名称:void Reset_DS18B20( );
	函数功能:复位DS18B20; 调试好
---------------------------------------------------------------------------------*/
bit Reset_DS18B20( )			 	//初始化函数
{
    uchar Reset_flag=1,i;
    bit Judge=1;

	DQ=0;    						//上拉电阻拉高总线
    Wire_delay(600);				//等待DS18B20响应
		DQ=1; 
	    	Wire_delay(80); 
			    for (i=0;i<16;i++)   //60us-240us    
				    {   
				    	Wire_delay(20); 
	        				Reset_flag=DQ;      		//采样应答信号
								if(Reset_flag==0)
									 Judge=0;   
				    }   
	return(Judge);				//返回0-有设备连接1-无设备连接 				  
}  
/*--------------------------------------------------------------------------------
	函数名称:uchar Read_byte( );
	函数功能:通过总线,将18B20内部数据读出,以字节为单位;
	入口参数:无;
	出口参数:receive_data;读出的数据;
---------------------------------------------------------------------------------*/
bit Read_bit()
{
	bit re_bit;

	DQ=0; 			    					// 给脉冲信号
		Wire_delay(1);
			DQ=1;
				Wire_delay(2);
					re_bit=DQ;
						Wire_delay(60);			//重要!!!
	return(re_bit);
}

uchar Read_byte( )								//读一个字节
{
	uchar i,receive_data=0;

    for(i=0;i<8;i++)
     {
		if(Read_bit()==1)
			receive_data=receive_data|(0x01<<i);
		Wire_delay(2);
     }

     return(receive_data);
}

/*--------------------------------------------------------------------------------
	函数名称:void Write_byte(uchar write_data);
	函数功能:通过总线,将数据写入DS18B20内部;
	入口参数:write_data;写入的数据;
	出口参数:无;
---------------------------------------------------------------------------------*/
void Write_bit(bit Trans_data)
{
	DQ=0;
		Wire_delay(2);
			if(Trans_data==1)
				DQ=1;
		Wire_delay(60);
			DQ=1;		
}

void Write_byte(uchar write_data)	 	//写一个字节
{
    uchar i,Bit;
	
    for(i=0;i<8;i++)
    {
		Bit=write_data>>i;
			Bit=Bit&0x01; 				//1_wire低位在前传输
				Write_bit(Bit);
					Wire_delay(2);
    }
	//Wire_delay(120);
}

/*--------------------------------------------------------------------------------
	函数名称:DS18B20_Initial( );
	函数功能:初始化;
	入口参数:无;
	出口参数:无;
---------------------------------------------------------------------------------*/
void DS18B20_Initial( )				  	//18b20寄存器初始化
{
	Reset_DS18B20( );
		Write_byte(SKIP_ROM );			//跳过读序列号
			Write_byte(WRITE_SCRATCHPAD);	//写字节到暂存器,即高温,低温触发器和配置寄存器
				Write_byte(High_limit);			//设置上限温度值
					Write_byte(Low_limit);		    //设置下限温度值
						Write_byte(0x7f);   	        //设置为12位分辨率
	Reset_DS18B20( );
		Write_byte(SKIP_ROM);		   	 //跳过读序列号
			Write_byte(CONVERT_T);  		 //拷贝存储器	 		
}

/*--------------------------------------------------------------------------------
	函数名称:void Start_Convert();
	函数功能;开始温度转换;
	入口参数:无;
	出口参数:无;
---------------------------------------------------------------------------------*/
void Start_Convert()
{
	Reset_DS18B20( );
	Write_byte(SKIP_ROM);		   	 //跳过读序列号
		Write_byte(CONVERT_T);  		 //拷贝存储器	 		
}


/*--------------------------------------------------------------------------------
	函数名称:uint Read_temperature( );
	函数功能:读取温度;
	入口参数:无;
	出口参数:温度所对应的二进制数;
---------------------------------------------------------------------------------*/
	uint  Temper;
uint Read_temperature()		 //读取温度
{
	bit Busy_Test=0;
	uchar tempL=0;			 	//温度值低8位
	uchar tempH=0;				//温度值高8位
	//uint i;//,T[16];

    Reset_DS18B20();
    	Write_byte(SKIP_ROM);         	//跳过读序号列号的操作
    		Write_byte(READ_SCRATCHPAD);   			//读取温度寄存器(共可读9个寄存器),前两个就是温度值
	/*for(i=0;i<16;i++)
		{
			T[i]=Read_bit();
				Wire_delay(200);	
		}*/	
		 tempL=Read_byte();								//读一个字节
		 tempH=Read_byte();									//读一个字节
	
			Start_Convert();
				Wire_delay(2);	
					Busy_Test=DQ;
						while(!Busy_Test)
				Busy_Test=DQ;
		//for(i=0;i<80;i++)
		//	Wire_delay(1000);
				
	/*Temper=T[0]*0.0625+T[1]*0.125+T[2]*0.25+T[3]*0.5+T[4]*1+T[5]*2+T[6]*4+T[7]*8+T[8]*16
			T[9]*32+T[10]*64+T[11]*128+T[12]*256;*/
		Temper=tempH;
		Temper<<=8;
			Temper|=tempL;
	return(Temper);
}

⌨️ 快捷键说明

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