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

📄 ds1820.c

📁 了解温度测量的原理掌握温度数据采集的程序设计方法掌握单总线器 件的编程方法 本实验板采用的温度传感器DS18B20 是美国DALLAS 公司推出的增强型单总线数字 温度传感器
💻 C
字号:
#include "c8051F020.h"
#include <intrins.h>

/*
	数字温度传感器DS18b20试验

	试验准备:用连接线将JH端子的DS12B80位与CN7或CN8的P37口相连
	运行此程序,温度值将在数码管上显示.用手触摸T1芯片(DS18B20)
	观察温度变化.

*/

#define DataPortDS1820 P37

void Delay1us(unsigned char us)
{
	while (us)
	{
	  _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	  --us;
	}
/*
   TCON  &= ~0xc0;              // STOP Timer1 and clear overflow flag
   TMOD  &= ~0xf0;              // configure Timer1 to 16-bit mode
   TMOD  |=  0x10;
   CKCON |=  0x10;              // Timer1 counts SYSCLKs

   TR1 = 0;                     // STOP Timer1
   TH1 = (-SYSCLK/us) >> 8;		// set Timer1 to overflow in us
   TL1 = -SYSCLK/us;
   TR1 = 1;         			// START Timer1
   while (TF1 == 0);            // wait for overflow
   TF1 = 0;                     // clear overflow indicator
*/
}



void Delay15us(void)  
{
	Delay1us(15);
}


void Delay10us(void)
{	
	Delay1us(10);
}

bit RstDS1820(void)  //返回0-有设备连接1-无设备连接
{
unsigned char i;
bit RstFlag;
	RstFlag=1;	
	DataPortDS1820=0;
	for (i=0;i<100/*40*/;i++)	//480us
		Delay15us(); 
	DataPortDS1820=1;
	for (i=0;i<4;i++)	//15us-60us
	{
		Delay15us();
	}
	for (i=0;i<16;i++)	//60us-240us
	{
		Delay15us();
		if (DataPortDS1820==0) RstFlag=0;
	}
	for (i=0;i<16;i++)	//240us
	{
		Delay15us();
	}
	return RstFlag;	
}

void WriteDS1820(unsigned char ch)
{
unsigned char i;
	DataPortDS1820=1;
	Delay1us(1);
	for (i=0;i<8;i++)
	{
		EA=0;
		DataPortDS1820=0;
		Delay15us();
		DataPortDS1820=ch&0x1;
		EA=1;
		Delay15us();Delay15us();Delay15us();
		DataPortDS1820=1;
		ch=ch>>1;
		Delay1us(1);
	}	
}

unsigned char ReadDS1820(void)
{
unsigned char i,ch;
	ch=0;
	DataPortDS1820=1;
	Delay1us(1);
	for (i=0;i<8;i++)
	{
		EA=0;
		DataPortDS1820=0;
		Delay10us();
		DataPortDS1820=1;
		Delay1us(2);
		ch=ch>>1;
		if (DataPortDS1820==1)
		{
			ch=ch+0x80;
		}
		EA=1;
		Delay15us();Delay15us();Delay15us();
	}	
	return ch;
}
/*
void GetROMCode(unsigned char idata *ptr)
{
unsigned char i;
	RstDS1820();
	WriteDS1820(0x33); //28h,1ah,2fh,0bh,00h,00h,00h,89h,
	for (i=0;i<8;i++)
	{
		*(ptr+i)=ReadDS1820();
	}
}	
void MatchROMCode(unsigned char idata *ptr)
{
unsigned char i;
	RstDS1820();
	WriteDS1820(0x55); 
	for (i=0;i<8;i++)
	{
		WriteDS1820(*(ptr+i));
	}
}

bit GetPowerType(void)
{
	WriteDS1820(0xb4); 
	EA=0;
	DataPortDS1820=1;
	Delay10us();
	if (DataPortDS1820)
	{
		EA=1;return TRUE;
	}
	else
	{
		EA=1;return FALSE;
	}
}
void WriteConfig(unsigned char Config)
{
	WriteDS1820(0x4e); 
	WriteDS1820(0x7f); 
	WriteDS1820(0x0); 
	WriteDS1820(Config); 
}
unsigned char GetConfig(void)
{
	WriteDS1820(0xBE); 
	ReadDS1820();
	ReadDS1820();
	ReadDS1820();
	ReadDS1820();
	return ReadDS1820();
}
*/

void SkipROMCode(void)
{
	RstDS1820();
	WriteDS1820(0xcc); 
}
void StartADC(void)
{

	RstDS1820();		//复位
	WriteDS1820(0xcc);  //广播
	WriteDS1820(0x44); 	//启动AD转换 12bit700ms
}

unsigned int GetTempValue(void)
{
unsigned char i,j;
unsigned int T;
	SkipROMCode();
	WriteDS1820(0xBE); 
	i=ReadDS1820();
	j=ReadDS1820();
	StartADC();
	T=i+j*256;
	if (T==0xffff) return 0xffff;
	if (T>0x8000) 
	{
		T=-T;
		return (0x8000+T*5/8);
	}
	else
		return (T*5/8);
}

⌨️ 快捷键说明

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