基于51单片机的ds18b20温度测量+lcd1602显示

一,材料准备

stc89c52rc(封装:pdid40)

ds18b20(封装:to-92-3)

16v10uf电容

10k电阻

lcd1602显示屏

轻触开关

10k可调电阻(电位器)

30pf电容(22pf的也可以)

11.0592mHz晶振(12mHz的也可以)

杜邦线若干

二,资料链接

点击链接“https://sunm.lanzouj.com/iAh13272ah4d”领取

三,外围电路架设

基础外围:

首先,基础外围有供电电路、复位电路和晶振(时钟)电路,具体做法如下:

1、复位:复位需要在单片机第9脚上提供2us以上的高电平。按照下图接法,可实现开机自动复位及手动复位。

2、晶振电路:stc89c系列单片机需要外接晶振提供时钟信号。频率一般选在8~12MHz之间,起振电容多为22皮法或30皮法。

其他外围

lcd1602接线如图。其中,vo脚需要用于调节对比度(后文再叙)。

至此,电路基本完成接线。完整接线如下图(同资料包内pcb文件)。

正面如图:

pcb正面图

背面如图:

pcb背面图​​​​​​

四,代码实现

main.c,一个文件实现内容

//writer:见闻山海1209
//date:24-8
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;//ds18b20
uint tvalue;
uchar tflag;
uchar code disp1[]="Temperature";
uchar code disp2[]="Now:";
sbit RS=P1^2;
sbit RW=P1^1;
sbit CS=P1^0;
#define LCDDATA P0 
void Delay_xms(uint x)
{
  uint i,j;
  for(i=0;i<x;i++)
    for(j=0;j<112;j++);
}
void Delay_xus(uint x)//延时
{
   while(x--);
}
//lcd
void LCD_en_write(void)       
{
  CS=1;//EN   
  Delay_xus(20);
  CS=0;    
  Delay_xus(20);
}
  
//写
void Write_Instruction(uchar command)
{
  RS=0;
  RW=0;
  CS=1;
  LCDDATA=command;
  LCD_en_write();//写入
}

//写数据
void Write_Data(uchar Wdata)
{
  RS=1;
  RW=0;
  CS=1;
  LCDDATA=Wdata;
  LCD_en_write();//写入数据
}

//字符显示初始地址设置
void LCD_SET_XY(uchar X,uchar Y)
{
  uchar address;
  if(Y==0)
    address=0x80+X;
  else 
    address=0xc0+X;
  Write_Instruction(address);//写
}

//在第X行Y列开始显示
void LCD_write_str(uchar X,uchar Y,uchar *s)
{
  LCD_SET_XY(X,Y);//设置初始字符显示地址
  while(*s)
  {
    Write_Data(*s);
	s++;
  }
}

//在第X行Y列开始显示Wdata所对应的单个字符
void LCD_write_char(uchar X,uchar Y,uchar Wdata)
{
  LCD_SET_XY(X,Y);//写地址
  Write_Data(Wdata);//写入当前字符并显示
}
//清屏函数
void LCD_clear(void)
{
  Write_Instruction(0x01);
  Delay_xms(5);
}
//显示屏初始化函数
void LCD_init(void) 
{	
	Write_Instruction(0x38);				//8bit interface,2line,5*7dots
	Delay_xms(5);
	Write_Instruction(0x38);	
	Delay_xms(5);
	Write_Instruction(0x38);	

	Write_Instruction(0x08);	//关显示,不显光标,光标不闪烁
	Write_Instruction(0x01);	//清屏
	Delay_xms(5);
	
	Write_Instruction(0x04);	//写一字符,整屏显示不移动
	//Write_Instruction(0x05);	//写一字符,整屏右移
	//Write_Instruction(0x06);	//写一字符,整屏显示不移动
	//Write_Instruction(0x07);	//写一字符,整屏左移
	Delay_xms(5);
	
	//Write_Instruction(0x0B);	//关闭显示(不显示字符,只有背光亮)
	Write_Instruction(0x0C);	//开显示,光标、闪烁都关闭
	//Write_Instruction(0x0D);	//开显示,不显示光标,但光标闪烁
	//Write_Instruction(0x0E);	//开显示,显示光标,但光标不闪烁
	//Write_Instruction(0x0F);	//开显示,光标、闪烁均显示
}
void ds1820rst()/*ds1820复位*/
{ 
 uchar x=0;
 DQ = 1;          //DQ复位
 Delay_xus(4); //延时
 DQ = 0;          //DQ拉低
 Delay_xus(100); //精确延时大于480us
 DQ = 1;          //拉高
 Delay_xus(40); 
} 

uchar ds1820rd()/*读数据*/
{ 
 uchar i=0;
 uchar dat = 0;
 for(i=8;i>0;i--)
  {   
   DQ = 0; //给脉冲信号
   dat>>=1;
   DQ = 1; //给脉冲信号
   if(DQ)
   dat|=0x80;
   Delay_xus(10);
  }
  return(dat);
}

void ds1820wr(uchar wdata)/*写数据*/
{
 uchar i=0;
 for (i=8; i>0; i--)
  {
   DQ = 0;
   DQ = wdata&0x01;
   Delay_xus(10);
   DQ = 1;
   wdata>>=1;
  }
}
read_temp()/*读取温度值并转换*/
{
 uchar a,b;
 ds1820rst();    
 ds1820wr(0xcc);//*跳过读序列号*/
 ds1820wr(0x44);//*启动温度转换*/
 ds1820rst();    
 ds1820wr(0xcc);//*跳过读序列号*/ 
 ds1820wr(0xbe);//*读取温度*/ 
 a=ds1820rd();
 b=ds1820rd();
 tvalue=b;
 tvalue<<=8;
 tvalue=tvalue|a;
 if(tvalue<0x0fff)
  tflag=0;
 else
  {
   tvalue=~tvalue+1;
   tflag=1;
  }
 tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
 return(tvalue);
}

void main()
{ 
 uchar temp1,temp2,temp3,temp4;
 Delay_xms(50);//等待系统稳定 
 LCD_init();   //LCD初始化
 LCD_clear();  //清屏  
 LCD_write_str(3,0,disp1);
 LCD_write_str(0,1,disp2);
   while(1)
   {    
    read_temp();           //读取温度
	temp1=(tvalue/1000)+'0';     //百位
	temp2=(tvalue%1000/100)+'0'; //十位
	temp3=(tvalue%100/10)+'0';   //个位
	temp4=(tvalue%10)+'0';       //小数位 
	if(tflag)
	 LCD_write_char(4,1,'-');	
	else
     LCD_write_char(4,1,'+');
	LCD_write_char(5,1,temp1);
    LCD_write_char(6,1,temp2);
    LCD_write_char(7,1,temp3);
    LCD_write_char(8,1,0x2e);//"."
    LCD_write_char(9,1,temp4);
	LCD_write_char(10,1,0xdf);
	LCD_write_char(11,1,'C');
   }
}

五,运行实例 

正常情况下,没有调节lcd1602对比度前,屏幕没有可见显示。

调节对比度(调整10k电位器)后,显示效果:

​​​​​​​

### 回答1: 以下是基于51单片机+DS18B20温度传感器+LCD1602显示器的程序: ```c #include <reg52.h> #include <intrins.h> #define LCD1602_DATAPORT P0 // LCD1602数据口定义 sbit LCD1602_RS = P2^0; // LCD1602 RS引脚定义 sbit LCD1602_RW = P2^1; // LCD1602 RW引脚定义 sbit LCD1602_EN = P2^2; // LCD1602 EN引脚定义 #define DS18B20_DQ P3_7 // DS18B20数据线定义 unsigned char str[16]; // 存储温度字符串 void delay(unsigned int t) // 延时函数 { unsigned int i,j; for(i=0;i<t;i++) { for(j=0;j<125;j++); } } void LCD1602_WriteCmd(unsigned char cmd) // 写命令函数 { LCD1602_RS = 0; // RS置低 LCD1602_RW = 0; // RW置低 LCD1602_DATAPORT = cmd; // 将命令写入数据口 LCD1602_EN = 1; // EN置高 _nop_(); // 空操作 _nop_(); _nop_(); LCD1602_EN = 0; // EN置低 } void LCD1602_WriteData(unsigned char dat) // 写数据函数 { LCD1602_RS = 1; // RS置高 LCD1602_RW = 0; // RW置低 LCD1602_DATAPORT = dat; // 将数据写入数据口 LCD1602_EN = 1; // EN置高 _nop_(); // 空操作 _nop_(); _nop_(); LCD1602_EN = 0; // EN置低 } void LCD1602_Init() // LCD1602初始化函数 { LCD1602_WriteCmd(0x38); // 8位数据总线,2行显示,5*7点阵字符 delay(5); LCD1602_WriteCmd(0x0c); // 关闭光标显示 delay(5); LCD1602_WriteCmd(0x06); // 右移光标 delay(5); LCD1602_WriteCmd(0x01); // 清屏 delay(5); } unsigned char DS18B20_Init() // DS18B20初始化函数 { unsigned char flag = 0; DS18B20_DQ = 1; // DQ置高 delay(10); DS18B20_DQ = 0; // DQ置低 delay(80); DS18B20_DQ = 1; // DQ置高 delay(10); flag = DS18B20_DQ; // 读取DS18B20应答信号 delay(10); return flag; } void DS18B20_WriteByte(unsigned char dat) // DS18B20写字节函数 { unsigned char i; for(i=0;i<8;i++) { DS18B20_DQ = 0; // DQ置低 _nop_(); // 空操作 _nop_(); DS18B20_DQ = dat&0x01; // 写入数据,从低位开始写 delay(10); DS18B20_DQ = 1; // DQ置高 dat >>= 1; // 右移一位 } } unsigned char DS18B20_ReadByte() // DS18B20读字节函数 { unsigned char i,dat = 0; for(i=0;i<8;i++) { dat >>= 1; // 右移一位 DS18B20_DQ = 0; // DQ置低 _nop_(); // 空操作 _nop_(); DS18B20_DQ = 1; // DQ置高 delay(2); if(DS18B20_DQ) // 判断数据位 { dat |= 0x80; // 写入数据,从高位开始写 } else { dat &= 0x7f; } delay(10); } return dat; } void DS18B20_GetTemp() // DS18B20读取温度函数 { unsigned char TL,TH; float temp; DS18B20_Init(); // DS18B20初始化 DS18B20_WriteByte(0xcc); // 跳过ROM操作 DS18B20_WriteByte(0x44); // 启动温度转换 delay(750); // 等待转换完成 DS18B20_Init(); // DS18B20初始化 DS18B20_WriteByte(0xcc); // 跳过ROM操作 DS18B20_WriteByte(0xbe); // 读取温度寄存器数据 TL = DS18B20_ReadByte(); // 读取低温度字节 TH = DS18B20_ReadByte(); // 读取高温度字节 temp = TH; temp *= 256; temp += TL; temp *= 0.0625; // 计算温度值 sprintf(str,"Temp:%.2fC ",temp); // 将温度值转换为字符串 } void main() { LCD1602_Init(); // LCD1602初始化 while(1) { DS18B20_GetTemp(); // 获取温度LCD1602_WriteCmd(0x80); // 设置光标位置为第一行第一列 for(unsigned char i=0;i<16;i++) // 写入温度字符串 { LCD1602_WriteData(str[i]); } delay(1000); // 延时1秒 } } ``` 以上程序实现了基于51单片机+DS18B20温度传感器+LCD1602显示器的温度监测功能。具体实现过程为:初始化LCD1602DS18B20,循环读取DS18B20温度值,将温度值转换为字符串并在LCD1602显示,然后延时1秒后继续循环读取温度值。 ### 回答2: 这是一个基于51单片机DS18B20温度传感器和LCD1602显示器的程序,用于测量环境温度并在LCD显示器上显示。 首先,我们需要连接硬件设备。将DS18B20温度传感器的VCC引脚连接到51单片机的5V电源引脚,将GND引脚连接到GND引脚,将DQ引脚连接到P0口(可以根据需要更改引脚)。然后,将LCD1602显示器的VCC引脚连接到5V电源引脚,将GND引脚连接到GND引脚,将SCL引脚连接到51单片机的P2口,将SDA引脚连接到P3口。 接下来,打开编程软件,创建一个新的项目。首先,我们需要引入51单片机的头文件和宏定义。然后,我们需要定义DS18B20传感器的一些常量和变量,包括温度传感器的ROM码和温度值。接着,我们需要写一些函数用于初始化DS18B20传感器和LCD1602显示器,并读取温度值。 在主函数中,我们首先需要调用初始化函数来初始化DS18B20传感器和LCD1602显示器。然后,我们可以通过调用读取温度值的函数来获取当前环境温度,并将其存储到温度变量中。最后,我们可以通过调用LCD显示函数来在LCD显示器上显示温度值。 程序的基本逻辑是,当主函数运行时,首先初始化DS18B20传感器和LCD1602显示器。然后,通过读取温度传感器的值并将其转换为实际温度值,将实际温度值存储在温度变量中。最后,通过将温度值转换为字符串,并调用LCD显示函数将其显示LCD1602显示器上。 以上是一个简单的基于51单片机DS18B20温度传感器和LCD1602显示器的程序。程序的功能是测量环境温度并在LCD显示器上显示。 ### 回答3: 基于51单片机DS18B20温度传感器和LCD1602显示器的程序如下: 首先,我们需要包含头文件 #include <reg51.h> #include <lcd.h> #include <ds18b20.h> 然后,定义所需的变量 sbit LCD_RS = P2^0; // 设置LCD_RS引脚 sbit LCD_RW = P2^1; // 设置LCD_RW引脚 sbit LCD_EN = P2^2; // 设置LCD_EN引脚 定义主函数 void main() { float temperature; // 存储温度值 char display[16]; // 存储显示LCD上的字符串 LCD_Init(); // 初始化LCD1602显示DS18B20_Init(); // 初始化DS18B20传感器 while (1) // 无限循环 { temperature = DS18B20_GetTemp(); // 获取温度值 sprintf(display, "Temperature: %.2fC", temperature); // 格式化温度值字符串 LCD_Clear(); // 清除LCD屏幕 LCD_Write_String(display); // 显示温度值 Delay(500); // 延迟500毫秒 } } 程序的逻辑是:首先,我们初始化LCDDS18B20传感器。然后,在无限循环中,我们不断获取温度值,并将其格式化为字符串。然后,我们清除LCD屏幕并在LCD显示温度值。最后,我们延迟500毫秒,以便能够看到温度LCD上的显示。该程序可以实时显示DS18B20传感器测量到的温度值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值