尽管很基础---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楼 请教2个问题 1:温度报警功能怎么用
2:the ds18b20 id is 28-C6-9-16-1-0-0-5A中的5A是根据 CRC=X8+X5+X4+1算出来的,但具体是怎么算的,有人愿意详细的说明一下吗,谢谢 程序:点击此处下载 ourdev_355590.rar(文件大小:72K) (原文件名:m128+2 ds1820+uart display.rar)
我这个DQ接的是PORTD.7,使用内部8M振荡,UART只有停止位,没有校验,有时候会出现接受错误(很少) 顶,本来想搞2个DS18B20组网,但郁闷的是有一个是坏的,搞不了了 ds18b20_init(&rom_code,-55,tempset,DS18B20_11BIT_RES);//设定报警温度
ds18b20_alarm_num=w1_search(DS18B20_ALARM_SEARCH_CMD,rom_code);//检查警报启动探头数量。 谢谢LZ 四楼愿意解释一下我提出的问题吗,谢谢 欢迎交流 算了,世道就世道,热心的人总是少数,有就行了 请教2个问题 1:温度报警功能怎么用
2:the ds18b20 id is 28-C6-9-16-1-0-0-5A中的5A是根据 CRC=X8+X5+X4+1算出来的,但具体是怎么算的,有人愿意详细的说明一下吗,谢谢
就没人知道吗 markup lz的串口终端软件不错,能提供吗? to aviator
这个我也是在论坛下的,忘记在哪下的了
点击此处下载 ourdev_356393.rar(文件大小:460K) (原文件名:串口调试EDS.rar) 给你一段代码参考
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
} 谢谢shark 报警功能我觉得没什么用,我都是读回温度自己和预设值比的。(也可能在总线上有很多DS18B20的时候报警有用,未核实) ding MEGA128才ISP了半个月,就ISP挂了,真是郁闷,是不是用高压编程或着JTAG下载它的寿命就长一些啊,突然发现DRAGON有一个缺陷,当你接了外部晶振,而设置又是使用内部的RC的话,就会出现错误,不能下载,这一点还不如USBASP
感谢shark的热心,我只是想看看那报警功能是怎么回事情,等着看有没有人把它搞出来 突然发现test搞成text了 积分600,留个纪念,不知道10后再回首是个什么感觉
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_356650.JPG
(原文件名:未命名.JPG) 大家也帮忙灌灌水吗,不然寂寞啊 mark ok!perfect! 呵呵,厉害,我也做过这个DS18B20测温!从没用过报警! 不错,我去试试我的DS18B20... Cool!
谢谢楼主的共享。 居然被置cool了,高兴,高兴,一定要再接再厉
正在摸索SD卡,FAT................... xiexie!!!!!!!!!!!!!!!!!!!!!!! 各位大侠:DS2760能不能用单片机把它模拟出来。不用特别高精度。 可以,高速都可以模拟出来。 DS2760没接触过,不发表意见 看看咯。。。a 记号个!! 很有用,先收下 学习 我用的DS18B20有个奇怪个的事情.
我读出来的温度后面的最后一位
"6.the crc is--a1 "
这一位一直是0x10..晚上回去再研究研究! 还有search rom功能.研究后,会将代码跟帖. 过来看看。。! 不得了 记号 记号 谢谢 mark 温度18b20标记一下 从头学习 非常感谢 mark mark Mark Mark 有用 mark 我看DS18B20说明书上说,存测得的温度值的两个8位存贮器RAM编号为0号和1号1号存贮器存放温度值的符号如果温度为负()则1号存贮器8位全为1否则全为00号存贮器用于存放温度值的补码LSB(最低位)的1表示0.5将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-550125),所以00AAH为+85度,但是我按照上面说的计算了,得出来的却不是85度,请楼主指教一下…… mark!~ mark 非常感谢,我正在搞单线这块! 还没有玩过呢,先标上 这个要记号 kan 不懂这个,还是赞下! 东西做的不错,顶一把!~ mark!!! 楼主有没有想过,可以用PID算法来控制温度,这样不是更强大吗? mark mark mark 这个要顶 1024 mark 回复【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
}
本人也是才疏学浅,不知道分析的对不对,请赐教 DS18B20... mark!! mark 回复【楼主位】lionliu
-----------------------------------------------------------------------
顶 楼主很强大,佩服楼主的上位机能力 MARK DS18B20 楼主有做过多路(一个I/O口接多个DS18B20)吗?
期望可以讨论一下! 又学习了
又温习一下了{:lol:}
页:
[1]