搜索
bottom↓
回复: 16

小弟 学习18b20 不会读数

[复制链接]

出0入0汤圆

发表于 2012-3-27 21:31:29 | 显示全部楼层 |阅读模式
小弟 想用12864显示18b20温度  可是对 18b20读数不了解  在网上找的程序 没有解释 看不太懂  求 哪位前辈  传个以前做过的程序  或指点一下思路   小弟 万分感谢

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-4-12 00:00:54 | 显示全部楼层
void ds_init()
{
  uchar x=0;
   ds=1;
   _nop_();_nop_();
   ds=0;
   tempdelay(85);
   ds=1;
   tempdelay(16);
  
  
}

void tempwrite(uchar dat)
{
   uchar i;
   for(i=0;i<8;i++)
     {
            ds=0;
                _nop_();
                ds=dat&0x01;
                tempdelay(5);
                _nop_();
            _nop_();
                ds=1;
                dat=dat>>1;
         }
         delayms(3);
}
uchar tempread()
{
    uchar i,dat;
        for(i=0;i<8;i++)
        {
          ds=0;
          _nop_();
          _nop_();
          dat=dat>>1;
          ds=1;
          _nop_();
          _nop_();
          if(ds==1)
          dat=dat|0x80;
          tempdelay(5);
        }
        return(dat);
}


uint get_temp()
{
  uchar a,b;
  ds_init();
  tempwrite(0xcc);     //写跳过读rom指令
  tempwrite(0x44);     //写温度转换指令
  tempdelay(10);
  ds_init();
  tempwrite(0xcc);
  tempwrite(0xbe);

  a=tempread();
  b=tempread();
  temp=(b<<4)|(a>>4);
  if(temp>128)
  {temp=~temp+1;}
   return temp;
}

出0入0汤圆

发表于 2012-4-12 11:47:14 | 显示全部楼层
楼主应该仔细钻研一下PDF中的时序和命令,然后再对照正规例程来学习。不然总是一知半解的。

出0入0汤圆

发表于 2012-4-12 13:23:06 | 显示全部楼层
Edward3121 发表于 2012-4-12 11:47
楼主应该仔细钻研一下PDF中的时序和命令,然后再对照正规例程来学习。不然总是一知半解的。 ...

敢问哪里有正规例程?

出0入0汤圆

发表于 2012-4-12 15:39:13 | 显示全部楼层
我曾经做过一个,你可以看一下

#include<reg52.h>
#include <intrins.h>

sbit ge2=P3^2;          //数码管个位
sbit shi2=P3^3;          //数码管十位
sbit DQ =P2^7;    //定义通信端口1


unsigned char tab[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
                    //  0   1     2    3    4    5    6    7    8    9

void delay(unsigned char i)
{
        while(i--);
}

//初始化函数1
Init_DS18B20(void)
{
        unsigned char x=0;
        DQ = 1;    //DQ复位
        delay(8);  //稍做延时
        DQ = 0;    //单片机将DQ拉低
        delay(80); //精确延时 大于 480us
        DQ = 1;    //拉高总线
        delay(14);
        x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        delay(20);
}

//读一个字节
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;
                  delay(4);
        }
        return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                  DQ = dat&0x01;
                  delay(5);
                  DQ = 1;
                  dat>>=1;
        }
        delay(4);
}

//读取温度
ReadTemperature(void)
{
        unsigned char a=0;
        unsigned char b=0;
        unsigned char t=0;
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=ReadOneChar();   //读取温度值低位
        b=ReadOneChar();   //读取温度值高位
        a=a>>4;            //低位右移4位,舍弃小数部分
        t=b<<4;            //高位左移4位,舍弃符号位
        t=t|a;            
        return(t);
}

void display_tempmain(unsigned char i)             //1个18b20温度显示函数
{
        shi2=1;                          
          ge2=0;
          P1=tab[i/10];           //dis shiwei
          delay(200);
       
        P1=0xff;
          shi2=0;
          ge2=1;
          P1=tab[i%10];           //dis  gewei
          delay(200);

        P1=0xff;
        delay(200);++
}

//****************************************************
//主函数
void main(void)
{
        unsigned char temp;
        int i ;
        temp = 0;
        while(1)                         //主循环
        {
                for( i = 0;i<300; i++)
                {
                        display_tempmain(temp);           
                }
                temp=ReadTemperature();
        }   
}


这个程序是:读取温度在数码管上显示。有不懂得地方可以问我。

出0入0汤圆

发表于 2012-4-12 16:02:59 | 显示全部楼层
这个绝对没问题 讲的也很细致

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-12 16:04:08 | 显示全部楼层
唉 没穿上来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-12 18:01:00 | 显示全部楼层
呵呵,热心的人很多啊,

出0入0汤圆

发表于 2012-4-12 18:20:57 | 显示全部楼层
tepaiyuan 发表于 2012-4-12 13:23
敢问哪里有正规例程?

正规例程就是形式规范的,不是视频里随手写的那种。

出0入0汤圆

发表于 2012-4-12 21:38:36 | 显示全部楼层
Edward3121 发表于 2012-4-12 18:20
正规例程就是形式规范的,不是视频里随手写的那种。

你就给他一份规范的,让他自己学会看时序图

出0入0汤圆

发表于 2012-4-12 23:55:43 | 显示全部楼层
tepaiyuan 发表于 2012-4-12 21:38
你就给他一份规范的,让他自己学会看时序图

http://wenku.baidu.com/view/88d013303968011ca30091e6.html
这个差不多吧,我找不到当时学的时候用的了,这个差不多吧……

出0入0汤圆

发表于 2012-4-13 16:14:34 | 显示全部楼层
到官网去下载技术文档,然后仔细研读,很详细的
http://www.maxim-ic.com/datasheet/index.mvp/id/2812/t/al

出0入0汤圆

 楼主| 发表于 2012-4-14 20:01:04 | 显示全部楼层
小弟  在此谢过楼上各位大侠了

出0入0汤圆

发表于 2012-4-18 14:11:19 | 显示全部楼层
Arachne29 发表于 2012-4-12 15:39
我曾经做过一个,你可以看一下

#include

大叔我想认识下你,,教教我温度传感器吧 ds18的麻烦说下qq好吗?

出0入0汤圆

发表于 2012-4-18 14:33:23 | 显示全部楼层
18B20已经算是最简单的了,你刚起步应该多自己琢磨,这样才能有所收获。

出0入0汤圆

发表于 2012-4-18 18:51:10 | 显示全部楼层
yesno 发表于 2012-4-18 14:11
大叔我想认识下你,,教教我温度传感器吧 ds18的麻烦说下qq好吗?

嘿嘿 很荣幸,我的qq648855521

出0入0汤圆

发表于 2012-4-18 21:47:12 | 显示全部楼层
贴一个

/*DS18B20 正常显示 by whj 11 11 18*/
#include<reg52.h>
//#include<intrins.h>
//#include<absacc.h>
//#include <stdio.h>  
#define uint  unsigned int   
#define uchar unsigned char
   

sbit DS = P2^0; //DS18B20的数据输入/输出脚DQ,根据情况设定
uchar flag1;            //正负标志

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar code wei[]={0x00,0x01,0x02,0x04,0x08};

uint temp,t;

void delay(uint count)      //delay
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
void dsreset(void)       //send reset and initialization command
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tmpread(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}

void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

void tmpchange(void)  //DS18B20 begin change
{
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);  // address all drivers on bus
  tmpwritebyte(0x44);  //  initiates a single temperature conversion
}

uint tmp()               //get the temperature
{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}
void display(uint temp)
{
        uchar A1,A2,A2t,A3;
        A1=temp/100;
        A2t=temp%100;
        A2=A2t/10;
        A3=A2t%10;
                t=400;
                P1= wei[1];;
               
                if (flag1==1)
                {
                P0=0x40;
                }
                else
                {
                P0=0x00;
                }
                while(t--);
               
                t=400;
                P1= wei[2];
                P0=table[A1];
                while(t--);
               
                t=400;
                P1= wei[3];                 
                P0=table1[A2];
                while(t--);
               
                t=400;
                P1= wei[4];
                P0=table[A3];
                while(t--);
                P1=wei[0];
               
               
}

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

本版积分规则

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

GMT+8, 2024-5-19 23:21

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

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