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

软件用途

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

使用环境

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

使用说明

  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"
uchar rom[8];
// float data_Temp_f;
sbit Bus = P2^2;

/*精确10us延时:10.85us*/
void Delay10us(uint count){
    int i;
	for(i=0; i<count*7; i++);
}

/*初始化*/
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();
	delayms(1);
	Ds_Write(0xCC);//跳过ROM寻址
	Ds_Write(0x44);//启动一次温度转换
}

/*ds18b20获取温度子函数*/
unsigned int Get_Temp()
{
	unsigned int temp=0;
	unsigned char LSB,MSB;//用来储存数据的第八位与高八位
	Ds_Init();
	delayms(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;
	delayms(10);//10ms度过不稳定期
    Ds_Change();//转换温度
    delayms(1000);//延时1s等待转化
    temp=Get_Temp();
    tp=temp;
    temp=tp*0.0625;
    return temp;//最终结果为temp
}


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

ds18b20.h

#ifndef __DS18B20_H__
#define __DS18B20_H__

#include <15w_lib_headfiles.h>

#define uchar unsigned char
#define uint unsigned int
// ROM操作指令
#define Read_ROM 0X33               //读ROM
#define Match_ROM 0X55              //匹配ROM
#define Skip_ROM 0xCC               //跳过ROM
#define Search_ROM 0xF0             //搜索ROM
#define Alarm_search 0xEC           //警告搜索

// 存储器操作命令
#define Write_Scratchpad 0x4E       //写暂存存储器
#define Read__Scratchpad 0xBE       //读暂存存储器
#define Copy_Scratchpad 0x48        //复制暂存存储器
#define Convert_Temperature 0x44    //温度变化
#define Recall_EPROM 0xB8           //重新调出
#define Read_Power_supply 0xB4      //读电源

sbit DS18B20_IO = P2^2;
extern uchar rom[];

// void Ds18b20_Delay_10us(uchar count);
// void Ds18b20_Delay_2us(void);
// float Ds18b20_Get_Temp();
// void Ds18b20_Read_ROMID();

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值