#include <DS18B20.h>
#include "intrins.h"
unsigned char DS18B20_time;
sbit DQ = P1^4 ; //定义DS18B20端口DQ
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
void delay_18B20(unsigned int i)
{
while (i--)
{ _nop_();_nop_();_nop_();_nop_();
}
}
//设置全局变量,专门用于严格延时
/*****************************************************
函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag
***************************************************/
/*初始化ds1820 */
/*******************************************************************/
bit Init_DS18B20(void)
{ unsigned char x=0;
DQ = 1; //DQ拉高
delay_18B20(80); //延时
DQ = 0; //DQ拉低
delay_18B20(800); //延时 480us以上
DQ = 1; //DQ拉高
delay_18B20(140);
x=DQ; delay_18B20(200);
}
/*****************************************************
函数功能:从DS18B20读取一个字节数据
出口参数:dat
***************************************************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // ?????
dat>>=1;
DQ = 1; // ?????
if(DQ)
dat|=0x80;
delay_18B20(40); //40
}
return(dat);
}
/*****************************************************
函数功能:向DS18B20写入一个字节数据
入口参数:dat
***************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(50); //50
DQ = 1;
dat>>=1;
}
}
/*****************************************************
函数功能:做好读温度的准备
***************************************************/
void Read_Temperature(void)
{
Init_DS18B20(); //将DS18B20初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
for(DS18B20_time=0;DS18B20_time<100;DS18B20_time++)
; //温度转换需要一点时间
Init_DS18B20(); //将DS18B20初始化
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
}
/******************************************************************************
以下是与温度有关的显示设置
******************************************************************************/
/****************************************************
函数功能:温度的处理
入口参数:x
***************************************************/
unsigned int Disp_Temperature()
{
unsigned char b=0;
unsigned char TN; //储存温度的整数部分
unsigned char TD; //储存温度的小数部分
unsigned int a;
unsigned int auu;
unsigned int temp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(1);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(1);
a=ReadOneChar(); //???????
b=ReadOneChar(); //???????
TN=b*16+a/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
//这样得出的是温度的整数部分,小数部分被丢弃了
TD=(a%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
//这样得到的是温度小数部分的第一位数字(保留1位小数)
auu=TN*10+TD;
return auu;
}
|