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

📄 ds18b20.c

📁 基于AVR单片机
💻 C
字号:
#include <mega16.h>
#define PD6 6
#define DQ_IN	DDRD &= ~(1 << PD6)		/*设置输入*/
#define DQ_OUT	DDRD |= (1 << PD6)		/*设置输出*/
#define DQ_CLR	PORTD &= ~(1 << PD6)	/*置低电平*/
#define DQ_SET	PORTD |= (1 << PD6)		/*置高电平*/
#define DQ_R	PIND & (1 << PD6)		/*读了电平*/
unsigned char flag;						/*中断标志缓存*/
/*
延时函数
延时时间:10um
CPU频率为:4MHz。
*/      
void delay_2us(void)
{  #asm("NOP");
   return;
}       
void delay_10us(unsigned char i) {

	 unsigned char j;
	
	while (i--) {   
	      j=5;
	      while(j--);	      	      		
		}
}
/*DS18B20复位函数*/
unsigned char ds1820_reset(void) {

	unsigned char i;
	flag = SREG;				/*中断保护*/
	#asm("cli")						/*关中断*/
	DQ_OUT;
	DQ_CLR;
	delay_10us(50);				/*延时500uS(480-960)*/
	DQ_SET;
	DQ_IN;
	delay_10us(8);				/*延时80uS*/
	i = DQ_R;
	delay_10us(50);				/*延时500uS(保持>480uS)*/
	if (flag & 0x80) {			/*恢复中断状态*/
		#asm("sei")
		}
	if (i) {
	  	return 0x00;
	 	}
	else {
		return 0x01;
		}
}
/*DS18B20字节读取函数*/
unsigned char ds1820_read_byte(void) {
	unsigned char i;
	unsigned char value = 0;
	flag = SREG;				/*中断保护*/
	#asm("cli")						/*关中断*/
	for (i = 8; i != 0; i--) {
		value >>= 1;
		DQ_OUT;
		DQ_CLR;
		delay_2us();					/*延时4uS*/
		delay_2us();
		
		DQ_SET;
		DQ_IN;
		delay_10us(1);					/*延时10uS*/
		if (DQ_R) {
			value|=0x80;
			}
		delay_10us(6);			/*延时60uS*/
		}
	if (flag & 0x80) {			/*恢复中断状态*/
		#asm("sei")
		}
	return(value);
}
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) {

	unsigned char i;
	flag = SREG;				/*中断保护*/
	#asm("cli")						/*关中断*/
	for (i = 8; i != 0; i--) {
		DQ_OUT;
		DQ_CLR;
		delay_2us();					/*延时4uS*/
		delay_2us();
		if (value & 0x01) {
			DQ_SET;
			}
		delay_10us(8);			/*延时80uS*/
		DQ_SET;					/*位结束*/
		value >>= 1;
		}
	if (flag & 0x80) {			/*恢复中断状态*/
		#asm("sei")
		}
}
/*启动ds1820转换*/
void ds1820_start(void) {

	ds1820_reset();
	ds1820_write_byte(0xCC);	/*勿略地址*/
	ds1820_write_byte(0x44);	/*启动转换*/
}
/*DS8B20读取温度信息*/
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];	
	return i;
}

⌨️ 快捷键说明

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