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

📄 ds18b20.txt

📁 AVR单片机读取DS18B20的程序
💻 TXT
字号:
#include <iom16v.h>
#include <macros.h>

#define ds18b20_dq PC5
#define set_ds18b20_dq_ddr() DDRC|=1<<ds18b20_dq
#define set_ds18b20_dq() PORTC|=1<<ds18b20_dq
#define clr_ds18b20_dq() PORTC&=~(1<<ds18b20_dq)
#define clr_ds18b20_dq_ddr() DDRC&=~(1<<ds18b20_dq)
#define in_ds18b20_dq() PINC&(1<<ds18b20_dq)

#define ds18b20_read_rom           0x33
#define ds18b20_match_rom          0x55
#define ds18b20_skip_rom           0xcc
#define ds18b20_search_rom         0xf0
#define ds18b20_alarm_search_rom   0xec
#define ds18b20_write_ram          0x4e
#define ds18b20_read_ram           0xbe
#define ds18b20_copy_ram           0x48
#define ds18b20_convert_tem        0x44
#define ds18b20_eecall_eeprom      0xb8
#define ds18b20_read_power_supply  0xb4

/*********************************************************************************************
延时函数
**********************************************************************************************/

void delay_1us(void)                 //1us延时函数 
  { 
   asm("nop"); 
  } 

void delay_nus(unsigned int n)       //N us延时函数 
  { 
   unsigned int i=0; 
   for (i=0;i<n;i++) 
   delay_1us(); 
  } 
void delay_1ms(void)                 //1ms延时函数 
  { 
   unsigned int i; 
   for (i=0;i<400;i++); 
  } 
   
void delay_nms(unsigned int n)       //N ms延时函数 
  { 
   unsigned int i=0; 
   for (i=0;i<n;i++) 
   delay_1ms(); 
  }
/*********************************************************************************************
延时函数
**********************************************************************************************/

/*********************************************************************************************
ds18b20函数包
**********************************************************************************************/

/////////////////////////////////////init_ds18b20//////////////////////////////
unsigned char init_ds18b20(void)
{
unsigned char bus_flag;
set_ds18b20_dq_ddr();
set_ds18b20_dq();
clr_ds18b20_dq();
delay_nus(200);//>480us
delay_nus(20);
delay_nus(20);
delay_nus(20);
delay_nus(20);
delay_nus(20);

CLI();
set_ds18b20_dq();
clr_ds18b20_dq_ddr();//释放总线    
delay_nus(10);//15~60us
delay_nus(10);

if(in_ds18b20_dq())
 bus_flag=0;
else
 bus_flag=1;

SEI();
set_ds18b20_dq_ddr();
set_ds18b20_dq();
delay_nus(20);   //60~240us 
delay_nus(20); 
delay_nus(20); 
delay_nus(20); 

return(bus_flag);
}
/////////////////////////////////////init_ds18b20//////////////////////////////

///////////////////////////////read ds18b20////////////////////////////////
unsigned char read_ds18b20(void)
{
unsigned char data=0;
unsigned char i=0;
for(i=0;i<8;i++)
{
CLI();
data>>=1;
clr_ds18b20_dq();
delay_1us();//2us
delay_1us();
set_ds18b20_dq();
clr_ds18b20_dq_ddr();//释放总线
delay_1us();//2us 
delay_1us();
if(in_ds18b20_dq()) 
    data|=0x80;
SEI();
delay_nus(20);//60~120us
delay_nus(20);
set_ds18b20_dq_ddr();
}
set_ds18b20_dq();
return(data);
}
///////////////////////////////read ds18b20////////////////////////////////

///////////////////////////////write ds18b20////////////////////////////////
void write_ds18b20(unsigned char data)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
CLI();
clr_ds18b20_dq();
delay_1us();//<15us        t1
delay_1us();
if(data&0x01)
 set_ds18b20_dq();
else
 clr_ds18b20_dq();
delay_nus(20);//15~60us      t2      60<t1+t2<120
delay_nus(10);
set_ds18b20_dq();
delay_1us();//>1us 
data>>=1;
SEI();
}
set_ds18b20_dq();
} 
///////////////////////////////write ds18b20////////////////////////////////

///////////////////////////////set_ds18b20//////////////////////////////
void set_ds18b20(char th,char tl,unsigned char config)
{
if(init_ds18b20()==1)
{
write_ds18b20(ds18b20_skip_rom);
write_ds18b20(ds18b20_write_ram);
write_ds18b20(th);
write_ds18b20(tl);
write_ds18b20(config);
}
}
///////////////////////////////set_ds18b20//////////////////////////////

///////////////////////////////get_rom//////////////////////////////
void get_rom(unsigned char* p)
{
   unsigned char i;
   if(init_ds18b20()==1)
   {
      write_ds18b20(ds18b20_read_rom);
   for(i=0;i<8;i++)
   {
   *p++ = read_ds18b20();
   }
    }
}
///////////////////////////////get_rom//////////////////////////////

///////////////////////////////convert_ds18b20//////////////////////////////
void convert_ds18b20(void)
{
if(init_ds18b20()==1)
{
   write_ds18b20(ds18b20_skip_rom);
   write_ds18b20(ds18b20_convert_tem);
}
}
///////////////////////////////convert_ds18b20//////////////////////////////

///////////////////////////////read_temperature//////////////////////////////
void read_temperature(unsigned char* tmp_high,unsigned char* tmp_low)
{
if(init_ds18b20()==1)       //复位18b20  
{
write_ds18b20(ds18b20_skip_rom); //发出读命令  
write_ds18b20(ds18b20_read_ram);
*tmp_low=read_ds18b20();
*tmp_high=read_ds18b20();
}
}

⌨️ 快捷键说明

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