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

📄 ds18b20.c

📁 小型便携式温度计的源代码第三版
💻 C
字号:
/***********************************************************************
;便携式温度计
;数码管引脚连接:a=P1.2 b=P1.1 c=P1.0 d=P1.3 e=P1.4 f=P1.6 g=P1.5 h=P1.7共阳;
;编写人:芦庆
;时间:2008年7月27日
;主控芯片:AT89C2051-24PU
;温度传感器:DS18B20
;占用资源:定时器0,P1口,P3.3,P3.4,P3.5
;晶振速度:6MHz
;版本:1.0
;
;ROM指令                       	       	代码
;Read ROM(读ROM)                 [33H]
;Match ROM(匹配ROM)           [55H]
;Skip ROM(跳过ROM]             [CCH]
;Search ROM(搜索ROM)           [F0H]
;Alarm search(告警搜索)          [ECH]
;
;存储器操作指令 					代码
;Write Scratchpad(写暂存存储器)  	[4EH]
;Read Scratchpad(读暂存存储器)  	[BEH]
;Copy Scratchpad(复制暂存存储器) 	[48H]
;Convert Temperature(温度变换)   		[44H]
;Recall EPROM(重新调出) 			[B8H]
;Read Power supply(读电源)	    		[B4H]
************************************************************************/

/*******************文件包含**********************/
#include <MAIN.H>

/*****************外部变量声明********************/
extern uchar flag;
extern uchar Temp[2];//原始温度数据
extern uchar DispLED[4];//数码管显示缓冲区

/*******************变量声明**********************/
uchar Temperature;
sbit dq=P3^7;//定义DS18B20数据引脚 

/**************************微秒级延时*********************/
void TempDelay (uchar us)
{
 	while(us--);
} 

/*****************18B20初始化函数***********************/
void Init18b20 ()
{
	dq=1;
	_nop_();
	dq=0;
	TempDelay(86/2);   //delay 530 uS//80
	_nop_();
	dq=1;
	TempDelay(14/2);   //delay 100 uS//14
	_nop_();
	_nop_();
	_nop_();
	
	if(dq==0)
		flag = 1;   //detect 1820 success!
	else
		flag = 0;    //detect 1820 fail!
	TempDelay(20/2);       //20
	_nop_();
	_nop_();
	dq = 1;
}

/**************************向18B20写入一个字节******************/
void WriteByte (uchar wr)  //单字节写入
{
	uchar i;
	for (i=0;i<8;i++)
	{
		dq = 0;
		_nop_();
		dq=wr&0x01;
		TempDelay(5/2);   //delay 45 uS //5
		_nop_();
		_nop_();
		dq=1;
		wr >>= 1;
	}
}

/*************************读18B20的一个字节***********************/
uchar ReadByte()     //读取单字节
{
	uchar i;
	uchar u=0;
	for(i=0;i<8;i++)
	{
		dq = 0;
		u >>= 1;
		dq = 1;
		if(dq==1)
		u |= 0x80;
		TempDelay (4/2);
		_nop_();
	}
	return(u);
}

/**********************延时函数****************************/
void mDelay(uint num)
{
	uint i;
	for(;num>0;num--)
	{	for(i=0;i<124;i++)
			{;}
	}
}

/********************温度转换全处理********************/
void Temperature_change(void)
{
	Init18b20 ();//初始化18B20
	WriteByte(0xcc);   //跳过ROM
	WriteByte(0x44);   //启动温度转换
	mDelay(50);//重要延时
	Init18b20 ();
	WriteByte(0xcc);   //跳过ROM
	WriteByte(0xbe);   //读取温度
	Temp[0]=ReadByte();//温度低8位
	Temp[1]=ReadByte();//温度高8位
	if(Temp[1]<0xF0)//温度大于0度
	{
		DispLED[3]=(Temp[0]&0x0F)*625/1000%10;//小数
		Temperature=(Temp[0]>>4)+(Temp[1]<<4);
		DispLED[2]=Temperature%10;//个位
		DispLED[1]=Temperature/10;//十位
		DispLED[0]=Temperature/100;//
	}
	else//温度小于0度
	{
		Temp[0]=~Temp[0]+1;
		Temp[1]=~Temp[1];
		DispLED[3]=(Temp[0]&0x0F)*625/1000%10;//小数
		Temperature=(Temp[0]>>4)+(Temp[1]<<4);
		DispLED[2]=Temperature%10;//个位
		DispLED[1]=Temperature/10;//十位
		DispLED[0]=Temperature/100+10;//百位+负号
	}
}
void init_1820(void)
{
	Init18b20 ();//初始化18B20
	if(flag==0)//效验错误
	{
		DispLED[0]=12;//字母F
		DispLED[1]=13;//字母A
		DispLED[2]=14;//字母L
		DispLED[3]=14;//字母L
	}
}

⌨️ 快捷键说明

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