lionliu 发表于 2008-7-22 22:57:07

尽管很基础---DS18B20彻底应用,送给需要的人

这个实验的目的就是要通过MEGA128把DS18B20里面能读的东西都读出来,然后通过UART0发出去送给电脑显示,而不是简单的显示一个33度就了事,程序是用CV写的,UART0的发送程序是CV自动生成的,很方便,DS18B20的程序也是在论坛的基础上改的

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_355530.JPG
(原文件名:1.JPG)
这是我的"实验平台",万用板焊的,很寒酸,但很适合我用,手机拍的,不是很清楚
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_355531.JPG
(原文件名:2.JPG)
简单解释一下:
1.the ds18b20 id is 28-C6-9-16-1-0-0-5A
这个是DS18B20的ID,0x28代表它是DS18B20,如果你读出来不是0x28,说明DS18B20是坏的,或着程序电路有问题,C6-9-16-1-0-0是DS18B20的自身的序列号,每个DS18B20都是不一样的,5A是前面56位的循环冗余校验码(CRC=X8+X5+X4+1),详细的内容请看datasheet
2.the temperature lsb is--fb
the temperature msb is--1
lsb 是温度值的低8位,msb是温度值的高8位,msb的高5位是符号位,如果是0,表示温度>0,是1表示温度<0,详细的内容请看datasheet

3.the th is--4b
the tl is--46
这个是高低温报警值,可由自己设定,详细的内容请看datasheet

4.the config is--7f
配置寄存器的内容,这个每个DS18B20读出来的内容都是一样的,具体的内容请看datasheet
5.the reserved is--ff 1 10
保留位,没必要研究,具体的内容请看datasheet
6.the crc is--a1
CRC校验值,具体的内容请看datasheet
7.the real temperature is 31.6875c
实际温度值,最高精度显示,把0x1fb转成10进制,再乘上0.0625,就等于31.6875,具体的内容请看datasheet

程序在2楼

lionliu 发表于 2008-7-22 23:00:51

请教2个问题   1:温度报警功能怎么用
            2:the ds18b20 id is 28-C6-9-16-1-0-0-5A中的5A是根据 CRC=X8+X5+X4+1算出来的,但具体是怎么算的,有人愿意详细的说明一下吗,谢谢

lionliu 发表于 2008-7-22 23:02:03

程序:点击此处下载 ourdev_355590.rar(文件大小:72K) (原文件名:m128+2 ds1820+uart display.rar)
我这个DQ接的是PORTD.7,使用内部8M振荡,UART只有停止位,没有校验,有时候会出现接受错误(很少)

lionliu 发表于 2008-7-22 23:03:25

顶,本来想搞2个DS18B20组网,但郁闷的是有一个是坏的,搞不了了

CHENBINGSTER 发表于 2008-7-23 08:22:29

ds18b20_init(&rom_code,-55,tempset,DS18B20_11BIT_RES);//设定报警温度

ds18b20_alarm_num=w1_search(DS18B20_ALARM_SEARCH_CMD,rom_code);//检查警报启动探头数量。

knight_avr 发表于 2008-7-23 08:56:50

谢谢LZ

lionliu 发表于 2008-7-23 09:19:53

四楼愿意解释一下我提出的问题吗,谢谢

lionliu 发表于 2008-7-23 11:16:48

欢迎交流

lionliu 发表于 2008-7-23 13:06:47

算了,世道就世道,热心的人总是少数,有就行了

lionliu 发表于 2008-7-23 14:38:58

请教2个问题   1:温度报警功能怎么用
            2:the ds18b20 id is 28-C6-9-16-1-0-0-5A中的5A是根据 CRC=X8+X5+X4+1算出来的,但具体是怎么算的,有人愿意详细的说明一下吗,谢谢

就没人知道吗

aduc812 发表于 2008-7-23 14:42:29

markup

aviator 发表于 2008-7-23 17:07:21

lz的串口终端软件不错,能提供吗?

lionliu 发表于 2008-7-23 19:09:28

to aviator
这个我也是在论坛下的,忘记在哪下的了
点击此处下载 ourdev_356393.rar(文件大小:460K) (原文件名:串口调试EDS.rar)

shark 发表于 2008-7-23 19:32:32

给你一段代码参考

BYTE CalCRC8(BYTE crc,BYTE data)
{
    BYTE i;
    crc ^= data;// crc = crc ^ data;
    for (i=0;i<8;i++)
    {
      if (crc & (BYTE)0x01) // 只测试最低位
            crc = (crc>>1)^(BYTE)0x8C;//最低位为1,移位和异或处理
      else
            crc = crc>>1; // 否则只移位(除2)
    }
    return crc;
}

...
    BYTE s={0};
    BYTE crc=0;
      for(i=0;i<8;i++)
      {
            s = OneWire_ReadByte();
           crc = CalCRC8(crc,s);//读8个字节,算crc值
      }
      s = OneWire_ReadByte();//读第9个和前面算出的crc相比,相等说明正确
      if (crc == s)
      {
             //CRC OK
         }

lionliu 发表于 2008-7-23 23:48:26

谢谢shark

shark 发表于 2008-7-23 23:52:52

报警功能我觉得没什么用,我都是读回温度自己和预设值比的。(也可能在总线上有很多DS18B20的时候报警有用,未核实)

xml2028 发表于 2008-7-24 01:45:08

ding

lionliu 发表于 2008-7-24 01:52:49

MEGA128才ISP了半个月,就ISP挂了,真是郁闷,是不是用高压编程或着JTAG下载它的寿命就长一些啊,突然发现DRAGON有一个缺陷,当你接了外部晶振,而设置又是使用内部的RC的话,就会出现错误,不能下载,这一点还不如USBASP

感谢shark的热心,我只是想看看那报警功能是怎么回事情,等着看有没有人把它搞出来

lionliu 发表于 2008-7-24 02:02:49

突然发现test搞成text了

lionliu 发表于 2008-7-24 02:04:50

积分600,留个纪念,不知道10后再回首是个什么感觉
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_356650.JPG
(原文件名:未命名.JPG)

lionliu 发表于 2008-7-24 22:30:21

大家也帮忙灌灌水吗,不然寂寞啊

626986 发表于 2008-7-24 22:48:03

mark

liyangbbs 发表于 2008-7-24 23:24:20

ok!perfect!

xiao100 发表于 2008-7-26 19:12:54

呵呵,厉害,我也做过这个DS18B20测温!从没用过报警!

cug07104416 发表于 2008-7-27 15:59:40

不错,我去试试我的DS18B20...

armok 发表于 2008-7-27 16:06:59

Cool!

谢谢楼主的共享。

lionliu 发表于 2008-7-27 19:37:00

居然被置cool了,高兴,高兴,一定要再接再厉

正在摸索SD卡,FAT...................

duqinglin 发表于 2008-7-28 09:20:37

xiexie!!!!!!!!!!!!!!!!!!!!!!!

hefeng 发表于 2008-7-28 11:30:54

各位大侠:DS2760能不能用单片机把它模拟出来。不用特别高精度。

lgx0301 发表于 2008-7-28 13:41:44

可以,高速都可以模拟出来。

lionliu 发表于 2008-7-29 01:18:24

DS2760没接触过,不发表意见

macchange 发表于 2008-8-7 21:10:24

看看咯。。。a

feiyang007 发表于 2009-2-26 13:22:13

记号个!!

1860 发表于 2009-2-26 14:31:09

很有用,先收下

bbi3014 发表于 2009-2-26 17:59:07

学习

wisebaby 发表于 2009-3-11 19:19:51

我用的DS18B20有个奇怪个的事情.

我读出来的温度后面的最后一位
"6.the crc is--a1 "
这一位一直是0x10..晚上回去再研究研究!

wisebaby 发表于 2009-3-11 19:21:44

还有search rom功能.研究后,会将代码跟帖.

hnrain 发表于 2009-3-11 20:02:40

过来看看。。!

DeKaron 发表于 2009-3-11 22:48:32

不得了

thinkker 发表于 2009-3-11 23:06:08

记号

mchen 发表于 2009-4-21 16:17:12

记号

wowu 发表于 2009-8-27 19:45:21

谢谢

dugutianma 发表于 2009-11-1 17:23:46

mark

dwrszgq 发表于 2009-11-3 20:35:02

温度18b20标记一下

penguin 发表于 2009-11-3 23:22:39

从头学习

airwolf09921 发表于 2009-11-9 13:03:23

非常感谢

dongzhiqing 发表于 2009-11-9 20:34:07

mark

crestxa 发表于 2009-11-9 20:45:17

mark

QQ373466062 发表于 2009-11-9 22:06:10

Mark

chengpiaopiao 发表于 2009-11-9 22:27:45

Mark

qilin3 发表于 2009-11-9 22:31:29

有用

jinbangzhou 发表于 2010-6-10 09:25:10

mark

leon_liang 发表于 2010-6-10 16:22:53

我看DS18B20说明书上说,存测得的温度值的两个8位存贮器RAM编号为0号和1号1号存贮器存放温度值的符号如果温度为负()则1号存贮器8位全为1否则全为00号存贮器用于存放温度值的补码LSB(最低位)的1表示0.5将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-550125),所以00AAH为+85度,但是我按照上面说的计算了,得出来的却不是85度,请楼主指教一下……

ljt8015 发表于 2010-6-10 19:15:16

mark!~

BLDC2010 发表于 2010-6-14 15:02:29

mark

522yt 发表于 2010-6-19 20:46:06

非常感谢,我正在搞单线这块!

foxsports 发表于 2010-6-22 16:03:33

还没有玩过呢,先标上

vermon 发表于 2010-6-22 16:06:59

这个要记号

czxf 发表于 2010-6-23 12:02:52

kan

lixinpeng1007 发表于 2010-6-23 12:19:35

不懂这个,还是赞下!

fengyuzhails 发表于 2010-6-23 13:51:16

东西做的不错,顶一把!~

jack_yu 发表于 2010-6-23 18:08:21

mark!!!

liudeen 发表于 2010-6-25 18:18:13

楼主有没有想过,可以用PID算法来控制温度,这样不是更强大吗?

yusufu 发表于 2010-6-25 22:48:34

mark

cuikai12345 发表于 2011-1-15 13:14:25

mark

pfeifer 发表于 2011-1-15 17:59:36

mark

vcrm 发表于 2011-1-15 18:12:23

这个要顶

ddaitt999 发表于 2011-2-26 14:40:33

1024

tangwei039 发表于 2011-2-26 14:58:45

mark

289457095 发表于 2011-8-3 13:03:42

回复【1楼】lionliu
-----------------------------------------------------------------------

请教楼主一个问题,你的程序代码段
unsigned char init_1820(void)
{
   out_dat;               //set output
   set_dat;               //set dat
   clr_dat;               //clr dat
   delay_us(480);         //wait 480us
   set_dat;               //set dat
   in_dat;                //set input
   delay_us(60);          //wait 15~60us
   while(!ds_dat);//当你等待60us后,也就是DS18B20开始回送低电平的存在脉冲,你这里读取电平并取反,相当于在等待器件发送存在脉冲完毕后,才退出whlie循环,那下面的延时,有什么作用呢?我认为应该是:一直读取器件是否返回回送脉冲,当有回送低电平脉冲后,再退出循环,再延时等待DS18B20回送脉冲发送完毕.你这样做检测不了器件是否存在,因为上拉电阻会起作用,导致你的while循环退出.
      out_dat;               //set output
      set_dat;               //set dat
   delay_us(140);          //wait 60~240us
}


本人也是才疏学浅,不知道分析的对不对,请赐教

zyw19987 发表于 2011-11-4 16:42:32

DS18B20...

powerg7 发表于 2011-11-4 19:16:56

mark!!

552467160 发表于 2011-11-21 16:48:44

mark

liangyanzhuo11 发表于 2011-11-23 11:02:58

回复【楼主位】lionliu   
-----------------------------------------------------------------------

xcjc90 发表于 2011-11-23 11:31:24

楼主很强大,佩服楼主的上位机能力

dingliming 发表于 2012-2-9 23:45:24

MARK

aabbc 发表于 2012-2-10 01:56:51

DS18B20

lvwenjie 发表于 2012-4-8 15:01:20

楼主有做过多路(一个I/O口接多个DS18B20)吗?
期望可以讨论一下!

jsszdfdn 发表于 2013-4-21 17:13:13

又学习了

ouravr2012 发表于 2013-7-16 11:33:44

又温习一下了{:lol:}
页: [1]
查看完整版本: 尽管很基础---DS18B20彻底应用,送给需要的人