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

📄 ds18b20_xin.c

📁 这是一个用keil-51编写的C51程序
💻 C
字号:
/*************************DS18B20温度计******************************/
#include "reg51.h"
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P3^7;	//温度输出管脚定义

/**************************温度小数部分查表****************************/


uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,
                      0x06,0x07,0x08,0x08,0x09,0x09};
uchar data temp_data[2]={0x00,0x00};
extern unsigned char Data[5]={0x00,0x00,0x00,0x00,0x00};

uint h;
/**********************************************************************/

/**************************函数申明部分********************************/
void delay(uint t);
ow_reset(void);
void write_byte(uchar val);
uchar read_byte(void);
void read_temp();
void work_temp();
/**********************************************************************/

/***************************11US延时函数*******************************/
void delay(uint 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写命令函数************************/
void write_byte(uchar val)		 
{
	uchar i;
	for(i=8;i>0;i--)
	{
		DQ=1;_nop_();_nop_();
		DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
		DQ=val&0x01;
		delay(6);
		val=val/2;
	}
	DQ=1;
	delay(1);
}
/**********************************************************************/
/*****************************DS18B20读1字节函数**********************/
uchar read_byte(void)	  
{
	uchar i;
	uchar value=0;
	for(i=8;i>0;i--)
	{
		DQ=1;_nop_();_nop_();
		value>>=1;
		DQ=0;
		_nop_();_nop_();_nop_();_nop_();
		DQ=1;_nop_();_nop_();_nop_();_nop_();
		if(DQ)value|=0x80;
		delay(6);
	}
	DQ=1;
	return(value);
}
/**********************************************************************/
/**************************读取温度*************************************/
void read_temp()
{
	ow_reset();
	write_byte(0xcc);
	write_byte(0xbe);
	temp_data[0]=read_byte();
	temp_data[1]=read_byte();
	ow_reset();
	write_byte(0xcc);
	write_byte(0x44);
}
/**********************************************************************/
/***************************温度数据处理函数**************************/
void work_temp()		 
{
	uchar n=0;
	if(temp_data[1]>127)
	{
		temp_data[1]=(256-temp_data[1]);
		temp_data[0]=(256-temp_data[0]);n=1;
	}

	Data[4]=temp_data[0]&0x0f;
	Data[0]=ditab[Data[4]];	 //0.1位
	Data[4]=((temp_data[0]&0xf0) >> 4)|((temp_data[1]&0x0f)<<4);
	Data[3]=Data[4] / 100;
	Data[1]=Data[4] % 100;
	Data[2]=Data[1] / 10;	 //十位
	Data[1]=Data[1] % 10;	 //个位
	
	if(!Data[3])
	{
		Data[3]=0x0a;
		if(!Data[2]) Data[2]=0x0a;
	}
	if(n) Data[3]=0x0b;


}
/**********************************************************************/

⌨️ 快捷键说明

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