标题:
用单片机+LCD1602采集温度数据(DS18B20传感器)
[打印本页]
作者:
李敏儿oc
时间:
2020-3-8 11:56
标题:
用单片机+LCD1602采集温度数据(DS18B20传感器)
51单片机视频教程中,是用数码管来显示温度的,这里用LCD1602来显示数据,效果图如下
_1UA(U81828XJM7U]~L~YQE.jpg
(159.58 KB, 下载次数: 42)
下载附件
2020-3-8 11:44 上传
下面是代码,采用模块化编程,分成LCD1602和DS18B20两个模块,在LCD1602的程序中调用DS18B20的读取温度数据,主函数中调用LCD1602的显示数据,从而显示温度
1.主函数代码
#include "reg52.h"
#include "lcd1602.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif
void main()
{
LcdDisp();
while(1);
}
复制代码
2.LCD1602代码
#include "lcd1602.h"
#include "ds18b20.h"
extern u8 Tempdata[9]; //声明ds18b20中保存温度数据的数组,扩展使用范围
void Lcd1602_Delay1ms(u8 c) //误差 0us
{
u8 a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void Lcd1602WriteCom(u8 com) //写命令函数
{
LCD_E=0;
LCD_RS=0; //写命令,RS=0
LCD_RW=0;
LCD_DATAPIN=com;
Lcd1602_Delay1ms(1);
LCD_E=1;
Lcd1602_Delay1ms(5);
LCD_E=0;
}
void Lcd1602WriteDat(u8 dat) //写数据函数
{
LCD_E=0;
LCD_RS=1; //写数据,RS=1
LCD_RW=0;
LCD_DATAPIN=dat;
Lcd1602_Delay1ms(1);
LCD_E=1;
Lcd1602_Delay1ms(5);
LCD_E=0;
}
void LcdInit() //初始化函数
{
Lcd1602WriteCom(0x38); //功能设置指令,总线8位,显示2行,5x7点阵每个字符
Lcd1602WriteCom(0x0c); //显示开关控制指令,显示功能开,无光标
Lcd1602WriteCom(0x06); //模式设置指令,写入新数据后光标右移,显示屏不移动
Lcd1602WriteCom(0x01); //清屏指令
Lcd1602WriteCom(0x47+0x80); //写入第二行倒数第八个位置
}
void LcdDisp() //显示函数
{
u8 i;
LcdInit(); //LCD初始化
tempdatapros(Tempdata); //读取温度数据,存入数组中
for(i=0;i<9;i++)
{
Lcd1602WriteDat(Tempdata[i]);
}
}
复制代码
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include "reg52.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif
#define LCD_DATAPIN P0 //定义数据口
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
void LcdDisp();
复制代码
3.DS18B20代码
#include "ds18b20.h"
u16 temp;
u8 Tempdata[9];
void delay1ms(u8 y) //延时函数,延时y毫秒
{
u8 x;
for(;y>0;y--)
for(x=110;x>0;x--);
}
u8 ds18b20Init() //温度传感器初始化函数
{
u8 i;
DSPORT=0;
i=60;while(i--); //约延时600us
DSPORT=1;
while(DSPORT)
{
i++;
if(i>6)
return 0; //初始化失败
}
return 1; //初始化成功
}
u8 Ds18b20Read() //从DS18B20中读数据
{
u8 dat=0,bi;
u8 i,j=0;
for(i=0;i<8;i++)
{
DSPORT=0;
j++;
DSPORT=1;
j++;
dat>>=1;
bi=DSPORT;
dat|=(bi<<7);
j=5;while(j--);
}
return dat;
}
void Ds18b30Write(u8 dat) //将数据写入DS18B20
{
u8 i,j=0;
for(i=0;i<8;i++)
{
DSPORT=0;
j++;
DSPORT=dat<<7;
j=6;while(j--);
DSPORT=1;
dat>>=1;
}
}
void Ds18b20TempConvert() //温度转换函数
{
ds18b20Init();
delay1ms(1);
Ds18b30Write(0xcc); //发送跳过ROM指令
Ds18b30Write(0x44); //发送温度转换指令
}
void Ds18b20ReadTempCom() //发送读暂存器指令
{
ds18b20Init();
delay1ms(1);
Ds18b30Write(0xcc); //发送跳过ROM指令
Ds18b30Write(0xbe); //发送读暂存器指令
}
void Ds18b20ReadTemp() //读温度存到temp中
{
u8 th,tl;
Ds18b20TempConvert();
Ds18b20ReadTempCom();
tl=Ds18b20Read();
th=Ds18b20Read();
temp=th<<8;
temp=temp|tl;
if(temp<0)
{
Tempdata[0]='-'; //若温度为负值,前面加负号
temp=~(temp-1);
temp=temp*0.0625*100+0.5;
}
else
{
Tempdata[0]=' '; // 温度为正值,前面无符号,显示空格
temp=temp*0.0625*100+0.5;
}
}
void tempdatapros(u8 Tempdata[]) //将读取的温度temp处理,放入数组中
{
Ds18b20ReadTemp();
/*数据位加‘0’,使数字转化为相应字符*/
Tempdata[1]=temp/10000+'0'; //百位
Tempdata[2]=temp/100%100/10+'0'; //十位
Tempdata[3]=temp/100%10+'0'; //个位
Tempdata[4]='.'; //小数点
Tempdata[5]=temp/10%10+'0'; //小数点后第一位
Tempdata[6]=temp%10+'0'; //小数点后第二位
Tempdata[7]=0xdf; //温度单位,摄氏度的‘。’
Tempdata[8]='C';
if(Tempdata[1]=='0') //如果温度百位为0,显示空格
Tempdata[1]=' ';
}
复制代码
#ifndef __ds18b20_H_
#define __ds18b20_H_
#include "reg52.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif
sbit DSPORT=P3^7; //定义数据管脚
void tempdatapros(u8 Tempdata[]);
#endif
复制代码
这个程序的缺点是不能实时更新温度数值,可以加中断函数或者其它函数来设定隔多长时间更新一次
欢迎大家在此基础上创
全部资料51hei下载地址:
LCD1602 DS18B20.zip
(36.4 KB, 下载次数: 78)
2020-3-8 11:55 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
7778882
时间:
2021-7-1 09:50
呜呜呜太有用了 感谢大神
作者:
hs1111
时间:
2021-7-2 20:08
有没有实时温度显示
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1