Use DS18B20 at STC8
STC8 驱动 DS18B20
#include "STC8.h"
#include "DS18B20.h"
#include <intrins.h>

sbit DQ = P5^4;

void delay_18B20(unsigned int i)
{
	_nop_();
	while(--i);
}

void DS18B20_Init(void)
{
	unsigned char x=0;
	DQ = 1;  //DQ Reset
	delay_18B20(80);
	DQ = 0; 
	delay_18B20(800);
	DQ = 1;
	delay_18B20(140);
	x=DQ; //if DS18B20 exist DQ=0
	delay_18B20(200);
}

unsigned char DS18B20_Read(void)
{
	unsigned char i=0;
	unsigned char dat = 0;
	for (i=0;i<8;i++)
	{
		dat >>= 1;
		DQ = 0;
		delay_18B20(2);
		DQ = 1;
		delay_18B20(2);
		DQ = 1;
		if(DQ) dat |= 0x80;
		delay_18B20(60);
	}
	return(dat);
}

void DS18B20_Write(unsigned char dat)
{
	unsigned char i=0;
	for (i=8; i>0; i--)
	{
		DQ = 0;
		delay_18B20(2);
		DQ = dat&0x01;
		delay_18B20(60);
		DQ = 1;
		delay_18B20(2);
		dat>>=1;
	}
}

头文件:

#ifndef __DS18B20_H_
#define __DS18B20_H_

void delay_18B20(unsigned int i);
void DS18B20_Init(void);
unsigned char DS18B20_Read(void);
void DS18B20_Write(unsigned char dat);

#endif

最后修改于 Fri, 29 Nov 2019