📄 18b20.h
字号:
#ifndef __18b20_H
#define __18b20_H
#include "avr/io.h"
#include "c12864.h"
//变量类型标识的宏定义
#define uchar unsigned char
#define uint unsigned int
#define DS18B20_IO 2
#define DS18B20_IO_DDR DDRA
#define DS18B20_IO_POR PORTA
#define DS18B20_IO_PIN PINA
#define DS18B20_IO_OUT DS18B20_IO_DDR |= (1<<DS18B20_IO)//设为输出
#define DS18B20_IO_IN DS18B20_IO_DDR &=~(1<<DS18B20_IO)//设为输入
#define DS18B20_IO_H DS18B20_IO_POR |= (1<<DS18B20_IO)//置高电平
#define DS18B20_IO_L DS18B20_IO_POR &=~(1<<DS18B20_IO)//置低电平
#define DS18B20_IO_DATA DS18B20_IO_PIN &(1<<DS18B20_IO)//读出电平a
//精确延时us函数
//延时时间=(n*16 + 53) 1M晶振
//延时时间=(n*3.2 + 10.6) 5M晶振
//延时时间=(n*16/6 + 53/6) 6M晶振
//延时时间=(n*2.0 + 6.62) 8M晶振
void delay_10us(unsigned int n)//3.2us
{
while(n--);
}
//----------------------------------------------------------------------
//函数名称:DS18B20复位
//函数功能:
//注意事项:主机发送复位脉冲最少保持低电平480US,DS18B20等待15~60US
//提示说明:无
//输 入:
//返 回:1表示有检测到器件存在,0表示没检测到器件存在
//----------------------------------------------------------------------
unsigned char ds1820_reset(void)
{
unsigned char i;
DS18B20_IO_OUT;
DS18B20_IO_H;
DS18B20_IO_L;
delay_10us(380);//延时480-960us
DS18B20_IO_H;
DS18B20_IO_IN;
delay_10us(40);//延时15-60us
i=DS18B20_IO_DATA;
delay_10us(250);//延时>480us
if (i)
{
return 0;
}
else
{
return 1;
}
}
//--------------------------------------------------------------------
//函数名称:DS18B20读一个字节
//函数功能:
//注意事项:无
//提示说明:无
//输 入:
//返 回:读出的一个字节
//--------------------------------------------------------------------
unsigned char ds1820_read_byte(void)
{
unsigned char i,j;
unsigned char value = 0;
for (i = 0; i <8; i++)
{
DS18B20_IO_OUT;
DS18B20_IO_L;
delay_10us(1);
DS18B20_IO_H;
DS18B20_IO_IN;
j=DS18B20_IO_DATA;
if (j)
{
value |=(1<<i);
}
else
{
value &=~(1<<i);
}
delay_10us(35);//延时>60us
}
return(value);
}
//--------------------------------------------------------------------
//函数名称:DS18B20写一个字节
//函数功能:
//注意事项:无
//提示说明:无
//输 入:
//返 回:无
//--------------------------------------------------------------------
void ds1820_write_byte(unsigned char value)
{
unsigned char i;
for (i = 0; i <8; i++)
{
DS18B20_IO_OUT;
DS18B20_IO_L;
if (value&0x01)
{
DS18B20_IO_H;
}
else
{
DS18B20_IO_L;
}
delay_10us(40);//延时>64us
DS18B20_IO_H;
value>>=1;
}
}
//--------------------------------------------------------------------
//函数名称:DS18B20(1个)开始转换
//函数功能:
//注意事项:无
//提示说明:无
//输 入:
//返 回:无
//--------------------------------------------------------------------
void ds1820_start(void) {
ds1820_reset();
ds1820_write_byte(0xCC); //发出 Match (ROM)指令
ds1820_write_byte(0x44); /*启动转换*/
}
//--------------------------------------------------------------------
//函数名称:DS18B20(1个)读温度
//函数功能:
//注意事项:无
//提示说明:无
//输 入:
//返 回:一个long型的温度值,4位小数,范围-125.0000~+125.0000
//--------------------------------------------------------------------
unsigned long ds1820_read_temp(void) {
long i;
float data;
unsigned char buf[9];
ds1820_reset();
ds1820_write_byte(0xCC); //发出 Match (ROM)指令
ds1820_write_byte(0xbe); //发出读取温度指令
for (i = 0; i < 9; i++)
{
buf[i] = ds1820_read_byte();
}
i=buf[1];
i<<=8;
i|=buf[0];
data=i*0.0625;
i=data*10000;
return i;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -