• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

有关DS18B20

大家好,最近看DS18B20的程序,有一些不明白,请大家指教!
#include
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2;           //define interface
uint temp;             // variable of temperature
uchar flag1;            // sign of the result positive or negative
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
                        0x87,0xff,0xef};

void delay(uint count)      //delay
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;
     TH1 = 0xFd;
     TL1 = 0xFd;
     TR1 = 1;
}

void dsreset(void)       //send reset and initialization command
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tmpread(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}

void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

void tmpchange(void)  //DS18B20 begin change
{
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);  // address all drivers on bus
  tmpwritebyte(0x44);  //  initiates a single temperature conversion
}

uint tmp()               //get the temperature
{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}

void delay10ms()            //delay
  {
    uchar a,b;
    for(a=10;a>0;a--)
      for(b=60;b>0;b--);
   }

void display(uint temp)//显示程序
{
   uchar A1,A2,A2t,A3,ser;
   ser=temp/10;
   SBUF=ser;
   A1=temp/100;
   A2t=temp%100;
   A2=A2t/10;
   A3=A2t%10;
   dula=0;
   P0=table[A1];//显示百位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7e;
   wela=1;
   wela=0;
   delay(1);

   dula=0;
   P0=table1[A2];//显示十位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7d;
   wela=1;
   wela=0;
   delay(1);

   P0=table[A3];//显示个位
   dula=1;
   dula=0;

   P0=0x7b;
   wela=1;
   wela=0;
   delay(1);
}


void main()
{
uchar a;
Init_Com();
  do
  {
    tmpchange();
   // delay(200);
for(a=10;a>0;a--)
  {   display(tmp());
  }
  }                while(1);
}
我看了它的资料,但是从来没学过还是不太懂,资料中介绍了一些读ROM,跳过ROM的命令,他们都是干什么用的,为什么程序里没有读ROM的命令 ?还有它的TH和TL的报警是怎么回事?怎么编程?请大家指教!
全部回复(6)
正序查看
倒序查看
ahai0306
LV.4
2
2007-05-14 13:49
当一个I/O口上有多个18B20时,需要读ROM,进行分辨.只有一个18B20时就没有必要读ROM了,跳过就可以了……

顺便给楼主看一下我的开发板:
硬件接口:
1:89C51系列单片机( ISP 单片机,可直接通过串口烧录更新程序,不用编程器)
2:4 Key + 1Key(int0) 共5个按键
3:2x8字LED数码管.
5:4单LED发光二极管
6:RS232接口(可调试通信程序)
7:RS485接口(可接入485总线)
8:EEROM 24C32(联系IIC总线的使用,和数据存储器的使用)
9:蜂鸣器.
10:9V电源适配器(避免初学者使用USB口烧坏主板)
11:温度传感器DS18B20(一线器件的使用,高精度温度传感器的使用)
12:LCD1602液晶屏(蓝屏的,没听电视广告说嘛:蓝瓶的——三精制药)

软件实验:
从最简单的建立KEIL工程,最简单的单片机程序开始
以上所有的实验都有.所有的基础实验配有C语言和汇编语言.高级程序用C语言编写.
价格160元.
本开发板优点:用到了比较值钱的器件,都是本人在项目开发中用到的元件,而且程序丰富,结构合理,免费升级,不断增加新程序,3个技术群和QQ号码技术支持!最大的优点是价格便宜!
还有QQ在线技术支持呢
QQ:50501160
QQ群:38210966(这个群刚刚开通,另外两个技术群已满)
应用领域:
1:学习
2:51项目开发
3:工业控制
4:其它
0
回复
2007-05-16 21:02
@ahai0306
当一个I/O口上有多个18B20时,需要读ROM,进行分辨.只有一个18B20时就没有必要读ROM了,跳过就可以了……顺便给楼主看一下我的开发板:硬件接口:1:89C51系列单片机(ISP单片机,可直接通过串口烧录更新程序,不用编程器)2:4Key+1Key(int0)共5个按键3:2x8字LED数码管.5:4单LED发光二极管6:RS232接口(可调试通信程序)7:RS485接口(可接入485总线)8:EEROM24C32(联系IIC总线的使用,和数据存储器的使用)9:蜂鸣器.10:9V电源适配器(避免初学者使用USB口烧坏主板)11:温度传感器DS18B20(一线器件的使用,高精度温度传感器的使用)12:LCD1602液晶屏(蓝屏的,没听电视广告说嘛:蓝瓶的——三精制药)软件实验:从最简单的建立KEIL工程,最简单的单片机程序开始以上所有的实验都有.所有的基础实验配有C语言和汇编语言.高级程序用C语言编写.价格160元.本开发板优点:用到了比较值钱的器件,都是本人在项目开发中用到的元件,而且程序丰富,结构合理,免费升级,不断增加新程序,3个技术群和QQ号码技术支持!最大的优点是价格便宜!还有QQ在线技术支持呢QQ:50501160QQ群:38210966(这个群刚刚开通,另外两个技术群已满)应用领域:1:学习2:51项目开发3:工业控制4:其它
请大家帮帮忙,谢谢!
0
回复
abing
LV.8
4
2007-05-19 13:38
@电源插头
请大家帮帮忙,谢谢!
程序是人家的,从头到尾你两个字“不懂”我想别人也不知从那里说起,我之前用汇编写过,还在我的博客里有发布,你可以去看下有没有新的发现.
0
回复
whatcall
LV.5
5
2007-05-19 20:39
@电源插头
请大家帮帮忙,谢谢!
abing问得好.你要先把问题描述清楚.

DS18B20我没有使用过,我只是根据你贴出的程序大概回答一下,如有谬误,请指出.
(1)Q:资料中介绍了一些读ROM,跳过ROM的命令,他们都是干什么用的?
A: 读DS18B20中的参数值 或 发送控制命令.

(2)Q:为什么程序里没有读ROM的命令 ?
A: 这个不算是吗?
uchar tmpread(void)   //read a byte date

(3)Q:还有它的TH和TL的报警是怎么回事?
A: 在温度的到达设定的报警点会有报警指示. TH: 过温(Temperature High),TL:低温(Temperature Low).

(4)Q:怎么编程?
A: 你都已经贴出了程序,还问怎么编程?或许该补一下C语言和你用的单片机的知识了.
0
回复
bill_gase
LV.3
6
2009-06-20 17:59
@whatcall
abing问得好.你要先把问题描述清楚.DS18B20我没有使用过,我只是根据你贴出的程序大概回答一下,如有谬误,请指出.(1)Q:资料中介绍了一些读ROM,跳过ROM的命令,他们都是干什么用的?A:读DS18B20中的参数值或发送控制命令.(2)Q:为什么程序里没有读ROM的命令?A:这个不算是吗?uchartmpread(void)  //readabytedate(3)Q:还有它的TH和TL的报警是怎么回事?A:在温度的到达设定的报警点会有报警指示.TH:过温(TemperatureHigh),TL:低温(TemperatureLow).(4)Q:怎么编程?A:你都已经贴出了程序,还问怎么编程?或许该补一下C语言和你用的单片机的知识了.
**此帖已被管理员删除**
0
回复
2009-07-21 11:48
@bill_gase
**此帖已被管理员删除**
供应DS18B20,特价销售,有需要联系.
0
回复