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

📄 tempture.c

📁 温度传感器18B20的典型应用
💻 C
字号:
/*******************************************************************************************************
程序名称:1602液晶温度显示
实现功能:1602液晶温度显示
作者:李灿松
最后修改时间:2008.7.18
=========================================
数据说明:								*
P0_0=D0   P0_1=D1    P0_2=D2    P0_3=D3	*
P0_4=D4   P0_5=D5    P0_6=D6    P0_7=D7 *   
P2_0=RS   P2_1=RW    P2_2=E				*
										*
P3_3为DS18B20的数据输入口          		*
=========================================
*******************************************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define T_cont  0.0625               //温度转换常数
#define uchar  unsigned char
#define uint  unsigned int             
#define L1602_DB0_DB7 P0             //定义1602的数据总线
bit T_sign=0;                        //温度正负符号	   
float  temp1=0;
sbit DQ=P3^3;                        //单口线说明
sbit L1602_RS=P2^0;                  //定义1602得RS控制线
sbit L1602_RW=P2^1;                  //定义1602得RW控制线
sbit L1602_E=P2^2;                   //定义1602的E控制线
sbit L1602_Busy=P0^7;                //定义1602的测忙线
uchar code Welcome[]={"wlecome"};
uchar code Welcome1[]={"tempture"};
uchar code Welcome2[]={"cansong:"};
uchar code Temp[]={"temp"};
unsigned char sdata,t_bai,t_shi,t_ge,t_feng,t_miao;
typedef bit BOOL ; 

/**********************************************************************************************
函数名称:主函数
函数功能:
说明:
**********************************************************************************************/
void main(void)
{
void print(uchar a,uchar *str);
void print1(uchar a,uchar t); 
void LCM1602_Init();
void LCM1602_Delay(uchar count);
void ReadTemperature();
void DS18B20_init();

DS18B20_init();
LCM1602_Init();
print(0x80,Welcome);
print(0xc0,Welcome1);
LCM1602_Delay(5000);
while(1)
  {
   ReadTemperature();
   print(0x80, Welcome2);
   if(T_sign==1)
       print1(0xc0,0x2d);
   else 
       print1(0xc0,0x2b);    
   //if(t_bai!=0)
       print1(0xc1,t_bai+0x30);
  // else
      // print1(0xc1,t_shi+0x30);   //消隐,不显示
  // t_shi=3;
   print1(0xc2,t_shi+0x30);
   print1(0xc3,t_ge+0x30);
   print1(0xc4,0x2e);               //显示点
   print1(0xc5,t_feng+0x30);
   print1(0xc6,t_miao+0x30);
   print1(0xc7,0x43);              //显示'C
  }
}	 


/**********************************************************************************************
函数名称:读取温度函数
函数功能:读取DS18B20的转换温度值
说明:
**********************************************************************************************/

void ReadTemperature()               //获取温度源程序
{
 void delay(unsigned int delay_time);
 void DS18B20_init();
 void DS18B20_send(unsigned char out_data);
 uchar DS18B20_read(void);
 unsigned int y=0;
 uchar a=0;
 uchar b=0;
// unsigned char k;
 DS18B20_init();                   //初始化DS18B20
 DS18B20_send (0xcc);
 DS18B20_send (0x44);              //启动温度转换
 delay(125);
 DS18B20_init();       
 DS18B20_send (0xcc);
 DS18B20_send (0xbe);             //读取温度寄存器
 a=DS18B20_read();	               //读取低位
 b=DS18B20_read();		          //读取高位
 //k=b&0X08;
 //if(k==0x08)  T_sign=1;          //温度是负数
 //else T_sign=0;

 	if(b>0x7f)
	{						    
		a=~a;b=~b+1;	          //补码转换,取反加一
		T_sign=1;                //温度为负时flag=0
		 
	}
	sdata=a/16+b*16;
	t_bai=sdata/100;
	t_shi=sdata/10;
	t_ge=sdata%10;
	t_feng=(a&0x0f)*10/16;
	t_miao=(a&0x0f)*100/16%10;
 
} 


/**********************************************************************************************
函数名称:延时函数
函数功能:转换延时和显示延时
说明:LCM1602_Delay()是液晶显示延时,delay()是温度转换延时
**********************************************************************************************/
void delay(unsigned int delay_time) // 延时程序
{
 while(delay_time--);
}

void LCM1602_Delay(uchar count)
{
	uchar i;
	while(--count!=0)
	   {for(i=0;i<250;i++);}	
}

/**********************************************************************************************
函数名称:初始化函数
函数功能:对DS18B20进行初始化
说明:
**********************************************************************************************/
void DS18B20_init()  //初始化DS18B20
{
unsigned char i=0;
DQ=1;
delay(8);
DQ=0;
delay(85);       //精确延时484 us
DQ=1;
delay(14);        //精确延时34us
i=DQ;
delay(20);
				 
}

/**********************************************************************************************
函数名称:写函数
函数功能:向DS18B20写命令
说明:
**********************************************************************************************/
void DS18B20_send(unsigned char out_data) //主机发送一字节到DS18B20
{
 unsigned char i=0;
 
 for(i=8;i>0;i--)
   {
    DQ=0;
	DQ=out_data&0x01;                     //数据从低位送出
	delay(5);                            //精确延时61us
	DQ=1;
	out_data>>=1;
   }
  delay(4);
}

/**********************************************************************************************
函数名称:读函数
函数功能:从DS18B20读取数据
说明:
**********************************************************************************************/
uchar DS18B20_read(void)//主机从DS18B20中读取一字节
{
 unsigned char i,in_data;
 in_data=0;
 for(i=8;i>0;i--)
    {
	 DQ=1;
	 delay(1);
	 DQ=0;            //给脉冲信号
	 in_data>>=1;
	 DQ=1;           //给脉冲信号
	 if(DQ) 
	   in_data|=0x80;
	 delay(4);
	}
 return(in_data);
}


/**********************************************************************************************
函数名称:初始化函数
函数功能:液晶1602初始化
说明:
**********************************************************************************************/
void  LCM1602_Init(void)
{
 void LCM1602_WriteData(uchar LCM1602_data);
 void LCM1602_WriteCMD(uchar LCM1602_command);
 LCM1602_WriteCMD(0x38);    //显示两行,每个字符为5*7个像素
 delay(1);
 LCM1602_WriteCMD(0x06);    //光标移动设置,光标右移
 delay(1);
 LCM1602_WriteCMD(0x0c);    //现设开,光标开,闪烁开
 delay(1);
 LCM1602_WriteCMD(0x01);    //清屏
 delay(1);
}

//在规定位置些数据或字符或字符串
void  print(uchar a,uchar *str)
{
 void  LCM1602_WriteData(uchar LCM1602_data);
 void  LCM1602_WriteCMD(uchar LCM1602_command);
 LCM1602_WriteCMD(a);
 while(*str!='\0')
    {
    LCM1602_WriteData(*str++);
	}
 *str=0;
}

void print1(uchar a,uchar t)
{
 LCM1602_WriteCMD(a);
 LCM1602_WriteData(t);
}



/**********************************************************************************************
函数名称:写命令和写数据函数
函数功能:向LCD写命令和数据
说明:LCM1602_WriteCMD是写命令函数,void LCM1602_WriteData是写数据函数
**********************************************************************************************/
void LCM1602_WriteCMD(uchar LCM1602_command)
{
BOOL lcd_bz();
while(lcd_bz());	//测忙
L1602_RS=0;
L1602_RW=0;
L1602_E=0;
_nop_();
_nop_();
L1602_DB0_DB7=LCM1602_command;
_nop_();
_nop_();_nop_();
L1602_E=1;    //命令总送出
_nop_();_nop_();_nop_();
L1602_E=0; 
}
// 测忙函数
void LCM1602_WriteData(uchar LCM1602_data)
{
BOOL lcd_bz();
while(lcd_bz());	//测忙
L1602_RS=1;
L1602_RW=0;
L1602_E=0;
L1602_DB0_DB7=LCM1602_data;
_nop_();
_nop_();
_nop_();
_nop_();
L1602_E=1;   //数据送出
_nop_();
_nop_();
_nop_();
L1602_E=0;
}


/**********************************************************************************************
函数名称:LCD检测忙函数
函数功能:检测LCD是否处于忙状态
说明: 
**********************************************************************************************/
BOOL lcd_bz()
{							// 测试LCD忙碌状态
	BOOL result;
	L1602_RS=0;
    L1602_RW=1;
    L1602_E=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (BOOL)(P0 & 0x80);
	L1602_E = 0;
	return result;	
}
/**********************************************************************************************/ 

⌨️ 快捷键说明

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