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

📄 ds1802.c

📁 多功能电子数字钟的设计 带语音报时功能 比赛做的
💻 C
字号:
/*******************************DS18B20单总线模块*****************************/

#include "Includes.h"			//文件包含 
/*************************************************
    模块级变量申明                 
*************************************************/
static    void 	        OneWire_Rst(void);
static    void 	        OneWire_Init(void);
static    void 	        OneWire_WriteByte(unsigned char cmd);
static  unsigned char 	OneWire_ReadByte(void);
static    void 	        OneWire_Idle(void);
/*************************************************
    子函数定义                  
*************************************************/

/*******************************************************************************
*** 函 数 名: static void OneWire_Init(void)
*** 功能描述: 
*** 全局变量: 
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  
*** 修 改 人:			 							
*** 函数说明: 单总线数据传输初始化;
/******************************************************************************/
static 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;				//提升数据线,准备数据传输
 }
/*******************************************************************************
*** 函 数 名: static void OneWire_Rst(void)
*** 功能描述: 
*** 全局变量: No !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 单总线Reset pulse;
/******************************************************************************/
static void OneWire_Rst(void)
{
	DQ = 0;				//拉低数据线,准备Reset OneWire Bus;
	Delay_Xus(125);		//延时511us,Reset One-Wire Bus.
	DQ = 0;
	Delay_Xus(125);
	}
/*******************************************************************************
*** 函 数 名: static void OneWire_WriteByte(unsigned char cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输		入: cmd:8bit;
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
static void OneWire_WriteByte(unsigned char cmd)
{
	unsigned char 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;
		}
	}
/*******************************************************************************
*** 函 数 名: static unsigned char OneWire_ReadByte(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: 8bit data;
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
static unsigned char OneWire_ReadByte(void)
{
	unsigned char i;
	unsigned char 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;	
	}
/*******************************************************************************
*** 函 数 名: static void OneWire_Idle(void)
*** 功能描述: 总线空闲模式;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
static void OneWire_Idle(void)
{
	DQ = 1;
	NOP();
	}
/*******************************************************************************
*** 函 数 名: extern void DS18B20_Init(void)
*** 功能描述: 器件DS18B20初始化;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
extern void DS18B20_Init(void)
{
	OneWire_Init();
	}
/*******************************************************************************
*** 函 数 名: extern void DS18B20_RomCmd(unsigned char 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.
/******************************************************************************/
extern void DS18B20_RomCmd(unsigned char romCmd)		//仅写了SkipRom例程;
{
	switch(romCmd)
	{
		case 0xcc:			//Skip Rom command;
			OneWire_WriteByte(0xcc);
			break;
		
		default:
			break;	
		}
	}
/*******************************************************************************
*** 函 数 名: extern void DS18B20_MemCmd(unsigned char memCmd)
*** 功能描述: DS18B20Memory 操作命令;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 仅写了ConvertT(0x44) 和0xBE命令;
							0x44:Convert T; 0xbe:Read Scratch-pad;
/******************************************************************************/
extern void DS18B20_MemCmd(unsigned char 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;	
		}
	}
/*******************************************************************************
*** 函 数 名: extern void DS18B20_ReadDat(unsigned char len,unsigned char *buf)
*** 功能描述: 读取DS18B20内部的Scratchpad内容;
*** 全局变量: NO !
*** 输		入: len:将要读取的数据长度;
*** 输		出: buf:数据缓存;
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
extern void DS18B20_ReadDat(unsigned char len,unsigned char *buf)
{
	unsigned char i;
	for(i=0;i<len;i++)
	{
		buf[i] = OneWire_ReadByte();
		}
	OneWire_Rst();
	OneWire_Idle();	
	}
/*******************************************************************************
*** 函 数 名: extern void DS18B20_Busy(void)
*** 功能描述: 内部模数转换中,忙
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:			 							日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
extern void DS18B20_Busy(void)
{
	OneWire_Idle();
	}
/***********读取温度函数***************************************************/
extern void Read_onetemp(unsigned char *datTm)
{
	DS18B20_Init();
	DS18B20_RomCmd(0xcc);	//Skip Rom command;
	Delay_Xms(3);
	DS18B20_MemCmd(0x44);	//Convert T command;
	Delay_Xms(5);
	DS18B20_Init();
	DS18B20_RomCmd(0xcc);
	DS18B20_MemCmd(0xbe);
	DS18B20_ReadDat(2,datTm);
}

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

⌨️ 快捷键说明

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