⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20.c

📁 avr单片机编写的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 + -