欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DS18b20

程序员文章站 2022-07-12 10:54:49
...
#include<stc15f2k60s2.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\
							0X40,0X79,0X1A,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XBF,0XFF};
int one,two,three,four,five,six,seven,eight;
uchar dat;
sbit DQ=P1^4;
void Allinit();
void Delayms(uint ms);
void Display1(uchar one,two);
void Display2(uchar three,four);
void Display3(uchar five,six);
void Display4(uchar seven,eight);
void DS18B20_Init();
void DS18B20_Write(uchar dat);
long DS18B20_Read();
long TemperatureGet();
void Delay80us();
void Delay500us();
void main()
{
	long t;
	Allinit();
  one=21;two=21;three=21;four=21;five=21;six=21;seven=21;eight=21;
	while(1)
	{
	  t=TemperatureGet();//13.0625  130625
	  one=t/100000;two=t%100000/10000+10;three=t%10000/1000;four=t%1000/100;five=t%100/10;six=t%10;
		Display1(one,two);
		Display2(three,four);
		Display3(five,six);
		Display4(seven,eight);
	}
	
}
void Allinit()
{
	P2=0XA0;//蜂鸣器继电器锁存器
	P0=0X00;//关闭
	P2=0XC0;//数码管位选锁存器
	P0=0XFF;//选中所有数码管
	P2=0XFF;//数码管段选锁存器 可以操作数码管
	P0=0XFF;//关闭
	P2=0X80;//LED锁存器
	P0=0XFF;//关闭
}
void Delayms(uint ms)
{
	uint i,j;
	for(i=0;i<ms;i++)
	for(j=845;j>0;j--);
}
void Display1(uchar one,two)
{
	P2=0XC0;
	P0=0X01;//0000 0001选中左边第一个数码管
	P2=0XFF;
	P0=tab[one];
	Delayms(1);
	
	P2=0XC0;
	P0=0X02;//0000 0010
	P2=0XFF;
	P0=tab[two];
	Delayms(1);
}
void Display2(uchar three,four)
{
	P2=0XC0;
	P0=0X04;//0000 0100
	P2=0XFF;
	P0=tab[three];
	Delayms(1);
	
	P2=0XC0;
	P0=0X08;//0000 1000
	P2=0XFF;
	P0=tab[four];
	Delayms(1);
}
void Display3(uchar five,six)
{
	P2=0XC0;
	P0=0X10;//0001 0000
	P2=0XFF;
	P0=tab[five];
	Delayms(1);
	
	P2=0XC0;
	P0=0X20;//0010 0000
	P2=0XFF;
	P0=tab[six];
	Delayms(1);
}
void Display4(uchar seven,eight)
{
	P2=0XC0;
	P0=0X40;//0100 0000
	P2=0XFF;
	P0=tab[seven];
	Delayms(1);
	
	P2=0XC0;
	P0=0X80;//1000 0000
	P2=0XFF;
	P0=tab[eight];
	Delayms(1);
}

void DS18B20_Init()
{
	DQ=0;
	Delay500us();
	DQ=1;
	Delay500us();
}
void DS18B20_Write(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		DQ=0;
		DQ=dat&0X01;//0101 0110&0000 0001
		Delay80us();
		DQ=1;
		dat>>=1;
	}
}
long DS18B20_Read()
{
   uchar i;
	 uchar dat;
	for(i=0;i<8;i++)
	{
		DQ=0;
		dat>>=1;
		DQ=1;
		if(DQ==1)
		{
			dat|=0X80;
		}
		Delay80us();		
	}
  return dat;
}

long TemperatureGet()
{
	uchar high,low;
	long temp;
	DS18B20_Init();
	DS18B20_Write(0XCC);//向寄存器里写CC表示跳过ROM指令 因为只有一个温度传感器 所以不需要验证ROM编码
	DS18B20_Write(0X44);//向寄存器里写44表示开始温度转换 
	Delay500us();//稳住转换需要时间所以延迟
	DS18B20_Init();
	DS18B20_Write(0XCC);
	DS18B20_Write(0XBE);//向寄存器里写BE表示开始读取暂存器里的值
	
	low=DS18B20_Read();
	high=DS18B20_Read();
	temp=(high&0X0F);//temp=(high<<4)|(low>>4) 高8位的前四位表示正负不需要直接去掉 低8位的后四位表示小数也去掉
	temp=temp<<8;
	temp|=low;
	temp=temp*625;
	return temp;
}
void Delay80us()		
{
	unsigned char i, j;

	_nop_();
	i = 1;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}
void Delay500us()		
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 6;
	j = 93;
	do
	{
		while (--j);
	} while (--i);
}