【蓝桥杯单片机(二)】DS18B20温度超精准采集代码;(全面,详细,且简单)

  • Post author:
  • Post category:其他


这个代码直接复制就可以了,不需要再加入其他的头文件,废话不多说,直接上代码,下图就是显示情况!

#include<reg52.h>

//================================================Ds18B20初始化设计========

sbit DQ = P1^4;//Ds18b20的端口


void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}




//通过单总线向DS18B20接受一个字节,也就时外部温度,因为只有8个字节所以循环8次
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);

}



//对已经接受的字节进行读取
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1; 
		if(DQ)  
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20初始化,复位
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80); // ÑÓʱ´óÓÚ480us
  	DQ = 1;
  	Delay_OneWire(10);  // 14
  	initflag = DQ;     // initflagµÈÓÚ1³õʼ»¯Ê§°Ü
  	Delay_OneWire(5);
  
  	return initflag;
}


//==============================Ds18B20初始化完成=====================

unsigned char SMG_1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管0到9
unsigned char SMG_Dian[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//数码管带点的0到9
unsigned int temp=0;//用于将读取的温度转化为数码管显示的中间变量

//LED 蜂鸣器和继电器关闭
void init_Led_buss()
{
	P0=0xff;
	P2=(P2 &0x1f) |0x80;//½«Ç°ÃæÈýλ¹éÁ㣬ºóÎåλ±£³Ö²»±ä£¬ÔÙÓûò£¬ÐÞ¸ÄÇ°Èýλ
	P2 &=0x1f;
	
	P0=0x00;
	P2=(P2 &0x1f) |0xa0;
	P2 &=0x1f;
	
}


void delay_1(unsigned char t)
{
while(t--);

}

//数码管显示完时的复位和初始化
void init_SMG_All(unsigned char dat)
{
		P0=0xff;
	P2=(P2 &0xff) |0xc0;
	P2=P2 &0x1f;
	
	P0=dat;
	P2=(P2 &0x1f) |0xe0;
	P2=P2 &0x1f;
	
}


//数码管的com通道和单个通道的设置
void SMG_bit(unsigned char dat,unsigned char  pos)
{
P0=0xff;
	P2=(P2 &0x1f) |0xe0;
	P2 &=0x1f;
	
	P0=0x01<<pos;
	P2=(P2 &0x1f) |0xc0;
	P2 &=0x1f;
	
	P0=dat;
	P2=(P2 &0x1f) |0xe0;
	P2=P2 &0x1f;

}

//数码管的显示
void Dispaly_SMG()
{
	SMG_bit(SMG_1[temp%10],7);
	delay_1(300);
	SMG_bit(SMG_Dian[(temp%100)/10],6);
	delay_1(300);
  SMG_bit(SMG_1[temp/100],5);
	delay_1(300);
	
	
	SMG_bit(0xbf,4);
	delay_1(300);
	SMG_bit(SMG_1[0],3);
	delay_1(300);
	
	SMG_bit(SMG_1[0],2);
	delay_1(300);
SMG_bit(0xbf,1);
	delay_1(300);
		SMG_bit(0x8c,0);
	delay_1(300);

	init_SMG_All(0xff);

}


void Delay_0(unsigned char tt)
{
while(tt--)
{
   Dispaly_SMG();
}

}

//DS18B20的采集程序
unsigned char Rd_temp(void)
{
    unsigned char low,high;
  	
  
  	init_ds18b20();//¸´Î»
  	Write_DS18B20(0xCC);//Ìø¹ýRomÖ¸Áî
  	Write_DS18B20(0x44); //Æô¶¯Î¶Èת»»
  	Delay_OneWire(200);
	
	Delay_0(800);

	
  	init_ds18b20(); //¸´Î»
  	Write_DS18B20(0xCC);//Ìø¹ýRomÖ¸Áî
  	Write_DS18B20(0xBE); //¶ÁÈ¡¼Ä´æÆ÷

  	low = Read_DS18B20(); //µÍ×Ö½Ú
  	high = Read_DS18B20(); //¸ß×Ö½Ú
 

	
	


	 temp = high;
	 
	temp = (temp<<8) | low;
 
 
	if((temp&0xf8)==0x00)
	{
		temp>>=4;
		temp=temp*10;
		temp=temp+(low &0x0f)*0.0625;
	}
	return temp;

}


//主函数
void main()
{
	init_Led_buss();

while(1)
  {
Rd_temp();
		Dispaly_SMG();

   }
}



版权声明:本文为m0_63213850原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。