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

📄 ds1820++.c

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 C
字号:
/*
DS18B20操作模块

	1、DS18B20的电源脚接到VCC及GND上面,数据线接到PA7口。
	2、晶振频率为内部1MHz。
	3、DS18B20由PA7口实现单总线访问,实现读取温度。
	4、此文件可以直接嵌入到项目中使用。
	
	AVR  mega16学习板
	AVR_AFA
	www.iccavr.com
	11:48 2007-6-30
*/

#include <iom16v.h>
#include <macros.h>

#define DQ_IN	DDRA &= ~(1 << PA7)		/*设置输入*/
#define DQ_OUT	DDRA |= (1 << PA7)		/*设置输出*/
#define DQ_CLR	PORTA &= ~(1 << PA7)	/*置低电平*/
#define DQ_SET	PORTA |= (1 << PA7)		/*置高电平*/
#define DQ_R	PINA & (1 << PA7)		/*读了电平*/

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

/*
延时函数
频率为1MHz,延时:i X 10 + 16uS*/
void delay_10us(unsigned char i) {

	if (i == 0) {
		return ;
		}
	while (i--) {
		NOP();
		NOP();
		NOP();
		NOP();
		}
}

/*DS18B20复位函数*/
unsigned char ds1820_reset(void) {

	unsigned char i;
	flag = SREG;				/*中断保护*/
	CLI();						/*关中断*/
	DQ_OUT;
	DQ_CLR;
	delay_10us(49);				/*延时500uS(480-960)*/
	DQ_SET;
	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;
		}
}

/*===================================================================
//	函数功能:	从 1-wire 总线上读取一个字节
//	形参:		void
//	返回:		unsigned char	读到的值
//	编写:		2004/8/25
===================================================================*/
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;
		DQ_CLR;
		NOP();					/*延时4uS*/
		NOP();
		NOP();
		NOP();
		DQ_SET;
		DQ_IN;
		NOP();					/*延时10uS*/
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		if (DQ_R) {
			value|=0x80;
			}
		delay_10us(5);			/*延时60uS*/
		}
	if (flag & 0x80) {			/*恢复中断状态*/
		SEI();
		}
	return(value);
}

/*===================================================================
//	函数功能:	向 1-WIRE 总线上写一个字节
//	形参:		value		写到总线上的值
//	返回:		void
//	编写:		2004/8/25
===================================================================*/
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();
		if (value & 0x01) {
			DQ_SET;
			}
		delay_10us(7);			/*延时80uS*/
		DQ_SET;					/*位结束*/
		value >>= 1;
		}
	if (flag & 0x80) {			/*恢复中断状态*/
		SEI();
		}
}

/*启动ds1820转换*/
void ds1820_start(void) {

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

/*===================================================================
//	函数功能:	读取温度
//	形参:		*temperature	温度存储空间
//	返回:		unsigned char	true为有效
//	编写:		2004/8/25
===================================================================*/
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;
}

/*===================================================================
//	函数功能:	读取Rom Code
//	形参:		*temp		DS18B20的Rom Code存储空间
//	返回:		unsigned char	true为有效
//	编写:		2004/8/25
===================================================================*/
/*unsigned char ds1820_read_rom(unsigned char *temp)
{
	ds1820_ack();
	write_byte(0x33);
	temp[0] = read_byte();
	temp[1] = read_byte();
	temp[2] = read_byte();
	temp[3] = read_byte();
	temp[4] = read_byte();
	temp[5] = read_byte();
	temp[6] = read_byte();
	temp[7] = read_byte();
	if(crccheck(temp,8))
		return	false;
	else
		return	true;
}*/

/*===================================================================
//	函数功能:	匹配DS18B20
//	形参:		*p	DS18B20的Rom Code
//	返回:		void
//	编写:		2004/8/25
===================================================================*/
/*void ds1820_match(unsigned char *p)
{
	unsigned char i;
	ds1820_ack();
	write_byte(0x55);	 
	for(i=0;i<8;i++)
		write_byte(p[i]);
}*/

⌨️ 快捷键说明

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