打印

DS18B20在LCD12864上的温度显示

[复制链接]
9170|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mindist|  楼主 | 2009-10-15 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天突然想起今年暑假刚接触单片机时搞的一个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 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(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;
}
//----------------------温度获取函数---------------------------
void get_temp()
{
init_temp();  //初始化,复位并获取应答信号
wr_temp(0xcc);  //跳过ROM
wr_temp(0x44);  //开始温度转换
delay_ms(1000);  //等待温度转换完成
init_temp();  //将DS18B20复位
wr_temp(0xcc);  //跳过ROM
wr_temp(0xbe);  //读暂存器
low=rd_temp();  //读取低8位
high=rd_temp();  //读取高8位
temp=high;
temp<<=8;
temp=temp|low;  //将读取的低8位和高8位合并
f_temp=temp*0.0625;  //温度在寄存器中为12位 分辨率位0.0625°
temp=f_temp*10+0.5;  //精确到十分位,四舍五入
d2=temp/100;  //显示数据:十位
d1=temp%100/10;  //显示数据:个位
d0=temp%10;  //显示数据:十分位

}
//-----------------主函数------------------------
void main()
{
init();    //lcd初始化   
while(1)
{
  get_temp();  //获取温度
  dat_dis();  //显示温度   
}
}

相关帖子

沙发
Mindist|  楼主 | 2009-10-15 18:17 | 只看该作者
由于用12864显示的,所以程序有点长,呵呵~~

使用特权

评论回复
板凳
ningling_21| | 2009-10-15 19:32 | 只看该作者
能正常显示吗?

使用特权

评论回复
地板
Mindist|  楼主 | 2009-10-15 21:39 | 只看该作者
3# ningling_21
可以的。。。在我的89c52上显示正常~

使用特权

评论回复
5
Mindist|  楼主 | 2009-10-16 11:12 | 只看该作者
没人要的?⊙﹏⊙b汗。。。

使用特权

评论回复
6
longcai1988| | 2009-10-16 20:06 | 只看该作者
我觉得有问题,能给个原理图看看吗?
邮箱:longcai062051@163.com
5# Mindist

使用特权

评论回复
7
Mindist|  楼主 | 2009-10-16 22:15 | 只看该作者
6# longcai1988
当然可以,发到你邮箱了。。。

实验板原理图.pdf

1.53 MB

使用特权

评论回复
8
longcai1988| | 2009-10-17 16:35 | 只看该作者
已收到,可能我用个的12864的液晶跟你的不一样,我的是18引脚的,就误以为你错了,看来是我知识太浅薄了,以后还是低调点算了。
7# Mindist

使用特权

评论回复
9
Mindist|  楼主 | 2009-10-17 17:29 | 只看该作者
8# longcai1988
呵呵,其实我也没接触过18脚的12864。

使用特权

评论回复
10
328500920| | 2009-10-27 23:46 | 只看该作者
KAN KAN学习

使用特权

评论回复
11
雨夜入眠| | 2011-12-24 11:58 | 只看该作者
我也想看看,谁有的能否发个给我,谢谢1030326357@qq.com

使用特权

评论回复
12
lanselove33| | 2013-3-14 14:35 | 只看该作者
:)

使用特权

评论回复
13
chuxiayijiu| | 2013-4-16 23:00 | 只看该作者
Mindist 发表于 2009-10-15 18:17
由于用12864显示的,所以程序有点长,呵呵~~

您好,我想问一下你做的适合是现在protues里仿真了再做实物的呢还是没仿真直接用实物调试的呢?

使用特权

评论回复
14
草原狼10| | 2013-4-16 23:06 | 只看该作者
今天真好被这个问题搞得一头遭呀!!!希望有所帮助

使用特权

评论回复
15
arsenalkobe| | 2013-5-18 08:50 | 只看该作者
你好,我想看看,能发给我一份吗?993879480@qq.com

使用特权

评论回复
16
yuanquan12345| | 2013-5-18 16:55 | 只看该作者
学习了。

使用特权

评论回复
17
cityant| | 2013-5-19 22:38 | 只看该作者
感谢楼书,好好学习一下

使用特权

评论回复
18
大米和小米| | 2013-5-20 11:46 | 只看该作者
楼主的程序看起来很规矩,不错

使用特权

评论回复
19
lbr_gao| | 2013-5-20 18:16 | 只看该作者
感谢分享

使用特权

评论回复
20
lwyjw| | 2013-5-20 19:51 | 只看该作者
态度值得表扬。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:生活不懂我,但是我得懂生活。

13

主题

136

帖子

1

粉丝