原创 [原创]操作DS18B20的程序(C写的 带ROMSearch和CRC校验)

2011-5-16 17:36 4995 5 7 分类: MCU/ 嵌入式

调试环境:

MPLAB 7.5

PICC  8.05 PL1

PIC16F88,DS18B20 两颗,晶振4MHz(如换其它晶振,需要更改WriteBit和ReadBit中的等待操作以及延时函数)

我只有两颗18B20,没有验证过SearchROM是否还有Bug

以下函数使用时均需关掉中断,

主要函数说明:

//Reset 18B28 and Detect the reply,检测是否有18B20在线上
//if succes return 1, over time return 0
unsigned char    DetectB20();

//Read One Byte from 18B20 从18B20上读取一字节数据
//return the byte just read
unsigned char   ReadB20Byte();

//Write one byte to 18B20   写一字节到18B20
void    WriteB20Byte(unsigned char);

//Read 18B20 ROM value,  当只有一个18B20时,读取其ROM值
// **return values**      **Explain**
// ZERO                    success
// CRCError               CRC Error
// OverTime             Detect over time
unsigned char   ReadB20ROM(unsigned char *ROM);


//Read EERAM, Skip ROM  读取EERAM的值,跳过ROM检测
// **return values**      **Explain**
// ZERO                      success,
// CRCError                 CRC Error
// OverTime               Detect over time
unsigned char   ReadEERAM(unsigned char *RAM);


//Search devices on the bus       //1-Wire 器件查询命令,结果返回到B20ROMTemp中,

注意:如果在查找下一个命令前更改B20ROMTemp中的值,将会造成无法遍历总线上的器件
// Arguments:            输入参数说明
//FirstNext:   FindFirst   find device from the 1st one  查找第一个器件
//                otherwise   from last one                            根据上一次结果,查找下一个器件
//
// **return values**      **Explain**
// SearchFinish        All devices are found
// OverTime              Detect over time
// ZERO             Success, but still have other device unknow
unsigned char   SearchDevice(unsigned char FirstNext);


//Start temprature                                //开始温度转换
// **return values**      **Explain**
// ZERO                      success
// OverTime               Detect over time
unsigned char StartConvertTp();

The bus master learns the unique ID number (ROM data pattern) of one 1-Wire device on each ROM
Search operation. The time required to derive the part’s unique ROM code is:
960 μs + (8 + 3 x 64) 61 μs = 13.16 ms
The bus master is therefore capable of identifying 75 different 1-Wire devices per second.

呵呵,官方的能找75个,我用C写的是20.8ms,最多不到50个

源代码如下

attachment download

文章评论2条评论)

登录后参与讨论

用户430926 2013-3-15 19:49

正在学习这个器件,谢谢博主的分享!!

用户1428533 2012-5-16 15:10

谢谢分享!

用户236990 2009-12-30 12:22

我已经找到了证明的书籍:《信号数学处理原理》里对采样定理进行了数学讨论。答案是大于两倍的最高频率。当然,依据不同的特殊情况,可以有不同的特殊结论。 数学原理依据 Y=AmSIN(wX+c) 这样的公式来讨论推导。说白了,就是Am,w,c 三个变量决定了其采样点数。当有n个频率分量,就需要n倍个采样数据组(3点)。

用户233292 2009-12-25 16:36

对采样的问题,就你举的那个例子,可以设想一个极端一些的情况,对这个单频信号,每个周期只采样一个点,信号持续时间很长,比如说100个周期。这样采样之后是100个相等的值,这时能确定这个信号到底是单频正弦信号还是直流信号?另外对于实信号的带通采样而言,最基本的要求仍然是采样频率要大于两倍的带宽。采样问题的讨论暂告一段落。

用户236990 2009-12-25 11:42

1)另外,带通的采样定理,没有要求采样频率要求高于信号的频率,这又说明了什么呢? 显然的是,在带通信号里,很多信号(频率)是没有的,从求解方程的角度来看,可以减少很多方程的数量,自然,可以减少很多采样点。 但并没有书籍作个介绍。 2)我说的教科书上没有给出采样定理的证明,是指其结论只是借一个图来说明的,可靠吗? 这是我的疑问。

用户236990 2009-12-25 00:03

1)设信号的周期是T,采样点数位K,假定符合采样定理,在T内完成。 2)现在将采样频率降低为1/N,在N个T周期内完成。将这些点合成,完全可以对应于1)。合成后,这些点的值,位置,是一致的。 他们的结果一致吗?

用户233292 2009-12-24 23:39

就采样定理而言,前面所说的过程,用数学公式描述的话,就是采样定理严格的证明。我感觉你现在的理解稍微有点偏差,比如说你认为对周期信号,可以增加信号采样时间,(这里的采样时间我理解是信号的持续时间),来实现。简单一点说,若采样频率低于2倍的最大频率,不管信号周期多长,都不能从离散信号中完全恢复出原始的连续信号。采样定理最根本的在于频谱不能混叠。当然这里的采样是指最通常意义上的采样,而不是指带通采样等其它的采样方式。欢迎交流。

用户236990 2009-12-24 23:09

1)多谢你的解答。 2)这并不是严格的数学证明(采样定理),只是想当然的证明(解释)。 我真的不明白,所以提出疑惑,希望有人能解答: http://bbs.matwav.com/viewthread.php?tid=868309&extra=page%3D4 3)我倒是觉得每个频率(信号)由一个正弦信号有幅值和频率两个变量决定(不考虑相位,如傅里叶级数是同相位的)。因而产生2倍的关系数量关系(方程求解的需要)。补零的数学意义在这里可以得到认识。 我并不认为采样频率必须绝对地是高于两倍最高信号的频率。至少对周期信号,可以通过增加采样时间,使两者的采样点数一致,效果也是一样的。我是这样认为。 所以,我想寻找采样定理的严格的数学证明。但是找不到。 4)如果你找到了采样定理的严格的数学证明。请告知。

用户233292 2009-12-24 20:36

采样定理的基本思路是这样的:将采样的过程看做是连续信号与一组冲激串的乘积,假定连续信号为一带限信号,由卷积定理可知,时域的相乘等效于频域的卷积,由于冲激串信号的频谱仍然为一冲激串,这样,采样造成的结果是频谱在频域上被搬移,频谱中心分别为...,-fs,0,fs,2fs,...,如果在频域没有频谱混叠的话,则表明连续信号可以从离散信号完全恢复。也即是说,fs大于两倍的最高频率的情况下,采样不会造成任何信息的丢失。具体的推导过程几乎每本信号与系统方面的书中都有。 另外,感谢分享你的体会,多交流。

用户236990 2009-12-24 07:31

另外: 我想请教一下: 两倍的采样频率的采样定理是如何证明的。我找不到其数学证明。 这对认识、理解信号处理的很多问题有帮助。是根本性的问题。
相关推荐阅读
用户236335 2011-04-08 09:17
[原创]用PIC10F200实现三色LED亮度调节
10F200资源:一个8位timer,一个WDT可以工作在 2.0~5.5V内置晶振,单一频率4MHz 精度1%三个IO,一个Input指令空间: 255目标:使用串口通讯方式,波特率38400,8位...
用户236335 2010-04-09 16:35
[原创]DIY一个多功能手柄
打造一个属于自己的多功能手柄多功能手柄的视频演示http://v.youku.com/v_show/id_XMTYyOTcwNjUy.html预览小结:芯片: STM32F103C8T6,MMA726...
用户236335 2010-04-09 14:12
[原创]STM32迷你OLed显示屏
之前买了几块128X64的OLed屏,用开发板驱动起来玩了一下,感觉显示效果还蛮不错的去赛格逛的时候又看到了这么一个小盒子,比划了一下觉得把这个屏放进去还能加点东西在上面盒子内部大小为44mm X 2...
用户236335 2010-04-07 23:28
FPM不能使用?(Foot Print Maker)别急,那是作者的小玩笑
用Candence来画PCB很不错,但是做封装很麻烦还好有人做了一个免费的小软件FPM(Foot Print Maker),用来生成封装很方便但是作者开了个小玩笑,0.0.8.0版本的从2010年4月...
用户236335 2010-03-28 15:57
[原创]用STM32 199元的开发板来玩俄罗斯方块
开发板是万利的那个带有ST-Link2的199开发板  STM3210B-LK1上面有一块STM32F103VBT6,这个片子有128K的Flash,20K的RAM开发板上面可以用到的资源·1 个LC...
我要评论
2
5
关闭 站长推荐上一条 /2 下一条