蓝桥杯单片机必备知识—–(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • img图片加载失败默认图片「建议收藏」

    img图片加载失败默认图片「建议收藏」<img:src=”item.goods_pic”onerror=”javascript:this.src=’../static/images/default.png’;”>转载于:https://www.cnblogs.com/techliang666/p/8876842.html

    2022年5月24日
    43
  • java中的策略模式(策略模式java)

    前言当代码中出现多重if-else语句或者switch语句时。弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处,那么程序就会出错。弊端之二:代码逻辑难以理解。卫语句卫语句的使用,并不能改变前言说的弊端:一旦需求更改,需要修改所有使用更改需求的if-else代码块。不过使用卫语句可以让自己或者代码…

    2022年4月18日
    57
  • Java函数式编程之Java8四大函数接口

    【前序】:在Java8中,内置了四个核心函数接口,它们存在是Lamda表达式出现的前提,Lamda表达式想重写函数式接口中的唯一方法。函数式接口与Lambda表达式之间的关系:lambda表达式相当于是一个行为,传入函数式接口中,进来实现各种操作。它们的接口内只有一个抽象方法,每一个函数式接口都有@FunctionalInterface注解。文章目录1.消费型接口2.供给型接口3.函数型接…

    2022年4月16日
    49
  • 数据类型U16_数据类型怎么判断

    数据类型U16_数据类型怎么判断#defineU32unsignedint#defineU16unsignedshort#defineS32int#defineS16shortint#defineU8unsignedchar#defineS8charunsignedchar=u8unsignedshortint=u16unsignedlongint

    2022年10月16日
    3
  • Oracle insert into select大数据量踩过的坑

    Oracle insert into select大数据量踩过的坑1、简单粗暴insertintotable1select*fromtable2;commit;灰度环境机器配置不好,二百多万数据十来分钟没有导完,产生大量归档日志。删除索引约束后可能要好点。大数量有风险,可能会导致归档日志撑爆。2、nologgingaltertabletable1nologging;insert/*+append*/intotable…

    2022年7月15日
    88
  • 压测TPS_测压管原理

    压测TPS_测压管原理1.TPS、并发量是什么关系?为什么有的地⽅要⽤TPS?有的地⽅要⽤并发?⾸先,TPS是⼀个吞吐速度的概念,就是每秒处理多少请求。是衡量系统处理能⼒的指标,⽽往往TPS的最⼤值,并⾮系统资源耗尽的时点,因为TPS和系统资源是⼀个抛物线的关系,就是当资源最优配置时往往是TPS最⾼的时间,当资源耗尽时,往往TPS也是⾮常低的。每个TPS指标都会对应当时的并发量。然后说说并发量,并发量往往是对⼀个系统同时操作的⼈数的,或者说同时产⽣的请求数的预估,来衡量系统的承载能⼒。⾔外之意,这个指标⽬的在于看能否同时承载

    2022年10月21日
    3

发表回复

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

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