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

📄 1602api.c

📁 液晶显示器1602与单片机接口,DS18B20测温
💻 C
字号:
/***********************************************
 液晶显示器1602与单片机接口,
 ds18B20测温
************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define _Nop() _nop_()
#define LCMDataPort P0
sbit LCM_RS=P3^5;
sbit LCM_RW=P3^4;
sbit LCM_EN=P3^3;

sbit DQ =P3^7;   //定义ds18b20检测端口

sbit P1_0=P1^0;
sbit P2_5=P2^5;
bit ds_flag=0;	 //ds18b20存在标志

void DelayMs(uchar);

void InitLCD(void);				 //液晶屏初始化
void WrCmdLCM(uchar WCLCM,uchar BusyC); //写液晶屏命令
uchar RdStatusLCM(void);	   //读液晶屏状态
void WrDataLCM(uchar WDLCM);   //写数据到液晶屏
uchar LCM_RdData(void) ;	   //读液晶屏数据
void DisplayOneChar(uchar x,uchar y,uchar DData); //在液晶屏上显示一个字符
void DisplayListChar(uchar x,uchar y,uchar slength,uchar *DData);//在液晶屏上显示一组数据
void delay15us(void);
void delay60us(void);
uint ReadTemperature(void);
void TemperConvert(void);
uint Temper;
uchar TemperL,TemperH;
uchar TemperInt,TemperDec;

/*-----------------------------------------------------
           主程序
---------------------------------------------------------*/
void main()
{
//	uchar code tab[16]={0x38,0x38,0x33,0x31,0x32,0x35,0x33,0x36};	//显示的数据内容
	uchar position;			   //显示位置变量
	uchar TemperBuf[8];

	InitLCD();
	DelayMs(200);
    DisplayListChar(1,2,11,"temperature");
	  DelayMs(200);
	position=0;
	while(1)					 //循环体
	{
     Temper=ReadTemperature();
	  TemperConvert();
	  TemperBuf[0]=0x54;
	  TemperBuf[1]=0x3a;
	  TemperBuf[2]=TemperInt/10+0x30;
	  TemperBuf[3]=TemperInt%10+0x30;
	  TemperBuf[4]=0x2e;
	  TemperBuf[5]=TemperDec+0x30; 
	  TemperBuf[6]=0x6f;
	  TemperBuf[7]=0x43;
	  DisplayListChar(2,1,8,TemperBuf);
	  DelayMs(200);
	  DelayMs(200);
	   
	   P1_0=~P1_0;
   /*   if(~(P3|0x7f))
	  {
	  position++;
	  if(position>8)
	  position=0;
	  while(~(P3|0x7f));
	  WrCmdLCM(0x01,1);
	  RdStatusLCM();
	  }*/
	}
}

void InitLCD()
{
	WrCmdLCM(0x38,1);
	WrCmdLCM(0x08,1);
	WrCmdLCM(0x01,1);
	WrCmdLCM(0x06,1);
	WrCmdLCM(0x0c,1);
}

void WrCmdLCM(uchar WCLCM,uchar BusyC)
{
	if(BusyC)RdStatusLCM();
	LCMDataPort=WCLCM;
	LCM_RS=0;
	LCM_RW=0;
	LCM_EN=0;
	_Nop();
	_Nop();
	LCM_EN=1;	
}

uchar RdStatusLCM()
{
	LCMDataPort=0xff;
	LCM_RS=0;
	LCM_RW=1;
	LCM_EN=0;
	_Nop();
	LCM_EN=1;
	while(LCMDataPort&0x80);
	return(LCMDataPort);

}


void WrDataLCM(uchar WDLCM)
{
	RdStatusLCM();
	LCMDataPort=WDLCM;
	LCM_RS=1;
	LCM_RW=0;
	LCM_EN=0;
	_Nop();
	LCM_EN=1;

}


uchar LCM_RdData(void)
{
	LCM_RS=1;
	LCM_RW=1;
	LCM_EN=0;
	_Nop();
	LCM_EN=1;
	return(LCMDataPort);
}


void DisplayOneChar(uchar x,uchar y,uchar DData)
{
	x=x&0x0f;
	y=y&0x01;
	if(y)x=x|0x40;
	x|=0x80;
	WrCmdLCM(x,0);
	WrDataLCM(DData);
				 
}

void DisplayListChar(uchar x,uchar y,uchar slength,uchar *DData)
{
	uchar ListLength;
	ListLength=0;
	x=x&0x0f;
	y=y&0x01;
	while(ListLength<slength)
	{
	 DisplayOneChar(x,y,DData[ListLength]);
	 ListLength++;
	 x++;
	}

}
/*------------------------------------------
     18b20测温程序
-------------------------------------------*/
//初始化函数
void Init_DS18B20(void)	   /////////////////////////////
{
 uchar i;
 DQ = 1;    //DQ复位
 _nop_();  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 for(i=0;i<8;i++)
 delay60us(); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay60us();
 if(DQ==0)
   {
    ds_flag=1;	  //ds18b20为1,置1
 	delay60us();
	delay60us();
    delay60us();
	}
  else
    ds_flag=0;
}
	

//读一个字节
uchar ReadOneChar(void)		 ////////////
{
  uchar i=0;
  uchar dat = 0;
for (i=8;i>0;i--)
 {
  dat>>=1;
  DQ=1;
  _nop_();
  DQ = 0; // 给脉冲信号
  _nop_(); _nop_();_nop_();	_nop_();
  DQ = 1; // 给脉冲信号
   _nop_(); _nop_();_nop_();_nop_();_nop_();
  if(DQ)						  
   dat|=0x80;
  delay15us();delay15us();delay15us();
 }
 return(dat);
}



//写一个字节
void WriteOneChar(uchar dat)
{
 uchar i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  _nop_(); _nop_();_nop_();_nop_();
  _nop_(); _nop_();_nop_();_nop_();
  DQ = dat&0x01;
  delay15us();delay15us();delay15us();
  DQ = 1;
  dat>>=1;
 }
}




//读取温度
uint ReadTemperature(void)
{
   uchar temperL=0;
   uchar temperH=0;
   uchar temper=0;
   uint  temperbak=0;

    DQ=1;
	Init_DS18B20();
	while(ds_flag==0)
       Init_DS18B20();
    delay60us();
	WriteOneChar(0xCC); // 跳过读序号列号的操作
	WriteOneChar(0x44); // 启动温度转换

	Init_DS18B20();
	WriteOneChar(0xCC); //跳过读序号列号的操作
	WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
	temperL=ReadOneChar();
	temperH=ReadOneChar();
	temperbak=temperH;
	temperbak<<=8;
	temperbak=temperbak|temperL;
	return(temperbak);
}

void TemperConvert()				 //温度转换
{
	TemperInt=(Temper&0x7ff0)>>4;
	TemperDec=0;
	if(Temper&0x0008)
	  TemperDec+=50;
	if(Temper&0x0004)
	  TemperDec+=25;
	 if(Temper&0x0002)
	  TemperDec+=13;
	 if(Temper&0x0001)
	  TemperDec+=6;
	 TemperDec=TemperDec/10;
}
		
void delay15us(void)
{
	uchar i;
	for(i=0;i<3;i++);
}

void delay60us(void)
{
	uchar i;
	for(i=0;i<18;i++);
}

void DelayMs(uchar no)
{
	uchar i,j;
	for(i=0;i<no;i++)
	{
	  for(j=0;j<164;j++);
	  for(j=0;j<164;j++);
	 }
}


















⌨️ 快捷键说明

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