搜索
bottom↓
123
返回列表 发新帖
楼主: hhrfjz

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

[复制链接]

出0入0汤圆

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

出0入0汤圆

发表于 2010-6-20 18:16:42 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-6-20 22:56:44 | 显示全部楼层
拿来用一下 3Q!

出0入0汤圆

发表于 2010-7-22 12:04:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-22 18:53:37 | 显示全部楼层
顶下!!

出0入0汤圆

发表于 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 char  Num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9

#define uint unsigned int
#define uchar unsigned char
//uchar data[4];
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[a];
       
        delay_nms(3);
        }
                if(b==0&&a==0)PORTC&=0xfb;
                else
        {
        PORTC|=0x04;
          PORTA=Num;
       
        delay_nms(3);
        }
                PORTC|=0x02;
        PORTA=Num[c];
        PORTA|=0X80;                  //  假设数码管小数点的控制位是 PA7,使小数点点亮
       
        delay_nms(3);
                                    PORTC|=0x01;       
        PORTA=Num[d];
       
       delay_nms(3);
}

}

出0入0汤圆

发表于 2010-8-5 23:01:10 | 显示全部楼层
这东西确实不错。。。。

出0入0汤圆

发表于 2010-8-6 08:03:13 | 显示全部楼层
标记一下啊

出0入0汤圆

发表于 2010-8-6 11:19:12 | 显示全部楼层
标记~

出0入4汤圆

发表于 2010-8-6 11:39:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-29 20:34:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-31 16:58:59 | 显示全部楼层
做个记号保留,用到的时候再来下。谢谢了!

出0入0汤圆

发表于 2010-8-31 19:47:31 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2010-9-2 08:59:56 | 显示全部楼层
收藏

出0入0汤圆

发表于 2010-9-2 09:09:21 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2010-9-17 09:32:16 | 显示全部楼层
刚开始看DS18S20,MARK下。

出0入0汤圆

发表于 2010-9-17 19:06:31 | 显示全部楼层
谢谢分享~

出0入0汤圆

发表于 2010-9-17 20:31:12 | 显示全部楼层
收藏!

出0入0汤圆

发表于 2010-9-17 21:01:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-20 21:25:41 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-9-20 21:32:38 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-9-21 09:57:44 | 显示全部楼层
为什么我的关机以后再重新开机温度显示就不正常了呢?

出0入0汤圆

发表于 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取整
}

出0入0汤圆

发表于 2010-10-14 17:29:27 | 显示全部楼层
好强,学习了

出0入0汤圆

发表于 2010-10-21 22:13:25 | 显示全部楼层

出0入0汤圆

发表于 2010-10-21 22:30:24 | 显示全部楼层
mark

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

发表于 2010-10-22 08:42:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-29 10:07:31 | 显示全部楼层
这必须得顶

出0入0汤圆

发表于 2010-10-29 10:32:34 | 显示全部楼层
cvavr里面有这个库。

出0入0汤圆

发表于 2010-10-31 00:17:19 | 显示全部楼层
我也做个记号,下次学到的时候来看。

出0入0汤圆

发表于 2010-10-31 21:08:59 | 显示全部楼层
细读。

出0入0汤圆

发表于 2010-10-31 21:31:25 | 显示全部楼层
回复【楼主位】hhrfjz  ---
-----------------------------------------------------------------------

好东西值得收藏

出0入0汤圆

发表于 2010-10-31 22:16:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-31 22:35:09 | 显示全部楼层
谢谢了,收藏先.

出0入0汤圆

发表于 2010-11-1 00:21:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-6 13:30:41 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-11-21 00:59:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 13:39:31 | 显示全部楼层
好,学习了,谢谢各位

出0入0汤圆

发表于 2010-11-22 13:51:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 18:07:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 18:35:22 | 显示全部楼层
ddddddddd

出0入0汤圆

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

出0入0汤圆

发表于 2010-11-22 22:24:56 | 显示全部楼层
学习下

出0入0汤圆

发表于 2010-11-23 23:44:19 | 显示全部楼层
收藏了。

出0入0汤圆

发表于 2010-11-24 12:33:49 | 显示全部楼层
很强悍,学习了

出0入0汤圆

发表于 2010-12-19 23:09:03 | 显示全部楼层
太厉害了 ,拿去看看 。

出0入0汤圆

发表于 2011-1-11 15:22:53 | 显示全部楼层
收藏,学习

出0入0汤圆

发表于 2011-3-8 19:36:29 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-3-12 09:16:41 | 显示全部楼层
先崇拜一下

出0入0汤圆

发表于 2011-3-13 10:43:30 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-3-13 13:22:39 | 显示全部楼层
感谢分享~

出0入0汤圆

发表于 2011-3-13 22:17:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-15 14:54:23 | 显示全部楼层
Mark!!!!!!

出0入0汤圆

发表于 2011-3-15 20:20:49 | 显示全部楼层
mark!!!!!

出0入0汤圆

发表于 2011-3-15 21:08:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-16 09:35:51 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2011-3-16 21:54:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-17 13:26:02 | 显示全部楼层
打酱油

出0入0汤圆

发表于 2011-3-19 14:35:13 | 显示全部楼层
正好要用到,谢谢!

出0入0汤圆

发表于 2011-3-20 20:47:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-20 21:47:23 | 显示全部楼层
不错很好用

出0入0汤圆

发表于 2011-3-20 21:48:25 | 显示全部楼层
我看了一下,这个函数好像有点问题(看使用的优化选项不同会有不一样的结果):
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }

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

出5入0汤圆

发表于 2011-4-5 18:59:03 | 显示全部楼层
void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }
8M时,asm("nop")这条指令的时间应该是1/8000000 = 0.125uS 吧,为什么会是1us呢

出0入0汤圆

发表于 2011-4-5 19:37:25 | 显示全部楼层
有木有负温度??我发觉我自己弄的头文件比楼主的好看多了。。
附上自己写的18B20代码~
//12M晶振,数据线接口为DQ,请自己修改绑定IO口
#ifndef _18B20_H_
#define _18B20_H_
/**************************************************/
#ifndef uchar
#define uchar unsigned char
#define uint unsigned int
#endif
/********************函数定义**********************/
void  ReadTemp(uchar *TempInt, uchar *TempDot, uchar *SignedFlag);   //使用时调用这条函数就OK了
void  Init_DS18B20(void);
uchar ReadOneChar(void);
void  WriteOneChar(unsigned char dat);
void  Delayx(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

出0入0汤圆

发表于 2011-4-5 20:05:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-22 00:27:08 | 显示全部楼层
谢谢LZ,借用你的例子调试成功了~

出0入0汤圆

发表于 2011-5-24 18:43:11 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-6-2 21:51:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-3 23:07:39 | 显示全部楼层
谢谢分享!
有空试试。

出0入0汤圆

发表于 2011-6-4 22:12:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-4 22:17:14 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-24 16:20:54 | 显示全部楼层
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-6-24 22:02:17 | 显示全部楼层
标记!!!!!

出0入0汤圆

发表于 2011-6-28 10:26:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-28 13:49:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-28 20:53:16 | 显示全部楼层
回复【265楼】babytaomail 陶子
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-6-28 20:55:15 | 显示全部楼层
回复【267楼】CSU David
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-6-28 21:19:54 | 显示全部楼层
回复【267楼】CSU David
-----------------------------------------------------------------------

void disp()
{
        PORTA=dula[0];
        PORTC=wela[wml];
        _delay_us(10);
        PORTA=dula[1];
        PORTC=wela[wmh];
        _delay_us(10);
}

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

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

出0入0汤圆

发表于 2011-7-2 00:24:33 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-7-13 18:28:47 | 显示全部楼层
#define CLR_DIR_1WIRE DDRC&=~BIT(2)
请问楼主,这句里的 DDRC&=~BIT(2)  里的  BIT(2),是什么意思呀,什么函数?怎么用来的?
感谢

出0入0汤圆

发表于 2011-7-16 10:30:58 | 显示全部楼层
又学到不少,谢谢

出0入0汤圆

发表于 2011-12-7 21:20:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-7 23:53:11 | 显示全部楼层
回复【283楼】yikuang
mark

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

出0入0汤圆

发表于 2011-12-8 04:13:05 | 显示全部楼层
ding la

出0入0汤圆

发表于 2011-12-8 11:37:23 | 显示全部楼层
DS18B20头文件!绝对好使!还使用方便!M16 8M 的!

出0入0汤圆

发表于 2011-12-8 12:08:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-8 15:37:47 | 显示全部楼层
我还有mega1288的,pic的,谁要?

出0入0汤圆

发表于 2011-12-8 21:20:36 | 显示全部楼层
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-12-8 21:27:31 | 显示全部楼层
回复【23楼】panxiaoyi 啊艺
-----------------------------------------------------------------------

是在佩服,能求指点吗?

出0入0汤圆

发表于 2011-12-10 14:22:11 | 显示全部楼层
mark一下先,谢谢楼主了!

出0入0汤圆

发表于 2012-2-2 22:43:15 | 显示全部楼层
谢谢楼主和楼上各位,下载学习了

出0入0汤圆

发表于 2012-2-3 09:26:44 | 显示全部楼层
受教了.谢谢大家!

出0入0汤圆

发表于 2012-2-6 10:18:30 | 显示全部楼层
这个有点意思。收藏先。

出0入0汤圆

发表于 2013-4-10 20:11:07 | 显示全部楼层
不错,收藏了

出0入0汤圆

发表于 2013-5-6 00:15:35 | 显示全部楼层
不错的 顶个

出0入0汤圆

发表于 2013-6-18 14:48:58 | 显示全部楼层
CPU为STM32F107,系统时钟为72M可以用吗

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-6 16:53

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

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