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

📄 18b20lcd.c

📁 ds18b20温度采集 rt12232和共阴极led同时显示温度 开发环境为keil软件
💻 C
字号:
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define	uchar unsigned char
unsigned code zima1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned int zima2[10]={0};

sbit DQ =P2^0;   
sbit a=P2^7;
sbit b=P2^6;
sbit c=P2^5;
sbit dp=P0^7;

sbit E1=P2^1;	
sbit E2=P2^2;	
sbit RW=P2^3;
sbit A0=P2^4;	 

#define DATA P1

unsigned char code bmp001[]=
{
/*--  文字:  祝  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x08,0x89,0xCE,0xA8,0x18,0x00,0xFE,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,
0x02,0x01,0x00,0xFF,0x00,0x83,0x40,0x30,0x0F,0x00,0x00,0x7F,0x80,0x80,0xF0,0x00,

/*--  文字:  大  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,

/*--  文字:  家  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x18,0x04,0x14,0x94,0x94,0xD5,0xB6,0x14,0x14,0x94,0x04,0x14,0x0C,0x04,0x00,
0x00,0x29,0x29,0x15,0x14,0x4A,0x89,0x44,0x3F,0x06,0x09,0x09,0x10,0x30,0x10,0x00,

/*--  文字:  中  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,

/*--  文字:  秋  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x24,0x24,0xE4,0xFC,0xA2,0x22,0x22,0x80,0x70,0x00,0xFF,0x40,0x20,0x18,0x00,0x00,
0x02,0x01,0x00,0xFF,0x00,0x83,0x40,0x20,0x18,0x07,0x01,0x06,0x18,0xE0,0x40,0x00,

/*--  文字:  快  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x70,0x00,0xFF,0x08,0xB0,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0xF8,0x80,0x80,0x00,
0x00,0x00,0xFF,0x00,0x80,0x40,0x30,0x0E,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,

/*--  文字:  乐  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x40,0xFC,0x44,0x44,0x44,0x46,0xFA,0x42,0x43,0x43,0x42,0x40,0x00,0x00,
0x00,0x20,0x18,0x0C,0x07,0x12,0x20,0x40,0x3F,0x00,0x00,0x02,0x0C,0x38,0x10,0x00,


/*--  文字:  温  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,

/*--  文字:  度  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,


/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,

/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,

/*--  文字:  .  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
};

void delay1(char a)
{
   while(a--);
}

void	OUTMD(unsigned char i)
{	

	A0=1;	//写数据
	//delay(5);
	E1=1;
	//delay(10);
	DATA=i;
	//delay(5);
	E1=0;
	
}
//左页
//发送命令
void	OUTMI(unsigned char i)
{
	A0=0;	//写指令
	//delay(5);
	E1=1;
	//delay(10);
	DATA=i;
	//delay(5);
	E1=0;
	
}
//右页
//发送数据
void	OUTSD(unsigned char i)
{	
	A0=1;	//写数据
	//delay(5);
	E2=1;
	//delay(10);
	DATA=i;
	//delay(5);
	E2=0;

}
//右页
//发送命令
void	OUTSI(unsigned char i)
{
	A0=0;	//写指令
	//delay(5);
	E2=1;
	//delay(10);
	DATA=i;
	//delay(5);
	E2=0;
	
}

//初始化
void	lcdini(void)
{
	RW=0;
	OUTMI(0XE2);
	OUTSI(0XE2);//复位
	OUTMI(0XAE);
	OUTSI(0XAE);//POWER SAVE
	OUTMI(0XA4);
	OUTSI(0XA4);//动态驱动
	OUTMI(0XA9);
	OUTSI(0XA9);//1/32占空比
	OUTMI(0XA0);
	OUTSI(0XA0);//时钟线输出
	OUTMI(0XEE);
	OUTSI(0XEE);//写模式
	
	OUTMI(0X00);
	OUTMI(0XC0);
	OUTSI(0X00);
	OUTSI(0XC0);
	
	OUTMI(0XAF);
	OUTSI(0XAF);
	
}
/*
函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------
*/
void SetPage(uchar page0,uchar page1)
{
  OUTMI(0xB8|page1);OUTSI(0xB8|page0);
}

/*
--------------------------------------------------------------------------------
函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
*/
void SetAddress(uchar address0,uchar address1)
{
  OUTMI(address1);OUTSI(address0);
}

/*
--------------------------------------------------------------------------------

调用方式:void PutChar0(uchar ch)
函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutCharR(uchar ch)
{
  OUTSD(ch);
}

/*
--------------------------------------------------------------------------------

调用方式:void PutChar1(uchar ch)
函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutCharL(uchar ch)
{
  OUTMD(ch);
} 



/*
--------------------------------------------------------------------------------

调用方式:void clrscr(void)
函数说明:清屏
--------------------------------------------------------------------------------
-*/
void clrscr(void)
{
  uchar i;
  uchar page;
  for (page=0;page<4;page++)
  {
    SetPage(page,page);
    SetAddress(0,0);
    for (i=0;i<61;i++)
		{PutCharR(0);
		PutCharL(0);}
  }
} 



//---------------------------------------------------------------
//---------------------------------------------------------------
//采用zimo2  显示汉字,以汉字的显示方式
//void Draw_word(uchar d_where,uint x_add,bit layer,uchar width)
//d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。
//---------------------------------------------------------------


void Draw_word(uint d_where,uint x_add,bit layer,uchar width,bit s)
{
  uchar x,address,     //address表示显存的物理地址
   page=0;	//page表示上下两页
  bit window=0;  //window表示左右两页
 //putcharR	//右边
 //putcharL	//左边
 	if(s==0)
  		d_where=d_where*32;
	else
		d_where=304+d_where*16;

  for (x=width;x>1;x--)
	   { 
		if (x_add>60) 
			 {
			  window=1;address=x_add%61;
		 	 }
		else 
			address=x_add;
			
		
		if(layer==0)	//显示一行八个字
		   {if (x_add>60) 
			 {
			  window=1;address=x_add%61;
		 	 }
		else 
			address=x_add;
			SetPage(0,0);
			SetAddress(address,address);
				if(window==1)
					PutCharR(bmp001[d_where]);//右边
				else
					PutCharL(bmp001[d_where]);//左边
		
			SetPage(1,1);
			SetAddress(address,address);
		
				if(window==1)
					PutCharR(bmp001[d_where+width]);
				else
					PutCharL(bmp001[d_where+width]);
		
			}
		else
			{				//显示第二行八个汉字
			SetPage(2,2);
			SetAddress(address,address);
			if(window==1)
				PutCharR(bmp001[d_where]);//右边
			else	
				PutCharL(bmp001[d_where]);//左边
			SetPage(3,3);
			SetAddress(address,address);
			if(window==1)
				PutCharR(bmp001[d_where+width]);
			else
				PutCharL(bmp001[d_where+width]);
			
			}
	    x_add++;
	    d_where++;
 }
}


void xianshi(void)
{
	

   
		P0=zima1[zima2[3]]; //读取温度的高值;
		a=1;b=1;c=0;   //所放数的位置;
	Draw_word(0,1,0,16,0); //每次只能显示14个汉字,即0~13位排列; 
		P0=zima1[zima2[4]]; //读取温度的高值
		a=0;b=1;c=0;dp=1;          //所放数的位置
 	Draw_word(1,17,0,16,0); 
		P0=zima1[zima2[5]]; //读取温度的高值
		a=1;b=0;c=0;           //所放数的位置
 	Draw_word(2,33,0,16,0); 
		P0=zima1[zima2[6]]; //读取温度的高值
		a=0;b=0;c=0;           //所放数的位置
 	Draw_word(3,49,0,16,0); 	
		P0=zima1[zima2[3]]; //读取温度的高值;
		a=1;b=1;c=0;   //所放数的位置;
 	Draw_word(4,65,0,16,0); 
		P0=zima1[zima2[4]]; //读取温度的高值
		a=0;b=1;c=0;dp=1;          //所放数的位置
  	Draw_word(5,81,0,16,0); 
		P0=zima1[zima2[5]]; //读取温度的高值
		a=1;b=0;c=0;           //所放数的位置
 	Draw_word(6,97,0,16,0); 	
		P0=zima1[zima2[6]]; //读取温度的高值
		a=0;b=0;c=0;           //所放数的位置
 	Draw_word(7,1,1,16,0); 	
		P0=zima1[zima2[3]]; //读取温度的高值;
		a=1;b=1;c=0;   //所放数的位置;
	Draw_word(8,17,1,16,0); 
		P0=zima1[zima2[4]]; //读取温度的高值
		a=0;b=1;c=0;dp=1;          //所放数的位置
	Draw_word(9,33,1,8,0); 	
		P0=zima1[zima2[5]]; //读取温度的高值
		a=1;b=0;c=0;           //所放数的位置
 
	Draw_word(zima2[3],41,1,8,1); 
	 	P0=zima1[zima2[6]]; //读取温度的高值
		a=0;b=0;c=0;           //所放数的位置
	Draw_word(zima2[4],49,1,8,1);
		P0=zima1[zima2[3]]; //读取温度的高值;
		a=1;b=1;c=0;   //所放数的位置;
 	Draw_word(10,57,1,8,1); 	
		P0=zima1[zima2[4]]; //读取温度的高值
		a=0;b=1;c=0;dp=1;          //所放数的位置
   	Draw_word(zima2[5],65,1,8,1);
		P0=zima1[zima2[5]]; //读取温度的高值
		a=1;b=0;c=0;           //所放数的位置
	Draw_word(zima2[6],73,1,8,1);
		P0=P0=zima1[zima2[6]]; //读取温度的高值
		a=0;b=0;c=0;           //所放数的位置
	  	
}

void write1(unsigned int i)    //计算所取得的数值;
{	  
		i=i*100/17;
		zima2[3]=i/1000;
		zima2[4]=i/100%10;
	  	zima2[5]=i/10%10;
	  	zima2[6]=i%10;
	  	xianshi();
}

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

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




//写一个字节
void WriteOneChar(unsigned char dat)
{
 	unsigned char i=0;
 	for (i=8; i>0; i--)
 	{
 		DQ = 0;
  		DQ = dat&0x01;
  		delay1(5);
  		DQ = 1;
  		dat>>=1;
 	}

}

//读取温度
unsigned int  ReadTemperature(void)
{
	unsigned char a=0;

	unsigned int t=0;
	
	Init_DS18B20();
	WriteOneChar(0xCC); // 跳过读序号列号的操作
	WriteOneChar(0x44); // 启动温度转换
	Init_DS18B20();
	WriteOneChar(0xCC); //跳过读序号列号的操作
	WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
	a=ReadOneChar();
	t=ReadOneChar();

	t<<=8;
	t=t|a;
   
	//t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
    //a=tt+0.5;
	return(t);
}


void main()
{
	P2=0xfe;
		lcdini();	
  	clrscr();
	while(1)
	{
		unsigned int i;

     	 i=ReadTemperature();//读温度
		 write1(i);		
	}

}












⌨️ 快捷键说明

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