蓝桥杯单片机必备知识—–(7)温度传感器整数和浮点数

蓝桥杯单片机必备知识—–(7)温度传感器整数和浮点数

蓝桥杯单片机必备知识—–(7)温度传感器整数和浮点数

注:一般蓝桥杯省赛会出温度传感器整数显示;而蓝桥杯国赛则会出温度传感器浮点数显示

onewire.h添加

unsigned char rd_temperature(void); 

onewire.c 整数显示

官方给的数据包中延时函数有问题需修改
整数

//延时函数修改
//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
   
	char  i;
	while(t--)
		for(i = 0;i<12;i++);
}
//添加读取温度函数
unsigned char rd_temperature(void)
{
   
	unsigned char low,high;
	char temp;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	low = Read_DS18B20();
	high = Read_DS18B20();
	temp = high <<4;
	temp |=(low >> 4);
	
	return temp;
}

测试结果

测试结果:

onewire.h添加

float rd_temperature(void); 

onewire.c 浮点数显示

//延时函数修改
//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
   
	char  i;
	while(t--)
		for(i = 0;i<12;i++);
}
//添加读取温度函数
float rd_temperature(void)
{
   
    unsigned int temp;
	float temperature;
    unsigned char low,high;
  
  	init_ds18b20();
  	Write_DS18B20(0xCC);
  	Write_DS18B20(0x44); //启动温度转换
  	Delay_OneWire(200);

  	init_ds18b20();
  	Write_DS18B20(0xCC);
  	Write_DS18B20(0xBE); //读取寄存器

  	low = Read_DS18B20(); //低字节
  	high = Read_DS18B20(); //高字节
/** 精度为0.0625摄氏度 */  
	temp = (high&0x0f);
	temp <<= 8;
	temp |= low;
	temperature = temp*0.0625;
  
  	return temperature;
}

测试结果:

在这里插入图片描述

相关资料

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全部代码粘贴

ONEWIRE.H

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

unsigned char rd_temperature(void);  //; ;

#endif

ONEWIRE.C

#include "reg52.h"

sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
   
	char  i;
	while(t--)
		for(i = 0;i<12;i++);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
   
	unsigned char i;
	for(i=0;i<8;i++)
	{
   
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
   
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
   
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
   
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
   
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

unsigned char rd_temperature(void)
{
   
	unsigned char low,high;
	char temp;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	low = Read_DS18B20();
	high = Read_DS18B20();
	temp = high <<4;
	temp |=(low >> 4);
	
	return temp;
}

MAIN.C

#include <stc15f2k60s2.h>
#include "onewire.h"
#define uchar unsigned char
#define uint unsigned int


code unsigned char tab[] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dspbuf[8] = {
   10,10,10,10,10,10,10,10};
uchar intr = 0,temperature;
uchar temper_flag = 1;


void load();
void display();
void cls()
{
   
	P2 = (P2 & 0xa0);
	P0 = 0x00;
	P2 = 0x1f;
	
	P2 = (P2 & 0x80);
	P0 = 0xff;
	P2 = 0x1f;
}

void main()
{
   
	cls();
	AUXR = 0x80;
	TMOD = 0x00;
	TL0 = 0xcd;
	TH0 = 0xd4;
	TF0 = 0;
	TR0 = 1;
	ET0 = 1;
	EA = 1;
	while(1)
	{
   
		if(temper_flag)
		{
   
			temper_flag = 0;
			temperature = rd_temperature();
		}
	}
}

void time0(void) interrupt 1
{
   
	if(++intr == 50){
   
		temper_flag = 1;
		intr = 0;
	}
	display();
}

void load()
{
   
	dspbuf[7] = temperature % 10;
	dspbuf[6] = temperature / 10;
}

void display()
{
   
	static unsigned char dspcom = 0;
	load();
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = 0xff;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 1<<dspcom;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = tab[dspbuf[dspcom]];
	P2 = 0x1f;
	
	if(++dspcom == 8)dspcom = 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2021年4月12日 下午8:00
下一篇 2021年4月12日 下午9:00


相关推荐

  • java的字符串分割

    java的字符串分割使用split0)方法可以使字符串按指定的分割字符或字符串对内容进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了以下两种字符串分割形式。(1)split(Stringsign)该方法可根据给定的分割符对字符串进行拆分。语法如下:str.spli(Stringsign)其中,sign为分割字符串的分割符,也可以使用正则表达式。.注意:没有统一的对字符进行分割的符号。如果想定义多个分割符,可使用符号“|”。例如,“=”表示分割符分别为“”和“=”。(2)split…

    2026年4月18日
    4
  • idea激活码在哪里看 Mac【2021.10最新】

    (idea激活码在哪里看 Mac)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsa…

    2022年3月27日
    66
  • goland 2021 破解 激活码-激活码分享

    (goland 2021 破解 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    524
  • Java中XML运用总结

    Java中XML运用总结XML 简介:可扩展标记语言(eXtensibleMarkupLanguage)。特性:1.xml具有平台无关性,是一门独立的标记语言.2.xml具有自我描述性为什么学习XML?1.网络数据传输.2.数据存储3.配置文件XML文件.XML文件是保存XML数据的一种方式XML数据也可以以其他的方式存在(如在内存中构建XML数据)。不要将XML语言狭隘的理解成XML文件。XML语法格式1.XML文档声明<?xmlversio..

    2022年7月7日
    26
  • h5新增标签

    h5新增标签h5 是 html 的最新版本 是 14 年由 w3c 完成标准制定 增强了浏览器的原生功能 减少浏览器插件的应用 提高用户体验满意度 让开发更加方便

    2026年3月18日
    2
  • 解决pycharm换国内源仍然安装失败

    解决pycharm换国内源仍然安装失败如果你换了国内的源仍然很慢 那么这篇博客可以解决你的问题

    2026年3月27日
    2

发表回复

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

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