📄 ds18b20.c
字号:
//#ifdef _DS18B20_H_
/*************************************
*** DS18B20处理函数
**************************************/
#include <reg52.h>
#include <Intrins.h>
#include <absacc.h>
//#include "Uarts1.h"
#include "main.h"
//2ROM操作品令
#define DS18B20_ROM_READ 0x33
#define DS18B20_ROM_MATCH 0x55
#define DS18B20_ROM_SKIP 0xCC
#define DS18B20_ROM_SERCH 0xF0
#define DS18B20_ALARM_SERCH 0xEC
//3存储器操作命令
#define DS18B20_WRITE_MEM 0x4E //Write Scratchpad(写暂存存储器) [4EH]
#define DS18B20_READ_MEM 0xBE //Read Scratchpad(读暂存存储器) [BEH]
#define DS18B20_COPY_MEM 0x48 //Copy Scratchpad(复制暂存存储器) [48H]
#define DS18B20_CONVERT_TEMP 0x44 //Convert Temperature(温度变换) [44H]
#define DS18B20_RECALL_EPROM 0xB8 //Recall EPROM(重新调出) [B8H]
#define DS18B20_READ_PWR 0xB4 //Read Power supply(读电源) [B4H]
////////////////////////////////////////////////////////////////////////////////
//全局变量
//ds18b20端口
sbit DQ_18b20 =P0^3;//根据实际情况定义端口
//unsigned int Delay_Ds18b20; //以1MS定时器,应该为1200. 1.2S
////////////////////////////////////////////////////////////////////////////////
//底层函数
//总线延时函数(DelayUs.A51)
void DS18B20_Delay(unsigned char k);
//DS18B20复位函数
unsigned char DS18B20_Reset(void)
{
bit k;
unsigned char flag,i;
for(i=0;i<10;i++)
// while(1)
{
//KK:
DQ_18b20 = 0;
DS18B20_Delay(70); //400us-600us
DQ_18b20 = 1;
DS18B20_Delay(8); //60us
k = DQ_18b20;
if(k==0)
{
flag=0x00;
i=10;
}
else
flag=0xff;
}
//测试
// UartSendChar(flag);
if(flag==0xff)
return flag;
k = DQ_18b20;
if(k==0)
{
DS18B20_Delay(10); //80us
k = DQ_18b20;
if(k==0)
flag=0xff;
}
//测试
// UartSendChar(flag);
if(flag==0xff)
return flag;
// goto KK;
DS18B20_Delay(25);
return flag;
}
//读一个字节
unsigned char DS18B20_ReadByte(void)
{
unsigned char i;
// bit k;
unsigned int value = 0;
for (i=0;i<8;i++) //从低位读到高位
{
value=value>>1;
DQ_18b20 = 0;
_nop_();_nop_();_nop_();_nop_();
DQ_18b20 = 1;
_nop_();_nop_(); //此两句可以不要
if(DQ_18b20)
value|=0x80;
DS18B20_Delay(6); //延时46US
DQ_18b20 = 1;
}
return(value);
}
//写一个字节
void DS18B20_WriteByte(unsigned char val)
{
unsigned char i;
for (i=0; i<8; i++) //从低位写到高位
{
DQ_18b20 = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();
DQ_18b20 =(val&0x01);
val=val>>1;
DS18B20_Delay(7); //延时56uS
DQ_18b20 = 1;
}
}
////////////////////////////////////////////////////////////////////////////////
//上层函数
//发送开始转换命令
void DS18B20_StartConvert()
{
unsigned char f;
EA=0;
f=DS18B20_Reset();
if(f==0)
{
DS18B20_WriteByte(DS18B20_ROM_SKIP); //0xCC
DS18B20_WriteByte(DS18B20_CONVERT_TEMP); //write_unsigned char(0x44);
}
EA=1;
}
//读取温度(暂时不考虑负数的情况)
//送出温度值*10倍
unsigned int DS18B20_ReadTemp(void)
{
// unsigned char i,j,k;
//unsigned int tmpH,tmpL;
unsigned char f,tmpH,tmpL;
char sign;
unsigned int tempZ;
EA=0;
f=DS18B20_Reset();
if(f==0)
{
DS18B20_WriteByte(DS18B20_ROM_SKIP); //0xCC
DS18B20_WriteByte(DS18B20_READ_MEM); //0xBE
tmpL=DS18B20_ReadByte();
tmpH=DS18B20_ReadByte();
}
EA=1;
if(f!=0)
{
// Led_Run=~Led_Run;
return 0xfedc;
}
/* 检查读取的两个温度数字
UartSendChar(tmpL);
UartSendChar(tmpH);
*/
//符号暂时不考虑
if((tmpH&0xf8)==0)
sign=1; //+
else
sign=-1; //-
tempZ=((tmpH&0x07)<<4)+((tmpL&0x0f0)>>4);
tmpL=(tmpL&0x0f)*0.625; // 1/16:0.0625 *10
return ((tempZ*10)+tmpL);
}
//#endif
//end of file.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -