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

📄 ds18b20.c

📁 通过Dsp计算电池的SOC
💻 C
字号:
#include "SEED-DEC2407.h"
#include "ds18b20.h"

#define nop() {asm(" nop");}
void PIN_HIGH() {*PFDATDIR=*PFDATDIR|0x7F7F;}//输出高电平
void PIN_LOW() {*PFDATDIR=(*PFDATDIR|0x7F00)&0x7F00;}//输出低电平
void PIN_LEAVE() {*PFDATDIR = (*PFDATDIR &0x807F)|0x807F;}//输入高电平
/*~~~~~~~~~~传感器复位程序~~~~~~~~~~~~*/
unsigned char reset(void)
{
	unsigned char retval;
	unsigned int loopindex=0;
	PIN_HIGH();
	nop();nop();nop();nop(); /* 延时1us*/
	PIN_LOW();
	for(loopindex=0;loopindex<213;loopindex++){;} /*置总线为低电平并保持至少480us */
	PIN_HIGH();
	for(loopindex=0;loopindex<26;loopindex++){;} /*等电阻拉高总线并保持15-60us */
	PIN_LEAVE(); /*接受应答信号*/
	nop();
	if((*PFDATDIR & DATA_BIT) == 0x0000)
	{ retval = 0; }
	else
	{ retval = 1; }
	PIN_HIGH();
	for(loopindex=0;loopindex<106;loopindex++){;} /*延时60-240us */
	return(retval); /*返回应答信号 */
}

/*~~~~~~~~~~~~从传感器中读一个字节~~~~~~~~~~~~~~*/
void read_byte(unsigned char *ReadByte)
{
	int i;
	unsigned char temp=0;
	unsigned int loopindex=0;
	PIN_HIGH();
	for(i=0;i<8;i++)
	{
		temp=temp>>1;
		PIN_LOW();
		nop();nop();nop();nop(); /*延时2us */
		nop();nop();nop();nop();
		PIN_HIGH();
		for(loopindex=0;loopindex<6;loopindex++){;} /* 延时14us */
		PIN_LEAVE();
		nop();
		if((*PFDATDIR & DATA_BIT) == 0x0000)
		{ temp=temp & 0x7F; }
		else
		{ temp=temp | 0x80; }
		PIN_HIGH();
		for(loopindex=0;loopindex<26;loopindex++){;} /* 延时60us */
	}
	*ReadByte=temp;
	return;
}

/*~~~~~~~~~将读得的温度转化为十进制~~~~~~~~~~~~~*/
float transform(unsigned char *T)
{
	unsigned char temp=0;
	float temprature=0;
	temp=temp|(*(T+1)<<8);
	temp=temp|*T;
	if((temp&0x0F800)==0x0F800)
	{ temprature=0-((~temp)+1)*0.0625; }
	else
	{ temprature=temp*0.0625; }
	return(temprature);
}

/*~~~~~~~~~~~读取温度主函数,返回十进制温度数~~~~~~~~~~~~~~~*/
float read_temp()
{
	unsigned char buff[2];
	float temprature=0;
	unsigned int loopindex=0;
	while (reset()==1){}; /* 复位等待从机应答 */
	write_byte(0xCC); /* 忽略ROM 匹配 */
	write_byte(0x44); /* 发送温度转化命令 */
	for(loopindex=0;loopindex<65535;loopindex++){;} /* 延时300ms,等待数模转换 */
	for(loopindex=0;loopindex<65535;loopindex++){;}
	while(reset()==1){}; /* 再次复位,等待从机应答 */
	write_byte(0xCC); /* 忽略ROM 匹配 */
	write_byte(0xBE); /* 发送读温度命令 */
	read_byte(buff); /* 读出温度低8 位 */
	read_byte(buff+1); /* 读出温度高8 位 */
	temprature=transform(buff);
	PIN_HIGH(); /* 释放总线 */
	return(temprature);
}

/*~~~~~~~~~~~~~~向传感器中写一个字节~~~~~~~~~~~~~~*/
void write_byte(unsigned char cmd)
{
	unsigned char i; 
	unsigned char j; 
	PIN_HIGH();
	for(i=0;i<8;i++) 
	{ 
		PIN_LOW();//DQ=0;
		nop();nop();nop();nop(); /*延时2us */
		nop();nop();nop();nop();
      	if((cmd & 0x01)==0) 
        { 
          	for(j=35;j>0;j--); //延时大于60us
          	PIN_HIGH();//DQ=1; 
          	nop();nop();nop();nop(); /*延时2us */
			nop();nop();nop();nop();
        } 
        else 
        { 
        	PIN_HIGH();//DQ=1; 
            for(j=33;j>0;j--); 
        } 
      	cmd=_cror_(cmd,1);      
	} 
	nop();nop();nop();nop(); //两次写之间延时大于1us
	nop();nop();nop();nop();
}

⌨️ 快捷键说明

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