前言
温度检测也是蓝桥杯的常考点,有时候需要显示小数点后一到两位,有时候只需要显示整数位(一般是要显示的东西太多了小数放不下了)。由于比赛的时候官方直接给出看底层的驱动,就不再去纠结底层实现的原理和方法了,只需要针对数据手册分析温度解析与获取部分即可。
实现
国信长天的开发板上的DS18B20接线如上图所示,其实官方给的底层驱动已经定义好了引脚,当然看原理图检查也是不可或缺的一步。
根据数据手册写出,在每次对DS18B20操作之前,我们都需要对其进行一个初始化,初始化时序如上图所示。
相关命令翻译已经给出,简而言之就是:使用18B20获取温度,我们需要启动其温度转换(0x44单个温度转换),然后才能使用读取命令(0xBE从最低位开始读取)进行读取,无论是启动温度转换还是读取温度,我们都需要先使用0xCC进行总线寻址(理解为寻找DS18B20)。
1、获取整数位温度方法如下
/*
彭某的蓝桥杯复习——DS18B20
1、整数温度值的获取
2、带小数位的温度值获取
*/
#include <STC15F2K60S2.h>
#include #include #define uint unsigned int #define uchar unsigned char void ALL_Init(); void delay_ms(uint ms); void Temp_show(uchar temp); uchar SEG_num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void main() { ALL_Init(); while(1) { Temp_show(DS18B20_Get()); } } /* 函数功能:数码管显示两位的温度值 函数参数:温度,8位 函数返回值:void */ void Temp_show(uchar temp) { P25 = 0;P26 = 1;P27 = 1;P0 = 0x01; P25 = 1;P26 = 1;P27 = 1; P0 = SEG_num[temp/10]; delay_ms(5); P25 = 0;P26 = 1;P27 = 1;P0 = 0x02; P25 = 1;P26 = 1;P27 = 1; P0 = SEG_num[temp%10]; delay_ms(5); P25 = 0;P26 = 1;P27 = 1;P0 = 0x00; } void delay_ms(uint ms) { int i; for(;ms>0;ms--) for(i = 864;i>0;i--); } void ALL_Init() { P25 = 1;P26 = 0;P27 = 1; P0 = 0x00; P25 = 0;P26 = 1;P27 = 1; P0 = 0x00; P25 = 0;P26 = 0;P27 = 1; P0 = 0xff; } 其中温度获取部分的实现: /* 函数功能:读取整数温度 函数参数:无 函数返回值:温度值,8位 */ unsigned char DS18B20_Get() { unsigned char low,high,temp; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); Delay_OneWire(200); init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); Delay_OneWire(200); low = Read_DS18B20(); high = Read_DS18B20(); temp = high<<4; temp |= low>>4; return temp; } 带小数位温度的获取 float DS18B20_Getfloat() { float temp2; unsigned int temp; unsigned char low,high; init_ds18b20(); Write_DS18B20(0xCC); Write_DS18B20(0x44); Delay_OneWire(200); init_ds18b20(); Write_DS18B20(0xCC); Write_DS18B20(0xBE); Delay_OneWire(200); low = Read_DS18B20(); high = Read_DS18B20(); temp = high&0x0f; temp = temp<<8|low; temp2 = temp*0.0625; return temp2; } 关于数据处理 如上图数据手册所示,DS18B20在进行温度转换以后,得到的是16位的数据,即高八位high,低八位low,其中,高八位的前五位代表符号位,当温度为正值时,这五位都为0,反之都为1;高八位的后三位与低八位的前四位共同组成了整数位,因此,在只显示整数时,我们只需要将高八位左移四位,随后或上低八位的前四位,即可得到整数的温度值;对于小数部分,我们只需要定义一个十六位数据,保留高八位的的后四位(&0x0f),随后拼上低八位并乘以0.0625(最小精度),即可得到小数部分的数值。 结语 也许对于比赛而言,我们只需要强行记住这些代码就能够实现出功能,但是我觉得我们更需要的是了解其中的原理,这样哪怕我们不记得代码,但是只需要翻开数据手册,一切便了然于心,并且这也十分有利于我们后续对于其他知识的学习
上一篇:蓝桥杯STC15单片机复习——DS1302
下一篇:蓝桥杯STC15单片机复习——外部中断
推荐阅读最新更新时间:2024-11-03 14:50
设计资源 培训 开发板 精华推荐
- LT1171HVCT、-5.2/2.5A 负降压转换器的典型应用
- 使用 Analog Devices 的 LTC3526LEDC 的参考设计
- MAXREFDES1103:采用MAX17690的效率为91.7%的小型,24V / 250mA,无光耦反激式DC-DC转换器
- LF50CPT-TR 5V 顺序极低压降稳压器多路复用器的典型应用
- ADA4075-2ARZ-RL 平衡线路接收器运算放大器的典型应用电路
- AM3G-0503SZ 3.3V 3 瓦 DC/DC 转换器的典型应用
- 温控风扇---直流稳压电源
- AM2G-2412SZ 12V 2 瓦 DC-DC 转换器的典型应用
- EVAL-AD5445EB,使用 AD5445、12 位、高带宽乘法 DAC 和并行接口的评估板
- 具有最大功率点跟踪功能的 LTC4162IUFD-FST 太阳能供电 3 节 3.2A 充电器的典型应用