历史上的今天
返回首页

历史上的今天

今天是:2025年10月11日(星期六)

正在发生

2022年10月11日 | 51单片机基础之DS18B20温度传感器

2022-10-11 来源:csdn

外型:

代码:


main.c 文件

 

#include "smg.h"

#include "ds18b20.h"

 

 

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

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

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

void main()

{

u8 i=0;

  int temp_value;

u8 temp_buf[6];

ds18b20_init();//初始化DS18B20

while(1)

{

i++;

if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间

temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位

if(temp_value<0)//负温度

{

temp_value=-temp_value;

temp_buf[0]=0x40;//显示负号

}

else

// temp_buf[0]=0x00;//不显示

//temp_buf[1]=gsmg_code[temp_value/1000];//百位

temp_buf[2]=gsmg_code[temp_value%1000/100];//十位

temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;//个位+小数点

temp_buf[4]=gsmg_code[temp_value%1000%100%10];//小数点后一位

temp_buf[5]=0x39; //显示C

smg_display(temp_buf,3);

}

}


ds18b20.c 文件

 

 

#include "ds18b20.h"

#include "intrins.h"

 

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

* 函 数 名         : ds18b20_reset

* 函数功能    : 复位DS18B20  

* 输    入         : 无

* 输    出         : 无

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

void ds18b20_reset(void)

{

DS18B20_PORT=0; //拉低DQ

delay_10us(75); //拉低750us

DS18B20_PORT=1; //DQ=1

delay_10us(2); //20US

}

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

* 函 数 名         : ds18b20_check

* 函数功能    : 检测DS18B20是否存在

* 输    入         : 无

* 输    出         : 1:未检测到DS18B20的存在,0:存在

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

u8 ds18b20_check(void)

{

u8 time_temp=0;

while(DS18B20_PORT&&time_temp<20) //等待DQ为低电平

{

time_temp++;

delay_10us(1);

}

if(time_temp>=20)return 1; //如果超时则强制返回1

else time_temp=0;

while((!DS18B20_PORT)&&time_temp<20) //等待DQ为高电平

{

time_temp++;

delay_10us(1);

}

if(time_temp>=20)return 1; //如果超时则强制返回1

return 0;

}

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

* 函 数 名         : ds18b20_read_bit

* 函数功能    : 从DS18B20读取一个位

* 输    入         : 无

* 输    出         : 1/0

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

u8 ds18b20_read_bit(void)

{

u8 dat=0;

DS18B20_PORT=0;

_nop_();_nop_();

DS18B20_PORT=1;

_nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据

if(DS18B20_PORT)dat=1; //如果总线上为1则数据dat为1,否则为0

else dat=0;

delay_10us(5);

return dat;

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

* 函 数 名         : ds18b20_read_byte

* 函数功能    : 从DS18B20读取一个字节

* 输    入         : 无

* 输    出         : 一个字节数据

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

u8 ds18b20_read_byte(void)

{

u8 i=0;

u8 dat=0;

u8 temp=0;

for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位

{

temp=ds18b20_read_bit();

dat=(temp<<7)|(dat>>1);

}

return dat;

}

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

* 函 数 名         : ds18b20_write_byte

* 函数功能    : 写一个字节到DS18B20

* 输    入         : dat:要写入的字节

* 输    出         : 无

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

void ds18b20_write_byte(u8 dat)

{

u8 i=0;

u8 temp=0;

for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位

{

temp=dat&0x01;//选择低位准备写入

dat>>=1;//将次高位移到低位

if(temp)

{

DS18B20_PORT=0;

_nop_();_nop_();

DS18B20_PORT=1;

delay_10us(6);

}

else

{

DS18B20_PORT=0;

delay_10us(6);

DS18B20_PORT=1;

_nop_();_nop_();

}

}

}

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

* 函 数 名         : ds18b20_start

* 函数功能    : 开始温度转换

* 输    入         : 无

* 输    出         : 无

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

void ds18b20_start(void)

{

ds18b20_reset();//复位

ds18b20_check();//检查DS18B20

ds18b20_write_byte(0xcc);//SKIP ROM

    ds18b20_write_byte(0x44);//转换命令

}

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

* 函 数 名         : ds18b20_init

* 函数功能    : 初始化DS18B20的IO口 DQ 同时检测DS的存在

* 输    入         : 无

* 输    出         : 1:不存在,0:存在

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

u8 ds18b20_init(void)

{

ds18b20_reset();

return ds18b20_check();

}

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

* 函 数 名         : ds18b20_read_temperture

* 函数功能    : 从ds18b20得到温度值

* 输    入         : 无

* 输    出         : 温度数据

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

float ds18b20_read_temperture(void)

{

float temp;

u8 dath=0;

u8 datl=0;

u16 value=0;

ds18b20_start();//开始转换

ds18b20_reset();//复位

ds18b20_check();

ds18b20_write_byte(0xcc);//SKIP ROM

  ds18b20_write_byte(0xbe);//读存储器

datl=ds18b20_read_byte();//低字节

dath=ds18b20_read_byte();//高字节

value=(dath<<8)+datl;//合并为16位数据

if((value&0xf800)==0xf800)//判断符号位,负温度

{

value=(~value)+1; //数据取反再加1

temp=value*(-0.0625);//乘以精度

}

else //正温度

{

temp=value*0.0625;

}

return temp;

}


ds18b20.h 文件

 

#ifndef _ds18b20_H

#define _ds18b20_H

 

#include "smg.h"

 

//管脚定义

sbit DS18B20_PORT=P3^7; //DS18B20数据口定义

 

 

//函数声明

u8 ds18b20_init(void);

float ds18b20_read_temperture(void);

 

#endif


smg.c 文件

 

#include "smg.h"

 

//共阴极数码管显示0~F的段码数据

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

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

* 函 数 名       : delay_10us

* 函数功能 : 延时函数,ten_us=1时,大约延时10us

* 输    入       : ten_us

* 输    出    : 无

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

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

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

* 函 数 名       : smg_display

* 函数功能 : 动态数码管显示

* 输    入       : dat:要显示的数据

   pos:从左开始第几个位置开始显示,范围1-8

* 输    出    : 无

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

void smg_display(u8 dat[],u8 pos)

{

u8 i=0;

u8 pos_temp=pos-1;

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

{

    switch(i)//位选

{

case 0: LSC=1;LSB=1;LSA=1;break;

case 1: LSC=1;LSB=1;LSA=0;break;

case 2: LSC=1;LSB=0;LSA=1;break;

case 3: LSC=1;LSB=0;LSA=0;break;

case 4: LSC=0;LSB=1;LSA=1;break;

case 5: LSC=0;LSB=1;LSA=0;break;

case 6: LSC=0;LSB=0;LSA=1;break;

case 7: LSC=0;LSB=0;LSA=0;break;

}

SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据

delay_10us(100);//延时一段时间,等待显示稳定

SMG_A_DP_PORT=0x00;//消音

}

}


smg.h 文件

 

#ifndef _smg_H

#define _smg_H

 

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

 

#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口

 

//定义数码管位选信号控制脚

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

 

extern u8 gsmg_code[17];

 

void smg_display(u8 dat[],u8 pos);

void delay_10us(u16 ten_us);

#endif


运行结果:

推荐阅读

史海拾趣

Golledge Electronics公司的发展小趣事

Golledge Electronics公司的发展故事

故事一:石英晶体振荡器的创新起点

Golledge Electronics公司的起源可以追溯到对石英晶体振荡器技术的深入研究和创新。公司最初成立于英国水晶产区的中心,依托当地丰富的水晶资源,Golledge迅速成为石英晶体振荡器领域的佼佼者。公司创始人敏锐地意识到石英晶体的压电特性在电子系统中的重要应用价值,于是投入大量资源进行研发。通过不断优化晶体制造工艺和温度补偿技术,Golledge成功推出了高精度、高稳定性的石英晶体振荡器,为无线电通信、卫星通信等领域提供了关键技术支持。这一创新不仅奠定了Golledge在电子行业的基础,也为其后续发展铺平了道路。

故事二:微机电系统(MEMS)技术的突破

随着电子产品的不断小型化和便携化,Golledge Electronics公司紧跟时代步伐,将研发重点转向微机电系统(MEMS)技术。MEMS谐振器以其紧凑的尺寸和稳健的性能,成为便携式设备和可穿戴设备中的理想选择。Golledge通过自主研发和合作创新,成功将MEMS技术应用于频率控制产品中,推出了多款高性能、低功耗的MEMS谐振器。这些产品不仅满足了市场对小型化、轻量化的需求,还进一步提升了电子系统的整体性能和可靠性。Golledge在MEMS技术领域的突破,为其在电子行业中的领先地位增添了新的动力。

故事三:新材料应用的探索

为了不断提升产品的性能和质量,Golledge Electronics公司始终致力于新材料的研发和应用。公司研发团队通过深入研究石英晶体的物理特性和化学性质,成功开发出了一系列具有独特性能的石英晶体材料。这些新材料不仅具有更高的稳定性和频率精度,还能够在极端环境下保持优异的性能表现。Golledge将这些新材料应用于频率控制产品中,显著提升了产品的竞争力和市场占有率。同时,公司还积极探索其他新型材料的应用潜力,为未来的技术创新储备了丰富的资源。

故事四:机器学习集成的创新实践

随着人工智能技术的快速发展,Golledge Electronics公司敏锐地捕捉到这一趋势,并积极探索机器学习在频率控制领域的应用。公司研发团队通过集成机器学习算法,使频率控制系统能够动态地适应和优化频率设置。这一创新实践不仅确保了频率控制系统的持续准确性,还为其赋予了自我学习和自我优化的能力。Golledge的这一创新成果,不仅提升了产品的智能化水平,也为电子行业的未来发展提供了新的思路和方向。

故事五:超微型SMD晶体的商用化

为了满足市场对更小、更轻、更高效的电子产品的需求,Golledge Electronics公司推出了超微型1610mm封装SMD晶体,并成功实现商用化。这款晶体以其极小的尺寸和优异的性能,迅速赢得了市场的青睐。Golledge通过不断优化生产工艺和质量控制体系,确保了超微型SMD晶体的稳定供应和高质量表现。这款产品的成功商用,不仅进一步巩固了Golledge在电子行业中的地位,也为其在小型化、便携化电子产品领域的发展开辟了新的市场空间。

EQCOLOGIC公司的发展小趣事

随着环保意识的日益增强,电子行业对环保的要求也越来越高。EQCOLOGIC公司积极响应环保号召,将环保理念贯穿于产品研发、生产和销售的各个环节。公司采用环保的生产工艺和材料,减少污染物的排放;同时,还开展了一系列环保宣传活动,提高员工和消费者的环保意识。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

Extech公司的发展小趣事

进入新世纪后,Extech公司迎来了新的发展机遇。2000年,公司成为国家第一批863/CIMS系统集成和咨询服务企业,同时也是国家863/CIMS示范应用工程的主流供应商。这一荣誉的获得不仅体现了公司在技术实力和服务能力方面的优势,也为公司未来的发展提供了更广阔的空间。

Esterline Power Systems公司的发展小趣事

Esterline Power Systems公司在其早期阶段就致力于研发创新技术,以满足航空和国防行业对高性能电源系统的需求。一次关键的技术突破发生在公司对一种新型高效能电源控制器的研发上。面对市场上已有的产品性能瓶颈,公司的研发团队经过数月的深入研究与实验,成功开发出了具有更高效率和更稳定性能的电源控制器。这一创新不仅赢得了客户的认可,也为公司赢得了市场份额,奠定了在电源系统领域的领先地位。

City_Technology公司的发展小趣事

随着市场的不断变化和需求的日益增长,City Technology并未满足于已有的成就。在1980年代末至1990年代初,公司积极扩展产品线,相继开发了电化学有毒气体传感器和可燃气体传感器。这些新产品的推出,不仅丰富了公司的产品线,也进一步巩固了其在气体传感领域的领先地位。同时,公司还不断对已有产品进行优化升级,以满足客户日益多样化的需求。

Emerging Display Technolgies公司的发展小趣事

随着虚拟现实(VR)、增强现实(AR)等技术的快速发展,微型显示技术的需求日益增加。一家新兴显示技术公司,凭借其在微纳加工和光学设计方面的技术优势,成功研发出了高性能的微型显示屏。这种显示屏具有体积小、分辨率高、功耗低等特点,为VR/AR设备提供了更加逼真的视觉体验。

问答坊 | AI 解惑

I2C器件接口IP核的CPLD设计

由于CPLD数字设计结构化的趋势,将出现针对CPLD不同层次的IP(Intellectual Property)核。各个IP核可重复利用,可大大提高设计能力和效率。国外各大公司都推出了专门的IP核,我国也迫切需要发展自己的IP核。本文针对I2C的主方式串行扩展通信的特点, ...…

查看全部问答>

有人用过AD1674或AD574吗?

我用AD1674进行AD转换,51控制并进行数据读取,现在发现51无法正确读取,用过的各位帮帮忙…

查看全部问答>

第二讲 照明用LED驱动电源设计基础

LED 的排列方式及LED 光源的规范决定着基本的驱动器要求。LED 驱动器的主要功能就是在一定的工作条件范围下限制流过LED 的电流, 而无论输入及输出电压如何变化。最常用的是采用变压器来进行电气隔离。文中论述了LED 照明设计需要考虑的因素 一、L ...…

查看全部问答>

同是Cortex-M3,恩智浦MCU的秘密武器是什么?

PPT文件, 这是NXP在2009ARM技术研讨会上的发言。 也可知晓NXP LPC1100的原理和应用。 …

查看全部问答>

程序执行到最后一句return时出现异常,帮帮忙!

ARM7 44b0,用ADS1.20编译调试。 代码中定义了这样一个函数device_run,如下。 BOOL device_run(BYTE type) {           BYTE setAttributeValue;           MAC_ENUM status; ...…

查看全部问答>

串口通信

串口通信  …

查看全部问答>

2416+16550 驱动外包

各位仁兄:     小弟有项目如下:     基于S3C2416的串口驱动程序,串口芯片16550,     现在有MDD+PDD(中间层)缺少最低层对16550的初始化代码     由于时间关系,现将项目外包     ...…

查看全部问答>

VS2008如何开发WINDOWS CE .NET 4.2的应用程序

我现在手里有一个MOTOROLA MC1000的设备,装的系统是WINDOWS CE .NET 4.2 在网上看了下 说.NET 可以开发移动设备的程序,所以就下了个试了下 我打开VS2008 - 新建 智能设备项目 - 目标平台我选的是 WINDOWS CE - .NET CF 我选的是 CF2.0 写了个T ...…

查看全部问答>

请大家推荐一款FPGA的学习板

请大家推荐一款FPGA的学习板,准备开学的时候跟着数电课一起学…

查看全部问答>