历史上的今天
返回首页

历史上的今天

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

正在发生

2020年11月11日 | 单片机单总线挂2片ds18b20传感器,8位数码同时管显示

2020-11-11 来源:51hei

计划做个同时检测室内外温度,并用数码管显示出来的温度计。从网上找到获得ds18b20序列码的程序,用开发板1602显示出来,记录备用。下面数组str1,2就是获得的64位序列码。如果不能获得自己1820的序列码,当然以下代码就不能完成正常功能。以下代码大部分网上获得加以整理而成。第一传感器 前4位,第2传感器后4位,中间无隔断。在开发板上正常显示变化,但大于100和小于0并未实验看到。


单片机源程序如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code SEG[]=  { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};         

uchar code str1[]={0x28,0xff,0xdf,0xd4,0x61,0x18,0x02,0x5e};  //ROM 1

uchar code str2[]={0x28,0xaa,0x63,0x63,0x4d,0x14,0x01,0x62};  //ROM2

uchar code DIG[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar data DisplayData[4];

uint temp;//温度值

sbit DQ=P3^7;  


/******************************ds1820程序***************************************/

void Delay_DS18B20(int num)

   {

        while(num--) ;

   }


void Init_DS18B20(void)

  {

        unsigned char x=0;

        DQ = 1;                 //DQ复位

        Delay_DS18B20(8);   //稍做延时

        DQ = 0;                           //单片机将DQ拉低

        Delay_DS18B20(80);  //精确延时,大于480us

        DQ = 1;                 //拉高总线

        Delay_DS18B20(14);

        x = DQ;                   //稍做延时后,如果x=0则初始化成功,x=1则初始化失败

        Delay_DS18B20(20);

  }


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;

            Delay_DS18B20(4);

          }

          return(dat);

  }

void WriteOneChar(unsigned char dat)

  {

        unsigned char i=0;

          for (i=8; i>0; i--)

      {

            DQ = 0;

            DQ = dat&0x01;

            Delay_DS18B20(5);

            DQ = 1;

            dat>>=1;

            }

  }

void Matchrom(uchar a)         //匹配ROM

    {

        char j;

        WriteOneChar(0x55);     //发送匹配ROM命令

        if(a==1)

        {

        for(j=0;j<8;j++)

           WriteOneChar(str1[j]);  //发送18B20的序列号,先发送低字节

        }

        if(a==2)

        {

        for(j=0;j<8;j++)

           WriteOneChar(str2[j]); //发送18B20的序列号,先发送低字节

        }


    }

uint ReadTemperature(uchar z)/*读取温度值并转换*/

  {        

    uchar LSB=0,MSB=0;

    signed int tp=0;

            

    Init_DS18B20();

          WriteOneChar(0xCC);  //跳过读序号列号的操作

          WriteOneChar(0x44);  //启动温度转换

          Init_DS18B20();

          WriteOneChar(0xCC);  //跳过读序号列号的操作

    Init_DS18B20();

    if(z==1)

        {

         Matchrom(1);  //匹配ROM 1

        }

     if(z==2)

        {

        Matchrom(2);  //匹配RO 2

        }

    WriteOneChar(0xBE);  //读取温度寄存器

          LSB=ReadOneChar();     //读低8位

          MSB=ReadOneChar();         //读高8位

    temp=(MSB<<8)|LSB;         //得到一个16位的数

        return(temp);                     //返回温度值

    }

void delay1ms(uint ms)//延时1毫秒(不够精确的)

{  uint i,j;

   for(i=0;i    for(j=0;j<100;j++);

}


/*****************显示函数******************************/

void Disp_Temperature(uchar z)//温度值显示

  {   

     float tep=0;

     if(temp>0)

          {

            tep=temp;

           temp=tep*0.0625*10+0.5;

          if(DisplayData[0]== 0x00)

              {  

                 DisplayData[0]=0x00;

               if(DisplayData[1]==0x00)

               DisplayData[1]=0x00;         //

              }

                        

        

          else

          {

                temp=~temp+1;

                tep=temp;

                temp=tep*0.0625*10+0.5;

            DisplayData[0]=0x40;         

          }

            DisplayData[1]=temp/100;

            DisplayData[2]=temp/10%10;

               DisplayData[3]=temp%10;

                          

  if(z==1)

    {

          P2=DIG[0];

      P0=SEG[DisplayData[0]]

      delay1ms(1);

          P2 = 0xff;


          P2=DIG[1];

      P0=SEG[DisplayData[1]]

      delay1ms(1);

          P2 = 0xff;


          P2=DIG[2];

      P0=SEG[DisplayData[2]]|0x80

      delay1ms(1);

          P2 = 0xff;


          P2=DIG[3];

      P0=SEG[DisplayData[3]]

      delay1ms(1);

          P2 = 0xff;

           }


  if(z==2)

    {

          P2=DIG[4];

      P0=SEG[DisplayData[0]]

      delay1ms(1);

          P2 = 0xff;


          P2=DIG[5];

      P0=SEG[DisplayData[1]]

      delay1ms(1);

          P2 = 0xff;


          P2=DIG[6];

      P0=SEG[DisplayData[2]]|0x80

      delay1ms(1);

          P2 = 0xff;


          P2=DIG[7];

      P0=SEG[DisplayData[3]]

      delay1ms(1);

          P2 = 0xff;

             }

    }

  }


void main()

  {

    while(1)

    {

      ReadTemperature(1);//读取温度

      Disp_Temperature(1);//显示

      ReadTemperature(2);//读取温度

      Disp_Temperature(2);//显示

    }

  }


推荐阅读

史海拾趣

Hengstler GmbH公司的发展小趣事

Helium Systems Inc.公司发展的五个故事

故事一:从物联网初创到区块链转型

Helium Systems Inc.的故事始于2013年,由Napster的联合创始人Shawn Fanning和知名游戏设计师Amir Haleem等人共同创立。最初,公司名为Skynet Phase 1,灵感来源于《终结者》系列电影中的电脑系统,旨在为物联网(IoT)创建无线网络。然而,在经历了几年的产品开发和市场探索后,该项目并未取得显著成功。直到2017年,Helium团队意识到区块链技术的潜力,决定将项目转型为基于区块链的分布式无线网络项目,即后来的Helium Network。这一转型为Helium带来了全新的发展机遇。

故事二:Helium Network的迅速崛起

自2019年Helium Network正式启动以来,该项目迅速吸引了全球用户的关注。用户只需购买并部署Helium热点设备,即可为周围的物联网设备提供无线连接,并因此获得Helium的加密货币HNT作为奖励。这种创新的挖矿模式迅速吸引了大量用户参与,Helium网络在短时间内实现了全球范围内的快速扩张。到2021年,Helium网络已经覆盖了超过160个国家和地区,拥有数十万个热点,成为全球领先的分布式无线网络之一。

故事三:融资与合作伙伴的加入

Helium Systems Inc.在发展过程中获得了多轮融资支持,其中包括来自a16z和Tiger Global等知名投资机构的巨额投资。这些资金为Helium网络的进一步扩展和技术创新提供了有力保障。同时,Helium还积极寻求与全球范围内的合作伙伴建立战略合作关系,包括电信运营商、物联网设备制造商等。这些合作伙伴的加入不仅丰富了Helium网络的应用场景,还进一步提升了其市场影响力和竞争力。

故事四:技术挑战与解决方案

在Helium网络的发展过程中,团队也面临了诸多技术挑战。例如,如何确保网络的稳定性和安全性、如何优化热点设备的部署和性能等。针对这些问题,Helium团队不断进行技术创新和优化,推出了多项新技术和解决方案。例如,他们开发了独特的PoC(Proof of Coverage)共识机制,通过该机制可以确保热点设备在提供有效覆盖时才能获得奖励,从而有效防止了作弊行为的发生。此外,Helium还加强了与区块链安全公司的合作,共同提升网络的安全性。

故事五:公司更名与未来发展

为了更好地推动Helium网络的发展,Helium Systems Inc.在2022年宣布将公司更名为Nova Labs,并启用新的品牌形象。这一更名举措旨在进一步凸显Helium网络作为分布式无线网络联盟的地位和影响力。同时,Nova Labs还宣布完成了D轮融资,并计划将资金用于进一步扩展网络覆盖范围、提升技术性能和加强市场推广等方面。展望未来,Nova Labs将继续致力于推动Helium网络的发展和创新,为全球用户提供更加安全、高效、便捷的物联网连接服务。

Deutsch公司的发展小趣事

人才是企业发展的核心驱动力。Deutsch公司非常重视人才引进和培养工作。公司积极招聘具有丰富经验和专业技能的人才,并为他们提供广阔的发展空间和良好的职业前景。同时,公司还注重内部人才的培养和晋升,通过培训、交流等方式提升员工的综合素质和业务能力。这些措施使得Deutsch公司拥有一支高素质、高效率的团队,为公司的持续发展提供了有力保障。

Chemtronics公司的发展小趣事

1999年,Chemtronics迎来了一个重要的转折点,成为Illinois Tool Works Inc的全资子公司。这一变化为Chemtronics带来了更多的资源和支持,使其能够进一步扩大生产规模、提升研发能力,并在全球范围内拓展业务。

DINTEK公司的发展小趣事

自1958年成立以来,Chemtronics公司在电子维护和维修领域不断进取。最初,公司专注于生产一系列清洁剂产品,以其高效清洁能力获得了市场的认可。随着时间的推移,Chemtronics逐渐将产品线扩展至超纯溶剂、净化室级别擦拭棒和擦拭布等领域,进而又扩展到电子电气和电信工业的精密返工和维修工具。这一转变不仅体现了公司对市场需求的敏锐洞察,也彰显了其不断创新的精神。

Custom Mmic Design Services Inc公司的发展小趣事

CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。

C&D公司的发展小趣事

随着国内市场的逐渐饱和,C&D公司开始积极拓展海外市场。公司制定了国际化战略,通过参加国际展会、建立海外销售网络等方式,不断开拓国际市场。同时,C&D公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

问答坊 | AI 解惑

嵌入式系统开发要点全面剖析

无疑嵌入式系统开发是目前相当热门的领域,因为它涉及到的范围实在是太广了,从消费电子到工业应用,从8位的单片机到32位处理器,嵌入式系统俨然成为不可缺少的一环,且有愈演愈热之势。那么该如何学习和开发嵌入式系统呢?需要具备哪些知识和技能 ...…

查看全部问答>

学USB的一点心得

1、目标:用USB取代232。   原因:1、提高速度,2、适应没有232的电脑笔记本,3、上档次。 2、知识点:     1、USB协议,比起232协议难多了,需要数字通信的基础,难。     2、USB接口器件的硬件知识和编程,硬件易懂, ...…

查看全部问答>

!!!!急函数指针问题.请大侠帮忙解决.

定义: typedef struct _SUPPORTED_NIC // NIC vendor ID {     USHORT wVenId;                    // PCI Vendor ID     USHORT wDevId;  & ...…

查看全部问答>

想学驱动开发,应该买什么书看??

知道有本《windows驱动开发技术详解》  不知道怎么样??? 还有什么别的好书推荐吗??? 希望讲的深入浅出的,讲的透一点的书???? …

查看全部问答>

51下的PS2鼠标驱动程序

哪位大人做过啊,我把鼠标发送给单片机的数据,通过单片机的串口发送到PC机上查看,结果每帧只收到2字节的数据(原本应该有3字节的,中间一字节丢了),请问是什么原因呢? 如果哪位有这样的源码,麻烦发到我邮箱:mochen5460@163.com,由于公司里 ...…

查看全部问答>

我准备去配个主机箱,大家看看还贵啵?

显卡:MIS NX7300-TD128E 350元 主板:MIS P35-Ne02-FR   550元 CPU:Intel Core 2Duo E7200(盒) 800元 内存:Kingston 2GB DDR2 800+ (盒) 160元 硬盘:希捷 320G 7200 11.16(串口/5年 盒) 360元 机箱:世纪之星 风云9号 210元 共 ...…

查看全部问答>

最近想做个蓝牙方面的东西 希望坛友们能推荐个模块,可自定义要创建的连接类型

可自定义UUID,即可自定义要创建的连接类型,即L2CAPConnection连接的URL…

查看全部问答>

STM3210B-EVAL的USB上位机驱动那里可以下载?

那位大侠可以告诉我一下 谢谢!…

查看全部问答>