历史上的今天
返回首页

历史上的今天

今天是:2024年08月30日(星期五)

正在发生

2021年08月30日 | 51单片机-温度传感器代码独立文件

2021-08-30 来源:eefocus

创建好“ds18b20.c”和“ds18b20.h”文件,把下面代码添加进各自的文件。


1.ds18b20.c代码


我们在宋老师的代码基础上添加了温度转换函数,原理在上一讲已经讲解清楚了。


#include

#include

#include

   

unsigned char temp_i=0;//定义全局变量temp_i用来帮助液晶屏灵活显示

 

/* 软件延时函数,延时时间(t*10)us */

void DelayX10us(unsigned char t)

{

    do {

           _nop_();

           _nop_();

           _nop_();

           _nop_();

           _nop_();

           _nop_();

           _nop_();

           _nop_();

    } while (--t);

}

 

/* 复位总线,获取存在脉冲,以启动一次读写操作 */

unsigned char Get18B20Ack()

{

    unsigned char ack;

      

    EA = 0;           //禁止总中断

    IO_18B20 = 0;     //产生500us复位脉冲

    DelayX10us(50);

    IO_18B20 = 1;

    DelayX10us(6);    //延时60us

    ack = IO_18B20;   //读取存在脉冲

    while(!IO_18B20); //等待存在脉冲结束

    EA = 1;           //重新使能总中断

      

    return ack;

}

 

/* 向DS18B20写入一个字节,dat-待写入字节 */

void Write18B20(unsigned char dat)

{

    unsigned char mask;

      

    EA = 0;                             //禁止总中断

    for (mask=0x01; mask!=0; mask<<=1)  //低位在先,依次移出8个bit

    {

        IO_18B20 = 0;                   //产生2us低电平脉冲

        _nop_();

        _nop_();

        if ((mask&dat) == 0)            //输出该bit值

            IO_18B20 = 0;

        else

            IO_18B20 = 1;

        DelayX10us(6);                  //延时60us

        IO_18B20 = 1;                   //拉高通信引脚

    }

    EA = 1;                             //重新使能总中断

}

 

/* 从DS18B20读取一个字节,返回值-读到的字节 */

unsigned char Read18B20()

{

    unsigned char dat;

    unsigned char mask;

      

    EA = 0;                             //禁止总中断

    for (mask=0x01; mask!=0; mask<<=1)  //低位在先,依次采集8个bit

    {

        IO_18B20 = 0;                   //产生2us低电平脉冲

        _nop_();

        _nop_();

        IO_18B20 = 1;                   //结束低电平脉冲,等待18B20输出数据

        _nop_();                        //延时2us

        _nop_();

        if (!IO_18B20)                  //读取通信引脚上的值

            dat &= ~mask;

        else

            dat |= mask;

        DelayX10us(6);                  //再延时60us

    }

    EA = 1;                             //重新使能总中断

    

    return dat;

}

 

/* 启动一次18B20温度转换,返回值-表示是否启动成功 */

unsigned char Start18B20()

{

    unsigned char ack;

      

    ack = Get18B20Ack();   //执行总线复位,并获取18B20应答

    if (ack == 0)          //如18B20正确应答,则启动一次转换

    {

        Write18B20(0xCC);  //跳过ROM操作

        Write18B20(0x44);  //启动一次温度转换

    }

    return !ack;           //ack==0表示操作成功,所以返回值对其取非,返回值就是1了

}

 

/* 读取DS18B20转换的温度值,返回值-表示是否读取成功 */

unsigned char Get18B20Temp(int *temp)

{

    unsigned char ack;

    unsigned char LSB, MSB;                     //16bit温度值的低字节和高字节

      

    ack = Get18B20Ack();                        //执行总线复位,并获取18B20应答

    if (ack == 0)                               //如18B20正确应答,则读取温度值

    {

        Write18B20(0xCC);                       //跳过ROM操作

        Write18B20(0xBE);                       //发送读命令

        LSB = Read18B20();                      //读温度值的低字节

        MSB = Read18B20();                      //读温度值的高字节

        *temp = ((unsigned int)MSB << 8) + LSB; //合成为16bit整型数

    }

    return !ack;                                //ack==0表示操作成功,所以返回值对其取非,返回值就是1了

}

 

/* 温度转换 */

unsigned char TEMP_CONV(unsigned int *temp, unsigned char *str)

{

    unsigned char res;

    float  temp_float;

    

    res = Get18B20Temp(temp);  //读取当前温度,传入的参数是指针类型

    if (res)                   //读取成功时,进行温度转换

    {

        if( (*temp>>11)==0 )   //温度大于等于0度     

        {   

            temp_float=( (float)(*temp) ) *0.0625*10.0;  //*temp就是没有转换时的16位那个变量,然后再把实际温度值再乘以10倍

            *temp=(unsigned int)temp_float;              //得到16位整型的数值

            str[0]='0'+( (*temp/1000)%10 );              //当温度大于等于100度时需要显示百位数

            str[1]='0'+( (*temp/100)%10 );               //当温度大于等于10度时需要显示十位数

            str[2]='0'+( (*temp/10)%10 );                //当温度大于等于1度时需要显示个位数

            str[3]='.';

            str[4]='0'+( (*temp)%10 );                   //温度必须显示小数点后的一位

 

            if(str[0]=='0')temp_i++;

            if(str[1]=='0')temp_i++;

 

            return 1;//读取温度成功,返回值一律为1

        } 

 

        else if( (*temp>>11)>0 )//温度小于0度     

        {

            *temp=(*temp)&0x07FF;                       //清除掉高5位使其变为0

            *temp=2048-(*temp);                         //此时的temp为补码     

            temp_float=( (float)(*temp) )*0.0625*10.0;  //实际温度值再乘以10倍

            *temp=(unsigned int)temp_float;             //得到16位整型的数值

 

            str[0]='-';                                 //添加负数的符号

            str[1]='0'+( (*temp/100)%10 );              //当温度在-10度以下时需要显示十位数

            str[2]='0'+( (*temp/10)%10 );               //温度必须显示个位数,哪怕是0,比如“-0.5”

            str[3]='.';

            str[4]='0'+( (*temp)%10 );                  //温度必须显示小数点后的一位

 

            if(str[1]=='0')

            { 

                str[1]='-';

                temp_i=1;//实际温度大于-10.0度的时候,假如是-5.4度,那么“LcdShowStr(0, 0, str+temp_i);”就是显示“-5.4”,小数点就是在第3个显示格上显示

                         //实际温度小于等于-10.0度的时候,假如是-12.6度,str[1]不等于‘0’,

                         //这样temp_i是等于0的,那么“LcdShowStr(0, 0, str+temp_i);”显示“-12.6”,小数点就是在第4个显示格上显示  

            }

 

            return 1;    //读取温度成功,返回值一律为1

        } 

    } 

     

    return 0;//读取温度不成功,返回值为0

}

 


2.ds18b20.h代码


#ifndef __DS18B20_H__

#define __DS18B20_H__

   

sbit IO_18B20 = P3^2;                                            //DS18B20通信引脚

推荐阅读

史海拾趣

Fluke公司的发展小趣事

福禄克(Fluke)公司在电子行业中的发展历程充满了创新与突破,以下是五个与福禄克公司发展相关的故事:

1. 创立与初期发展

1948年,John Fluke先生在美国康涅狄格州的家中地下室创立了福禄克公司,并亲自设计了公司的第一款产品——VAW Meter(伏特、安培、瓦数表)。这一创举标志着福禄克在电子测试测量领域的初步探索与尝试。随着产品的不断推出和市场认可度的提升,福禄克逐渐在电子行业中站稳了脚跟。

2. 技术创新与市场拓展

多年来,福禄克公司一直致力于技术创新和产品升级。例如,福禄克推出的手持式电流表、接地阻抗测量仪表等产品,凭借其高精度和可靠性,在电力、通信、工业控制等多个领域得到了广泛应用。同时,福禄克还不断拓展其销售和服务网络,覆盖全球多个国家和地区,为全球客户提供优质的测试测量解决方案。

3. 新能源汽车领域的涉足

随着新能源汽车产业的快速发展,福禄克公司也积极涉足这一领域。新能源汽车中的锂电池、光纤等关键部件需要在使用过程中进行连续的温度监测。福禄克凭借其可靠的耐用性,为多家新能源汽车企业提供了安全可靠的测试测量产品及解决方案。这一举措不仅拓展了福禄克的市场领域,也进一步巩固了其在电子测试测量行业的领先地位。

4. 应对国际计量系统变革

当前国际计量系统正在经历历史性变革,福禄克公司密切关注这一世界热议话题。作为全球知名的电子测试仪器公司,福禄克已做好准备随时对应调整,以应对计量单位量子化等挑战。福禄克的这一举措体现了其作为行业领导者的前瞻性和应变能力。

5. 智能化与网络化发展

近年来,福禄克公司不断推动产品的智能化和网络化发展。例如,福禄克推出的在线式红外热像仪、带有Fieldsense技术的钳表等产品,不仅提高了测试测量的精度和效率,还实现了数据的实时传输和分析。这些创新产品满足了客户对智能化、网络化测试测量解决方案的需求,进一步推动了福禄克在电子行业中的发展。

以上五个故事展示了福禄克公司在电子行业中的发展历程和成就。从创立初期的艰难探索到如今的行业领导者地位,福禄克始终秉持着创新、质量和服务的理念不断前行。

AMRI Enterprise Co Ltd公司的发展小趣事

品质是AMRI Enterprise Co Ltd的生命线。公司始终坚持品质至上的原则,通过严格的质量管理体系和持续改进的工艺流程,确保产品的稳定性和可靠性。同时,AMRI还注重品牌建设,通过提升品牌形象和塑造企业文化,增强客户对公司的信任度和忠诚度。这些努力使得AMRI的产品在市场上赢得了良好的口碑和广泛的认可。

台湾致强(FORT)公司的发展小趣事

致强科技深知员工是企业持续发展的关键。因此,公司自成立以来便注重企业文化的建设,积极营造和谐、关爱的工作氛围。公司管理层倡导“尊重人性”的理念,不仅为员工提供具有竞争力的薪酬福利,还通过EAP(员工协助计划)等方式关注员工的心理健康和生活需求。EAP项目的实施不仅帮助员工缓解了工作压力,还从多方面提升了员工的归属感和幸福感,为公司的长期发展奠定了坚实的人才基础。

Compact公司的发展小趣事

随着全球环保意识的提高,电子行业对环保和可持续发展的要求也越来越高。Compact公司积极响应这一趋势,加大环保投入,采用环保材料和工艺,降低生产过程中的能耗和排放。同时,公司还致力于推动循环经济的发展,通过回收和再利用废旧电子产品,减少资源浪费和环境污染。这一举措不仅提升了公司的社会形象,还为公司的可持续发展奠定了坚实基础。

请注意,以上故事仅为示例,并不代表任何真实存在的企业情况。如果需要关于特定企业(如Compact公司)的准确信息,建议查阅相关公司的官方资料、行业报告或新闻报道。

BTCPower公司的发展小趣事

BTCPower深知技术创新是公司发展的核心动力。因此,公司不断加大研发投入,积极引进和培养高素质的研发人才。同时,公司还建立了完善的研发体系和创新机制,鼓励员工提出新的想法和创意。这些举措使得BTCPower在技术创新方面始终保持领先地位。

冠西电子(COSMO)公司的发展小趣事

进入21世纪,冠西电子不断加大在研发方面的投入,成功突破了一系列技术难题,特别是在光耦合器和继电器领域取得了显著成果。这些技术突破不仅提升了冠西电子产品的竞争力,也为其赢得了更多国际大厂的信赖。同时,冠西电子积极拓展市场,其产品广泛应用于电源、互联网设备、电脑系统和相关系统、家电、工业、安防系统等领域,为全球客户提供优质的产品和服务。

问答坊 | AI 解惑

89C51

本帖最后由 paulhyde 于 2014-9-15 09:33 编辑 89C51FDBDFBDGD  …

查看全部问答>

开关电源分类介绍

开关电源的分类介绍  现代开关电源有两种:一种是直流开关电源;另一种是交流开关电源。本书要介绍的只是直流开关电源,其功能是将电能质量较差的原生态电 源(粗电),如市电电源或蓄电池电源,转换成满足设备要求的质量较高的直流电压(精电) ...…

查看全部问答>

计算机系统总线基础

一. 总线的概念 在计算机系统中,不同的子系统必须具有连接彼此的接口,比如,内存和处理器需要通信,处理器和I/O设备也需要通信。这些工作都是由总线来完成的。总线就是一条共享的通信链路,它用一套线路来连接多个子系统。下图是一个典型的计算 ...…

查看全部问答>

有没用TVP5147做解码芯片的?我配置出来的效果很不好,怎么改进啊?!谁有优化后的参数表?

有没用TVP5147做解码芯片的?我配置出来的效果很不好,怎么改进啊?!谁有优化后的参数表?…

查看全部问答>

vxworks源码和tornado的target目录的问题

刚开始接触vxworks,现在在学习END驱动,看到tornado的target目录下的src里面有个文件是templateEnd.c,有点不明白这里面的代码和vxworks源码里面的MUXDevLoad的关系是怎么样的,是否在templateEnd.c里面提供的模板供我们在特定的芯片开发时按照上 ...…

查看全部问答>

求CRC校验程序

现有电脑与单片机串口通讯数据 请大侠求证CRC校验方法 多谢 发送: A5 A5 00 1E 00 00 01 35 CA EC A5 A5 00 1E 00 01 01 35 FA DB A5 A5 00 1E 00 02 01 35 AA 82 A5 A5 00 1E 00 03 01 35 9A B5 A5 A5 00 1E 00 04 01 35 0A 30 A5 A5 00 ...…

查看全部问答>

WinCE下的注册表读写,在线等,急~~~~

我在VC下的注册表读写问题为什么在EVC下运行成功,却无法对注册表修改?…

查看全部问答>

PC5设为外部中断时中断号选哪个?

PC5设为外部中断时中断号应该选啥( NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;)…

查看全部问答>