wangshaosh 发表于 2010-6-20 18:06:57

~~~

slzzmcu 发表于 2010-6-20 18:16:42

Mark

super373 发表于 2010-6-20 22:56:44

拿来用一下 3Q!

wbanng 发表于 2010-7-22 12:04:43

mark

qinhya 发表于 2010-7-22 18:53:37

顶下!!

muscledev 发表于 2010-8-5 22:47:55

楼主,我用你的程序,用共阴数码管显示,但是不行,不知出什么问题了,帮忙看一下。非常感激
#include<ioavr.h>
/*************************************************************************
ds18b20头文件   
M16内部8M         
*************************************************************************/
#define CLR_DIR_1WIRE DDRC&=~0x80   //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRC|=0x80      //里面什么都不用该! //BIT(2)换成0x80
#define CLR_OP_1WIRE PORTC&=~0x80
#define SET_OP_1WIRE PORTC|=0x80      
#define CHECK_IP_1WIRE (PINC & 0x80)    //检测
unsigned char wmh,wml;
unsigned charNum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9

#define uint unsigned int
#define uchar unsigned char
//uchar data;
unsigned char wmh,wml,wm3;

//延时程序:

//delay.h
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void)               //1us延时函数
{
   asm("nop");
}

void delay_nus(unsigned int n)       //N us延时函数
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
}
   
void delay_1ms(void)               //1ms延时函数
{
   unsigned int i;
   for (i=0;i<1140;i++);
}
   
void delay_nms(unsigned int n)       //N ms延时函数
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
}


void init_1820()
{
    SET_DIR_1WIRE; //设置PC2 为输出
    SET_OP_1WIRE;   
    CLR_OP_1WIRE;
    delay_nus(580);    //480us以上
    SET_OP_1WIRE;
    CLR_DIR_1WIRE;
    delay_nus(25);   //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<<m))    //写数据了,先写低位的!
       SET_OP_1WIRE;
       else
       {CLR_OP_1WIRE;}
       delay_nus(40);   //15~60us
       SET_OP_1WIRE;
    }
   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;
      k=(CHECK_IP_1WIRE);    //读数据,从低位开始
      if(k)
      temp|=(1<<n);
      else
      temp&=~(1<<n);
      delay_nus(50); //60~120us      
      SET_DIR_1WIRE;
   }
   return (temp);
}   
void gettemp()    //读取温度值
{
   unsigned char temh,teml,wm0,wm1,wm2;
   init_1820();      //复位18b20
   write_1820(0xcc);   // 发出转换命令
   write_1820(0x44);
//delay_nms(800);   //不延时也好使,不知道怎么回事!
   init_1820();
   write_1820(0xcc);//发出读命令
   write_1820(0xbe);
   teml=read_1820();//读数据
   temh=read_1820();
   wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
   wm1=temh<<4;
   wm2=wm1+wm0;      //16进制转10进制
   wm3=wm2/100;
   wmh=(wm2%100)/10;   //出口参数了!wmh是显示的高位,wml使显示的低位
   wml=(wm2%100)%10;
}   




void main(void)
{
delay_nms(1);


         uint a,b,c,d;
       
      DDRA=0Xff;//假设数码管接在PA口上,数码管为共阴
        PORTA=0x00;
      DDRC=0X0f;
      PORTC=0x00;//假设控制数码管位数的是PC口的低四位
               a=wm3;
      b=wmh;
      c=wml;
while(1)
        {
       
      gettemp        //a=(uint)i/100;
        if(a==0)PORTC&=0xf7;
                else
        {
        PORTC|=0x08;
          PORTA=Num;
       
        delay_nms(3);
        }
                if(b==0&&a==0)PORTC&=0xfb;
                else
        {
        PORTC|=0x04;
          PORTA=Num;
       
        delay_nms(3);
        }
                PORTC|=0x02;
      PORTA=Num;
        PORTA|=0X80;                  //假设数码管小数点的控制位是 PA7,使小数点点亮
       
        delay_nms(3);
                                    PORTC|=0x01;       
      PORTA=Num;
       
       delay_nms(3);
}

}

zhq1989723 发表于 2010-8-5 23:01:10

这东西确实不错。。。。

allenjwb 发表于 2010-8-6 08:03:13

标记一下啊

xfloveyou886 发表于 2010-8-6 11:19:12

标记~

sailor0908 发表于 2010-8-6 11:39:37

mark

xtaens 发表于 2010-8-29 20:34:45

mark

liujinyu 发表于 2010-8-31 16:58:59

做个记号保留,用到的时候再来下。谢谢了!

woshinlb 发表于 2010-8-31 19:47:31

感谢楼主分享

icer1 发表于 2010-9-2 08:59:56

收藏

fshunj 发表于 2010-9-2 09:09:21

谢谢分享

zkcheng606 发表于 2010-9-17 09:32:16

刚开始看DS18S20,MARK下。

poet_lee 发表于 2010-9-17 19:06:31

谢谢分享~

worldly_guest 发表于 2010-9-17 20:31:12

收藏!

xuejianhua1986 发表于 2010-9-17 21:01:46

mark

cai361305 发表于 2010-9-20 21:25:41

标记

XQGG 发表于 2010-9-20 21:32:38

记号

wangbin6030 发表于 2010-9-21 09:57:44

为什么我的关机以后再重新开机温度显示就不正常了呢?

jsarthur 发表于 2010-10-14 17:13:57

回复【楼主位】hhrfjz---
-----------------------------------------------------------------------
前两天正好在调 参考了坛子里的不少帖子 在这边贴下自己写的 读温的函数 支持正负值 及小数
写的不好还望大家见谅
//------------DS18BB0读温度----------
int readTemp(void)
{
    int temp,temp3;
    unsigned char temp1,temp2,temp4,temp5;
               
    convertDs18b20();
    resetOnewire();
    wOnewire(0xcc);
    wOnewire(0xbe);        
    temp1=rOnewire(); //低位
    temp2=rOnewire(); //高位

        temp4=temp1;
        temp5=temp2;

        temp2=temp2<<4;
        temp1=temp1>>4;
        temp2|=temp1;

//        return (temp2&0x7F); //返回0~99

        if((temp5&0xF0)==0xf0)        //负值
        {
                temp3=((~temp4+1)&0x0F)*0.0625*100;       
                temp=(~temp2&0x7F)*100+temp3;

                temp=~temp+1;
        }
        else                                        //正值
        {

                temp3=(temp4&0x0F)*0.0625*100;       
                temp=(temp2&0x7F)*100+temp3;

        }

        return (temp);        //扩大100取整
}

changzi2008 发表于 2010-10-14 17:29:27

好强,学习了

guxingganyue 发表于 2010-10-21 22:13:25

zhaoghsea 发表于 2010-10-21 22:30:24

mark

arvidwen 发表于 2010-10-21 23:10:52

mark

wenfeiexe 发表于 2010-10-21 23:13:34

mark

zchenj 发表于 2010-10-22 08:42:49

mark

sxdy99 发表于 2010-10-29 10:07:31

这必须得顶

w99991888 发表于 2010-10-29 10:32:34

cvavr里面有这个库。

pingguo2012 发表于 2010-10-31 00:17:19

我也做个记号,下次学到的时候来看。

sddzycnq 发表于 2010-10-31 21:08:59

细读。

luvemcu 发表于 2010-10-31 21:31:25

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

好东西值得收藏

zhenhuah 发表于 2010-10-31 22:16:14

mark

heero 发表于 2010-10-31 22:35:09

谢谢了,收藏先.

danielzhuang 发表于 2010-11-1 00:21:59

mark

adamj 发表于 2010-11-6 13:30:41

不错

www1519 发表于 2010-11-21 00:59:44

mark

sharp0 发表于 2010-11-22 13:39:31

好,学习了,谢谢各位

chinawrj 发表于 2010-11-22 13:51:57

mark

love_zjb 发表于 2010-11-22 18:07:00

mark

kelos3000 发表于 2010-11-22 18:35:22

ddddddddd

AG17 发表于 2010-11-22 21:49:25

mark

pengeiei 发表于 2010-11-22 22:24:56

学习下

hackerzw 发表于 2010-11-23 23:44:19

收藏了。

martial 发表于 2010-11-24 12:33:49

很强悍,学习了

heroling 发表于 2010-12-19 23:09:03

太厉害了 ,拿去看看 。

kongan 发表于 2011-1-11 15:22:53

收藏,学习

enjoyliwenhua 发表于 2011-3-8 19:36:29

标记

enjoyliwenhua 发表于 2011-3-12 09:16:41

先崇拜一下

aidby2004 发表于 2011-3-13 10:43:30

MARK

poet_lee 发表于 2011-3-13 13:22:39

感谢分享~

hydraulics 发表于 2011-3-13 22:17:48

mark

dasemo2008 发表于 2011-3-15 14:54:23

Mark!!!!!!

lixupeng 发表于 2011-3-15 20:20:49

mark!!!!!

416446891 发表于 2011-3-15 21:08:25

mark

scsdwxj2005 发表于 2011-3-16 09:35:51

标记一下

lsy5110 发表于 2011-3-16 21:54:00

mark

CaineStrong 发表于 2011-3-17 13:26:02

打酱油

tianyuanqike 发表于 2011-3-19 14:35:13

正好要用到,谢谢!

fanbinhua 发表于 2011-3-20 20:47:40

mark

billbot501 发表于 2011-3-20 21:47:23

不错很好用

liangyaozhan 发表于 2011-3-20 21:48:25

我看了一下,这个函数好像有点问题(看使用的优化选项不同会有不一样的结果):
void delay_1ms(void)               //1ms延时函数
{
   unsigned int i;
   for (i=0;i<1140;i++);
}

在for循环内什么都不做时,此函数达不到你要的延时。但可以使用volatile定义变量i,防止被优化了。

gnail092 发表于 2011-4-5 18:59:03

void delay_1us(void)               //1us延时函数
{
   asm("nop");
}
8M时,asm("nop")这条指令的时间应该是1/8000000 = 0.125uS 吧,为什么会是1us呢

babytaomail 发表于 2011-4-5 19:37:25

有木有负温度??我发觉我自己弄的头文件比楼主的好看多了。。./emotion/em025.gif
附上自己写的18B20代码~
//12M晶振,数据线接口为DQ,请自己修改绑定IO口
#ifndef _18B20_H_
#define _18B20_H_
/**************************************************/
#ifndef uchar
#define uchar unsigned char
#define uint unsigned int
#endif
/********************函数定义**********************/
voidReadTemp(uchar *TempInt, uchar *TempDot, uchar *SignedFlag);   //使用时调用这条函数就OK了
voidInit_DS18B20(void);
uchar ReadOneChar(void);
voidWriteOneChar(unsigned char dat);
voidDelayx(unsigned int i);//注意延时,MCU速度快时要加大,而且只可大不可小

/***************************************************
功能说明: 微秒级延时
****************************************************/
void Delayx(unsigned int i)
{
while(i--);
}
/***************************************************
                void Init_DS18B20()
功能说明: 初始化18B20
****************************************************/
void Init_DS18B20(void)
{
       unsigned char x=0;
       DQ = 1;                  //DQ复位
       Delayx(8);        //稍做延时
       DQ = 0;            //单片机将DQ拉低
       Delayx(80);       //精确延时 大于 480us
       DQ = 1;            //拉高总线
       Delayx(10);
       x=DQ;              //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
       Delayx(5);
}

/***************************************************
                void ReadOneChar()
功能说明: 从18B20中读取一个字节的数据
返回值:        返回具体数据
****************************************************/
unsigned char ReadOneChar(void)
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
       {
          DQ = 0; // 给脉冲信号
          dat>>=1;
          DQ = 1; // 给脉冲信号
          if(DQ)
           dat|=0x80;
          Delayx(5);
       }
       return(dat);
}

/***************************************************
                void WriteOneChar()
功能说明: 字一个字节的数据进18B20中
****************************************************/
void WriteOneChar(unsigned char dat)
{
       unsigned char i=0;
       for (i=8; i>0; i--)
       {
          DQ = 0;
          DQ = dat&0x01;
          Delayx(5);
          DQ = 1;
          dat>>=1;
       }
        Delayx(5);
}

/**************************************************
void ReadTemp(uchar *TempInt,uchar *TempDot, uchar *SignedFlag)
功能说明:从18B20中读出温度
出口:TempInt 温度整数部分
                   TempDot 温度整数部分
                   SignedFlag为温度正负标志,正为0,负为1
**************************************************/
void ReadTemp(uchar *TempInt,uchar *TempDot, uchar *SignedFlag)
{
        unsigned char a=0;
        unsigned char b=0;
        unsigned int i;
        unsigned long int temp;
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); //12位温度分辨率,默认9位
        Delayx(100);
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=ReadOneChar();        //读低位
        b=ReadOneChar();        //读高位
    *SignedFlag=b>>7;        //符号标志
       
        if(*SignedFlag>0)//负数处理
        {
                temp=b;
                temp=temp<<8|a;
                temp=0xffff-temp;               //负数时为补码,因而要取反加一
                temp+=1;
                b=temp>>8;
                a=temp;
        }

        i=a&0x0f;                                       //小数部分三位二制码
        *TempInt=(a>>4)|(b<<4);       
        i=i*625;                                    //小数部分转换
        *TempDot=i/1000;                           //只取一位小数。TS:你可以修改1000的大小,以达自己想要的分辨率
}

#endif

fw190d9 发表于 2011-4-5 20:05:47

mark

CSU_David 发表于 2011-5-22 00:27:08

谢谢LZ,借用你的例子调试成功了~

oysy 发表于 2011-5-24 18:43:11

好东西

wanzhouyang29 发表于 2011-6-2 21:51:51

mark

stewen 发表于 2011-6-3 23:07:39

谢谢分享!
有空试试。

cuit4017 发表于 2011-6-4 22:12:30

mark

Elderfox 发表于 2011-6-4 22:17:14

MARK

ervinzz 发表于 2011-6-24 16:20:54

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

18B20读写数据不都是从高位开始的吗?

bingshuihuo888 发表于 2011-6-24 22:02:17

标记!!!!!

Garbage614 发表于 2011-6-28 10:26:12

mark

bingshuihuo888 发表于 2011-6-28 13:49:53

mark

ervinzz 发表于 2011-6-28 20:53:16

回复【265楼】babytaomail 陶子
-----------------------------------------------------------------------

你这弄的是51机子上的吧……不适合用在AVR上 光是定义位操作DQ就不行,AVR还要考虑IO的输入输出设置的你上面的IO都是输出情况很显然不行的!

ervinzz 发表于 2011-6-28 20:55:15

回复【267楼】CSU David
-----------------------------------------------------------------------

为什么 我没调成功呢哭……

ervinzz 发表于 2011-6-28 21:19:54

回复【267楼】CSU David
-----------------------------------------------------------------------

void disp()
{
        PORTA=dula;
        PORTC=wela;
        _delay_us(10);
        PORTA=dula;
        PORTC=wela;
        _delay_us(10);
}

int main()
{
        DDRA=0xff;
        DDRC=0xff;
        PORTA=0x00;
        PORTC=0xff;
       
        while(1)
        {
                gettemp();
                _delay_ms(1);
                disp();       
        }       
}

这是我的显示程序还有主函数 帮我看看哪里有问题 怎么烧进去没反应呢谢谢!(省略了借用楼主的代码)

liguanglei 发表于 2011-7-2 00:24:33

MARK

jinjinge 发表于 2011-7-13 18:28:47

#define CLR_DIR_1WIRE DDRC&=~BIT(2)
请问楼主,这句里的 DDRC&=~BIT(2)里的BIT(2),是什么意思呀,什么函数?怎么用来的?
感谢

zhangchenggong 发表于 2011-7-16 10:30:58

又学到不少,谢谢

yikuang 发表于 2011-12-7 21:20:23

mark

LSZD 发表于 2011-12-7 23:53:11

回复【283楼】yikuang
mark

-----------------------------------------------------------------------

void_delay 发表于 2011-12-8 04:13:05

ding la

ap0405209 发表于 2011-12-8 11:37:23

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

shiqj 发表于 2011-12-8 12:08:57

mark

yaozi321 发表于 2011-12-8 15:37:47

我还有mega1288的,pic的,谁要?

xingpoull 发表于 2011-12-8 21:20:36

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

刚好要用到这个,你那个数据线是接在PC.2口?

xingpoull 发表于 2011-12-8 21:27:31

回复【23楼】panxiaoyi 啊艺
-----------------------------------------------------------------------

是在佩服,能求指点吗?

evileva 发表于 2011-12-10 14:22:11

mark一下先,谢谢楼主了!

airfex 发表于 2012-2-2 22:43:15

谢谢楼主和楼上各位,下载学习了

jack_yu 发表于 2012-2-3 09:26:44

受教了.谢谢大家!

ba4wi 发表于 2012-2-6 10:18:30

这个有点意思。收藏先。

jz701209李 发表于 2013-4-10 20:11:07

不错,收藏了

zhexuejia 发表于 2013-5-6 00:15:35

不错的 顶个

lchunsong 发表于 2013-6-18 14:48:58

CPU为STM32F107,系统时钟为72M可以用吗

308343327 发表于 2013-6-19 12:05:10

顶一下,学习学习
页: 1 2 [3]
查看完整版本: DS18B20头文件!绝对好使!还使用方便!M16 8M 的!