DS18B20.h
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include<reg51.h>
sbit DSPORT = P3^7;
void delay600us(void);
void delay15us(void);
unsigned char Ds18b20Init(void);
void Ds18b02WriteByte(unsigned char dat);
unsigned char Ds18b02ReadByte(void);
void Ds18B20ChangTemp(void);
void Ds18B20ReadTempCom(void);
void Ds18B20ReadTemp(void);
#endif
DS18B20.c
#include"DS18B20.h"
#include"uart.h"
#include<reg51.h>
void delay600us(void)
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=98;a>0;a--);
}
void delay15us(void)
{
unsigned char a;
for(a=6;a>0;a--);
}
void delay1ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay750ms(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=136;b>0;b--)
for(a=15;a>0;a--);
}
void delay45us(void)
{
unsigned char a;
for(a=21;a>0;a--);
}
void delay70us(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=32;a>0;a--);
}
unsigned char Ds18b20Init()
{
unsigned char i=0;
DSPORT = 0;
delay600us();
DSPORT = 1;
i = 0;
while(DSPORT)
{
i++;
if(i>5)
{
return 0;
}
delay15us();
}
return 1;
}
void Ds18b02WriteByte(unsigned char dat)
{
unsigned int i=0,j=0;
for(j=0; j<8; j++)
{
DSPORT = 0;
i++;
DSPORT = dat & 0x01;
delay70us();
DSPORT = 1;
dat >>= 1;
}
}
unsigned char Ds18b02ReadByte(void)
{
unsigned char byte = 0, bi = 0;
unsigned int i=0, j=0;
for(j=8; j>0; j--)
{
DSPORT = 0;
i++;
DSPORT = 1;
i++;
i++;
bi = DSPORT;
byte = (byte>>1)|(bi<<7);
delay45us();
}
return byte;
}
void Ds18B20ChangTemp(void)
{
Ds18b20Init();
delay1ms();
Ds18b02WriteByte(0xcc);
Ds18b02WriteByte(0x44);
delay750ms();
}
void Ds18B20ReadTempCom(void)
{
Ds18b20Init();
delay1ms();
Ds18b02WriteByte(0xcc);
Ds18b02WriteByte(0xbe);
}
void Ds18B20ReadTemp(void)
{
unsigned int temp = 0;
unsigned int tml=0, tmh=0;
Ds18B20ChangTemp();
Ds18B20ReadTempCom();
tml = Ds18b02ReadByte();
tmh = Ds18b02ReadByte();
temp = (tmh<<8) | tml;
temp = temp * 625 / 1000;
uart_sendbyte(temp);
}
uart.h
#ifndef __UART_H__
#define __UART_H__
#include<reg51.h>
void uart_init(void);
void uart_sendbyte(unsigned char c);
void uart_send_string(unsigned char *str);
#endif
uart.c
#include "uart.h"
#include<reg51.h>
void uart_init(void)
{
SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TL1 = 243;
TH1 = 243;
TR1 = 1;
}
void uart_sendbyte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
main
#include"DS18B20.h"
#include"uart.h"
#include<reg51.h>
void main()
{
unsigned char ret = 1;
uart_init();
ret = Ds18b20Init();
while(1)
{
Ds18B20ReadTemp();
}
}