📄 18b20.c
字号:
/*
********************************************************
* 文件: 18b20.c
* 功能: AVR微控制器 VS 温度芯片DS18B20(TO-92)
* 工具: (WINAVR-GCC)
* 作者: cht
* 日期: 1/29/2007
* 版本: 0.1
* 声明:
********************************************************
*/
#ifndef d18b20_c_
#define d18b20_c_
#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include "18b20.h"
/*----------------------------------------------------------
* 配置avr和18b20的接口
*/
void DS18b20_config(void)
{
DDRD &= ~OW_18B20; //输入模式(上电为高电平)
PORTD &= ~OW_18B20; //输出锁存器写0,以后不改
}
/*----------------------------------------------------------
* 复位操作(每一次操作前都要复危)flag 表示是否探测到18b20
*/
uint8_t DS18b20_rest(void)
{
uint8_t flag;
flag = 0;
OW_TO_L(); //设置总线为低电平
wait_us(490); //至少480us
cli();
OW_TO_H(); //设置总线为高电平
wait_us(67.5); //18b20等待(15-60us)+ 18b20拉低电平(60-240us)
if (OW_STATUS())
{
flag = 0; //没有18b20
}
else
{
flag = 1; //有18b20
};
sei();
wait_us(490-67.5);
return(flag);
}
/*-------------------------------------------------------------
* 写命令到18b20
*/
void DS18b20_write(uint8_t command)
{
uint8_t count;
for(count=0;count<8; count++)
{
cli();
OW_TO_L();
wait_us(2); //每传送一位至少要隔1us
if (command & 0X01)
{
OW_TO_H();
}
else
{
OW_TO_L();
};
command = command>>1;
wait_us(62);
OW_TO_H();
sei();
wait_us(2);
}
}
/*-----------------------------------------------------------------
* DS18B20读配置或数据
*/
uint8_t DS18b20_read(void)
{
uint8_t count,data;
data = 0x00;
for (count=0; count<8; count++)
{
cli();
OW_TO_L();
wait_us(2);
OW_TO_H();
wait_us(4);
data = data>>1;
if (OW_STATUS())
{
data|= 0x80; //读取总线电平,先接受低位再接受高位
};
sei();
wait_us(62);
}
return(data);
}
/*------------------------------------------------------------------
*开始采集温度
*/
void covert_t(void)
{
if (DS18b20_rest())
{
DS18b20_write(0xcc); //由于只有一个18b20跳过多器件识别
DS18b20_write(0x44); //启动温度转换
}
}
/*------------------------------------------------------------------
* 读出18b20采集的温度数据,
*/
uint16_t read_t(void)
{
uint16_t value ;
value = 0x0000;
if(DS18b20_rest())
{
DS18b20_write(0xcc); //由于只有一个18b20跳过多器件识别
DS18b20_write(0xbe); //读出18b20 RAM中的内容
}
value = DS18b20_read(); //读出低字节
value += DS18b20_read()<<8; //读出高字节
return value;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -