介绍
部分硬件代码
软件架构
适用于89c52系列单片机的DS18B20传感器代码。
安装教程
- 单片机晶振:11.0592MHz;
- 传感器数据接口:P00;
使用说明
- unsigned int Ds_Result();//返回最终结果,
- 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