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

📄 tempture2.c

📁 温度传感器18B20的典型应用
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ; 

sbit rs	= P2^0;		//
sbit rw = P2^1;
sbit ep = P2^2;

BYTE code dis1[] = {"temp"};
unsigned int dis2[7]={0};
sbit TMDAT=P3^3;
WORD sdata=0;
WORD xiaoshu1;
WORD xiaoshu2;
WORD xiaoshu;
bit flag=1;				           //温度正负标志
BYTE seg7code[]={0,1,2,3,4,5,6,7,8,9};		 


delay(BYTE ms)
{							// 延时子程序
	BYTE i;
	while(ms--)
	{
		for(i = 0; i< 250; i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}

BOOL lcd_bz()
{							// 测试LCD忙碌状态
	BOOL result;
	rs = 0;
	rw = 1;
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (BOOL)(P0 & 0x80);
	ep = 0;
	return result;	
}

lcd_wcmd(BYTE cmd)
{							// 写入指令数据到LCD
	while(lcd_bz());
	rs = 0;
	rw = 0;
	ep = 0;
	_nop_();
	_nop_();	
	P0 = cmd;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;		
}

lcd_pos(BYTE pos)
{							//设定显示位置
	lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)	
{							//写入字符显示数据到LCD
	while(lcd_bz());
	rs = 1;
	rw = 0;
	ep = 0;
	P0 = dat;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;	
}

lcd_init()
{							//LCD初始化设定
	lcd_wcmd(0x38);			//
	delay(1);
	lcd_wcmd(0x0c);			//
	delay(1);
	lcd_wcmd(0x06);			//
	delay(1);
	lcd_wcmd(0x01);			//清除LCD的显示内容
	delay(1);
}

/************************************************************
程序名称:复位函数
函数说明:向DS18B20发送484us复位信号
功能:
*************************************************************/
void dmsec(WORD count)
{
	int i;
	while(count--)
	{
		for(i=0;i<115;i++)
		;
	}
}

/************************************************************
程序名称:复位函数
函数说明:向DS18B20发送484us复位信号
功能:
*************************************************************/
void tmreast(void)
{
	int i;			  
	TMDAT=0;
	for(i=0;i<103;i++);
	TMDAT=1;
	for(i=0;i<4;i++);
}

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

}

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

/************************************************************
程序名称:写函数
函数说明:
功能:
*************************************************************/
void  tmwbyte(BYTE dat)   //写一个字节
{
	BYTE 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)
{
	BYTE 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(void)
{
    if(flag==1)
	{
		dis2[0]='+';
		dis2[1]='2';//sdata/10;
		dis2[2]='5';//seg7code[sdata%10];
		dis2[3]='.';
		dis2[4]='6';//seg7code[xiaoshu1];
		dis2[5]='4';
		dis2[6]='C';
	}
/*	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;
	} */

}

void main()
{
	BYTE k;
	flag=1;
	DS18B20R();
	LED();
	lcd_init();				// 初始化LCD			
	delay(10);
	lcd_pos(4);				// 设置显示位置为第一行的第5个字符
	k = 0;
	while(dis1[k] != '\0')
	{						// 显示字符"welcome!"
		lcd_wdat(dis1[k]);
		k++;
	}
	lcd_pos(0x41);			// 设置显示位置为第二行第二个字符
	k = 0;
	while(dis2[k] != '\0')
	{
		lcd_wdat(dis2[k]);	// 显示字符"  www.xingyan.com.cn  "
		k++;
	}		  
	while(1);				// 	
}

⌨️ 快捷键说明

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