0
点赞
收藏
分享

微信扫一扫

适用于89c52系列单片机的DS18B20传感器代码

君心浅语 2022-02-18 阅读 63

介绍

部分硬件代码

软件架构

适用于89c52系列单片机的DS18B20传感器代码。

安装教程

  1. 单片机晶振:11.0592MHz;
  2. 传感器数据接口:P00;

使用说明

  1. unsigned int Ds_Result();//返回最终结果,
  2. void Ds_Read_RomId();//读取传感器ROM ID,没有返回值,故需要定义全局字符数组变量,eg. unsigned char rom[8];

 ds18b20.c

#include "ds18b20.h"
#include "INTRINS.H"
#include "delay.h"

sbit Bus = P0^0;
uchar rom[8];

/*10us基准延时*/
void Delay10us(uint t){
    uint i;
    for(i=t;i>0;i--){
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    }
}

/*初始化*/
bit Ds_Init(){
    bit ack;
    Bus = 0;
    Delay10us(60);  //最小480us,最大960us
    Bus = 1;
    Delay10us(6);   //15-60us
    while(Bus == 0);
    Bus = 1;        //让传感器释放总线,避免影响下一步  
    return ack;
}

/*ds18b20写时序*/
void Ds_Write(unsigned char dat)//一个写周期为60-120us,主机在15--45us内对信号采样
{
	unsigned char mask;
	for(mask=0x01;mask!=0;mask<<=1)
	{
		Bus=0;
		_nop_();
		if((mask&dat)==0)
		{
			Bus=0;
		}
		else
		{
			Bus=1;
		}
		Delay10us(6);//15-60us采样
		Bus=1;
		_nop_();
		_nop_();
	}
}

/*ds18b20读时序*/
unsigned char Ds_Read()
{
	unsigned char dat=0;
	unsigned char mask,fmask;
	for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
	{
		Bus=0;
		_nop_();
		Bus=1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		if(Bus==0)//读0
		{
			fmask=~mask;
			dat=dat&fmask;
		}
		else
		{
			dat|=mask;
		}
		Delay10us(5);
		Bus=1;
	}
	return dat;
}

/*转换温度子函数*/
void Ds_Change()
{
	Ds_Init();
	delay1ms(1);
	Ds_Write(0xCC);//跳过ROM寻址
	Ds_Write(0x44);//启动一次温度转换
}

/*ds18b20获取温度子函数*/
unsigned int Get_Temp()
{
	unsigned int temp=0;
	unsigned char LSB,MSB;//用来储存数据的第八位与高八位
	Ds_Init();
	delay1ms(1);
	Ds_Write(0xCC);//跳过寻址
	Ds_Write(0xBE);//发送读值命令·
	LSB=Ds_Read();
	MSB=Ds_Read();
	temp=MSB;
	temp<<=8;
	temp|=LSB;
	return temp;
}


/*ds18b20  返回最终结果子函数*/
unsigned int Ds_Result()
{
	float tp;
	unsigned int temp;
	delay1ms(10);//10ms度过不稳定期
    Ds_Change();//转换温度
    delay1ms(1000);//延时1s等待转化
    temp=Get_Temp();
    tp=temp;
    temp=tp*0.0625;
    return temp;//最终结果为temp
}


/*读传感器 ROM ID*/
void Ds_Read_RomId(){
    uchar i;
    Ds_Init();
    delay1ms(1);
    Ds_Write(0x33);
    for(i=0; i<8; i++){
        rom[i]=Ds_Read();
    }
}

ds18b20.h

#ifndef __DS18B20_H__
#define __DS18B20_H__

#include "STC89C5XRC.H"

#define uchar unsigned char
#define uint unsigned int

uchar rom[];

unsigned int Ds_Result();//返回最终结果
unsigned int Get_Temp();//获取温度子函数
void Ds_Read_RomId();


#endif
举报

相关推荐

0 条评论