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

📄 one-wire.c

📁 12864液晶显示万年历的51单片机仿真和程序 程序是C语言写的。仿真用的proteus
💻 C
字号:
/******************************************************************************/
/**
/** 模 块 名: -------------------One-Wire.C----------------------------------
/**            -----------------DS18B20单总线模块----------------------------*/
/** 功能描述: 
/**
/** 创 建 人: huangtiexiong   	日期:2006-11-28   */
/** 修 改 人:                 	日期:2006-11-28   */ 
/** 其他说明: 
/******************************************************************************/

//#include "Includes.h"			//文件包含
#include 		<reg52.h>
#include    <intrins.h>
#include    <string.h>
#include 	"One-Wire.h"

#define int8u unsigned char

/*************************************************
    模块级变量申明                 
*************************************************/
/* void 	OneWire_Rst(void);
 void 	OneWire_Init(void);
 void 	OneWire_WriteByte(int8u cmd);
 int8u 	OneWire_ReadByte(void);
 void 	OneWire_Idle(void);	  */

 void Delay_Xus(int8u x)		//x取值1~255;
{
	while(--x);
//	int8u i;
//	x /= 8;
//	for(i=0;i<x;i++);
	}

 void Delay_Xms(int8u x)		//x取值1~255;
{
	int8u i,j;
	for(i=0;i<x;i++)
	for(j=0;j<200;j++)
	{
		_nop_();
		_nop_();
	}
}

/*************************************************
    子函数定义                  
*************************************************/

/*******************************************************************************
*** 函 数 名:  void OneWire_Init(void)
*** 功能描述: 
*** 全局变量: 
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 单总线数据传输初始化;
/******************************************************************************/
 void OneWire_Init(void)
{
	DQ = 1;
	_nop_();;
	DQ = 0;						//拉低数据线,准备Reset OneWire Bus;
	Delay_Xus(125);		//延时510us,Reset One-Wire Bus.
	Delay_Xus(125);
	
	DQ = 1;						//提升数据线;
	Delay_Xus(15);		//延时35us;
	
	while(DQ)					//等待Slave 器件Ack 信号;
	{
		_nop_();;
		}
	Delay_Xus(60);		//延时125us;	
	DQ = 1;						//提升数据线,准备数据传输;
	}
/*******************************************************************************
*** 函 数 名:  void OneWire_Rst(void)
*** 功能描述: 
*** 全局变量: No !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 单总线Reset pulse;
/******************************************************************************/
 void OneWire_Rst(void)
{
	DQ = 0;						//拉低数据线,准备Reset OneWire Bus;
	Delay_Xus(125);		//延时511us,Reset One-Wire Bus.
	DQ = 0;
	Delay_Xus(125);
	}
/*******************************************************************************
*** 函 数 名:  void OneWire_WriteByte(int8u cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输		入: cmd:8bit;
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
 void OneWire_WriteByte(int8u cmd)
{
	int8u i;
	for(i=0;i<8;i++)
	{
		if(cmd & 0x01)		//低位在前;
			{
				DQ = 0;				//结束Recovery time;
				_nop_();;
				_nop_();;
				_nop_();;
				DQ = 1;				//发送数据;
				}
		else
			{
				DQ = 0;				//结束Rec time;
				_nop_();;
				_nop_();;
				_nop_();;		
				//DQ = 0;			//发送数据;
				}
		Delay_Xus(30);		//等待Slave Device采样;
		DQ = 1;						//Recovery;
		_nop_();;						//Recovery Time Start;
		cmd >>= 1;
		}
	}
/*******************************************************************************
*** 函 数 名:  int8u OneWire_ReadByte(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: 8bit data;
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
 int8u OneWire_ReadByte(void)
{
	int8u i;
	int8u tmp = 0;
	DQ = 1;							//准备读;
	_nop_();;
	for(i=0;i<8;i++)
	{
		tmp >>= 1;				//低位先发;
		DQ = 0;						//Read init;
		_nop_();					//2ms;
		DQ = 1;						//必须写1,否则读出来的将是不预期的数据;
		Delay_Xus(2);			//延时9us;
		_nop_();
		if(DQ)						//在12us处读取数据;
			tmp |= 0x80;
		Delay_Xus(30);		//延时55us;
		DQ = 1;						//恢复One Wire Bus;
		_nop_();;
		}
	return tmp;	
	}
/*******************************************************************************
*** 函 数 名:  void OneWire_Idle(void)
*** 功能描述: 总线空闲模式;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
 void OneWire_Idle(void)
{
	DQ = 1;
	_nop_();;
	}
/*******************************************************************************
*** 函 数 名:  void DS18B20_Init(void)
*** 功能描述: 器件DS18B20初始化;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
 void DS18B20_Init(void)
{
	OneWire_Init();
	}
/*******************************************************************************
*** 函 数 名:  void DS18B20_RomCmd(int8u romCmd)
*** 功能描述: DS18B20Rom操作命令写;
*** 全局变量: NO !
*** 输		入: romCmd;
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 0x33:Read Rom; 0x55:Match Rom; 0xcc:Skip rom; 0xf0: Search rom;
							0xec:Alarm Search.
/******************************************************************************/
 void DS18B20_RomCmd(int8u romCmd)		//仅写了SkipRom例程;
{
	switch(romCmd)
	{
		case 0xcc:			//Skip Rom command;
			OneWire_WriteByte(0xcc);
			break;
		
		default:
			break;	
		}
	}
/*******************************************************************************
*** 函 数 名:  void DS18B20_MemCmd(int8u memCmd)
*** 功能描述: DS18B20Memory 操作命令;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 仅写了ConvertT(0x44) 和0xBE命令;
							0x44:Convert T; 0xbe:Read Scratch-pad;
/******************************************************************************/
 void DS18B20_MemCmd(int8u memCmd)		
{
	switch(memCmd)
	{
		case 0x44:		//Start to Convert temperature;
			OneWire_WriteByte(0x44);
			_nop_();;
			DS18B20_Busy();
			Delay_Xms(250);		//延时750ms;
			Delay_Xms(250);
			Delay_Xms(250);
			break;
		
		case 0xbe:		//Read scratchpad;
			OneWire_WriteByte(0xbe);
			break;
				
		default:
			break;	
		}
	}
/*******************************************************************************
*** 函 数 名:  void DS18B20_ReadDat(int8u len,int8u *buf)
*** 功能描述: 读取DS18B20内部的Scratchpad内容;
*** 全局变量: NO !
*** 输		入: len:将要读取的数据长度;
*** 输		出: buf:数据缓存;
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
 void DS18B20_ReadDat(int8u len,int8u *buf)
{
	int8u i;
	for(i=0;i<len;i++)
	{
		buf[i] = OneWire_ReadByte();
		}
	OneWire_Rst();
	OneWire_Idle();	
	}
/*******************************************************************************
*** 函 数 名:  void DS18B20_Busy(void)
*** 功能描述: 内部模数转换中,忙
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
 void DS18B20_Busy(void)
{
	OneWire_Idle();
	}


/*******************************************************************************
****                              End Of File
*******************************************************************************/

⌨️ 快捷键说明

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