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

📄 18b20.c

📁 DY580实验板上面的18b20温度传感器程序
💻 C
字号:
//18B20单线温度检测的应用样例程序
#include<REG52.H>
#include<math.h>
#include<INTRINS.H>

#define uchar unsigned char
#define uint   unsigned int;
/*****************************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^7;//ds18b20 端口
sfr dataled=0x80;//显示数据端口(P0)
/**********************************************************************/ 
uchar temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//7段数码管段码表共阳"0123456789 -"
uchar  str[5];
int ints[5];
int dot = 0;
int fu = 0;

typedef unsigned char byte;
typedef unsigned int  word;

/***********************************************************************/
void delay1(uchar MS);
unsigned char ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/************************************************************************/
main()
{
	TMOD|=0x01;//定时器设置
	TH0=0xef;
	TL0=0xf0;
	IE=0x82;
	TR0=1;
	P2=0x00;  
	count=0;

	while(1)
	{
		if (fu==1)	//负数
		{
			ints[4]=11;
		}
		else	//正数
	   	{
			ints[4]=temp/100;	//百位温度
		}
   		ints[3]=temp/10%10; //十位温度
   		ints[2]=temp%10; //个位温度
   		ints[1]=dot;//小数点后第一位温度

		if(ints[4]==0)		//百位为0
		{
			ints[4]=10;		//隐藏百位
		}
		
		if(ints[3]==0 && ints[4]!=1)	//十位为0且百位不为1
		{
			ints[3]=ints[4];			//把百位的负号或空位挪到十位
			ints[4]=10;					//隐藏百位
		}

		str[4]=tab[ints[4]];
   		str[3]=tab[ints[3]]; //十位温度
   		str[2]=tab[ints[2]]-0x80; //个位温度
   		str[1]=tab[ints[1]];//小数点后第一位
		str[0]=0xa7;
	
  		if(flag_get==1)  //定时读取当前温度
    	{
  			temp=ReadTemperature();
  			flag_get=0;
    	}
  	}
}

void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
	TH0=0xef;//定时器重装值
	TL0=0xf0;
	num++;
	if (num==50)
    {
		num=0;
	  	flag_get=1;//标志位有效
      	second++;
       	if(second>=60)
        {
			second=0;
           	minute++;  
		}
	}
	count++;
	if(count==1)	//数码管扫描
   	{
		P2=0xef;		//11101111
    	dataled=str[4];
	}
	if(count==2)
   	{
		P2=0xf7;		//11110111
    	dataled=str[3];
	}
	if(count==3)
   	{
		P2=0xfb;		//11111011
    	dataled=str[2];
	}
	if(count==4)
   	{
		P2=0xfd;		//11111101
     	dataled=str[1];
	}
	if(count==5)
   	{
		P2=0xfe;		//11111110
     	dataled=str[0];
		count=0;
	}
}
/*************************************************************************************/
//延时函数
void delay(unsigned int i)
{
	while(i--);
}
/***************************************************************************************/
//18b20初始化函数
void Init_DS18B20(void)
{
	unsigned char x=0;
	DQ = 1;    //DQ复位
	delay(8);  //稍做延时
	DQ = 0;    //单片机将DQ拉低
	delay(80); //精确延时 大于 480us
	DQ = 1;    //拉高总线
	delay(10);
	x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
	delay(5);
}

//读一个字节
unsigned char ReadOneChar(void)
{
	unsigned char i=0;
	unsigned char dat = 0;
	for (i=8;i>0;i--)
 	{
  		DQ = 0; // 给脉冲信号
  		dat>>=1;
  		DQ = 1; // 给脉冲信号
  		if(DQ)
		{
   			dat|=0x80;
		}
		delay(5);
 	}
	return(dat);
}


//写一个字节
void WriteOneChar(unsigned char dat)
{
	unsigned char i=0;
	for (i=8; i>0; i--)
	{
		DQ = 0;
		DQ = dat&0x01;
		delay(5);
		DQ = 1;
		dat>>=1;
	}
	delay(5);
}

//读取温度
unsigned char ReadTemperature(void)
{
	unsigned char a=0;
	unsigned char b=0;
	unsigned char t=0;
	Init_DS18B20();
	WriteOneChar(0xCC); // 跳过读序号列号的操作
	WriteOneChar(0x44); // 启动温度转换
	delay(200);
	Init_DS18B20();
	WriteOneChar(0xCC); //跳过读序号列号的操作 
	WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
	a=ReadOneChar();
	b=ReadOneChar();
	t=(b<<4)+((a&0xf0)>>4);
	dot = (a&0x0f)*0.625+0.5;
	fu=0;
	if(t>>7)
	{
		fu = 1;
		t=~t+0x01;
		dot=(10-dot)%10;
		if(dot!=0)
		{
			t--;
		}
	}
	return(t);
}

⌨️ 快捷键说明

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