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

📄 ds18b20.h

📁 DS18B20 的单片机驱动
💻 H
字号:
#ifndef __DS18B20_H__
#define __DS18B20_H__

#include <reg51.h>
#include <intrins.h>

sbit DS18B20_DQ = P0^7;

#define DS18B20_CONVERT_TEMP		0x44
#define DS18B20_WRITE_SCRATCHPAD	0x4E
#define DS18B20_READ_SCRATCHPAD		0xBE
#define DS18B20_COPY_SCRATCHPAD		0x48
#define DS18B20_RECALL_E2			0xB8
#define DS18B20_READ_POWER			0xB4

#define DS18B20_READ_ROM			0x33
#define DS18B20_MATCH_ROM			0x55
#define DS18B20_SKIP_ROM			0xCC
#define DS18B20_SEARCH_ROM			0xF0
#define DS18B20_ALARM_ROM			0xEC

//extern unsigned char DS_CODE[8]; 
	unsigned char temp_data,temp_data_2;
 	unsigned int TempDec;	//用来存放4位小数

void delay_50us_DS(unsigned int t);
void WriteByte_DS(unsigned char dat);
unsigned char ReadByte_DS(void);
bit  Reset_DS(void);

void ReadCode_DS(void);
void Init_DS(void);
void Read_Temp_DS(void);


unsigned char DS_CODE[9];
unsigned char TEMP_DS[2];
unsigned char OK_TEMP_DS[10];
void delay_50us_DS(unsigned int t)
{
	unsigned char j;  
	for(;t>0;t--)   
  		for(j=19;j>0;j--) 
   			;
}

void Init_DS(void) {

	
}
void Read_Temp_DS(void) {

	Reset_DS();
	WriteByte_DS(DS18B20_SKIP_ROM);
	WriteByte_DS(DS18B20_CONVERT_TEMP);

	Reset_DS();
	WriteByte_DS(DS18B20_SKIP_ROM);
	WriteByte_DS(DS18B20_READ_SCRATCHPAD);
	TEMP_DS[0] = ReadByte_DS();
	TEMP_DS[1] = ReadByte_DS();

	Reset_DS();

 	temp_data = TEMP_DS[1];
 	temp_data &= 0xf0; 	//取高4位
 	if (temp_data==0xf0)	//判断是正温度还是负温度读数
 	{
	//负温度读数求补,取反加1,判断低8位是否有进位
		if (TEMP_DS[0]==0)
			{	//有进位,高8位取反加1
			 	TEMP_DS[0]=~TEMP_DS[0]+1;
				TEMP_DS[1]=~TEMP_DS[1]+1;
			}
		else
			{	//没进位,高8位不加1
				TEMP_DS[0]=~TEMP_DS[0]+1;
				TEMP_DS[1]=~TEMP_DS[1];
			}
	}
	temp_data = TEMP_DS[1]<<4;		//取高字节低4位(温度读数高4位)
	temp_data_2 = TEMP_DS[0]>>4;	//取低字节高4位(温度读数低4位)
	temp_data = temp_data|temp_data_2;	//组合成完整数据
	OK_TEMP_DS[0] = temp_data/100+0x30; 		//取百位转换为ASCII码
	OK_TEMP_DS[1] = (temp_data%100)/10+0x30; 	//取十位转换为ASCII码
	OK_TEMP_DS[2] = (temp_data%100)%10+0x30; 	//取个位转换为ASCII码
	TEMP_DS[0]&=0x0f; 				//取小数位转换为ASCII码
	TempDec = ((TEMP_DS[0]&0x0f)*0.0625)*10000;//小数部分,扩大1万倍
	OK_TEMP_DS[3] = '.';
	OK_TEMP_DS[4]	= TempDec/1000+0x30; 		//取小数个位转换为ASCII码
	OK_TEMP_DS[5]	= (TempDec%1000)/100+0x30; 	//取小数十位转换为ASCII码
	OK_TEMP_DS[6]	= ((TempDec%1000)%100)/10+0x30;//取小数百位转换为ASCII码
	OK_TEMP_DS[7] = ((TempDec%1000)%100)%10+0x30;//取小数千位转换为ASCII码
	OK_TEMP_DS[8] = 'C';
	OK_TEMP_DS[9] = '\0';
}
void ReadCode_DS(void) {
	unsigned char i;
	Reset_DS();
	WriteByte_DS(DS18B20_READ_ROM);
	for(i = 0; i < 8; i++)
	{
		DS_CODE[i] = ReadByte_DS();
	}

}
void WriteByte_DS(unsigned char dat) {
	unsigned char i;
	
	for(i = 0; i < 8; i++)
	{
		DS18B20_DQ = 0;//拉低总线
		_nop_();_nop_();
		DS18B20_DQ = dat & 0x01;
		delay_50us_DS(2);//至少保持60us
		DS18B20_DQ = 1;
		dat >>= 1;		
	}
}
unsigned char ReadByte_DS(void) {
	unsigned char dat, i;
	bit r;

	for(i = 0; i < 8; i++)
	{
		dat >>= 1;
		DS18B20_DQ = 0;//拉低总线
		_nop_();_nop_();_nop_();_nop_();_nop_();
		DS18B20_DQ = 1;//释放总线 准备读数据
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		r = DS18B20_DQ;
		if(r == 1)	dat |= 0x80;
		delay_50us_DS(1);
		DS18B20_DQ = 1;
	}
	return dat;
}
bit Reset_DS(void) {
	bit f;
	DS_CODE[8] = '\0';
	DS18B20_DQ = 1;
	_nop_();_nop_();_nop_();_nop_();
	//拉低总线 延时480us - 960us产生复位脉冲
	DS18B20_DQ = 0;
	delay_50us_DS(10);
	//释放总线
	DS18B20_DQ = 1;
	delay_50us_DS(2);
	//采样应答脉冲...
	f = DS18B20_DQ;
	//延时恢复总线
	delay_50us_DS(8);

	return f;
}

#endif //__DS18B20_H__

⌨️ 快捷键说明

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