📄 ds18b20.c
字号:
/****************************************************************
//MCS-51单片机扩展DS18B20底层操作库。
//只在STC89C52单片机上实验过
//硬件接口见hardmap.h文件
//create by changshengwuji
//email: netspider@163.com
//qq: 450353168
//2006.05.03
****************************************************************/
#include "../inc/MCS_X51.H"
#include "../inc/hardmap.h"
#include "../inc/MCS_X51LIB.H"
extern bit bit_10ms;
extern bit bit_10ms_over;
extern bit bit_400ms;
extern bit bit_400ms_over;
//************************************************************************
void delay(UINT8 t){ //call first 24us,after 16us
int s;
for(s=0;s<=t;s++);
}
void delay10ms(){
UINT8 i;
for(i=0;i<12;i++){
delay(60);
}
}
/*************************************************
//函数功能:1-wire总线复位。
//函数输入参数:无
//函数输出参数:返回UINT8。=0,表示复位成功。
// =1, 表示复位失败。
**************************************************/
UINT8 ibus_reset(){
UINT8 answer;
iwire=0;
delay(29);
iwire=1;
delay(3);
answer=iwire;
delay(25);
return(answer);
}
UINT8 read_bit(void){
UINT8 i;
iwire=0;
iwire=1;
for(i=0;i<3;i++);
return(iwire);
}
void write_bit(UINT8 b){
iwire=0;
if (b==1)
iwire=1;
delay(5); //delay 104uS
iwire=1;
}
//------------------------------
/*************************************************
//函数功能:从1-wire总线读取一个字节。
//函数输入参数:无
//函数输出参数:返回UINT8。读到的数据
**************************************************/
UINT8 read_byte(){
UINT8 i;
UINT8 value=0;
for(i=0;i<8;i++){
if(read_bit())
value|=0x01<<i;
delay(6); //wait for rest line
}
return(value);
}
//------------------------------
/*************************************************
//函数功能:向1-wire总线写一个字节。
//函数输入参数:要写的字节。UINT8类型。
//函数输出参数:无
**************************************************/
void write_byte(UINT8 byt){
UINT8 i;
UINT8 temp;
for ( i=0;i<8;i++){
temp=byt>>i;
temp=temp&0x01;
write_bit(temp);
}
delay(5);
}
/*************************************************
//函数功能:读取1-wire器件的ID号。
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。读到的数据存放于此。
//函数输出参数:无
**************************************************/
void read_rom(UINT8 *p){ //读ROM
UINT8 i;
write_byte(0x33);
for (i=0;i<8;i++){
*p=read_byte();
p++;
}
}
/*************************************************
//函数功能:ds18b20的命令,跳过命令 ,不执行操作。
//函数输入参数:无
//函数输出参数:无
**************************************************/
void write_skip(){ //跳过ROM指令
write_byte(0xcc);
}
//-----------------------------------
/*************************************************
//函数功能:写缓存命令。写3个字节到ds18b20的缓存中
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。用来写入的数据。
//函数输出参数:无
**************************************************/
void write_scratchpad(UINT8 *p){ //写缓存
UINT8 i;
write_byte(0x4e);
for(i=0;i<3;i++){
write_byte(*p);
p++;
}
}
//-----------------------------------
/*************************************************
//函数功能:读缓存命令。从ds18b20的缓存中读5个字节
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。存放读到的数据。
//函数输出参数:无
**************************************************/
void read_scratchpad(UINT8 *p){ //读缓存
UINT8 i;
write_byte(0xbe);
for(i=0;i<5;i++){
*p=read_byte();
p++;
}
}
//-----------------------------------
/*************************************************
//函数功能:读取温度命令。读取ds18b20转换的温度,3个字节
//函数输入参数:UINT8类型的指针,一般是一个数组的首地址。存放读到的数据。
//函数输出参数:无
**************************************************/节
void read_temperature(UINT8 *p){ //读转换结果
UINT8 i;
write_byte(0xbe);
for(i=0;i<3;i++){
*p=read_byte();
p++;
}
}
//-----------------------------------
/*************************************************
//函数功能:写缓存到内部eprom命令。将存到ds18b20缓存中的数据写到eprom中去。
//函数输入参数:无
//函数输出参数:无
//说明:需要延时10ms等待数据写入。
// 使用到了一个外部变量bit_10ms_over和bit_10ms.都为bit类型。
// bit_10ms置位表示定时开始,接着等待bit_10ms_over置位。在外部程序中延时10ms把bit_10ms_over置位。
// 也可以在这里直接定时10ms。
**************************************************/节
void copy_scratchpad(){ //使用直接电源。
write_byte(0x48);
bit_10ms=1;
bit_10ms_over = 0;
while(!bit_10ms_over);
bit_10ms_over = 0;
}
//-----------------------------------
/*************************************************
//函数功能:ds18b20开始转换命令。命令ds18b20转换温度。
//函数输入参数:无
//函数输出参数:无
//说明:需要延时最少400ms,根据采用电压不同延时时间也不同。不过转换完毕以后总线一直为高。转换中间总线
// 输出高低变化电平。
// 使用到了一个外部变量bit_400ms_over和bit_400ms.都为bit类型。
// bit_400ms置位表示定时开始,接着等待bit_400ms_over置位。在外部程序中延时400ms把bit_400ms_over置位。
// 也可以在这里直接定时400ms。
**************************************************/
void convert_t(){
write_byte(0x44);
//while(read_byte()!=0xff);
bit_400ms_over = 0;
bit_400ms = 1;
while(!bit_400ms_over);
bit_400ms_over = 0;
}
//-----------------------------------
/*************************************************
//函数功能:重新加载eeprom命令。
//函数输入参数:无
//函数输出参数:无
*************************************************/
void recall_eeprom(){
write_byte(0xb8);
while(read_byte()!=0xff);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -