目录
一、电路图
二、底层驱动代码
三、温度读取实现
四、实际使用
一、电路图
二、底层驱动代码
时序是单总线
我们需要修改的地方是单总线内部延时函数,改成
void Delay_OneWire(unsigned int t)
{
t*=12;
while(t--);
}
#ifndef __ONEWIRE_H
#define __ONEWIRE_H#include <STC15F2K60S2.H>sbit DQ = P1^4; #endif
#include "onewire.h"//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{t*=12;while(t--);
}//单总线写操作
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//单总线读操作
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;} Delay_OneWire(5);}return dat;
}//DS18B20初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ; Delay_OneWire(5);return initflag;
}
三、温度读取实现
void T_Concert()
{init_ds18b20();Write_DS18B20(0xCC);//跳过ROMWrite_DS18B20(0x44);//转换温度
}float T_read()
{u8 TL=0,TH=0;u16 temp;float T;init_ds18b20();Write_DS18B20(0xcc);//跳过ROMWrite_DS18B20(0xbe);//转换温度TL=Read_DS18B20();//先读低位TH=Read_DS18B20();temp=TL|(TH<<8);//高位左移八位T=temp/16.0;return T;
}
四、实际使用
float T;
void main()
{T_Concert();Delay(750);All_Init();Timer1Init(); //1毫秒@11.0592MHzif(Tem_f == 1){T_Concert();T = T_read();temp = T*100;Tem_f = 0;seg_set(16,16,16,16,16,temp/100,temp /10%10+32,temp %10);}
}void Timer1() interrupt 3
{TL1 = 0x18; TH1 = 0xFC; count++;seg_loop();if(count % 500 ==0){Tem_f = 1;}count %= 1000;
}