历史上的今天
返回首页

历史上的今天

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

正在发生

2020年09月02日 | 实用的温度计(ds18b20)+Proteus仿真+C源程序

2020-09-02 来源:51hei

#include    //包含单片机寄存器的头文件

#include  //包含_nop_()函数定义的头文件

#include

#include

unsigned char code dispcode0[]={0x3f,0x06,0x5b,0x4f,

                               0x66,0x6d,0x7d,0x07,

                               0x7f,0x6f};

unsigned char dispcode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,

                                 0xfd,0x87,0xff,0xef};


     unsigned char TL;     //储存暂存器的温度低位

     unsigned char TH;    //储存暂存器的温度高位

     unsigned char TN;      //储存温度的整数部分

     unsigned int TD;       //储存温度的小数部分

void delay1ms()

{

   unsigned char i,j;

         for(i=0;i<10;i++)

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

           ;

}

void delaynms(int n)

{

   unsigned char i;

        for(i=0;i           delay1ms();

}

sbit DQ=P1^0;

unsigned char time_DS18B20;   //设置全局变量,专门用于严格延时

bit Init_DS18B20(void)

{

bit flag_DS18B20;         //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在

DQ = 1;           //先将数据线拉高

for(time_DS18B20=0;time_DS18B20<2;time_DS18B20++) //略微延时约6微秒

     ;

DQ = 0;           //再将数据线从高拉低,要求保持480~960us

for(time_DS18B20=0;time_DS18B20<200;time_DS18B20++)  //略微延时约600微秒

     ;         //以向DS18B20发出一持续480~960us的低电平复位脉冲

DQ = 1;           //释放数据线(将数据线拉高)

  for(time_DS18B20=0;time_DS18B20<10;time_DS18B20++)

     ;  //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)

flag_DS18B20=DQ;          //让单片机检测是否输出了存在脉冲(DQ=0表示存在)

for(time_DS18B20=0;time_DS18B20<200;time_DS18B20++)  //延时足够长时间,等待存在脉冲输出完毕

      ;

return (flag_DS18B20);    //返回检测成功标志

}

unsigned char ReadOneChar(  )

{

                unsigned char i=0;

                unsigned char dat;  //储存读出的一个字节数据

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

                 {


                   DQ =1;       // 先将数据线拉高

                   _nop_();            //等待一个机器周期

                   DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序

                          dat>>=1;

                   _nop_();     //等待一个机器周期

                   DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备

                   for(time_DS18B20=0;time_DS18B20<3;time_DS18B20++);      //延时约6us,使主机在15us内采样

                   if(DQ==1)

                      dat|=0x80;  //如果读到的数据是1,则将1存入dat

                        else

                                dat|=0x00;//如果读到的数据是0,则将0存入dat


                     //将单片机检测到的电平信号DQ存入r[i]

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

                              ;              //延时3us,两个读时序之间必须有大于1us的恢复期

            }

         return(dat);    //返回读出的十进制数据

}

WriteOneChar(unsigned char dat)

{

        unsigned char i=0;

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

                 {

                  DQ =1;         // 先将数据线拉高

                  _nop_();             //等待一个机器周期

                  DQ=0;          //将数据线从高拉低时即启动写时序

                  DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,

                       //并将其送到数据线上等待DS18B20采样

                 for(time_DS18B20=0;time_DS18B20<10;time_DS18B20++)

                     ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

                  DQ=1;          //释放数据线

                  for(time_DS18B20=0;time_DS18B20<1;time_DS18B20++)

                          ;//延时3us,两个写时序间至少需要1us的恢复期

                  dat>>=1;       //将dat中的各二进制位数据右移1位

                 }

          for(time_DS18B20=0;time_DS18B20<4;time_DS18B20++)

                      ; //稍作延时,给硬件一点反应时间

}

void display(unsigned char x,y)

{

        unsigned char j,k,l,m,n,o;     //j,k,l分别储存温度的百位、十位和个位

        j=x/100;              //取百位

        k=(x%100)/10;    //取十位

        l=x%10;             //取个位

        m=y/100;

        n=(y%100)/10;

        o=y/10;

        if(x>=100)

        {

        P0=dispcode0[j];

        P2=dispcode0[k];

        if(o>=5)

        n+=1;

        else

        ;

        if(n>=5)

        m+=1;

        else

        ;

        if(m>=5)

        l+=1;

        else

        ;

        P3=dispcode0[l];

        }

        else if((x>=10)&&(x<100))

        {

        P0=dispcode0[k];

        P2=dispcode1[l];

        if(o>=5)

        n+=1;

        else

        ;

        if(n>=5)

        m+=1;

        else

        ;

        P3=dispcode0[m];

                  }

          else if((x>=0)&&(x<10))

          {

            P0=dispcode1[l];

            P2=dispcode0[m];

            if(o>=5)

            n+=1;

            else

            ;

            P3=dispcode0[n];

           }



}

void displayfu(unsigned char x,y)

{

        unsigned char k,l,m,n,o;     //j,k,l分别储存温度的百位、十位和个位

        P0=0x40;

        k=(x%100)/10;    //取十位

        l=x%10;             //取个位

        m=y/100;

        n=(y%100)/10;

        o=y/10;

        if(x>=10)

        {

        P2=dispcode0[k];

        if(o>=5)

        n+=1;

        else

        ;

        if(n>=5)

        m+=1;

        else

        ;

        if(m>=5)

        l+=1;

        else

        ;

        P3=dispcode0[l];

        }

        else if(x<10)

        {

        P2=dispcode1[l];

        if(o>=5)

        n+=1;

        else

        ;

        if(n>=5)

        m+=1;

        else

        ;

        P3=dispcode0[m];

        }



}






void ReadyReadTemp(void)

{

      Init_DS18B20();     //将DS18B20初始化

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

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

推荐阅读

史海拾趣

ADLINK公司的发展小趣事

ADLINK 是一家全球领先的嵌入式计算解决方案提供商,以下是该公司发展的五个相关故事:

  1. 公司创立与初期发展: ADLINK 成立于1995年,总部位于台湾新北市。公司专注于为工业自动化、通讯、医疗保健、交通运输等领域提供高性能的嵌入式计算和连接解决方案。在创立初期,ADLINK 主要专注于硬件产品的开发和销售,如嵌入式计算板卡、模块、工业计算机等。

  2. 技术创新与产品扩展: 随着市场需求的不断变化和技术的发展,ADLINK 不断进行技术创新,积极拓展产品线。除了传统的嵌入式计算硬件产品外,公司还推出了嵌入式操作系统、软件工具和解决方案等,以满足客户在物联网、人工智能、工业4.0 等领域的需求。

  3. 全球业务布局与国际化发展: ADLINK 在全球范围内建立了广泛的销售网络和服务体系,拥有多个全球研发和生产基地,并在美国、欧洲、亚洲等地设有分支机构和办事处。通过与全球领先企业的合作和市场拓展,ADLINK 的产品和解决方案已经覆盖了全球100多个国家和地区。

  4. 合作伙伴关系与客户案例: ADLINK 与世界各地的行业领先企业建立了紧密的合作伙伴关系,共同开发创新性的解决方案,应用于工业自动化、智能交通、医疗保健等领域。例如,公司与德国西门子、美国英特尔等知名企业合作,在工业物联网、边缘计算等领域取得了一系列成功案例。

  5. 未来展望与持续发展: 面对快速变化的市场环境和日益激烈的竞争,ADLINK 将继续致力于技术创新和产品研发,不断提升解决方案的质量和性能,以满足客户日益增长的需求。公司将继续秉承“创新、合作、可靠”的核心价值观,努力成为全球领先的嵌入式计算和连接解决方案提供商。

EFINIX公司的发展小趣事

EFINIX公司成立于2012年,由一群来自知名FPGA企业的创始人团队创立。他们拥有丰富的FPGA设计经验,并致力于在可编程逻辑行业实现突破性的创新。公司总部位于美国加利福尼亚州圣克拉拉市,计划采用一种全新的现场可编程门阵列(FPGA)技术——量子可编程技术,来设计芯片。这种技术旨在实现芯片尺寸仅为传统芯片的四分之一,能耗减少一半,同时结构更加简化。EFINIX公司相信,这种技术将推动人工智能和深度学习的发展,使数据处理更加高效。

亿宝科技(CNIBAO)公司的发展小趣事

在技术创新的基础上,亿宝科技积极拓展市场。公司通过与国内外知名企业的合作,将产品打入国际市场。同时,亿宝科技还注重品牌建设,通过参加各类展会、举办技术研讨会等方式,提升品牌知名度和影响力。在一次国际电子展上,亿宝科技的产品凭借其卓越的性能和品质,赢得了众多客户的青睐,成功打开了国际市场的大门。

ELPIDA公司的发展小趣事

2012年,由于无法承受巨大的财务压力和市场竞争压力,ELPIDA宣布破产保护。随后,美国美光科技公司(Micron Technology)以较低的价格收购了ELPIDA。这一事件标志着日本在DRAM领域的彻底失败,同时也为美光公司带来了重要的技术和市场资源。

C-MEDIA公司的发展小趣事

随着数字化时代的到来,C-MEDIA公司敏锐地捕捉到文化传媒市场的潜力。公司以法国主流电视台为传播平台,积极与中国主流媒体展开合作,成功开创了海外华人经营国际文化传媒的新模式。特别是在2014年,中国国务院新闻办独家授权C-MEDIA在欧洲播放中国影视数据库节目,这一举措极大地提升了公司在国际文化传媒领域的影响力。

Datalogic公司的发展小趣事

在2022年,Datalogic推出了PowerScan 9600系列工业手持式扫描枪。这款扫描枪具有坚固的设计、IP67等级防护和出色的性能,能够在严酷的工业环境中稳定运行。PowerScan 9600系列的推出进一步提升了Datalogic在电子行业中的产品竞争力。

问答坊 | AI 解惑

跟我学模拟电子电路.pdf

跟我学模拟电子电路.pdf…

查看全部问答>

10分钟学会Xilinx_FPGA_应用

新手可以看看,写了还可以!…

查看全部问答>

单片机串口接收求助

void serial_send(void) {         char i;                 for(i=0; i < 4; i++)         {                 ...…

查看全部问答>

如何申请 pci verndor ID

有朋友申请过pci vendor ID吗?清楚的请指点指点,或给一些网站连接.小弟不胜感谢!!!…

查看全部问答>

弱问:写驱动时对寄存器的C语言操作

最近在看别人写的驱动时总是遇到一些C语言用法,句子符号能看懂,但实际的意思不明白,如下语句: // LCD_PWREN(GPG4) s2440IOP->GPGCON &= ~(3 GPGCON |= (1 GPGDAT |= (1 GPBCON = (s2440IOP->GPBCON & ~(3…

查看全部问答>

求助关于CE下电源管理

在CE下电源管理 MDD层代码中:   电池驱动对外接口函数没有“BAT_”前缀,因为HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\Battery\\Flags注册表项设置了DEVFLAGS_NAKEDENTRIES属性,表示“Init”代替“BAT_Init”,这样修改注册表“Prefix ...…

查看全部问答>

我的单片机为什么唱不了歌

似乎总是一个音调……………

查看全部问答>

求周立功《EDA实验与实践》光盘资料

求周立功《EDA实验与实践》光盘资料,谢啦…

查看全部问答>

如何加快android系统编译

转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 习惯了automake之后,再用Android的编译系统,就是感觉不爽。编译一个小模块也等上几分钟,有次实在受不了,看了一下它的实现,发现它对任何一次编 ...…

查看全部问答>