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

📄 ds18b20.c

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

#define uchar  unsigned char 
#define uint  unsigned  int
sbit TMDAT=P3^3;                   //定义DS18B20的数据输入端
uint sdata=0;	                       //温度数据的整数部分
uint xiaoshu1=0;					   //小数第一位
uint xiaoshu2=0;					   //小数第二位
uint xiaoshu;
bit flag=1;				           //温度正负标志
uchar seg7code[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0x60,0x25,0x3c,0x23,0x34,0x76};		 //共阳段码

/************************************************************
程序名称:延时函数
函数说明:数码管显示延时
功能:
*************************************************************/
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<103;i++);
	TMDAT=1;
	for(i=0;i<4;i++);
}

/************************************************************
程序名称:读位函数
函数说明:读取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);
	}			   
	return(dat);
}

/************************************************************
程序名称:写函数
函数说明:
功能:
*************************************************************/
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;	   //写0
			i++;i++;
			TMDAT=1;
			for(i=0;i<8;i++);
				
		}
	    else
		{
			TMDAT=0;
			for(i=0;i<8;i++);
			TMDAT=1;
			i++;i++;
		}
	}
}

/************************************************************
程序名称:温度转换函数
函数说明:将读取的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=0x7f;
		P0=seg7code[sdata/10];
		Delay(2);
		P2=0xbf;
		P0=seg7code[sdata%10]&0xdf;
		Delay(2);
		P2=0xdf;
		P0=seg7code[xiaoshu1];
		Delay(2);
		P2=0xef;
		P0=seg7code[xiaoshu2];
		Delay(2);
		P2=P2|0xf0;
		P0=0xff;
	}
	if(flag==0)
	{
		P2=0x7f;
		P0=seg7code[11];                  //负号
		Delay(8);
		P0=seg7code[sdata/10];
		Delay(8);
		P2=0xbf;
		P0=seg7code[sdata%10];
		Delay(8);
		P2=0xdf;
		P0=seg7code[xiaoshu1];
		Delay(8);
		P2=P2|0xf0;
		P0=0xff;
	}

}

/************************************************************
程序名称:主函数
函数说明:数码管显示温度数据
功能:
*************************************************************/
main()
{
	flag=1;
	while(1)
	{
		DS18B20R();
		LED();
	}
}

⌨️ 快捷键说明

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