📄 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 + -