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

📄 ds18b20.c

📁 一个集合DS18B20的多路温度测量系统,加上adc0809数据采集,加上1602液晶显示的综合数据处理系统,有较高学习价值.
💻 C
字号:
#include "system.h"
#include "intrins.h"

sbit DQ = P3^7;						   //温度输入口

unsigned int h;


unsigned char ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};


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

/****************************DS18B20复位函数*******************************/
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位
	ow_reset();										  
	write_byte(0xCC);								  
	write_byte(0x44);								  //SKIP ROM
}													  //发转换命令




/***************************温度数据处理函数******************************/
void work_temp()
{
	unsigned char n = 0;
	if(temp_data[1] > 127)
	{
		temp_data[1] = (256-temp_data[1]);				//负温度求补码
		temp_data[0] = (256-temp_data[0]);
		n = 1;
	}

	display[4] = temp_data[0] & 0x0f;
	display[0] = ditab[display[4]];
	//display[3] = temp_data[0] & 0x0f;
	//display[0] = ditab[display[3]];

	display[4] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4);
	//display[3] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4);
	display[3] = display[4]/100;
	display[1] = display[4]%100;
	display[2] = display[1]/10;
	display[1] = display[1]%10;

	if(!display[3])								 //最高位为0时都不显示
	{
		display[3] = 0x0A;

		if(! display[2])
		{
			display[2] = 0x0A;
	    }
	}

	if(n)
	{
		display[3] = 0x0B;                            //负温度时最高位显示“-”
	}
}

⌨️ 快捷键说明

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