适用于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
    评论
好的,这是一个比较复杂的问题,需要涉及到单片机的编程和串口通信,我会尽可能详细地回答你。首先,你需要了解以下几个知识点: 1. DS18B20传感器的工作原理和通信协议 2. STC89C52单片机的编程语言和串口通信模块的使用方法 3. PC机串口通信的实现方法 下面是一个简单的流程图,可以帮助你更好地理解整个过程: ``` DS18B20传感器 --> STC89C52单片机 --> 串口通信模块 --> PC机 ``` 接下来,我将针对每一个知识点进行详细说明。 1. DS18B20传感器的工作原理和通信协议 DS18B20是一种数字温度传感器,采用单总线通信协议。它的工作原理是通过测量半导体材料的电阻值来计算温度。DS18B20的通信协议包括三个阶段:初始化、发送命令和接收数据。具体步骤如下: 1. 主机向总线发送复位信号,让DS18B20进入初始化状态。 2. 主机发送“跳过ROM命令”,让DS18B20开始进行温度转换。 3. 主机发送“读取温度命令”,DS18B20将温度值发送回主机。 4. 主机接收温度值并进行处理,得到实际温度值。 2. STC89C52单片机的编程语言和串口通信模块的使用方法 STC89C52单片机的编程语言是C语言,通常使用Keil C51集成开发环境进行开发。串口通信模块是单片机与外部设备进行通信的重要模块之一,STC89C52单片机内置了两个串口,分别为UART0和UART1。下面是串口通信的基本流程: 1. 初始化串口,设置波特率、数据位、停止位等参数。 2. 发送数据,将要发送的数据存入发送缓冲区,等待发送。 3. 接收数据,将接收到的数据存入接收缓冲区,等待处理。 在本题中,我们需要使用串口通信模块将读取到的温度值发送到PC机上,具体步骤如下: 1. 初始化串口,设置波特率为115200,数据位为8位,停止位为1位。 2. 读取DS18B20传感器的温度值。 3. 将温度值转换为字符串形式,存入发送缓冲区。 4. 等待串口发送完毕,继续读取温度值并发送。 3. PC机串口通信的实现方法 PC机可以通过串口与STC89C52单片机进行通信,通常使用COM口进行连接。在Windows操作系统中,可以使用C++语言编写程序,通过WinAPI函数实现串口通信。以下是简单的流程图: ``` PC机 --> 串口通信模块 --> STC89C52单片机 ``` 具体步骤如下: 1. 打开COM口,设置波特率、数据位、停止位等参数。 2. 发送数据,将要发送的数据存入发送缓冲区,等待发送。 3. 接收数据,将接收到的数据存入接收缓冲区,等待处理。 在本题中,我们需要使用PC机接收STC89C52单片机发送的温度值,具体步骤如下: 1. 打开COM口,设置波特率为115200,数据位为8位,停止位为1位。 2. 等待接收数据,将接收到的数据存入接收缓冲区。 3. 将接收到的数据显示在PC机上。 希望以上内容能够帮助你更好地了解STC89C52单片机读取DS18B20传感器温度值并发送到PC机的过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值