复位
时序图如下所示:低电平持续时间为480-960us,高电平持续时间为15-60us,然后低电平持续60-240us。
代码如下:
void ds18b20_rst(void) { IO_OUT; //输出模式 DQ_OUT=0; //拉低DQ引脚 delay_us(600); //延时480-960us DQ_OUT=1; //拉高DQ引脚 while(DQ_OUT); //等待器件应答(器件拉低),约15-60us后 while(!DQ_OUT); //应答脉冲出现后,等待器件拉高,约60-240us后 }写0操作
时序图如下所示:
代码如下:
void ds18b20_write_zero(void) { IO_OUT; //输出模式 DQ_OUT=0 //拉低引脚 delay_us(80); //延时60-120us DQ_OUT=1; //拉高引脚 delay_us(2); } 写1操作代码如下:
void ds18b20_write_one(void) { IO_OUT; //输出模式 DQ_OUT=0 delay_us(2); DQ_OUT=1; delay_us(80); } 读0、1操作代码如下:
unsigned char ds18b20_read_bit(void) { unsigned char data; IO_OUT; DQ_OUT=0; delay_us(2); DQ_OUT=1; DQ_IN; delay_us(2); if(DQ_IN) data=1; else data=0; delay_us(500); return data; } 写1字节代码如下:
void ds18b20_write_byte(unsigned char data) { unsigned char i,testb; IO_OUT; for(i=0;i<8;i++) { testb=data&0x01; //从低位开始写 data>>=1; if(testb) ds18b20_write_one(); else ds18b20_write_zero(); } } 读一字节代码如下:
unsigned char ds18b20_read_byte(void) { unsigned char i,j,data=0; for(i=0;i<8;i++) { j=ds18b20_read_bit(); data=(j<<7)|(data>>1); //从低位开始读 } return data; } 开始读取数据代码如下:
void ds18b20_start(void) { ds18b20_rst(); ds18b20_write_byte(0xcc); // 跳过ROM ds18b20_write_byte(0x44); //温度转换 } 初始化代码如下:
unsigned char ds18b20_init(void) { gpio_init(); //此引脚需根据相应的单片机进行配置 ds18b20_rst(); } .读取温度代码如下:
short get_tempetature(void) { unsigned char TL,TH; short tem; ds18b20_start(); //开始转换 delay_ms(700); //等待转换完成 ds18b20_init(); ds18b20_write_byte(0xcc); //跳过ROM ds18b20_write_byte(0xbe); //读取暂存寄存器 TL=ds18b20_read_byte(); //低八位 TH=ds18b20_read_Byte(); //高八位,注意前五位为符号位只有全为0的时候温度是正的 tem=TH; //获得高八位 tem<<=8; tem+=TL; //获得底八位 return tem; }