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

📄 ds18b20.c

📁 DS18B20温度传感器
💻 C
字号:
/*************************************************************
程序名称:数码管显示温度
函数说明:数码管显示温度
功能:
P3_3为温度数据输入端
共阳数码管
李灿松
2008.7.17
**************************************************************/
#include<reg52.h>
//#include<string.h>
//#include<ctype.h>
#include <intrins.h>

#define uchar  unsigned char 
#define uint  unsigned  int
sbit TMDAT=P2^7;                   //定义DS18B20的数据输入端
uint sdata=0;	                       //温度数据的整数部分
uint xiaoshu1=0;					   //小数第一位
uint xiaoshu2=0;					   //小数第二位
uint xiaoshu;
bit flag=1;                         //温度正负标志
sbit P0_7=P0^7;			           //小数点标志
//uchar seg7code[]=
//{0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,
//0xea,0x20,0xa0,0x60,0x25,0x3c,0x23,0x34,0x76};		 //共阳段码
//uchar code seg7code[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};
uchar code seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};


/************************************************************
程序名称:延时函数
函数说明:数码管显示延时
功能:
*************************************************************/
void  Delay(uint tc)    //显示延时函数
{
	 while(tc!=0)
	 {
	 	uint i;
		for(i=0;i<100;i++)
			;
		tc--;
	 }
}

/************************************************************
程序名称:延时函数
函数说明:DS18B20数据读取延时
功能:
*************************************************************/
void dmsec(uint count)
{
	uchar i;
	while(count--)
	{
		for(i=0;i<115;i++)
		;
	}
}

/************************************************************
程序名称:复位函数
函数说明:向DS18B20发送484us复位信号
功能:
*************************************************************/
void tmreast(void)
{
	uchar i;			  
	TMDAT=0;
	for(i=0;i<180;i++);//542US
	TMDAT=1;
	for(i=0;i<15;i++); //47US
    while(TMDAT);
    for(i=0;i<50;i++); //152US
    TMDAT=1;
    for(i=0;i<80;i++); //240US
}

/************************************************************
程序名称:读位函数
函数说明:读取DS18B20一位信号
功能:
*************************************************************/
bit tmrbit(void)
{
	uint i;
	bit dat;
	TMDAT=0;		  //给脉冲信号
	i++;
	TMDAT=1;
	i++;i++ ;         //微量延时
	dat=TMDAT;				//给脉冲信号
	for(i=0;i<8;i++);
	return(dat);

}

/************************************************************
程序名称:读字函数
函数说明:读取DS18B20一字节信号
功能:
*************************************************************/
uchar tmrbyte(void)
{
	uchar i,j,dat;
    dat=0;
	for(i=1;i<=8;i++)
	{
		j=tmrbit();
		dat=(j<<7)|(dat>>1);
	}
    TMDAT=1;			   
	return(dat);
}

/*uchar tmrbyte(void)   //??????用这个部分的读字节不行???????????
{
 uchar i;
 uchar value=0;
 for(i=8;i>0;i--)
 {
  TMDAT=1;_nop_();_nop_();
  value>>=1;
  TMDAT=0;_nop_();_nop_();_nop_();_nop_();         //4 us
  TMDAT=1;_nop_();_nop_();_nop_();_nop_();         //4 us
  if(TMDAT)value|=0x80;
  for(i=0;i<20;i++);                                     //66 us
 }
TMDAT=1;
return(value);
}  */



/************************************************************
程序名称:写函数
函数说明:
功能:
*************************************************************/
void  tmwbyte(uchar dat)   //写一个字节
{
	uchar i,j;
	bit testb;
	for(j=1;j<=8;j++)
	{
		testb=dat&0x01;
		dat=dat>>1;
		if(testb)
		{
			TMDAT=0;	   //写1
			i++;i++;
			TMDAT=1;
			for(i=0;i<20;i++);
				
		}
	    else
		{
			TMDAT=0;         //xie0
			for(i=0;i<20;i++);
			TMDAT=1;
			i++;i++;
		}
	}
}
/*
//向1-WIRE 总线上写1个字节               //??????用这个部分的写字节不行???????????
void tmwbyte(uchar val)
{ 
  uchar i;
  for(i=8;i>0;i--)
  {
   TMDAT=1;_nop_();_nop_();                  //从高拉倒低
   TMDAT=0;_nop_();_nop_();_nop_();_nop_();  //5 us
   TMDAT=val&0x01;                           //最低位移出
   for(i=0;i<15;i++);                              //55 us 15us~120us
   val=val/2;                             //右移1位
   }
   TMDAT=1;
}*/

/************************************************************
程序名称:温度转换函数
函数说明:将读取的DS18B20的数据进行转换
功能:
*************************************************************/
void  trstar(void)
{
	tmreast();
	dmsec(1);
	tmwbyte(0xcc);		   //跳过序列号命令
	tmwbyte(0x44);        //发送转换命令44H
}


/************************************************************
程序名称:读温度函数
函数说明:读取转换后的温度
功能:
*************************************************************/
void  temp(void)
{
	uchar a,b;
	tmreast();			  //复位
	dmsec(1);		   	  //延时
	tmwbyte(0xcc);		  //跳过序列号命令
	tmwbyte(0xbe);		  //发送读取命令
	a=tmrbyte();          // 读取地位温度
	b=tmrbyte();		  //读取高位温度
	if(b>0x7f)
	{
		a=~a;b=~b+1;	  //补码转换,取反加一
		flag=0;            //温度为负时flag=0
		 
	}
	sdata=a/16+b*16;
	xiaoshu1=(a&0x0f)*10/16;
	xiaoshu2=(a&0x0f)*100/16%10;
	xiaoshu=xiaoshu1*10+xiaoshu2;
/*	sdata=45;
	xiaoshu1=3;
	xiaoshu2=2;
	xiaoshu=xiaoshu1*10+xiaoshu2;
*/
		
}

void DS18B20R(void)
{
	trstar();		//温度转换
    dmsec(5);       //不断读取数据 , 延时
	temp();         //读取数据后将温度存在TMP中,读温度
}


/************************************************************
程序名称:显示函数
函数说明:显示读取的数据
功能:
*************************************************************/
void LED()
{
	if(flag==1)
	{
		P2=0xfe;
		P0=seg7code[sdata/10];
		Delay(2);
		P2=0xfd;
		P0=seg7code[sdata%10];
        P0_7=0;                 //小数点标志
		Delay(2);
		P2=0xfb;
		P0=seg7code[xiaoshu1];
		Delay(2);
		P2=0xf7;
		P0=seg7code[xiaoshu2];
		Delay(2);
		//P2=P2|0xf0;
    	//	P0=0xff;
	}
	if(flag==0)
	{
		P2=0xfe;
		P0=seg7code[11];                  //负号
		Delay(8);
        P2=0xfd;
		P0=seg7code[sdata/10];
		Delay(8);
		P2=0xfb;
		P0=seg7code[sdata%10];
		Delay(8);
		P2=0xf7;
		P0=seg7code[xiaoshu1];
		Delay(8);
		//P2=P2|0xf0;
    	//	P0=0xff;
	}

}

/************************************************************
程序名称:主函数
函数说明:数码管显示温度数据
功能:
*************************************************************/
main()
{
    trstar();       //下面三句也可不要
    Delay(1);
    flag=1;
	while(1)
	{
		DS18B20R();
		LED();
	}
}

⌨️ 快捷键说明

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