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

📄 18b20.c

📁 mega128控制单总线协议温度传感器18b20
💻 C
字号:
#include "iom128v.h"
#include "macros.h"
#include "gprs.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



signed char Temp_H;
signed char Temp_L;
//float f_TEMP;

/**********************************************************************************/
void Reset (void) // 复位和初始化
{
    unsigned char error = 0;
    delay (3);  // 延时
	DQ_0;
	DQ_OUT;
	delay(900);//480-960us 600us
	DQ_IN;
	delay(30);//15-60us
	if(DQ_READ)
	{
		error = 1;
	}
	else
	{
		error = 0;
	}
	delay(750);//60-240us
}

/**********************************************************************************/
unsigned char Read_one_bit (void)   //读取数据的一位
{
    unsigned char i;
	
	DQ_OUT;
	DQ_1;
	DQ_0;
	DQ_IN;
	
    delay(15);//15us
	
	if(DQ_READ)
	  i = 1;
	else
	  i = 0;
	delay(50);//45us
	return i;
	
}

/**********************************************************************************/
unsigned char Read_one_byte2 (void) //读一个字节
{
  unsigned char i,j,dat;
  dat = 0;
  for (i=1;i<=8;i++)
  {
    j = Read_one_bit ();
    dat = (j << 7) | (dat >> 1);
  }

return (dat);
}

/**********************************************************************************/
void Write_one_byte (unsigned char data) //写一个字节
{
unsigned char i;
unsigned char j;
unsigned char  testb;
for (j=1;j<=8;j++)
{
  testb = data & 0x01;
  data = data >> 1;
  
  DQ_1;
  DQ_OUT;
  if (testb)
  {
   /*DQ = 0;     // 写0
   _nop_; _nop_;
   DQ = 1;
   i = 8;
   while (i--);*/
   

   DQ_0;
   
   delay(15);//15us
 //  delay(15);//15us
   
   DQ_IN;
   delay(50);//45us
  }
  else
  {
   /*DQ = 0;  // 写0
   i = 8;
   while (i--);
   DQ = 1;
   _nop_; _nop_;*/
   DQ_0;
   //DQ_OUT;
   delay(70);//60us
   DQ_IN;
  }
}
}

/********************************************************************************/
void Temp_Change(void) // ds1820 开始转换
{
  Reset ();  // 复位
  delay (3);  // 延时
  Write_one_byte (0xcc);// 跳过序列号命令
  delay (3);  // 延时
  Write_one_byte (0x44); // 发转换命令 44H
  delay (3);  // 延时
}

/*********************************************************************************/
float Read_Temp (void) // 读取温度
{
  unsigned int a,b,d;
  float temperature = 0;
  signed int temp = 0;
  Reset ();  // 复位
  delay (3);  // 延时
  Write_one_byte (0xcc); // 跳过序列号命令
  delay (3);  // 延时
  Write_one_byte (0xbe); // 发送读取命令
  delay (3);  // 延时
  a = Read_one_byte2 ();// 读取低位温度
  delay (3);  // 延时
  b = Read_one_byte2 (); //读取高位温度
  delay (3);  // 延时
  b=b<<8;
  d=a+b;
  ///////////////////////
  if((0xf000&b)!=0)
  {
   // flag1=1; //若b为1则为负温
    temp = -(~d+1); //如果为负温则去除其补码
  }
  ///////////////////////
  else
    temp=d;
  temperature = temp * 0.0625;
//  temperature = -15.1;
  return temperature;
}

/********************************************************************************/
void Measure(float *temperature)
{
  DQ_OUT;
  CLI();	
  Temp_Change();// 开始温度转换
  // Delay_ms(1000);
  *temperature = Read_Temp(); //读取温度
  //  *temperature = -5.0;
  SEI();

  Temp_H = (signed char)(*temperature);
  if(Temp_H >= 100)
  {
     Temp_H = 99;
  }
  else if(Temp_H < -40)
  {
     Temp_H = -40;
  }

  if (*temperature < 0)
  {
      Temp_L = (int)(-*temperature * 100) % 100;
  }
  else
  {
      Temp_L = (int)(*temperature * 100) % 100;
  }
}

⌨️ 快捷键说明

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