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

📄 18b20.h

📁 18b20的器件使用
💻 H
字号:
#define b20_io   PC7
#define b20_port PORTC
#define b20_pin  PINC
#define b20_ddr  DDRC
/********************************************************************************************
* 函数名称:Sensor_Delay(uint16 US)//延时函数
* 功    能:DS18B20软件延时专用
* 入口参数:US    
* 出口参数:无
*********************************************************************************************/
void Sensor_Delay(unsigned int US)
{
 unsigned int i;
 US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
 for(i=0;i<US;i++); 
}
/*******************************************
函数名称: B20_init
功    能: 复位DS18B20
参    数: 无
返回值  : 无
********************************************/
void B20_init(void)
{
 b20_ddr|=(1<<b20_io);			//配置为输出			  
 b20_port&=~(1<<b20_io);			//拉低
 Sensor_Delay(600);					//等待600微秒
 b20_port|=(1<<b20_io);			//释放总线
 Sensor_Delay(60);					//等待60微秒
 b20_ddr&=~(1<<b20_io);			//配置为输入 
 while((b20_pin&(1<<b20_io)));	//等待DS18B20拉低
 while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
}

/*******************************************
函数名称: B20_readB
功    能: 读取一个字节的数据
参    数: 无
返回值  : retd--返回的一个字节数据
********************************************/
unsigned char B20_readB(void)
{
 unsigned char i,retd=0;
 for(i=0;i<8;i++)	 			//位计数值
 {
  retd>>=1;						//右移,准备接受新的数据位
  b20_ddr|=(1<<b20_io);			//配置为输出
  b20_port&=~(1<<b20_io);			//拉低,启动读数据位
  b20_port|=(1<<b20_io);			//释放总线
  Sensor_Delay(5);					//等待5微秒
  b20_ddr&=~(1<<b20_io);			//配置为输入,开始读取数据位
  if(b20_pin&(1<<b20_io))			//该位是否为高
  {
   retd|=0x80;					//是就将此位置高
  }
  Sensor_Delay(50);					//等待50微秒
 }
 return retd;					//将读到的一个字节返回
}
/*******************************************
函数名称: B20_writeB
功    能: 写入一个字节的数据
参    数: wrd--要写入的数据
返回值  : 无
********************************************/
void B20_writeB(unsigned char wrd)
{
 unsigned char i;
 for(i=0;i<8;i++)	  	        //位计数值
 {
  b20_ddr|=(1<<b20_io);			//配置为输出
  b20_port&=~(1<<b20_io);			//拉低,启动写数据位
  Sensor_Delay(1);					//等待1微秒
  if(wrd&0x01)					//此位数据是否为高
  {
   b20_port|=(1<<b20_io);			//是高则将单总线拉高
  }
  else
  {
   b20_port&=~(1<<b20_io);		//是低则将单总线拉低
  }
  Sensor_Delay(50);					//等待50微秒
  b20_port|=(1<<b20_io);			//释放总线
  wrd>>=1;						//右移,为写入新的数据位做准备
 }
 Sensor_Delay(50);					//等待50微秒
}

/*******************************************
函数名称: Read_temp
功    能: 读取温度值
参    数: templ温度值低位,temph温度值高位
返回值  : 无
********************************************/
void Read_temp(unsigned char *templ,unsigned char *temph)
{
 B20_init();	      //初始化,每次写命令都从初始化开始
 B20_writeB(0xcc); 	  //跳过ROM
 B20_writeB(0x44); 	  //启动温度转换
 B20_init();	   	  //初始化,每次写命令都从初始化开始
 B20_writeB(0xcc); 	  //跳过ROM
 B20_writeB(0xbe); 	  //读寄存器
 *templ=B20_readB();	  //读温度低字节
 *temph=B20_readB();	  //读温度高字节
}
/*******************************************
函数名称: b20_display
功    能: 温度值显示
参    数: lz为液晶显示位置
返回值  : 无
********************************************/
void b20_display(unsigned char lz)
{
 unsigned char b20_h=0,b20_l=0;
 unsigned char inter=0;
 unsigned int fraction=0;
 Read_temp(&b20_l,&b20_h);   //读取温度值
 if(b20_h&0xf8)
 {
  lcd_write(command,lz);
  lcd_write(data,' -');
  b20_l=~b20_l;
  b20_h=~b20_h;
 }
 inter=b20_h*16+(b20_l>>4);//整数部分
 int_disp(lz+1,inter);
 lcd_write(data,'.');
 fraction=(b20_l&0x0f)*625;//小数部分,只显示小数点后一位
 lcd_write(data,fraction/1000+48);
}

⌨️ 快捷键说明

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