找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7436|回复: 7
打印 上一主题 下一主题
收起左侧

DS18B20温度探测器终于成功了

  [复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-24 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
仿真图片如下:(当前温度为13.0000度)



实物图片(当前温度为30.5000度)


   经过几个星期的努力终于把DS18B20温度探测做出来了。前段时间一直不能读出温度出来,不知是什么原因,参照别人用汇编写的程序才明白是自己的复位程序少了个延时,结果后面的时序全都出错了。

程序如下:
#include <reg51.h>
#include<intrins.h>
sbit dq = P1^0;//定义P1.0为DS18B20的数据线
sbit P1_1=P1^1;
sbit P2_0 = 0xA0^0;
sbit P2_1 = 0xA0^1;
sbit P2_2 = 0xA0^2;
sbit P2_3 = 0xA0^3;
sbit P2_4 = 0xA0^4;
sbit P2_5 = 0xA0^5;
sbit P2_6 = 0xA0^6;
void delay(unsigned char i);
bit init_18b20();
void w_18b20(unsigned char dat);
unsigned char r_18b20();
void LedDisp();
unsigned char dis[]={0x00,0x00,0x00,0x00,0x00,0x00};//显示数据
unsigned char TemL;
unsigned char TemLH;
unsigned char TemLL;
unsigned char TemH;
unsigned long Tem;
bit TempS;
void main()
{
bit res;
while(1)
{
  do
  {
   res=init_18b20();//复位并检测DS18B20是否存在
  }
  while (res);//存在继续

  w_18b20(0xCC);//跳过ROM匹配
  w_18b20(0x44);//开始温度转换

  do//等待温度转换完成
  {
  dq=0;
  _nop_();
  _nop_();
  _nop_();
  dq=1;
  delay(6);
  TempS=dq;
  delay(22);
  }
  while (!TempS);//温度转换完成后继续
  init_18b20();//复位
  w_18b20(0xCC);//跳过ROM匹配
  w_18b20(0xBE);//读取温度值
  TemL=r_18b20();//低位
  TemH=r_18b20();//高位

  if (TemH&0x80)//把读取的温度值进行转换,并存进dis[]中
  {
   TemH=~TemH;
   TemL=(~TemL)+1;
   TempS=1;
  }
  else TempS=0;

  TemLH=TemL>>4;
  TemLL=TemL&0x0F;
  Tem=(TemH*16 + TemLH + TemLL*0.0625)*10000;

  dis[5]=Tem%10;
  Tem=Tem/10;
  dis[4]=Tem%10;
  Tem=Tem/10;
  dis[3]=Tem%10;
  Tem=Tem/10;
  dis[2]=Tem%10;
  Tem=Tem/10;
  dis[1]=Tem%10;
  Tem=Tem/10;
  dis[0]=Tem%10;
  LedDisp();//温度显示
}
}
void delay (unsigned char i) //延时程序,12M晶振下延时为:(2i+3)us ,i=0~255
{
while (--i);
}
bit init_18b20() //初始化,init_18b20=0初始化成功,init_18b20=1初始化失败,可能18b20不存在
{
dq=1;
_nop_();
dq=0;
delay(255);
dq=1;
delay(34);
TempS=dq;
delay(120);
return (TempS);
}
void w_18b20(unsigned char dat) //写一个字节到18b20
{
unsigned char i=0;
for(i=8;i>0;i--)
{
  dq=0;
  delay(5);
  dq=dat&0x01;
  delay(22);//延时
  dq=1;
  dat>>=1;
}
}
unsigned char r_18b20()//从18b20读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
  dq=0;
  dat>>=1;
  dq=1;
  delay(6);
  if(dq) dat|=0x80;
  delay(22);
}
return(dat);
}
void  LedDisp() //显示数字函数
{
P3=dis[0];
P2_0=0;
delay(200);
P2_0=1;
P3=dis[1];
P2_1=0;
delay(200);
P2_1=1;
P3=dis[2];
P2_2=0;
delay(200);
P2_2=1;
P3=dis[3];
P2_3=0;
delay(200);
P2_3=1;
P3=dis[4];
P2_4=0;
delay(200);
P2_4=1;
P3=dis[5];
P2_5=0;
delay(200);
P2_5=1;
}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:191531 发表于 2017-5-9 16:18 | 只看该作者
好哎,正在做温度检测,这个程序正好能用上  谢谢楼主
回复

使用道具 举报

板凳
ID:369060 发表于 2018-8-26 00:17 | 只看该作者
很不错
回复

使用道具 举报

地板
ID:128484 发表于 2018-8-29 15:22 | 只看该作者
找到了错误:
                  自己的复位程序少了个延时,结果后面的时序全都出错了。
是最大的进步。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:8222 发表于 2022-4-24 10:15 | 只看该作者
这个也太复杂了吧???
回复

使用道具 举报

6#
ID:584814 发表于 2022-4-25 09:19 | 只看该作者
温xyz 发表于 2022-4-24 10:15
这个也太复杂了吧???

要看年份,现在这样做的是练技术,当年未必。
回复

使用道具 举报

7#
ID:1021547 发表于 2022-4-29 08:55 来自手机 | 只看该作者
老哥,太感谢了,成功了。我按网上视频做的都不成功 ,我还以为18b20坏了又买了。问题就是延时。
回复

使用道具 举报

8#
ID:516216 发表于 2022-8-12 13:50 | 只看该作者
长知识了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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