搜索
bottom↓
回复: 68

DS18B20一个礼拜终于调通了,放出来供大家参考!!(M16,8M晶振)

[复制链接]

出0入0汤圆

发表于 2007-9-25 10:34:26 | 显示全部楼层 |阅读模式
/*********************************************************************
目    的:   建立DS18B20操作库
目标系统:   基于avr单片机
应用软件:   AVRGCC                                             
版    本:   Version 1.2
圆版时间:   2007-09-25
开发人员:   heshw99
*********************************************************************/
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

//变量类型标识的宏定义
#define                uchar        unsigned char
#define                uint        unsigned int

#ifndef  FREQ
#define  FREQ    (8)
#endif

#define DQ_IN DDRC &= ~(1 << PC0);  /*设置输入*/
#define DQ_OUT DDRC |= (1 << PC0);  /*设置输出*/
#define DQ_CLR PORTC &= ~(1 << PC0); /*置低电平*/
#define DQ_SET PORTC |= (1 << PC0);  /*置高电平*/
#define DQ_R PINC & (1 << PC0);  /*读了电平*/

unsigned char flag;      /*中断标志缓存*/


#define delay_10us(x)\
         _delay_loop_2((uint)((x)*10*FREQ/4))

/*--------------------------------------------------------------------
函数名称:DS18B20复位
函数功能:
注意事项:主机发送复位脉冲最少480US,DS18B20等待15~60US
提示说明:无
输    入:
返    回:无
--------------------------------------------------------------------*/
unsigned char ds1820_reset(void) {

unsigned char i;
flag = SREG;    /*中断保护*/
cli();      /*关中断*/
DQ_OUT;
DQ_CLR;
delay_10us(49);    /*延时500uS(480-960)*/
DQ_SET;
DQ_IN;
delay_10us(7);    /*延时80uS*/
i = DQ_R;
delay_10us(49);    /*延时500uS(保持>480uS)*/
if (flag & 0x80) {   /*恢复中断状态*/
  sei();
  }
if (i) {
  return 0x00;
  }
else {
  return 0x01;
  }
}

/*--------------------------------------------------------------------
函数名称:DS18B20读一个字节
函数功能:
注意事项:无
提示说明:无
输    入:
返    回:一个字节
--------------------------------------------------------------------*/
unsigned char ds1820_read_byte(void)
{
unsigned char i;
unsigned char value = 0;
flag = SREG;    /*中断保护*/
cli();      /*关中断*/
for (i = 8; i != 0; i--)
{
          value >>= 1;
          DQ_OUT;
          DQ_CLR;
          DQ_SET;
          DQ_IN;
          if (PINC & (1 << PC0))
          value|=0x80;       
          delay_10us(5);   /*延时60uS*/
  }
if (flag & 0x80)
{   /*恢复中断状态*/
  sei();
  }
return(value);
}

/*--------------------------------------------------------------------
函数名称:DS18B20写一个字节
函数功能:
注意事项:无
提示说明:无
输    入:
返    回:无
--------------------------------------------------------------------*/
void ds1820_write_byte(unsigned char value)
{
unsigned char i;
flag = SREG;    /*中断保护*/
cli();      /*关中断*/
for (i = 8; i != 0; i--) {
  DQ_OUT;
  DQ_CLR;
  NOP();     /*延时4uS*/
  NOP();
  NOP();
  NOP();
  if (value & 0x01) {
   DQ_SET;
   }
  delay_10us(7);   /*延时80uS*/
  DQ_SET;     /*位结束*/
  value >>= 1;
  }
if (flag & 0x80) {   /*恢复中断状态*/
  sei();
  }
}

/*--------------------------------------------------------------------
函数名称:DS18B20(1个)开始转换
函数功能:
注意事项:无
提示说明:无
输    入:
返    回:无
--------------------------------------------------------------------*/
void ds1820_start(void) {

ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0x44); /*启动转换*/
}

/*--------------------------------------------------------------------
函数名称:DS18B20(1个)读温度
函数功能:
注意事项:无
提示说明:无
输    入:
返    回:温度
--------------------------------------------------------------------*/
unsigned int ds1820_read_temp(void) {

unsigned int i;
unsigned char buf[9];

ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0xBE); /*读取温度*/
for (i = 0; i < 9; i++)
  {
  buf = ds1820_read_byte();
  }
i = buf[1];
i <<= 8;
i |= buf[0];

i=i*0.625;

return i;
}



int main(void)
{
ds1820_reset();
while(1)
{
        ds1820_start();
        delay_10us(20);
        ds1820_read_temp();
}
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2007-9-25 18:39:18 | 显示全部楼层
好,谢谢

出0入22汤圆

发表于 2007-9-25 20:56:45 | 显示全部楼层
谢谢楼主的无私分享。

出0入0汤圆

发表于 2007-9-25 21:55:05 | 显示全部楼层
会不会加个裤子

出0入0汤圆

发表于 2007-9-26 11:34:18 | 显示全部楼层
感谢

出0入0汤圆

发表于 2007-9-26 12:17:58 | 显示全部楼层
用CVAVR里面自带了个DS18B20的代码,改改就能用了,老是重写不麻烦吗?

出0入0汤圆

发表于 2007-10-8 21:32:09 | 显示全部楼层
谢谢,正要找个8M的呢

出0入0汤圆

发表于 2007-10-22 14:47:21 | 显示全部楼层
开始怀疑此程序问题,开始没接vcc,一直读到1360(dec)*0.625=850,后来找其他帖子,发现要接Vcc,后来就正常了

我就接一个18B20,按道理可以偷电的,上拉4.7K 有接啊

出0入0汤圆

发表于 2008-1-11 23:20:14 | 显示全部楼层
谢了

出0入0汤圆

发表于 2008-1-28 14:19:40 | 显示全部楼层
不用校验表么

出0入0汤圆

发表于 2009-1-6 10:42:02 | 显示全部楼层
&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;i++)&nbsp;

&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;buf&nbsp;=&nbsp;ds1820_read_byte();&nbsp;

&nbsp;&nbsp;}

&nbsp;i&nbsp;=&nbsp;buf[1];&nbsp;

&nbsp;i&nbsp;&lt;&lt;=&nbsp;8;&nbsp;

&nbsp;i&nbsp;|=&nbsp;buf[0];



为什么要读9次,只用了前两次的值啊?

出0入0汤圆

发表于 2009-1-6 11:44:19 | 显示全部楼层
thanks

出0入0汤圆

发表于 2009-6-10 11:07:00 | 显示全部楼层
ths

出0入0汤圆

发表于 2009-6-10 12:44:51 | 显示全部楼层
做个记号  谢谢楼主

出0入0汤圆

发表于 2009-6-10 12:54:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-15 10:39:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-15 10:40:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-18 17:20:32 | 显示全部楼层
你好。。
我放到proteus下仿真时不行,,

出0入0汤圆

发表于 2009-6-18 21:20:19 | 显示全部楼层
楼主试试多个18b20的情况

出0入0汤圆

发表于 2009-6-30 09:46:59 | 显示全部楼层
看不懂,还是顶一下

出0入0汤圆

发表于 2009-6-30 10:05:56 | 显示全部楼层
你那个85度是怎么处理的啊

出0入0汤圆

发表于 2009-7-14 18:54:37 | 显示全部楼层
你好。。
proteus下读取温度是0

出0入0汤圆

发表于 2009-7-15 10:49:57 | 显示全部楼层
o

出0入0汤圆

发表于 2009-7-15 14:23:05 | 显示全部楼层
做个记号, 以后用得着。。

出0入0汤圆

发表于 2009-7-15 14:54:16 | 显示全部楼层
距离有多远?

出0入0汤圆

发表于 2009-7-22 23:23:51 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2009-7-23 10:17:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-23 21:05:43 | 显示全部楼层
赞LZ一个!

出0入0汤圆

发表于 2009-7-29 11:00:53 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-7-29 13:01:11 | 显示全部楼层
kankan

出0入0汤圆

发表于 2009-7-30 08:35:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-11 11:45:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-19 09:35:15 | 显示全部楼层
楼主,这些NOP在哪个库里面,编译时NOP全是错误

出0入0汤圆

发表于 2009-8-21 10:09:33 | 显示全部楼层
【32楼】 honey655729
积分:14
派别:
等级:------
来自:
楼主,这些NOP在哪个库里面,编译时NOP全是错误



你加上这个 #include <compat/ina90.h>
并把楼主的    NOP(); 改成   _NOP();

就可以编译通过了

出0入0汤圆

发表于 2010-3-7 20:46:25 | 显示全部楼层
楼主,误差是多大啊?

出0入0汤圆

发表于 2010-3-8 09:34:07 | 显示全部楼层
“偷电”时,最好把上拉电阻放小一点,如1.5K。另外,从启动转换到读取温度之间的时间会不会太短了,官方的说法是在9bit模式下转换需要93.75ms,12bit时需要750ms。


(原文件名:DS18B20 time.jpg)

出0入0汤圆

发表于 2010-3-9 22:02:25 | 显示全部楼层
for (i = 0; i < 9; i++)  
  {  
  buf = ds1820_read_byte();  
  }
i = buf[1];  
i <<= 8;  
i |= buf[0];

为什么要读9次,只用了前两次的值啊?

出0入0汤圆

发表于 2010-3-9 22:03:37 | 显示全部楼层
为什么函数中调用了很多全局中断,是什么作用啊?

出0入0汤圆

发表于 2010-3-17 15:29:03 | 显示全部楼层
好东西,他是保存中断,但没用中断

出0入0汤圆

发表于 2010-3-19 10:47:15 | 显示全部楼层
没用到中断,写他干嘛?

出0入0汤圆

发表于 2010-3-19 10:50:59 | 显示全部楼层
复位函数为什么写成带返回值的?楼主没有利用返回值

出0入0汤圆

发表于 2010-3-20 13:30:01 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-6-19 22:05:08 | 显示全部楼层
顶下!

出0入0汤圆

发表于 2010-6-21 17:29:00 | 显示全部楼层
顶  一个礼拜似乎太长了点,

出0入0汤圆

发表于 2010-6-22 13:01:00 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-6-29 00:11:01 | 显示全部楼层
LCD+18B20 成功,谢谢!

出0入0汤圆

发表于 2010-7-22 10:10:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-2 03:45:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-13 19:45:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-13 23:33:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-3 10:52:24 | 显示全部楼层
还不懂啊——

出0入0汤圆

发表于 2010-12-9 10:58:21 | 显示全部楼层
我也编过,但只能在2M以下内置时钟运行,4M和8M都死机。不知哪里要延时。

出0入0汤圆

发表于 2010-12-10 21:05:42 | 显示全部楼层
这个我用了两个晚上写了出来,外加可以设置高低温报警的CODE,时序很重要.

出0入0汤圆

发表于 2010-12-21 10:32:25 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2011-1-15 12:53:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-11 20:46:53 | 显示全部楼层
收藏。不知能传输多少米?

出0入0汤圆

发表于 2011-8-13 19:26:01 | 显示全部楼层
回复【楼主位】heshw99
-----------------------------------------------------------------------

XIELE

出0入0汤圆

发表于 2011-9-28 14:07:32 | 显示全部楼层
楼主比我厉害多了

出0入0汤圆

发表于 2011-12-31 15:22:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-13 13:22:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-20 13:54:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-22 14:31:28 | 显示全部楼层
楼主为啥要保存中断?

出0入0汤圆

发表于 2012-2-23 13:49:44 | 显示全部楼层
看看学习学习

出0入4汤圆

发表于 2012-3-8 14:07:07 | 显示全部楼层
留一下吧,过几天就会用到

出0入0汤圆

发表于 2012-3-9 16:50:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-10 09:22:51 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 21:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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