📄 ds1820.c
字号:
/**********************************************************
*DS1820驱动程序
*版本:V1.0
**********************************************************/
#include <at89x52.h>
//引脚定义
sbit DS1820_DQ= P1^3; //单总线引脚
//函数声明
bit DS1820_Reset();
void DS1820_WriteData(unsigned char wData);
unsigned char DS1820_ReadData();
//存放温度数据
unsigned char data temperature[2]; //将温度存储在低128RAM单元
/**********************************************************
*读温度数据函数
**********************************************************/
void read_temp()
{
unsigned char i;
DS1820_Reset(); //复位
DS1820_WriteData(0xcc); //跳过ROM命令
DS1820_WriteData(0x44); //温度转换命令
DS1820_Reset(); //复位
DS1820_WriteData(0xcc); //跳过ROM命令
DS1820_WriteData(0xbe); //读DS1820温度暂存器命令
for (i=0;i<2;i++)
{
temperature[i]=DS1820_ReadData();
}
DS1820_Reset(); //复位,结束读数据
}
/**********************************************************
*DS1820复位及存在检测(通过存在脉冲可以判断DS1820是否损坏)
*函数名称:DS1820_Reset()
*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在
**********************************************************/
bit DS1820_Reset()
{
unsigned char i;
bit flag; //DS1820存在标志位
DS1820_DQ = 0; //拉低总线
for (i=240;i>0;i--);//延时480微秒,产生复位脉冲
DS1820_DQ = 1; //释放总线
for (i=40;i>0;i--); //延时80微秒对总线采样
flag = DS1820_DQ;
for (i=200;i>0;i--); //延时400微秒等待总线恢复
return (flag); //根据flag的值可以知道DS1820是否存在或损坏
} //可以加声音告警提示DS1820故障
/**********************************************************
*写数据到DS1820
*函数名称:DS1820_WriteData()
*
**********************************************************/
void DS1820_WriteData(unsigned char wData)
{
unsigned char i,j;
for (i=8;i>0;i--)
{
DS1820_DQ = 0; //拉低总线,产生写信号
for (j=2;j>0;j--); //延时4us
DS1820_DQ = wData&0x01; //发送1位
for (j=30;j>0;j--); //延时60us,写时序至少要60us
DS1820_DQ = 1; //释放总线,等待总线恢复
wData>>=1; //准备下一位数据的传送
}
}
/**********************************************************
*从DS1820中读出数据
*函数名称:DS1820_ReadData()
*
**********************************************************/
unsigned char DS1820_ReadData()
{
unsigned char i,j,TmepData;
for (i=8;i>0;i--)
{
TmepData>>=1;
DS1820_DQ = 0; //拉低总线,产生读信号
for (j=2;j>0;j--); //延时4us
DS1820_DQ = 1; //释放总线,准备读数据
for (j=4;j>0;j--); //延时8微秒读数据
if (DS1820_DQ == 1)
TmepData |= 0x80;
for (j=30;j>0;j--); //延时60us
DS1820_DQ = 1; //拉高总线,准备下一位数据的读取.
}
return (TmepData);//返回读到的数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -