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

📄 ds1820.c

📁 ds18b20温度传感器
💻 C
字号:
#include<reg52.h>
#include"start.h"
#include"ds1820.h"
#include<math.h>							  
unsigned  templ,temph;
sbit DQ=P3^7;
//==================================
//		  延时微秒
//==================================
void delay_us(int us)
{
	for(;us>0;us--);
}

//======================================================
// 复位 和检测存在返回0表示没有器件,返回1表示有器件存在            
//======================================================
bit ds1820_reset()//
{
	bit flag=0;
	DQ=1;
	delay_us(1);
	DQ=0;
	delay_us(60);//延时50*8微秒
	DQ=1;		 //DQ=1表示释放总线,并不代表总线的电平就一定就是1。
	delay_us(8); 
	flag=DQ;	//
	delay_us(14);
	DQ=1;
	return ~flag;
}

//=============================================
//				  读一个字节
//=============================================
unsigned ds1820_read_byte()  //
{
	unsigned value=0,i;
	DQ=1;
	for(i=0;i<8;i++)
	{   
		DQ=0;
		value>>=1;
		DQ=1;
//		delay_us(1);  //加上此语句就不行,不能延时!
		if(DQ)
		    value|=0x80;
		delay_us(6);
		DQ=1;
	}
	return value;  
}


//========================================
//   	  	   写一个字节
//========================================
void ds1820_write_byte(unsigned num)//
{
	unsigned i;
	DQ=1;
	for(i=0;i<8;i++)
	{
		DQ=0;
		DQ=num&0x01;
		num>>=1;
		delay_us(7);
		DQ=1;
	}

}

float tempeature_read()// 读温度
{
	unsigned hi,low,i;
	float xiaoshu=0;
//	bit flag=0;
	EA=0;
	ds1820_reset();

	ds1820_write_byte(0xcc);   //跳过读序号列号的操作
	ds1820_write_byte(0x44);   // 启动温度转换

	
	
	ds1820_reset();
  
	ds1820_write_byte(0xcc);	 //跳过读序号列号的操作
	ds1820_write_byte(0xbe);	   //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
	
	low=ds1820_read_byte();
	hi=ds1820_read_byte();
	EA=1;
	hi=(hi&0x07)<<4;
	hi=hi|((low&0xf0)>>4);
	low=low&0x0f;
	for(i=4;i>0;i--)
	{
		if(low&&0x01!=0)
			xiaoshu=xiaoshu+1/pow(2,i);
		low>>=1;
	}
	xiaoshu=xiaoshu+hi;

	return xiaoshu;

}
//==========================
void delay5ms()
{
   int i;
   for(i=0;i<800;i++);
}


/*
unsigned to_bcd(unsigned char num)	  // 时间转换成BCD吗
{
     unsigned ge,shi;
	 shi=num/10;
	 ge=num%10;
	 shi=(shi<<4)|ge;
	 return shi;
}

*/



void led_display(unsigned i,unsigned num)//在第i位上显示num
{    
                                                // 
	unsigned char ledtable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
	LED1=1;
	LED2=1;			    
	LED3=1;
	if(i==2)
	{
		P0=ledtable[num]|0x80; //在第二位加上小数点
	}
	else
    	P0=ledtable[num];
	switch(i)
	{
		case 1:LED1=0;break;
		case 2:LED2=0;break;
		case 3:LED3=0;break;
	//	case 4:LED4=1;break;
		default:break;
	}
	delay5ms();
	
}



main()
{   
//	bit flag;
	
	float temper=45.6;
	unsigned char ge,shi,dot1,i=1; 
	
	//DQ=1; 
	LED1=0;
	LED2=0;
	LED3=0; 	 
	D8=0;
	D9=0;
	
/*	TR0=0;
	TH0=0xee;
	TL0=0;
	TR0=1; 
	EA=1;
	ET0=1;   */
    while(1)
	{
	
		temper=tempeature_read();
		shi=(unsigned char)(temper/10);
		ge=(unsigned char)((int)temper%10);
		dot1=(unsigned char)(((int)(temper*10))%10);
		if(i==1)
		{
			led_display(1,shi);
			i++;
		}
		else if(i==2)
		{
			led_display(2,ge);
			i++;
		}
		else if(i==3)
		{
			led_display(3,dot1);
			i=1;
		}

        
	} 
	

}
/*void timer() interrupt 1
{
	TR0=0;
	TH0=0xee;
	TL0=0;
//	led_display();
	TR0=1;
}   */

⌨️ 快捷键说明

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