蓝桥杯单片机DS18B02温度测量(小数点显示)

蓝桥杯单片机DS18B02温度测量(小数点显示)

DS18B02芯片可以说是在蓝桥杯中是极为常考的一个芯片模块了,熟练掌握是必须的。
简单说明一下吧:温度读取时候呢?首先读出的是温度的低八位,其次读出的是温度的高八位,组成一个16位的二进制值就是DS18B20测量到的温度值。16位中的高5位代表着温度值的正负,一般环境下就没有必要考虑了,因为我们身边的环境温度都是高于零度的啦。最低的4位呢是小数位,需要显示小数位的时候就需要进行处理,没有这方面的要求时候可以直接忽略了。

(省赛时候会提供DS18B20 的底层驱动代码直接调用就可以了,但是小心可能会存在一点小问题,就像某一年的温度转换延时时间太小了,需要调整;还有就是可能源文件里面的函数可能没有在头文件中定义,需要定义之后才可以正常运行)

某一年的底层驱动代码延时函数如下,因为提供的驱动代码测试环境:12T, 8051, 12MHz;但是我们蓝桥杯考试的板子的环境是1T的,在速度上是51完全比不上的,所以相同的延时函数,需要把延时时间加长才行。

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
   
	while(t--);
}

修改为

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
   
    t = t * 12;      // 放大十二倍延时时间
	while(t--);
}

温度检测代码如下:

#include "reg52.h"
#include "intrins.h"
#include "onewire.h" // 调用官方提供的单总线底层驱动代码

typedef unsigned char u8;
typedef unsigned int u16;

u8 code shuma[12] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};

u16 tempera;

void display_temp();        // 温度值显示函数

// 外设初始化函数
void init_system()
{
   
    P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);
}

	// 外设选通函数
void select(u8 local)
{
   
    switch(local)
	{
   
	    case(4): P2 = (P2 & 0x1f) | 0x80; break;
		case(5): P2 = (P2 & 0x1f) | 0xa0; break;
		case(6): P2 = (P2 & 0x1f) | 0xc0; break;
		case(7): P2 = (P2 & 0x1f) | 0xe0; break;
	}
}

// 延时函数
void delay()
{
   
    u8 t = 200;
	while(t--);
}


// 数码管显示函数,单个数码管点亮
void display(u8 local, u8 num)
{
   
    select(6);
	P0 = 0x80 >> (local - 1);
	P2 = P2 & 0x1f;

	select(7);
	P0 = num;
	P2 = P2 & 0x1f;

	// 数码管延时
	delay();

}

void close_display()
{
   
    // 消隐
	select(6);
	P0 = 0x00;
	P2 = P2 & 0x1f;
}

// 温度检测函数
void temperature()
{
   
	u8 HT,LT;
	u16 temp;
	
	init_ds18b20();
    Write_DS18B20(0xcc);
	Write_DS18B20(0x44);

	Delay_OneWire(250);

    init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);

	LT = Read_DS18B20();	   // 先读取低位数据,后读取高位数据
	HT = Read_DS18B20();
	init_ds18b20();     
	// 一:可以直接使用读取到的十六位值进行乘上倍数;二、如果不需要小数位,可以直接把低八位的后四位移出去,之后把高八位向左移四位,之后把高八位低八位进行或运算,得出一个整数,不需要再乘以倍数;
// temp = HT&0X0F;
	temp = HT << 8;			
	temp |= LT;
// temp = temp >> 4;
// temp = temp * 10;
// tempera = temp;
// temp = LT & 0x0f;
// tempera = tempera + (u8)(temp * 0.625);
	tempera = (u16)(temp * 0.625);    // 把测量到温度放大十倍显示一位小数位,如果想要多位小数,自行继续放大即可 
	 
}

void display_temp()
{
   
    display(1,shuma[tempera%100]);
	display(2,shuma[tempera/10%10] & 0x7f);	   // 小数点的处理,与上一个0x7f便可以把第二位的小数点显示出来了
	display(3,shuma[tempera/100]);

}

void Delay1ms()		//@11.0592MHz
{
   
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
   
		while (--j);
	} while (--i);
}


void main()
{
   
    init_system();  // 初始化外设
    while(1)
	{
   
	    temperature();
		display_temp();
		close_display();
		Delay1ms();		// 延时1ms再去读取温度值,没有必要一直读取,浪费资源 
	}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115106.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sdn网络的特点(水环式真空泵的工作原理)

    SDN的工作原理SDN网络架构的三层模型架构主要分为协同应用层,控制层,转发层三层,网络架构本身包括管理平面,控制平面和转发平面,与这三层对应。传统的IP网络具有转发平面,控制平面和管理平面。协同应用层主要是完成用户意图的各种上层应用程序,此类应用程序(APP)成为协同应用程序,典型的协同层包括OSS,Openstack等。控制层是系统的控制中心,负责网络内部交换路径和边界业务路由的生成,并负责处理网络状态变化事件。这里注意sdn架构下,sdn控制器直接提供网络业务服务接口,APP就不需关心内部

    2022年4月11日
  • linux中vim如何显示行数,vim 在linux下中如何设置显示行数「建议收藏」

    linux中vim如何显示行数,vim 在linux下中如何设置显示行数「建议收藏」在.vimrc(或/etc/vimrc)文件中输入如下文本:settabstop=4setsofttabstop=4setshiftwidth=4setnoexpandtabsetnusetautoindentsetcindent其中:Tabstop:表示一个tab显示出来是多少个空格的长度,默认8。softtabstop:表示在编辑模式的时候按退格键的时候退回缩进的长度,当使…

    2022年10月30日
  • Java 时间格式化(java中如何格式化一个日期)

    1、通过MessageFormat转化String      dateTime=MessageFormat.format("{0,date,yyyy-MM-dd-HH-mm:ss:ms}",                                   newObject[]      {                                       …

    2022年4月17日
  • oracle中integer最大值,integer表示的最大整数[通俗易懂]

    oracle中integer最大值,integer表示的最大整数[通俗易懂]Integer类型的变量可能存在的最大整数为?A.256BInteger类的数据范围为,最小值为-2^31,最大值为2^31-1;验证如下,创建java类TestInteger,做测试验证用,编写java代码,创建Integer对象,值为256,数据可以输出,Integeri=newInteger(256);System.out.println(i);java中int型最大值…

    2022年9月8日
  • 数列所有公式大全_splay树

    数列所有公式大全_splay树请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线 _ 表示实际输入文件中的空格)输入格式第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目。第 2 行包含 N 个数字,描述初始时的数列。以下 M 行,每行一条命令,格式参见问题描述中的表格。输出格式对于输入数据中的 GET-SUM 和 MAX-SUM 操作,向输出文件依次打印结果,每个答案(数字)占一行。数据范围与约定你可以认为在任何时刻,数列中至少有 1 个数。输入

    2022年8月10日
  • css怎么改鼠标样式,如何利用CSS改变鼠标的样式

    css怎么改鼠标样式,如何利用CSS改变鼠标的样式各种各样的鼠标样式,对于经常使用电脑的人而言一定不会生疏。当鼠标移动到不同的地方时,当鼠标执行不同的功能时,鼠标的外形都会发生变化。但在网页上,貌似只有当鼠标在超级链接上时才出现一个手形,在其它地方似乎没有什么变化,同布满动感的网页显得不怎么和谐。实际上,用css可以方便地定义许多种鼠标外形。下面小编就为大家介绍一下怎样利用CSS改变鼠标的样式。用CSS改变鼠标的样式,我们使用cursor属性,现…

    2022年5月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号