ds18b20_xin.c

来自「这是一个用keil-51编写的C51程序」· C语言 代码 · 共 134 行

C
134
字号
/*************************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 + =
减小字号Ctrl + -
显示快捷键?