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

📄 ds18b20.c

📁 51单片机驱动的LED点阵万年历显示
💻 C
字号:
#include<reg52.h>
#include<rtx51tny.h>
#include"inc/define.h"
#include"inc/utility.h"
#include"inc/ds18b20.h"

sbit DS18B20_DQ= P1^4; 	//单总线引脚

extern vu8 idata week_tempert[8];



/*********************************************************
*将获取的当前温度设置为待显示数据
*函数名称:setTempertShowData()
*说明:这是一个RTX51任务,os_create_task(3)之后开始运行
*********************************************************/
void setTempertShowData(void ) _task_ 8
{
	t_tempert tempert;
	while(1)
	{
		getTempert(&tempert);

		if(tempert.flag>0)
			week_tempert[3]=12;
		else 
			week_tempert[3]=11;
		week_tempert[4]=(tempert.tempert>>4) & 0x0F;
		week_tempert[5]=tempert.tempert & 0x0F;

		os_wait(K_TMO,20,0);
	}
}


/**********************************************************
*DS1820复位及存在检测(通过存在脉冲判断有无正常工作的DS1820)
*函数名称:DS1820_reset()
*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在
**********************************************************/
bit DS18B20_reset()
{
	bit flag;    
 	DS18B20_DQ = 0;		//拉低总线
 	delay20US(30);		//延时至少480us,产生复位脉冲
 	DS18B20_DQ = 1;  	//释放总线
 	delay20US(4); 		//延时60--240微秒后对总线采样
 	flag=DS18B20_DQ;
 	delay20US(15); 		//延时至少240微秒等待总线恢复

 	return flag;  
}


/**********************************************************
*写数据到DS1820
*函数名称:DS1820_inputByte()
*说明:
**********************************************************/
void DS18B20_inputByte(u8 ibyte)
{
	u8 i,delay;
	for (i=8;i>0;i--)
	{
		DS18B20_DQ = 0;  	//拉低总线,产生写信号
		for(delay=2;delay>0;delay--) ; 	//延时4us
		DS18B20_DQ = ibyte&0x01; 		//发送1位
		delay20US(4); 		//写时序至少要60us--120us
		DS18B20_DQ = 1;  	//释放总线,等待总线恢复
		ibyte>>=1; 			//准备下一位数据的传送
	}
}


/**********************************************************
*从DS1820中读出数据
*函数名称:DS1820_outputByte()
*说明:
**********************************************************/
u8 DS18B20_outputByte()
{
	u8 i,delay,obyte;
	for (i=8;i>0;i--)
  	{
  		obyte>>=1;
  		DS18B20_DQ = 0;   	//拉低总线,产生读信号
  		for(delay=2;delay>0;delay--); 	//延时4us
   		DS18B20_DQ = 1; 	//释放总线,准备读数据
  		for (delay=4;delay>0;delay--); 	//延时8微秒读数据
   		if (DS18B20_DQ == 1)
    		obyte |= 0x80;
		delay20US(4); 		//延时80us
  		DS18B20_DQ = 1;  	//拉高总线,准备下一位数据的读取.
	}
	return obyte;//返回读到的数据
}


/**********************************************************
*获取当前温度
*函数名称:getTempert()
*说明:
**********************************************************/
void getTempert(t_tempert * t)
{
	u8 i;
	u8 tempert[2];
	
	DS18B20_reset();    		//复位
	DS18B20_inputByte(0xcc); 	//跳过ROM命令
	DS18B20_inputByte(0x44); 	//温度转换命令
	os_wait(K_TMO,100,0);		//完成温度转换至少需要750ms	
	DS18B20_reset();    		//复位
	DS18B20_inputByte(0xcc); 	//跳过ROM命令
	DS18B20_inputByte(0xbe); 	//读DS1820温度暂存器命令
	for (i=0;i<2;i++)
		tempert[i]=DS18B20_outputByte();
	DS18B20_reset();    		//复位,结束读数据
		
	if(tempert[1] & 0xF8==0)
		(*t).flag=1;
	else
		(*t).flag=-1;
	(*t).tempert=((tempert[1] & 0x07)<<4) + ((tempert[0] & 0xF0)>>4);
 }

⌨️ 快捷键说明

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