搜索
bottom↓
楼主: hhrfjz

DS18B20头文件!绝对好使!还使用方便!M16 8M 的!

[复制链接]

出0入0汤圆

发表于 2009-3-13 13:22:50 | 显示全部楼层
确实好使,谢谢啦,希望更多的人看到这份资料...

出0入0汤圆

发表于 2009-3-13 16:39:44 | 显示全部楼层
不错 记号 18B20

出0入0汤圆

发表于 2009-3-27 17:14:42 | 显示全部楼层
好使.我试了!

出0入0汤圆

 楼主| 发表于 2009-3-30 17:30:01 | 显示全部楼层
TO: feiyang007 不正

我又来了,我是菜鸟,不明白这三个宏定义:
------------------------------------------------------------------
#define CLR_DIR_1WIRE    DDRC&=~BIT(2)     //只要修改这里的参数就可以了!呵呵!  
#define SET_DIR_1WIRE    DDRC|=BIT(2)      //里面什么都不用该!  
#define CLR_OP_1WIRE     PORTC&=~BIT(2)  
#define SET_OP_1WIRE     PORTC|=BIT(2)
------------------------------------------

这个是对单总线占用你单片机的I/O口的一个宏定义。
我用的是 PC2 口。
第一个的意思是让PC2口设置为输入状态。
第二个的意思是让PC2口设置为输出状态。
第三个的意思是让PC2口下拉为低电平。
第四个的意思是让PC2口上拉为高电平。

如果你要更换I/O口你只需要修改一下 DDRX、PORTX 和BIT(X)就可以了。

不知道我说清楚了没有.

出0入0汤圆

发表于 2009-3-31 15:29:16 | 显示全部楼层
请问hhrfjz ---
  小数如何处理。谢!

出0入0汤圆

发表于 2009-4-12 18:40:40 | 显示全部楼层
出口参数wmh是显示的高位,wml使显示的低位????
为什么呢
什么迹象表明出口参数是wmh 和 wml

出0入0汤圆

发表于 2009-4-12 20:34:22 | 显示全部楼层
其中的 init_f = SREG;     
SEI();

是什么意思,请教大侠

出0入0汤圆

发表于 2009-4-13 10:41:29 | 显示全部楼层
感谢分享!

出0入0汤圆

发表于 2009-4-14 12:22:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-4-15 21:01:05 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2009-4-15 21:21:09 | 显示全部楼层
唉,最近买DS18B20都不好买,缺货啊~

出0入0汤圆

发表于 2009-4-20 09:21:10 | 显示全部楼层
不好意思,我是新手来的,请问有无详细的实例,具体如何操作,谢谢!

出0入0汤圆

发表于 2009-4-20 09:59:21 | 显示全部楼层
楼上,这要怎么操作啊?
你要温度就去GETTEMP,全局就是WML和WMH就是你要的。

出0入0汤圆

发表于 2009-4-20 11:14:54 | 显示全部楼层
void gettemp()                   //读取温度值
这个函数不用带返回值 吗?

出0入0汤圆

发表于 2009-4-21 07:58:19 | 显示全部楼层
想请教下各位,为什么我这样用却不能成功的,我的液晶显示程序没有问题的,我只是在我原来写好的液晶程序中加入了下while(1)
          {  
             gettemp();
             for(num=20;num>0;num--)
                 {
                 write_dat(wmh);

         }
但却不能读出18B20的数据,请各位指教,谢谢!
#include<avr/io.h>//编译环境为WINAVR,8M晶振
#include<util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#include "delay.h"
#include "18B20.h"
uchar table[]={"I LOVE CHY"};
void write_com(uchar com)//写命令函数
{       _delay_ms(5);
      
       PORTC&=~(1<<PC3);
      
           PORTA=com;
       _delay_ms(5);
           PORTC|=(1<<PC2);
           _delay_ms(5);
           PORTC&=~(1<<PC2);

}
void write_dat(uchar dat)//写数据函数
{       _delay_ms(5);
       PORTC|=(1<<PC3);//RS设置为高电平,写数据
           PORTA=dat;//将数据送到数据端口A
       _delay_ms(5);
           PORTC|=(1<<PC2);
           _delay_ms(5);//  
           PORTC&=~(1<<PC2);
}
   int main(void)
  { uchar num;
      
          DDRA=0xff;
          DDRC|=(1<<PC3)|(1<<PC2);
          PORTC&=~(1<<PC2);
          write_com(0x01);
          write_com(0x38);
             _delay_ms(5);
            write_com(0x0e);//显示光标
         _delay_ms(5);
        write_com(0x0f);
        _delay_ms(5);
                   write_com(0x80);
          while(1)
          {  
             gettemp();
             for(num=20;num>0;num--)
                 {
                 write_dat(wmh);

         }
}

出0入0汤圆

发表于 2009-4-22 02:28:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-4-25 13:17:54 | 显示全部楼层
在主函数中还要初始化吗?
是不是直接用:

个位温度=wml;
十位温度=wmh;

就可以了?是这样的吗

出0入0汤圆

发表于 2009-4-25 16:48:54 | 显示全部楼层
你把gettemp函数定义为uint多好啊,直接返回,省得加2个全局变量

出0入0汤圆

发表于 2009-4-25 20:34:30 | 显示全部楼层
再学习下!

出0入0汤圆

发表于 2009-4-28 20:10:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-4-28 23:30:42 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-5-22 20:19:14 | 显示全部楼层
多谢LZ!好用。

出0入0汤圆

发表于 2009-6-10 10:59:35 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2009-6-10 14:09:21 | 显示全部楼层
程序只能在未优化的情况下工作,建议楼主修改一下延时函数,使其在优化时调用函数库中_delay_us(),这样可使其通用工作!

出0入0汤圆

发表于 2009-6-10 22:03:52 | 显示全部楼层
avr比51延时就是好。

出0入0汤圆

发表于 2009-6-10 22:14:09 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2009-6-11 09:15:05 | 显示全部楼层
谢谢!收藏,要用时再仔细看。

出0入0汤圆

发表于 2009-6-14 18:34:24 | 显示全部楼层
void init_1820()  
{  
    SET_DIR_1WIRE;                //设置PC2 为输出
    SET_OP_1WIRE;   
    CLR_OP_1WIRE;  
    delay_nus(480);    //480us以上  
    SET_OP_1WIRE;  
    CLR_DIR_1WIRE;  
    delay_nus(20);     //15~60us  
    while(CHECK_IP_1WIRE);  
    SET_DIR_1WIRE;  
    SET_OP_1WIRE;  
    delay_nus(140);   //60~240us  
}  
void write_1820(unsigned char x)  
{     
     unsigned char m;  
    for(m=0;m<8;m++)  
    {  
       CLR_OP_1WIRE;  
       if(x&1)//(x&(1<<m))    //写数据了,先写低位的!
       SET_OP_1WIRE;  
       else  
       {CLR_OP_1WIRE;}  
       delay_nus(40);   //15~60us  
       SET_OP_1WIRE;
        x>>=1;
    }  
     SET_OP_1WIRE;  
}  
unsigned char read_1820()  
{      
    unsigned char temp,k,n;  
    temp=0;  
    for(n=0;n<8;n++)  
       {  
      CLR_OP_1WIRE;  
      SET_OP_1WIRE;  
      CLR_DIR_1WIRE;  
      ttemp>>=1;
      k=(CHECK_IP_1WIRE);    //读数据,从低位开始  
      if(k)  
      temp|=0x80;//(1<<n);  
      else  
      temp&=0x7f;//~(1<<n);  
      delay_nus(50); //60~120us      
      SET_DIR_1WIRE;  
   }  
   return (temp);  
}   
小改一下可省60多个字节。

出0入0汤圆

发表于 2009-6-18 22:01:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-20 10:00:16 | 显示全部楼层
MAK

出0入0汤圆

发表于 2009-6-20 10:03:05 | 显示全部楼层
以前自己玩了一下没成,有时间再试试

出0入0汤圆

发表于 2009-6-23 11:26:32 | 显示全部楼层
谢谢
记号

出0入0汤圆

发表于 2009-6-23 13:28:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-24 12:37:52 | 显示全部楼层
都是强人!!!

出0入0汤圆

发表于 2009-6-27 22:12:39 | 显示全部楼层
记号!

出0入0汤圆

发表于 2009-8-20 13:53:33 | 显示全部楼层
谢谢,记下号!

出0入0汤圆

发表于 2009-8-20 17:25:02 | 显示全部楼层
3q

出0入0汤圆

发表于 2009-8-20 18:02:19 | 显示全部楼层
18b20,先MARK了。。

出0入0汤圆

发表于 2009-8-20 19:17:16 | 显示全部楼层
我很菜,加之刚学C,看了LZ的佳作,有以下几点还没明白:
1,void gettemp()这个函数用了VOID不是说明这个函数没有返回值吗?
2, wml, wmh是子函数里面的变量,函数调用后书上不是说此变量开辟的存储空间不是会覆盖吗,
   那怎么还能把值返回合调用函数呢?

以上两点疑惑请各们帮忙解答下,万分感谢!!!

出0入0汤圆

发表于 2009-8-23 17:24:06 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-9-7 16:30:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-8 19:10:21 | 显示全部楼层
好东东。高人!!!!!顶!!!!!!!!!!!

出0入0汤圆

发表于 2009-10-9 20:04:43 | 显示全部楼层
MARK,好东西`

出0入0汤圆

发表于 2009-10-9 22:00:16 | 显示全部楼层
记号一下,前几天还在迷茫不知道怎么用这个东东了

出0入0汤圆

发表于 2009-10-10 00:17:22 | 显示全部楼层
一直想弄个1602+18B20    先Mark

出0入0汤圆

发表于 2009-10-10 12:27:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-10 22:56:20 | 显示全部楼层
MARK

出0入0汤圆

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

出0入0汤圆

发表于 2009-10-11 00:54:43 | 显示全部楼层
顶!

出0入0汤圆

发表于 2009-10-11 07:48:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-11 10:01:36 | 显示全部楼层
mark

出0入0汤圆

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

出0入0汤圆

发表于 2009-10-27 14:23:38 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2009-11-2 10:32:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-3 00:42:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-3 23:47:42 | 显示全部楼层
围观一下

出10入0汤圆

发表于 2009-11-4 04:12:32 | 显示全部楼层
18B20记号

出0入0汤圆

发表于 2009-11-10 08:57:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-20 16:00:20 | 显示全部楼层
好东西,我刚好也在调试18b20

出0入0汤圆

发表于 2009-11-23 02:06:05 | 显示全部楼层
mark

出10入0汤圆

发表于 2009-11-23 13:49:06 | 显示全部楼层
18b20
CRC校验函数
记号

出0入0汤圆

发表于 2009-11-29 09:49:54 | 显示全部楼层
请问各位能精确到0.1摄氏度吗??

出0入0汤圆

发表于 2009-12-8 18:56:48 | 显示全部楼层
ds18b20 的精度为0.5度,不能到0.1度

出0入0汤圆

发表于 2009-12-10 16:49:40 | 显示全部楼层
顶一下!

出0入0汤圆

发表于 2009-12-10 23:30:09 | 显示全部楼层
支持个!  mark

出0入0汤圆

发表于 2009-12-11 07:13:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-11 07:18:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-11 10:49:08 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2009-12-11 11:13:38 | 显示全部楼层
【10楼】 btpig
积分:101
派别:
等级:------
来自:
很菜的问一句,用示波器怎么调延时。。谢谢  

调用你自己的延时程序使某个端口输出高低电平,然后用示波器测试就好了!

出0入0汤圆

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

出0入0汤圆

发表于 2010-1-15 14:20:28 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-1-15 17:51:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-21 20:34:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-21 21:52:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-6 21:38:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-7 11:56:44 | 显示全部楼层
关于18B20我也来谈点体会,从51开始就接触18B20,也用18B20做过一些关于温度检测的产品,总的来说18B20使用比较方便,2-3条线解决硬件连接,节省单片机引脚之源,内部转换温度值,节省单片机内部或外部之源,但是18B20有个致命的弱点,就是温度转换时间过长,从大家写的程序来看,一般发出转换指令后,延时等待转换完成,在去读取温度值,这样的做法无疑浪费单片机处理事件的时间,而且如果说每秒要刷新一次温度的话,单片机基本没什么时间在去处理其它事件,关于这部分的程序上的改进大家可以考虑定时器中断,外部循环只发出转换指令,发出转换指令后,把定时器中断打开,设置时间为转换时间,并把外部循环发转换温度指令关闭,在去处理其它事件,中断产生后,关中断防止连续中断,发读温度值,读回温度值后,在开放外部循环的发转换温度指令,这样做的目的是大大节省单片机对18B20操作所需要的时间,对于整个操作不影响程序其它事件的处理,尤其对扫描方式下的显示过程不会出现显示停止现象。
   在就是,18B20在网上基本99%的都是跳过ROM,很少有匹配ROM的文章,所以我觉得谈论18B20的ROM以外的过程实在是没有什么意义了,18B20可以值得讨论的地方估计就是匹配ROM这块了

出0入0汤圆

发表于 2010-3-7 16:27:14 | 显示全部楼层
好,18B20的时序的确很烦人,谢谢LZ的资料,这回要好好学习一下了

出0入112汤圆

发表于 2010-3-7 16:52:47 | 显示全部楼层
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------
我的18B20比实际的高出约2度,不知问题在那?

出0入0汤圆

发表于 2010-3-13 18:45:46 | 显示全部楼层
我的也是8M晶振,为什么看不到显示呢?

出0入0汤圆

发表于 2010-3-17 16:07:36 | 显示全部楼层
好东东

出0入4汤圆

发表于 2010-4-18 01:26:56 | 显示全部楼层
果然厉害呀

出0入0汤圆

发表于 2010-4-18 10:49:28 | 显示全部楼层
NRF24L01无线数传模块(13RMB为人民服务)
http://item.taobao.com/auction/item_detail.htm?item_num_id=5029339086

出0入0汤圆

发表于 2010-4-20 20:19:04 | 显示全部楼层
好,mark

出0入0汤圆

发表于 2010-4-20 23:01:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-21 08:25:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-21 08:46:46 | 显示全部楼层
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------

ddddd

出0入0汤圆

发表于 2010-4-21 20:28:53 | 显示全部楼层
谢谢楼主,请教一下,我用你的头文件。在while(CHECK_IP_1WIRE);  这个语句停住了,就是说没有读到这个引脚低电平,我把这句注释了,程序顺利过去了。温度也读出来了。这个语句有必要吗?

出0入0汤圆

发表于 2010-4-22 00:36:26 | 显示全部楼层
MARK

出0入4汤圆

发表于 2010-4-22 07:44:51 | 显示全部楼层
while(CHECK_IP_1WIRE); 我加了个超时处理,防止程序死掉了

出0入0汤圆

发表于 2010-4-22 09:07:46 | 显示全部楼层
非要等到这个信号吗?我看了网站上其他程序。有的就用它判断一下初始化是否成功,不成功也继续读温度。

出0入0汤圆

发表于 2010-4-22 15:37:24 | 显示全部楼层
棒棒!

出0入0汤圆

发表于 2010-4-22 18:59:34 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-4-22 19:28:42 | 显示全部楼层
不错啊,恭喜楼主,顶一个。

出0入0汤圆

发表于 2010-4-26 21:00:13 | 显示全部楼层
多谢了

出0入0汤圆

发表于 2010-5-8 21:53:38 | 显示全部楼层
谢过楼主。参考了。。。太好使了。

出0入0汤圆

发表于 2010-6-19 21:58:58 | 显示全部楼层
谢谢啊,我正在调这个东西!

出0入0汤圆

发表于 2010-6-19 22:47:34 | 显示全部楼层
小顶个

出0入0汤圆

发表于 2010-6-19 23:46:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-20 18:06:57 | 显示全部楼层
~~~

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-27 06:03

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

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