历史上的今天
返回首页

历史上的今天

今天是:2024年11月28日(星期四)

正在发生

2019年11月28日 | 使用AVR来驱动MAXIN的DS18B20

2019-11-28 来源:51hei

我最近正在研究使用AVR来驱动MAXIN的DS18B20,琢磨了几天,终于把它的驱动程序写好了.

使用IAR C++编译器


#ifndef DS18B20_H
#define DS18B20_H
/****************************************只需在源程序里定义以下宏
#define seDDS()  (seDB0())
#define clDDS()  (clDB0())
#define seDS()   (sePB0())
#define clDS()   (clPB0())
#define GetDS()  (GetPB0())
*********************************************/
/***********************************   函数说明  *********************
void DS18B20::DS18B20(void) 构造函数
void DS18B20::init()初始化DS18B20
char DS18B20::GetID()读取器件ID,成功返回1,并且器件的64位id号保存到DS18B20.id[4],里,失败返回0
char DS18B20::convter()读取温度,成功返回1,并且温度值保存到DS18B20.temp里,未就绪返回0。此程序需要调用数次才能正确转换
                       调用周期不得低于2ms
char DS18B20::GetPower()读取总线供电模式,正常返回1,寄生返回0
char DS18B20::SearchAlarm()读取报警,有报警返回1,没有返回0

****************************************************/
#define DS_ReadROM     0x33
#define DS_CopyROM     0x48
#define DS_MatchROM    0x55
#define DS_SkipROM     0xCC
#define DS_SearchROM   0xF0
#define DS_AlarmSearch 0xEC
#define DS_Convert     0x44
#define DS_ReadRAM     0xBE
#define DS_WriteRAM    0x4E
#define DS_ReadPower   0xB4
#define DS_9BIT           0
#define DS_10BIT          1
#define DS_11BIT          2
#define DS_12BIT          3
#include "c:incstatus.h"
#include "c:inccrc8.c"
#include "c:incdelay.c"
#include "c:incformat.h"
#include

class DS18B20
{
public:

  float temp;//           温度  
  int rel;//              温度偏移量
  char id[8];//           器件ID号
  char mode;//            转换模式9-12bit
  unsigned char TH;//     预警温度上限
  unsigned char TL;//     预警温度下限
  char power;//           0:寄生供电  1:电源供电
  char status;//          单线总线状态0: 无连接  1:已连接
  char sbuf[10];

private:

  char setup;
/****************************************复位总线***********************/
  char Reset_DS()
  {
    unsigned int x;
    seDS();
    seDDS();
    DELAY_80us();
    if(GetDS())
    {
      clDS();
      DELAY_600us();
      seDS();
      clDDS();
      for(x=0;x<30;)
      {
        if(GetDS())x++;
        else
        {
          for(x=0;x<30;)
          {
     if(GetDS())
            {
        seDDS();
        DELAY_600us();//
        return 1;
     }
     else
       x++;
            DELAY_10us();
   }
   clDDS();
   return 0;
        }
        DELAY_10us();//
      }
    }
    clDDS();
    return 0;
  }
/**************************************************写总线*******************/
  void Write_DS(unsigned dat,unsigned char wide)// dat:数据  wide:数据宽度(位数)
  {
    unsigned char i,sreg;
    seDDS();
    for(i=0;i    {
      sreg=SREG;
      SREG&=0x7F;//                      关中断
      if(dat&0x01)
      {
        clDS();
        DELAY_10us();
seDS();
        DELAY_80us();
      }
      else
      {
        clDS();
        DELAY_80us();
seDS();
        DELAY_10us();
      }
      SREG=sreg;//                       恢复中断 发生的中断将依次执行
      dat>>=1;
    }
  }
/***************************************************读总线*******************/
  unsigned char Read_DS(unsigned char wide)
  {
    unsigned char dat,i,sreg;
    for(i=dat=0;i    {
      if(GetDS())
      {
        sreg=SREG;
        SREG&=0x7F;
        clDS();
        seDDS();
        DELAY_10us();
        seDS();
        clDDS();
        dat>>=1;
        DELAY_10us();
        if(GetDS())dat|=0x80;
        seDDS();
        SREG=sreg;
        DELAY_80us();
      }
      else
      {
        setup=0;
      }
    }
    return dat;
  }

  char getid()
  {
    char i;
    for(i=0;i      if(id)
        return 1;
    return 0;
  }
public:
  char convert()//                           本程序调用周期至少2ms或以上
  {
    static unsigned char sbuf[9];
    static unsigned int i;
    switch(setup)
    {
    case 0:
      if(Reset_DS())//                   开始
      {
        status=1;
        setup++;
      }
      else
status=0;
      break;
    case 1:
      if(getid())
      {
        Write_DS(DS_MatchROM,8);//       匹配ROM
        for(i=0;i<8;i++)
          Write_DS(id,8);
      }
      else
      {
        Write_DS(DS_SkipROM,8);//       跳过匹配
      }
      Write_DS(DS_Convert,8);//         启动转换
      i=power?0:500;//         选择电源方式,以达到最快速度
      setup++;
      break;
    case 2:
      if(i)//                           延时
      {
        i--;
      }
      else if(Read_DS(8)==0xFF)//       等待转换结束
      {
        Reset_DS();
        if(getid())
        {
          Write_DS(DS_MatchROM,8);//    匹配ROM
          for(i=0;i<8;i++)
            Write_DS(id,8);
        }
        else
          Write_DS(DS_SkipROM,8);
        Write_DS(DS_ReadRAM,8);
        i=0;
        setup++;
      }
      break;
    case 3:
      sbuf=Read_DS(8);
      if(i>=9)
      {
        Reset_DS();
        if(GetCRC8(sbuf,8)==sbuf[8])//                    校验CRC
        {
          int i;
          i=sbuf[1]*0x100+sbuf[0];
          i+=rel;
          temp=i/16+(i%16)*0.125;
          setup=0;
          status=1;
          return 1;
        }
        setup=0;
      }
      break;
    }
    return 0;
  }
  char GetPower()
  {
    unsigned char x;
    if(Reset_DS())
    {
      Write_DS(DS_SkipROM,8);
      Write_DS(DS_ReadPower,8);
      x=Read_DS(8);
      Reset_DS();
      if(x)
        return 1;
    }
    return 0;
  }
/*************************************预警搜索****************************/
  char SearchAlarm()
  {
    if(Reset_DS())
    {
      Write_DS(DS_AlarmSearch,8);
      if(Read_DS(2)==0x80)//      读两个位
      {
        Reset_DS();
return 1;
      }
    }
    Reset_DS();
    return 0;
  }
//TH:高温限制  TL:低温限制    
//mode:转换模式  0:9bit(93.75ms)  1:10bit(187.5ms)  2:11bit(375ms)  3:12bit(750ms)  
//power:总线的电源模式
//ID:器件ID号
  char init()
  {
    unsigned char i,sbuf[9];
    if(Reset_DS())
    {
      if(getid())
      {
Write_DS(DS_MatchROM,8);
for(i=0;i<8;i++)
   Write_DS(id,8);
      }
      else
        Write_DS(DS_SkipROM,8);
      Write_DS(DS_WriteRAM,8);
      Write_DS(TH,8);
      Write_DS(TL,8);
      Write_DS(((mode&0x03)<<5)|0x1F,8);
      Reset_DS();
      if(getid())
      {
Write_DS(DS_MatchROM,8);
        for(i=0;i<8;i++)
   Write_DS(id,8);
      }
      else
        Write_DS(DS_SkipROM,8);
      Write_DS(DS_ReadRAM,8);
      for(i=0;i<9;i++)
        sbuf=Read_DS(8);
      if(GetCRC8(sbuf,8)==sbuf[8])//  校验CRC
      {
        if(sbuf[2]==TH&&sbuf[3]==TL)
        {
          Reset_DS();
          if(getid())
          {
            Write_DS(DS_MatchROM,8);
            for(i=0;i<8;i++)
                Write_DS(id,8);
          }
          else
            Write_DS(DS_SkipROM,8);
          Write_DS(DS_CopyROM,8);
          DELAY_200ms();
          Reset_DS();
          power=GetPower();
          Reset_DS();
          return 1;//                 完成
        }
      }
    }
    return 0;
  }
/*********************************************读取DS18B20的64位ROM******************/
  char GetID()
  {
    unsigned char i;
    unsigned char sbuf[8];
   if(Reset_DS())
   {
     Write_DS(DS_ReadROM,8);
     for(i=0;i<8;i++)
     {
       sbuf=Read_DS(8);
     }
     Reset_DS();
     if(GetCRC8(sbuf,7)==sbuf[7])//   校验CRC
     {
       for(i=0;i<8;i++)
         id=sbuf;//    拷贝数据到ROM
       return 1;
     }
   }
   return 0;
  }

  char* disp(char width=0)
  {
    int i=(int)temp;
    int j=(int)(temp*10);
    j%=10;
    if(temp<0)
      j=0-j;
    switch(width)
    {
    case 2:
      sprintf(sbuf,"%2d.%d",i,j);
      break;
    case 3:
      sprintf(sbuf,"%3d.%d",i,j);
      break;
    default:
      sprintf(sbuf,"%d.%d",i,j);
      break;
    }
    return sbuf;
  }

  DS18B20()
  {
    format(id,sizeof(id),0);
    mode=DS_12BIT;
    TH=100;
    TL=0;
    power=0;
    rel=0;
    status=0;
    setup=0;
    seDDS();
    seDS();
  }
};
#endif

推荐阅读

史海拾趣

A1 PROS公司的发展小趣事

在2000年,A1 PROS在韩国正式成立,初创期的它,主要专注于黑白CCD芯片的研发与生产。当时,随着数字技术的兴起,电子摄像头逐渐普及,市场对高质量的图像传感器需求日益增长。A1 PROS凭借其核心团队在半导体技术方面的深厚积累,成功研发出多款性能优越的黑白CCD芯片,并很快在市场上占据了一席之地。

为了拓展业务,A1 PROS积极寻求合作伙伴。2003年,它与台湾的昱生电子有限公司建立了合作关系,后者成为A1 PROS在台湾地区的主要经销商。这一合作不仅帮助A1 PROS打开了台湾市场,也为后续进军更广阔的亚洲市场奠定了基础。

Discrete Semiconductor Industries公司的发展小趣事

“精工半导体”是另一家值得一提的Discrete Semiconductor Industries公司。该公司自创立之初就坚持以品质为核心,对每一个生产环节都进行严格的质量控制。通过引进先进的生产设备和技术,精工半导体不断提高产品的可靠性和稳定性。同时,公司还建立了完善的售后服务体系,确保客户在使用过程中能够得到及时的技术支持和解决方案。正是凭借这种对品质的执着追求,精工半导体逐渐树立了良好的品牌形象,赢得了市场的广泛认可。

Adamant Co Ltd公司的发展小趣事

品质是电子行业的生命线。Adamant Co Ltd深知这一点,因此在品质管理方面下足了功夫。公司建立了严格的品质管理体系,从原材料采购到产品生产、检测、出厂等各个环节都严格把关。同时,公司还注重品牌建设,通过提升产品形象和服务质量,赢得了客户的信任和口碑。这些努力使得Adamant Co Ltd在行业中树立了良好的品牌形象。

Cal-Chip Electronics公司的发展小趣事

在快速发展的过程中,Cal-Chip Electronics公司始终关注社会责任和可持续发展。公司积极参与公益事业,支持教育、环保等领域的发展。同时,公司还注重环保生产,通过引进先进的环保技术和设备,减少生产过程中的污染排放。此外,公司还建立了完善的员工培训体系,为员工提供广阔的职业发展空间。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上是关于Cal-Chip Electronics公司在电子行业发展的5个相关故事,这些故事展示了公司在不同历史阶段所取得的成就和面临的挑战。通过不断努力和创新,Cal-Chip Electronics公司已经成为了电子行业的一颗璀璨明星。

北京人民电器厂公司的发展小趣事

近年来,随着新能源产业的快速发展,北京人民电器紧跟时代步伐,在新能源领域取得了重要突破。公司推出的真安型零飞弧直流断路器,解决了直流低压系统中长期存在的外喷电弧问题,为新能源行业的发展提供了重要的技术支持。这一创新成果不仅得到了行业的广泛认可,也为公司在新能源领域的发展打开了新的局面。

这五个故事只是北京人民电器在电子行业发展历程中的一部分,但它们足以展现出公司在技术创新、产品应用、生产自动化、人才队伍建设以及新能源领域发展等方面的努力和成就。这些故事不仅记录了北京人民电器的成长轨迹,也见证了中国电子行业的蓬勃发展。

E-Z-HOOK公司的发展小趣事

自E-Z-HOOK公司成立以来,其产品线一直在不断扩大。到了1970年代,随着电子行业的快速发展,对测试工具的需求也日益增加。公司的新主人继承了阿尔伯特·史密斯的愿景,并决定进一步扩展产品线。他们引入了一系列新的测试钩型号,以适应不同尺寸和形状的测试点。此外,公司还开始生产其他与测试相关的零部件和组件,以满足客户日益增长的需求。

问答坊 | AI 解惑

3G网络对IP承载网规划设计中问题的探讨

对于中国人来说,姗姗来迟的3G时代究竟是如何的欣欣向荣,现在我们还只能忐忑不安地憧憬着。但是,在这山雨欲来的时刻,3G的IP承载网对于运营商来说,都已经是“风满楼”的状态,几乎触手可及了。         不管是中 ...…

查看全部问答>

芯片资料

各位好!目前我手上有个贴片元件,封装为SOT-23-5,元件表面丝印内容简单标注为A1,不知大伙可否遇到过类似元件,求该元件的技术资料,非常感谢!      hgpwgp@yahoo.com.cn…

查看全部问答>

rs422转u盘知道吗谢谢

rs422转u盘知道吗谢谢…

查看全部问答>

关于wince下openssl命令的问题

请问各位大侠,本人有一个很棘手的问题请教。我在wince下用openssl命令想要生成一个ca.crt文件,命令如下: \"X509 -req -in \\\"\\\\wince_192.168.6.200_own.csr\\\" -out \\\"\\\\wince_192.168.6.200_ca.crt\\\" -signkey \\\"\\\\wince_192.1 ...…

查看全部问答>

液晶黑屏

我用的液晶显示器平时显示是正确的 但是偶尔会在初始化之后黑屏了 这样就看不到屏上的信息了 请高手指点一下!! 谢谢…

查看全部问答>

关于用QuartusII仿真的问题??????

今天遇到一个奇怪的问题:用QuartusII仿真的时候,波形图总是不会出现时钟,就只有电平而已,但是程序确定无误是设定了时钟类型的,仿真的时候也设定了,但就是仿真不了!到底是什么问题呢??…

查看全部问答>

关于ARM开发板

最近想弄块A8或者ARM11的板子玩玩,不知道大家都有没有兴趣如果人多,我们可以组织团购!!~…

查看全部问答>

有线无线温度器完成

我无线有两套方案:一个是用ADI公司射频芯片,一个是用射频块。但我由于手头上就一片ADI主控芯片所以第一方案先放放,那就得用射频模块了。ADI那个方案我想日后试试。这两种我在后边补吧,现在先传下视频作个总结。       ...…

查看全部问答>

毕业设计求助!!!

        我的专业是机械大类里面的机械电子工程方向,前三年学的都是与机械设计制造相关的课程。毕业设计我选的题目是“基于ARM的智能家居系统设计”,在网上购买了OK6410作为开发系统。由于之前只用过51单片机 ...…

查看全部问答>

只为uC而生,uS成长历程4

昨晚我花了不少时间,做了一系列关于开销的测试。 我们可以得出一个我们很关心的结论: 那就是,相比于平常的直接调用变量和函数。 采用指针,乃至通过结构体引用,相比而言,多出来的 时间开销并不是十分大,大多数情况下,不足以成为影响效率 ...…

查看全部问答>