📄 ds1802.c
字号:
//这是一个温度采集模块的驱动程序。
/*
|----|
| DS | DS18B20管脚排列
+----+
| | |
| | |
| | |----------Vdd
| |------------DQ-->P2.7
|---------------GND
*/
#include <reg51.h>
#include "intrins.h"
//------------DS18B20控制命令-----------------------------
#define T_CONVER 0x44 //开始温度转换
#define T_READ 0xbe //读暂存器
#define T_WRITE 0x4e //写暂存器
#define T_ROM_JMP 0xcc //忽略64ROM地址
//------------------------------------------------------
sbit DQ=P2^7; //DS18B20数据输出端
bit REC_suc=0; //DS18B20成功复位标志位(1为成功0为失败)
void DS18B20_init(); //DS18B20初始化函数
void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数
unsigned char DS18B20_read(); //从DS18B20读取一个字节函数
extern void delay(unsigned int i);
/****************************DS18B20初始化函数**************************/
/*函数原型:void DS18B20_init()
/*函数功能:DS18B20初始化
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/14
/**********************************************************************/
void DS18B20_init()
{
unsigned char i=1;
DQ=0;
DQ=1;
delay(16); //延时227(230)us=(22+16*13)us
DQ=0;
delay(37); //延时502us(503)us=(22+37*13)us
DQ=1;
delay(2); //等待DS18B20作出相应 延时40us(48)us=(22+2*13)us
i=DQ;
if(i==0)
{
REC_suc=1; //复位信号标志1为成功0为失败
}
else
{
REC_suc=0;
}
}
/****************************DS18B20发送函数**************************/
/*函数原型:void DS18B20_send(unsigned char in_data)
/*函数功能:DS18B20发送数据
/*输入参数:要发送的数据
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/14
/**********************************************************************/
void DS18B20_send(unsigned char in_data)
{
unsigned char i,out_data,k;
out_data=in_data;
for(i=1;i<9;i++) //串行发送数据
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=out_data&0x01;
if(k==0x01) //判断数据 写1
{
DQ=1;
}
else //写0
{
DQ=0;
}
delay(3); //延时62us(61)us=(22+3*13)us
DQ=1;
out_data=_cror_(out_data,1); //循环右移1位
}
}
/**************************DS18B20读函数**************************/
/*函数原型:void DS18B20_read()
/*函数功能:DS18B20读数据
/*输入参数:无
/*输出参数:读到的一字节内容
/*调用模块:无
/*建立时间:2005/11/14
/******************************************************************/
unsigned char DS18B20_read()
{
unsigned char i,in_data,k;
in_data=0;
for(i=1;i<9;i++) //串行发送数据
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=DQ; //读DQ端
if(k==1) //读到的数据是1
{
in_data=in_data|0x01;
}
else
{
in_data=in_data|0x00;
}
delay(2); //延时51us(48)us=(22+2*13)us
DQ=1;
in_data=_cror_(in_data,1); //循环右移1位
}
return(in_data);
}
/**************************DS18B20读取温度函数*********************/
/*函数原型:void ReadTemperature()
/*函数功能:DS18B20读取温度转换好的数据
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/15
/******************************************************************/
int ReadTemperature()
{
unsigned char T_L=0;
unsigned char T_H=0;
unsigned char k;
int temp; //转换好的温度数值
DS18B20_init();
DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
DS18B20_send(T_CONVER); // 启动温度转换
DS18B20_init();
if(REC_suc==1)
{
DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
T_L=DS18B20_read();
T_H=DS18B20_read();
k=T_H&0x01; //T_H&0xf8;
if(k==0x01)
{temp=0-(256-T_L)*5;} //温度是负数
else
{temp=T_L*5;} //温度是正数
}
else
{
temp=9999;//ERROR代码
}
return(temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -