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

📄 110500618_3.c

📁 yong 1602 yejing xian shi db15b20 de wen du ,mcu wei 89s52.
💻 C
字号:
#include <REG51.H>
#include <intrins.h>

#define uint  unsigned int
#define uchar unsigned char


#define LCD_AC_UP			0x02
#define LCD_AC_DOWN			0x00     

#define LCD_MOVE			0x01      // 画面可平移
#define LCD_NO_MOVE			0x00    

#define LCD_COMMAND			0      // Command
#define LCD_DATA			1      // Data
#define LCD_CLEAR_SCREEN	0x01      // 清屏
#define LCD_HOMING  		0x02      // 光标返回原点


#define LCD_SHOW			0x04    //显示开
#define LCD_HIDE			0x00    //显示关	  

#define LCD_CURSOR			0x02 	//显示光标
#define LCD_NO_CURSOR		0x00    //无光标		     

#define LCD_FLASH			0x01    //光标闪动
#define LCD_NO_FLASH		0x00    //光标不闪动


sbit  DQ = P3^7;        
uint  temp_value;      //温度值
uchar t;			   //正负号
uint  k;			   //小数点后一位
uchar TempBuffer[9];

void  display();   

/***********1602液晶显示子程序**************/


sbit RS		= P2^0;
sbit RW		= P2^1;
sbit EN  	= P2^2;
sfr  DBPort = 0x90;		//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

/*********lcd忙测试************/
uchar LCD_Busytext(void)
{
	RS=0;
	RW=1;	
	_nop_();
	EN=1;	
	_nop_();
						 
	EN=0;
	return DBPort;		
}
/************向LCD写入命令或数据*************/


void LCD_Write(bit style, uchar input)
{
	EN = 0;
	RS = style;
	RW = 0;		
	_nop_();

	DBPort=input;	
	_nop_();
	EN = 1;		
	_nop_();
	EN = 0;		
	_nop_();
	LCD_Busytext();	
}

/****************设置显示模式******************/

void LCD_SetDisplay(uchar DisplayMode)
{
	LCD_Write(LCD_COMMAND, 0x08|DisplayMode);	
}

/************设置输入模式***********/


void LCD_SetInput(uchar InputMode)
{
	LCD_Write(LCD_COMMAND, 0x04|InputMode);
}

/***************初始化LCD***************/

void LCD_Initial()
{
	EN=0;
	LCD_Write(LCD_COMMAND,0x38);          		 //显示模式
	LCD_Write(LCD_COMMAND,0x38);
	LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
	LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
	LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
}

/************液晶字符输入的位置**************/
void GotoXY(uchar x, uchar y)
{
	if(y==0)
		LCD_Write(LCD_COMMAND,0x80|x);
	if(y==1)
		LCD_Write(LCD_COMMAND,0x80|(x+0x40)); 
}


/***********液晶显示*************/
void Print(uchar *str)
{
	while(*str!='\0')
	{
		LCD_Write(LCD_DATA,*str);
		str++;
	}
}



/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数*******/ 

void delay_18B20(uint i)
{
	while(i--);
}

/**********ds18b20初始化******************/

void Init_DS18B20(void) 
{
	 uchar x=0;
	 DQ = 1;          		//DQ复位
	 delay_18B20(8);  		//稍做延时
	 DQ = 0;          		//单片机将DQ拉低
	 delay_18B20(80); 		//精确延时 大于 480us
	 DQ = 1;          		//拉高总线
	 delay_18B20(14);
	 x=DQ;            		//稍做延时后 如果x=0则初始化成功 x=1则初始化失败
	 delay_18B20(20);
}

/***********ds18b20读一个字节**************/  

uchar ReadOneChar(void)
{
	uchar i = 0;
	uchar dat = 0;
	for(i=8;i>0;i--)
	 {
		  DQ = 0; 			// 给脉冲信号
		  dat>>=1;
		  DQ = 1; 			
		  if(DQ)
		  dat|=0x80;
		  delay_18B20(4);
	 }
 	return(dat);
}

/*************ds18b20写一个字节****************/  

void WriteOneChar(uchar dat)
{
 	uchar i = 0;
 	for(i=8;i>0;i--)
 	{
  		DQ = 0;
 		DQ = dat&0x01;
    	delay_18B20(5);
 		DQ = 1;
    	dat>>=1;
 }
}

/**************读取ds18b20温度************/

void ReadTemp(void)
{
	uchar a = 0;
	uchar b = 0;
	

	Init_DS18B20();
	WriteOneChar(0xCC);    		//  没读序列号
	WriteOneChar(0x44); 		//  启动温度转换

	delay_18B20(100);      

	Init_DS18B20();
	WriteOneChar(0xCC); 		//没读序列号
	WriteOneChar(0xBE); 

	delay_18B20(100);

	a = ReadOneChar();    		//读取温度值低位
	b = ReadOneChar();   		//读取温度值高位
	temp_value = b;
	temp_value<<=8;
	temp_value = temp_value|a;
	if(temp_value<0x0fff)
		t=0;                  //正
    else
	{
		t=1;				 //负
		temp_value = ~temp_value+1;
	}
	k = temp_value*0.0625;
	temp_value = k*10+0.5;
	            
}

/***********温度数据转换成液晶显示字符**************/

void DispTemp()  		 
{ 
  uchar m=0;
  if(t==0)					 //正
  {
	  TempBuffer[0]='+';
	  TempBuffer[1]=temp_value/1000+'0';  			//百位
	  TempBuffer[2]=(temp_value%1000)/100+'0';  	//十位
	  TempBuffer[3]=temp_value%100/10+'0';  		//个位
	  TempBuffer[4]='.';
	  TempBuffer[5]=temp_value%10+'0';				//小数点
  }
  else						//负值
  {
	  TempBuffer[0]='-'; 
	  TempBuffer[1]=temp_value/1000+'0';  			//百位
	  TempBuffer[2]=temp_value%1000/100+'0';  		//十位
	  TempBuffer[3]=temp_value%100/10+'0';  		//个位
	  TempBuffer[4]='.';
	  TempBuffer[5]=temp_value/10%10+'0';		 	//小数点
  }
 
  TempBuffer[6]=0xdf;   				//温度符号
  TempBuffer[7]='C';
  TempBuffer[8]='\0';

  for(m=0;m<2;m++)
  {
    if(TempBuffer[m]=='0')
	 { 
	  TempBuffer[m]=' '; 	  
	 }
  }
}
void Delay1ms(uint count)			   //毫秒延时
{
	uint i,j;
	for(i=0;i<count;i++)
	for(j=0;j<120;j++);
}



/************液晶显示程序***************/
void display()   
{
  ReadTemp();                    //开启温度采集
  DispTemp();                   //温度数据转换成液晶字符
  GotoXY(8,1);                  //液晶字符显示位置
  Print(TempBuffer);             //显示温度
  GotoXY(0,0);
  Print("THE TEMPERATURE ");
  GotoXY(0,1);
  Print("IS NOW:");	
  Delay1ms(400);                 //扫描延时
}



main()
{
   	LCD_Initial();    		//液晶初始化
	Init_DS18B20( ) ;      //DS18B20初始化
	Delay1ms(5); 
	while(1)
	display();           //液晶显示数据	 
}




⌨️ 快捷键说明

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