软件用途
适用于STC15系列单片机的DS18B20传感器代码。
使用环境
- 单片机晶振:24MHz;
- 传感器数据接口:P22;
使用说明
- unsigned int Ds_Result();//返回最终结果,
- 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