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

📄 18b20.c

📁 一个集合DS18B20的多路温度测量系统,加上adc0809数据采集,加上1602液晶显示的综合数据处理系统,有较高学习价值.
💻 C
字号:
#include "system.h"
#include <INTRINS.H>				  //为调用nop空指令需要


sbit DQ    =    P3^7;						   //温度输入口
unsigned char c_b;
unsigned char c_b_c;
unsigned char n;

unsigned char data temp_data[2] = {0x00,0x00};                  //读出温度暂放

/****************************延时函数*******************************/
void delay(unsigned int t)
{
	for(;t > 0; t--);
}


/****************************DS18B20复位函数*******************************/
void ow_reset(void)
{
	char presence = 1;
	while (presence)
	{
		while (presence)
		{
			DQ = 1;

			_nop_();
			_nop_();

			DQ = 0;
			delay(50);

			DQ = 1;
			delay(6);

			presence = DQ;
		}
		delay (45);
		presence = ~DQ;
	}
	DQ  = 1;
}




/****************************DS18B20写命令函数*******************************/
//向1-wire    总线上写一个字节
void write_byte(unsigned char val)
{
	unsigned char i;
	for(i = 8; i > 0; i--)
	{
		DQ = 1;
		_nop_();
		_nop_();
		
		DQ = 0;	  											 //延时5us
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		
		DQ = val & 0x01;									//最低位益出
		delay(6);											//66us
		val = val / 2;										//右移一位
	}
	DQ = 1;
	delay(1);
}


/****************************DS18B20读字节函数*******************************/
unsigned char read_byte(void)
{
	unsigned char i;
	unsigned char value = 0;
	
	for(i = 8; i > 0; i--)
	{
		DQ = 1;;
		_nop_();
		_nop_();

		value >>= 1;
		DQ = 0;						  //4us
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		
		DQ = 1;						 //4us
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		
		if(DQ)
		value |= 0x80;
		delay(6);					 //66us
	}
	DQ = 1;
	return (value);
}


/***************************读出温度函数******************************/
void read_temp()
{
	
	ow_reset();										  //总线复位
	write_byte(0xCC);								  //发SKIP ROM命令
	write_byte(0xBE);								  //发读命令
	temp_data[0] = read_byte();						  //温度低8位
	temp_data[1] = read_byte();						  //温度高8位
	
	n = temp_data[1];									  //若n为1则为负温			
	if(n)								
	{								
		temp = (~temp_data[0]+1)/2;	//如果为负温则去除其补码	
	}								
	else							
	{								
		temp = (temp_data[0])/2;			
	}

	ow_reset();										  
	write_byte(0xCC);								  
	write_byte(0x44);								  //SKIP ROM
													  //发转换命令
}													  










/***************************温度数据处理函数******************************/
void work_temp()
{							
	if(temp_data[1] > 127)//负温度处理函数
	{
		temp_data[1] = (256-temp_data[1]);				//负温度求补码
		temp_data[3] = (256-temp_data[0]);	         	//负温度求补码
		display[3]   = temp_data[3] & 0x0f;

		display[4] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4);      //取出整数
		if(display[4] < 10 & display[4] >= 0)
		{
			display[1] = display[4]/1;
			display[2] = display[3]%10;
			c_b_c = 1;
			n = 1;
		}
		else
		{
			display[1] = display[4]/10;
			display[2] = display[4]%10;
			n = 1;
		}		
	}
	else
	{
		display[4] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4); //取出整数
		if(display[4] < 10 & display[4] >= 0)
		{
			display[0] = display[4]/1;
			
			//小数位
			display[1] = display[3]/10;
			display[2] = display[3]%10;
			c_b = 1;
		}
		else
		{
			display[0] = display[4]/10;
			display[1] = display[4]%10;

			//小数位
			display[2] = display[3]/10;
			c_b_c = 1;
		}
	}
} 

⌨️ 快捷键说明

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