51单片机之DS18B20

8 篇文章 0 订阅
6 篇文章 0 订阅

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)   //误差 0us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=98;a>0;a--);
}

void delay15us(void)   //误差 0us
{
    unsigned char a;
    for(a=6;a>0;a--);
}

void delay1ms(void)   //误差 0us
{
    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)   //误差 0us
{
    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)   //误差 0us
{
    unsigned char a;
    for(a=21;a>0;a--);
}

void delay70us(void)   //误差 0us
{
    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;	//0表示初始化失败
		}
		delay15us();
	}
	return 1;  			//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++;		//延时3us
		DSPORT = 1;	//释放总线
		i++;
		i++;		//延时6us
		bi = DSPORT;   
		byte = (byte>>1)|(bi<<7);
		delay45us();
	}
	return byte;	
}

/************** 高层时序 ****************/
void Ds18B20ChangTemp(void)
{
	Ds18b20Init();				//初始化
	delay1ms();
	Ds18b02WriteByte(0xcc);		//跳过ROM操作指令
	Ds18b02WriteByte(0x44);		//温度转换命令
	delay750ms();
}

void Ds18B20ReadTempCom(void)
{
	Ds18b20Init();				//初始化
	delay1ms();
	Ds18b02WriteByte(0xcc);		//跳过ROM操作指令
	Ds18b02WriteByte(0xbe);		//发送读取温度指令	
}	

void Ds18B20ReadTemp(void)
{
	unsigned int temp = 0;
	unsigned int tml=0, tmh=0;
	Ds18B20ChangTemp();
	Ds18B20ReadTempCom();			//此时温度数据在暂存器上
	tml = Ds18b02ReadByte();		//读取暂存器上的低8位数据
	tmh = Ds18b02ReadByte();		//读取暂存器上的搞4位数据					  	
	/*temp = tmh;
	temp <<= 8;
	temp |= tml;*/
	
	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; // 串口工作在模式1下,允许接收数据
	PCON = 0x80; // 波特率加倍,意思是本来需要波特率4800,等下计算时按2400去计算即可
	
	//波特率相关设置
	TMOD = 0x20; //设置T1为模式2
	TL1 = 243;		//波特率4800计算出来的
	TH1 = 243; // 8位自动重装的意思是TH1用完了后,TL1会自动的重装到TH1去 

	TR1 = 1;	//开启定时器1
//	ES = 1;		//开启串口中断,单片机要接收数据时才打开
//	EA = 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();				//串口初始化
	//uart_sendbyte('1');  		//串口测试
	ret = Ds18b20Init();			//DS18B20初始化
	/*
	if(ret == 1)
	{
		uart_sendbyte('1');	
	}
	else
	{
		uart_sendbyte('0');
	}
	*/
	while(1)
	{
		Ds18B20ReadTemp();
	}
}		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值