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

📄 ds18b20.c

📁 目 的: 建立DS18B20操作库 目标系统: 基于avr单片机 应用软件: AVRGCC 版 本: Version 1.2 圆版时间: 2007-09-25 开发人员: heshw
💻 C
字号:
/********************************************************************* 
目    的:   建立DS18B20操作库 
目标系统:   基于avr单片机 
应用软件:   AVRGCC                                               
版    本:   Version 1.2 
圆版时间:   2007-09-25 
开发人员:   heshw99 
*********************************************************************/ 
#include <stdint.h> 
#include <avr/io.h> 
#include "stdio.h"
#include <util/delay.h> 
#include "stdlib.h"
#include "delay.h"
//#include <avr/signal.h> 
#include <avr/interrupt.h> 

//变量类型标识的宏定义 
#define                uchar        unsigned char 
#define                uint         unsigned int  

#ifndef  FREQ 
#define  FREQ    (20)  
#endif  

#define DQ_IN DDRC &= ~(1 << PC6);  /*设置输入*/ 
#define DQ_OUT DDRC |= (1 << PC6);  /*设置输出*/ 
#define DQ_CLR PORTC &= ~(1 << PC6); /*置低电平*/ 
#define DQ_SET PORTC |= (1 << PC6);  /*置高电平*/ 
#define DQ_R PINC & (1 << PC6);  /*读了电平*/ 
#define NOP() asm("nop")

unsigned char flag;      /*中断标志缓存*/ 


#define delay_10us(x)         _delay_loop_2((uint)((x)*10*FREQ/4)) 

/*-------------------------------------------------------------------- 
函数名称:DS18B20复位 
函数功能: 
注意事项:主机发送复位脉冲最少480US,DS18B20等待15~60US 
提示说明:无 
输    入: 
返    回:无 
--------------------------------------------------------------------*/ 
unsigned char ds1820_reset(void) { 

	unsigned char i; 
	flag = SREG;    /*中断保护*/ 
	cli();      /*关中断*/ 
	DQ_OUT; 
	asm("nop");
	DQ_CLR; 
	delay_10us(49);    /*延时500uS(480-960)*/ 
	DQ_SET; 
	asm("nop");
	DQ_IN; 
	delay_10us(7);    /*延时80uS*/ 
	i = DQ_R; 
	delay_10us(49);    /*延时500uS(保持>480uS)*/ 
	if (flag & 0x80) {   /*恢复中断状态*/ 
		sei(); 
	} 
	if (i) { 
		return 0x00; 
	} 
	else { 
		return 0x01; 
	} 
} 

/*-------------------------------------------------------------------- 
函数名称:DS18B20读一个字节 
函数功能: 
注意事项:无 
提示说明:无 
输    入: 
返    回:一个字节 
--------------------------------------------------------------------*/ 
unsigned char ds1820_read_byte(void) 
{ 
	unsigned char i; 
	unsigned char value = 0; 
	flag = SREG;    /*中断保护*/ 
	cli();      /*关中断*/ 
	for (i = 8; i != 0; i--) 
	{ 
		value >>= 1; 
		DQ_OUT; 
		asm("nop");
		DQ_CLR; 
		asm("nop");
		DQ_SET; 
		asm("nop");
		DQ_IN; 
		asm("nop");
		if (PINC & (1 << PC0)) 
		value|=0x80;         
		delay_10us(5);   /*延时60uS*/ 
	} 
	if (flag & 0x80) 
	{   /*恢复中断状态*/ 
		sei(); 
	} 
	return(value); 
} 

/*-------------------------------------------------------------------- 
函数名称:DS18B20写一个字节 
函数功能: 
注意事项:无 
提示说明:无 
输    入: 
返    回:无 
--------------------------------------------------------------------*/ 
void ds1820_write_byte(unsigned char value) 
{ 
	unsigned char i; 
	flag = SREG;    /*中断保护*/ 
	cli();      /*关中断*/ 
	for (i = 8; i != 0; i--) { 
		DQ_OUT; 
		DQ_CLR; 
		NOP();     /*延时4uS*/ 
		NOP(); 
		NOP(); 
		NOP(); 
		NOP();     
		NOP(); 
		NOP(); 
		NOP(); 
		NOP(); 
		NOP(); 
		if (value & 0x01) 
		{ 
			DQ_SET; 
		} 
		delay_10us(7);   /*延时80uS*/ 
		DQ_SET;     /*位结束*/ 
		value >>= 1; 
	} 
	if (flag & 0x80) {   /*恢复中断状态*/ 
		sei(); 
	} 
} 

/*-------------------------------------------------------------------- 
函数名称:DS18B20(1个)开始转换 
函数功能: 
注意事项:无 
提示说明:无 
输    入: 
返    回:无 
--------------------------------------------------------------------*/ 
void ds1820_start(void) { 

	ds1820_reset(); 
	ds1820_write_byte(0xCC); /*勿略地址*/ 
	ds1820_write_byte(0x44); /*启动转换*/ 
} 

/*-------------------------------------------------------------------- 
函数名称:DS18B20(1个)读温度 
函数功能: 
注意事项:无 
提示说明:无 
输    入: 
返    回:温度 
--------------------------------------------------------------------*/ 
unsigned int ds1820_read_temp(void) { 

	unsigned int i; 
	unsigned char buf[9]; 

	ds1820_reset(); 
	ds1820_write_byte(0xCC); /*勿略地址*/ 
	ds1820_write_byte(0xBE); /*读取温度*/ 
	for (i = 0; i < 9; i++) 
	{ 
		buf[i] = ds1820_read_byte(); 
	} 
	i = buf[1]; 
	i <<= 8; 
 	i |= buf[0]; 

 	i=i*0.0625; 
  
 	return i; 
} 

// UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
	UCSRB = 0x00; //disable while setting baud rate
	UCSRA = 0x00;
	UCSRC = URSEL|0x06;
	//UBRRL = 0x33; //set baud rate lo
	UBRRL = 0x81; //set baud rate lo
	UBRRH = 0x00; //set baud rate hi
	UCSRB = 0x98;
}

int main(void) 
{ 
	unsigned int nTemp;
	uart0_init();
 	ds1820_reset(); 
	
 	while(1) 
 	{ 
		ds1820_start(); 
        delay_10us(20); 
        nTemp=ds1820_read_temp(); 

		//nTemp=0x1234;
		while ( !( UCSRA & (1<<UDRE)) );
		UDR=nTemp>>8;
		while ( !( UCSRA & (1<<UDRE)) );
		UDR=nTemp;
		while ( !( UCSRA & (1<<UDRE)) );
		UDR=13;
		while ( !( UCSRA & (1<<UDRE)) );
		UDR=10;
		delay_nms(600);
 	} 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -