找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2923|回复: 6
收起左侧

单片机+LCD12864温度显示(DS18B20)

[复制链接]
296892430 发表于 2019-7-22 21:56 | 显示全部楼层 |阅读模式

附件完整代码

附件完整代码

---------------------------------------------------------------LCD12864温度显示(DS18B20)------------------------------------------------------------
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;      //定义lcd使能端
sbit lcdrs=P3^5;      //定义lcd数据命令选择端
sbit lcdwr=P3^6;      //定义lcd读写选择端
sbit lcdrd=P3^7;      //定义并串选择端
sbit DQ=P2^2;       //定义DS18B20数据线引脚端
uchar high,low;
char a,d2,d1,d0;
float f_temp;
uint i,j,temp;
uchar code line1[] = {"电工电子创新协会"};
uchar code line2[]="当前温度:";
uchar code line3[]="00.0度";
//-------------------毫秒级延时函数-------------------------
void delay_ms(uint z)      //延时z毫秒
{
uint x,y;
for(x=z;x>0;x--)
  for(y=115;y>0;y--);
}
//------------lcd写指令函数-------------
void wr_cmd(uchar cmd)
{
lcden=0;
lcdrs=0;
P0=cmd;
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}
//-----------lcd写数据函数-----------
void wr_dat(uchar dat)
{
lcden=0;
lcdrs=1;
P0=dat;
delay_ms(1);
lcden=1;        
delay_ms(1);
lcden=0;
}

//-----------------------用户界面文字显示函数--------------------------
void face_dis()      
{
wr_cmd(0x30);           //选择功能:8位数据基本指令操作
wr_cmd(0x0c);          //整体显示开,不显示光标
wr_cmd(0x01);          //lcd清屏
wr_cmd(0x02);          //游标归原点
wr_cmd(0x80);
for(a=0;a<16;a++)         //写入第二行数据
{
  wr_dat(line1[a]);
}

wr_cmd(0x90);          //设置第二行起始位
for(a=0;a<10;a++)         //写入第二行数据
{
  wr_dat(line2[a]);
}
wr_cmd(0x8c);          //设置第三行起始位
for(a=0;a<6;a++)         //写入第三行数据
{
  wr_dat(line3[a]);
}
}
//------------------------用户界面数据显示函数-------------------------------
void dat_dis()
{
wr_cmd(0x8c);  //显示温度
wr_dat(0x30+d2);
wr_dat(0x30+d1);
wr_dat(0x2e);  //写入“.”号
wr_dat(0x30+d0);
}
//-----------------------------初始化函数------------------------------------
void init()
{
delay_ms(20);      //等待液晶输入电源稳定
lcdrd=1;       //选定lcd与单片机并行连接
lcdwr=0;       //因为我们不需要从lcd模块读数据,所以可直接将此端口清零,便于之后利用矩阵键盘
face_dis();       //显示用户界面
}
//-----------------------获温部分:初始化函数--------------------
void init_temp()
{
DQ=0;  //拉低总线,产生复位信号
i=80;while(i>0)i--;  //延时480~960us
DQ=1;  //拉高总线
i=4;while(i>0)i--;  //延时15~60us
while(DQ);  //等待产生应答脉冲
i=70;while(i>0)i--;  //延时至少480us
}
//------------------获温部分:写函数-------------------------------
void wr_temp(uchar dat)  //写1个字节
{
bit testb;
for(j=8;j>0;j--)
{
  testb=dat&0x01;
  dat=dat>>1;
  if(testb)  //写1
  {
   DQ=0;  //拉低总线,产生写时间隙
   i++;  //延时大于1us
   DQ=1;  //拉高总线
   i=8;while(i>0)i--;  //延时至少60us,供DS18B20采样
  }
  else    //写0
  {
   DQ=0;  //拉低总线,产生写时间隙
   i=8;while(i>0)i--;  //保持至少60us,供DS18B20采样
   DQ=1;  //拉高总线
   i++;i++;
  }
}
}
//------------------获温部分:读函数-------------------------------
uchar rd_temp()  //读1个字节
{
bit b;  //定义存放接收到的1个字节
uchar i_b;
uchar rdbyte;
for(j=8;j>0;j--)
{
  DQ=0;  //拉低总线,产生读时隙
  i++;  //延时大于1us
  DQ=1;  //释放总线
  i++;i++;  //给一定时间让总线释放
  b=DQ;  //读取数据
  i=8;while(i>0)i--;  //延时至少60us
  i_b=b;
  rdbyte=(i_b<<7)|(rdbyte>>1);  //将读取到得一位值左移7位,存放读取的数据变量rdbyte右移1位
}
return rdbyte;
}
//----------------------温度获取函数-----------------------

12864温度显示——成功.zip

33.56 KB, 下载次数: 218, 下载积分: 黑币 -5

完整代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

断线 发表于 2020-7-6 22:25 | 显示全部楼层
可以问一下么,怎么调到在第一行显示  当前温度:xx.x度
回复

使用道具 举报

欣语宝贝 发表于 2020-7-8 07:24 来自手机 | 显示全部楼层
看着很简单,做起来好蓝
回复

使用道具 举报

关中小河 发表于 2020-7-17 08:40 | 显示全部楼层
认真学习 才是硬道理
回复

使用道具 举报

123yqs 发表于 2020-11-25 09:29 | 显示全部楼层
没有仿真图?
回复

使用道具 举报

zhangleixbyl 发表于 2021-1-14 22:01 | 显示全部楼层
所有引脚都接吗,我没不会能给个接线图吗
回复

使用道具 举报

人人学会单片机 发表于 2021-1-15 11:49 | 显示全部楼层
我们写的DS18B20的代码 初始化是不需要死等延迟的,有需要的可以下载
http://www.51hei.com/bbs/dpj-200968-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表