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

📄 18b20._h

📁 avr基础程序大全
💻 _H
字号:
#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int 
#define DQ_IN	DDRC &= ~(1 << PA3)		/*设置输入*/
#define DQ_OUT	DDRC |= (1 << PA3)		/*设置输出*/
#define DQ_CLR	PORTC &= ~(1 << PA3)	/*置低电平*/
#define DQ_SET	PORTC |= (1 << PA3)		/*置高电平*/
#define DQ_R	PINC & (1 << PA3)		/*读了电平*/

uchar flag;/*中断标志缓存*/				
#define delay4us {NOP();NOP();NOP();NOP();}
#define delay10us {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();} 
void delay_10us(unsigned char i) {

	if (i == 0) {
		return ;
		}
	while (i--) {
		delay4us;
		}
}
/*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;
		}
}

/*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;
		DQ_CLR;
		delay4us;					/*延时4uS*/
		DQ_SET;
		DQ_IN;
		delay10us;					/*延时10uS*/
		if (DQ_R) {
			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;
		delay4us;					/*延时4uS*/
		if (value & 0x01) {DQ_SET;}
		//每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0						
		delay_10us(7);			/*延时80uS*/
		DQ_SET;					/*位结束*/
		value >>= 1;
		}
	if (flag & 0x80) {			/*恢复中断状态*/
		SEI();
		}
}

/*DS8B20读取温度信息*/
ds1820_read_temp(void) 
{

	unsigned int a = 0, b = 0, c = 0, t = 0;
    float tt = 0; 

      ds1820_reset();
	  ds1820_write_byte(0xCC);	/*勿略地址*/
	  ds1820_write_byte(0x44);	/*启动转换*/
	  ds1820_reset();
	  ds1820_write_byte(0xCC);	/*勿略地址*/
	  ds1820_write_byte(0xBE);	/*读取温度*/
         a = ds1820_read_byte(); //读取温度寄存器
         b = ds1820_read_byte();
         t = b;
         t <<= 8;
         t = t | a;

        tt = t * 0.0625;
        t = tt * 10 + 0.5; //放大10倍输出并四舍五入

        a = t / 100;              //十位
        b = t / 10 - a * 10;      //个位
        c = t - a * 100 - b * 10; //小数位
		locate(4,4);
		write_shuju(1,a+0x30);
		write_shuju(1,b+0x30);
		write_hz(".");
		write_shuju(1,c+0x30);
		delay(100);
}

⌨️ 快捷键说明

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