📄 ds18b20.c
字号:
#include <iom16v.h>
#include <macros.h>
#include "ds18b20.h"
#include "lm1602.h"
byte DS18B20_Reset(void) //DS18B20初始化函数
{
byte err=0;
DQ_OUT; //DQ复位
_NOP();
_NOP();
DQ_L;
delay_nus(300); //延时470us
// DQ_H;
DQ_IN;
delay_nus(60); //延时100us
if(DQ_IN_H)
err = 1;
delay_nus(60); //延时100us
return err;
}
void DS18B20_WriteBit(byte bitval)
{
DQ_OUT;
_NOP();
_NOP();
DQ_L;//将DQ线拉低,开始写时间隙
delay_nus(10); //延时30us
if(bitval == 1) //如果写1,DQ线拉高
DQ_H;
delay_nus(20); //延时30us
DQ_H;
}
byte DS18B20_ReadBit(void)
{
byte rbit = 0;
DQ_OUT;
_NOP();
_NOP();
DQ_L; //将DQ线拉低,开始写时间隙
delay_us(); //延时30us
//DQ_H;
// delay_nus(10); //延时
DQ_IN;
_NOP();
_NOP();
//
if(DQ_IN_H)
rbit =1;
delay_nus(40);
return (rbit);
}
void DS18B20_WriteChar(byte val)
{
byte i;
byte temp;
temp = val;
for(i = 0;i<8;i++)
{
temp =val>>i;
if((temp&0x01) == 0x01)
DS18B20_WriteBit(1);
else
DS18B20_WriteBit(0);
}
delay_nus(60); //延时
}
byte DS18B20_ReadChar(void) //读一个字节数据函数
{
unsigned char i = 0;
byte R_data = 0;
for (i=0;i<8;i++)
{
if(DS18B20_ReadBit())
R_data |=1<<i;
}
return (R_data);
}
unsigned int ReadTemperature(void) //读取温度函数
{
byte Rom[2];
unsigned int tempValue;
if(DS18B20_Reset())
{
return 0xffff;
}
DS18B20_WriteChar(0xcc) ; //跳过读序号列号的操作
DS18B20_WriteChar(0x44) ; //启动温度转换
delay_nus(100);
if(DS18B20_Reset())
{
return 0xffff;
}
DS18B20_WriteChar(0xCC) ; //跳过读序号列号的操作
DS18B20_WriteChar(0xBE) ; //读取温度寄存器
delay_nus(200);
Rom[0] = DS18B20_ReadChar() ; //读温度低8位
Rom[1] = DS18B20_ReadChar() ; //读温度高8位
/* *tempValue = Rom[1];
*tempValue <<= 8;
*tempValue |= Rom[0];*/
tempValue = Rom[1];
tempValue <<= 8;
tempValue |= Rom[0];
return tempValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -