历史上的今天
返回首页

历史上的今天

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

正在发生

2019年11月28日 | LPC1114采集温度传感器DS18B20程序

2019-11-28 来源:51hei

Temperature.h文件

#ifndef _TEMPERATURE_H_

#define _TEMPERATURE_H_

#include "lpc11xx.h"


#define DQ_H    (LPC_GPIO0->DATA |= (1<<2))

#define DQ_L    (LPC_GPIO0->DATA &=~(1<<2))

#define DQ_IN   (LPC_GPIO0->DIR&=~(1<<2))

#define DQ_OUT  (LPC_GPIO0->DIR|=(1<<2))

#define DQ_DATE ((LPC_GPIO0->DATA&0x4)>>2^1)




//DS18B20 ROM 命令宏定义

#define ReadRom 0x33

#define MatchRom 0x55

#define Skip_ROM 0xcc  //跳过ROM

#define SearchRom 0xf0

#define AlertSearch 0xec

#define CopyScratchpad 0x48

#define SkipRom 0xcc

#define ReadPower 0xb4

//DS18B20 功能命令宏定义

#define ConvertTemperature 0x44

#define ReadScratchpad 0xbe

#define WriteScratchpad 0x4e

#define RecallE 0xb8

extern unsigned char DS18B20_Init(void);

#endif


Temperature.c文件#include "temperature.h"#include "lpc11xx.h"

#include "timer.h"

extern uint16_t T;

extern unsigned char tempH,tempL,wenduqk;


/****************************************************************************

* 名称: unsigned char DS18B20_Init(void)

* 功能:对DS18B20 进行初始化

* 入口参数:

* 出口参数:

* 说明:

****************************************************************************/

unsigned char DS18B20_Init(void)

{

        unsigned char result;

        DQ_OUT;

        DQ_L;

        Delay_Us(600); // 总线拉低480us~960us ,即主机发送复位脉冲

        DQ_H;

        DQ_IN; // 总线设为输入状态,等待18b20 应答

        Delay_Us(60);

        result=DQ_DATE; // 读取18b20 应答信号

//        Send_TO_DWIN(0x00,result,2);

        Delay_Us(500); // 等待480us 以上,保证总线释放

        return(result); // 返回0 则初始化成功

}



/****************************************************************************

* 名称: unsigned char DS18B20_ReadBit(void)

* 功能:从DS18B20 单总线上读1Bit 数

* 入口参数:

* 出口参数:

* 说明:

****************************************************************************/

unsigned char DS18B20_ReadBit(void)

{

        unsigned char result;

        DQ_OUT; // 设置总线为输出状态

        DQ_L; // 总线拉低,产生读起始信号

        Delay_Us(2); // 保证低电平在1us 以上

        //要在15us 内读取总线上数据

        DQ_IN;

        Delay_Us(3);  // 这个延时很重要,没有这个延时,读不出18B20的数据

        result=DQ_DATE; // 接收数据

        Delay_Us(60); // 延时60us,保证总线释放

        return(result); // 返回数据

}



/****************************************************************************

* 名称: void DS18B20_WriteBit(unsigned char Data)

* 功能:给DS18B20 单总线上写1Bit 数

* 入口参数:

* 出口参数:

* 说明:

****************************************************************************/void

DS18B20_WriteBit(unsigned char Data)

{

        DQ_OUT; // 设置总线为输出

        DQ_L; // 产生写起始信号

        Delay_Us(10); //15us 后写入数据

        if(Data) DQ_H;

        else DQ_L;

        Delay_Us(80); // 延时60us~120us ,保证总线释放

        DQ_IN; // 空闲状态总线保持输入状态

}


/****************************************************************************

* 名称: unsigned char DS18B20_ReadByte(void)

* 功能:从DS18B20 单总线上读1Byte 数

* 入口参数:

* 出口参数:

* 说明:

****************************************************************************/

unsigned char DS18B20_ReadByte(void)

{

        unsigned char i,result=0;

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

        {

        result>>=1;

//        if(DS18B20_ReadBit()) result|=0x80;          // 设为上拉电阻,当读取值为0时,实际上总线为高电平,所以要反过来

//        else result&=0x7f;

        if(DS18B20_ReadBit()) result&=0x7f;

        else result|=0x80;

        }

        return(result);

}



/****************************************************************************

* 名称: void DS18B20_WriteByte(unsigned char Data)

* 功能:给DS18B20 单总线上写1Byte 数

* 入口参数:

* 出口参数:

* 说明:

****************************************************************************/

void DS18B20_WriteByte(unsigned char Data)

{

        unsigned char i;

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

        {

                DS18B20_WriteBit(Data&0x01);

                Data>>=1;

    }

}



/****************************************************************************

* 名称: void DS18B20_ReadTemp(void)

* 功能:从DS18B20 上读取温度值

* 入口参数:

* 出口参数:

* 说明:

****************************************************************************/

void DS18B20_ReadTemp(void)

{

        unsigned char i,j;

        uint16_t Temperature[10],T1;

    DS18B20_Init();

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

        {        

                DS18B20_WriteByte(SkipRom);

                DS18B20_WriteByte(ConvertTemperature);

        //        Delay_Ms(600); // 按照要求延时1s 左右,但是不延时也可以,还未找到原因

                DS18B20_Init();

                DS18B20_WriteByte(SkipRom);

                DS18B20_WriteByte(ReadScratchpad);

                tempL=DS18B20_ReadByte(); // 读温度低字节

                tempH=DS18B20_ReadByte(); // 读温度高字节

        

                // 未考虑温度为负情况

        //        Temperature=tempH;

        //        Temperature<<=8;

        //        Temperature+=tempL;

        //        Temperature=0.625*Temperature;

                // 考虑温度为负情况

        

                if(tempH>7)//(TH>xxxxx111)温度为负

           {

               tempH=~tempH;tempL=~tempL;

               wenduqk=0; 

           }

           else  wenduqk=1;//温度为正

            Temperature[i]=tempH;

                Temperature[i]<<=8;

                Temperature[i]+=tempL;

           if(wenduqk) Temperature[i]= Temperature[i]; //返回温度值

           else  Temperature[i]= -Temperature[i];

         }

                 //冒泡法排序

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

        {

                for(j=i+1;j<=9;j++)

                {                

                        if(Temperature[i]>Temperature[j])

                        {

                                T1=Temperature[i];

                                Temperature[i]=Temperature[j];

                                Temperature[i]=T1;                

                        }

                }                

        }

        

        T=0;

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

        {

                T=T+Temperature[2+i];

        }         

        T=T*(0.625)/6;                               


}


推荐阅读

史海拾趣

Apacer公司的发展小趣事

除了产品创新,Apacer宇瞻科技还注重为客户提供量身定制的解决方案。在某次客户系统升级中,宇瞻科技的技术团队发现原有SD卡无法满足大量随机小数据的存取应用,甚至可能缩短SSD使用寿命。于是,宇瞻科技建议客户导入Page Mapping技术,并搭配Smart Read Refresh技术的SD卡,成功解决了客户的存储问题。这一技术突破不仅帮助客户实现了系统升级,也为宇瞻科技赢得了更多的信任和赞誉。

芯力微(CHI Power)公司的发展小趣事

芯力微深知人才是企业发展的核心动力。因此,公司一直注重人才的培养和引进。公司建立了一套完善的人才培养机制,为员工提供广阔的发展空间和良好的职业前景。同时,芯力微还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队不仅具备丰富的行业经验和技术能力,还具备高度的责任感和使命感。他们为公司的发展贡献了自己的智慧和力量。

Gigabit Logic Inc公司的发展小趣事
采用集成电路等现代电子元器件,提高了电路的可靠性和稳定性。
千志电子(CCO)公司的发展小趣事

为了进一步拓展业务版图,千志电子开始进军国际市场。2006年,千志电子在香港设立了千志电子(香港)有限公司,将其作为国际服务据点重心之一。这一举措使千志电子能够更好地了解国际市场需求和趋势,加强与国外客户的联系和合作。同时,千志电子还积极参加国际展览和论坛,展示其优质产品和先进技术,提高了品牌知名度和国际影响力。

Federal Custom Cable公司的发展小趣事

在追求企业发展的同时,Federal Custom Cable也积极履行社会责任。他们注重绿色生产,采用环保材料和生产工艺,减少对环境的影响。同时,Federal Custom Cable还积极参与公益事业和慈善活动,回馈社会。这种关注社会责任、追求绿色发展的企业精神,使Federal Custom Cable在电缆行业中树立了良好的企业形象。

APC (APC by Schneider Electric)公司的发展小趣事

进入21世纪,数据中心成为了企业信息化建设的核心。APC凭借其在UPS电源保护领域的深厚积累,稳步向数据中心市场拓展。通过并购和技术创新,APC不仅成为了首个收入达到十亿美元的以UPS为主营业务的公司,更在数据中心领域推出了多款创新产品,如InfraStruXure®架构。这一架构将电源、制冷、机架和管理无缝集成为一个模块化、可扩展的、预制式解决方案,为数据中心带来了前所未有的效率和可靠性提升。

问答坊 | AI 解惑

手机充电器方案集结贴—更新中,欢迎推荐

基于AP3768 的高效手机充电器方案       近年来,节能环保理念的深入人心,对半导体IC 设计和应用也提出了更高的要求。2008 年11 月,五大手机制造商诺基亚、三星、索尼爱立信、摩托罗拉和LG 电子联合发布了手机充电器的五星 ...…

查看全部问答>

10000RMB求手机软件开发兼职人员

公司要做一个智能手机上的软件,要求如下: 系统能够自动采集手机终端的相关网络数据,并自动生成测量报告,测量报告中包含以下内容: ?        当前小区信号强度 ?        邻小区信号强度 ?  &n ...…

查看全部问答>

找工作了--北京

2005年6月计算机专业本科毕业,毕业后一直在一个研究所从事软件开发:     a)参与了专业交换机研发, 我主要做交换与维护模块(c  语言+vxWorks)和交换机维护终端软件(vc 6.0)     b)做过专业网控器的组网协 ...…

查看全部问答>

请问VI是个什么东西

请问vi是什么东西呀?老师要我们翻译一篇文章, 我不知sub vi是什么意思?  还有就是context help是什么意思?多谢…

查看全部问答>

求助:工程怎样下载到目标机,可以只运行目标机就可以启动工程啊?

各位路过的大侠,请问:我在主机上装了tornado ,pentium处理器的,做了一个工程,然后通过对等线连接的主机和目标机,目标机是一个HMI,我每次调试的时候都要通过tornado download到目标机里面,然后在tornado里debug,再run,目标机的工程才启动 ...…

查看全部问答>

郁闷阿,昨天锁了两个stm32片子

调用了库里的读保护函数,结果,后来stlink2仿真器就连不上了,Jlink下载完就报错。是不是只能用ISP擦了?…

查看全部问答>

ADS1115IDGSR管脚

哪位大神知道ADS1115IDGSR的ALERT/RDY管脚是做什么用的,如果与51连接,悬空行不????急求…

查看全部问答>

TMP112温度传感器搞不定了

昨天用TI的低功耗温度传感器TMP112,单片机是MSP430F2132,使用IO模拟I2C,总是在写入第二个字节后,传感器没有应答,第一个字节是器件地址,第二个字节是内部寄存器地址,不知道怎么回事?各位大侠有用过这个传感器的吗?…

查看全部问答>

紧急求助

请问一下,bq24160这款电源芯片怎么进行测试啊?有完整典型应用的电路图吗?有没有已经测试完成的啊? …

查看全部问答>