最近几天有文章的读者反馈,本平台发布的文章只是讲了一些基础知识,并没有谈到具体应用,根据各位的反馈,我也做了相应的思考,所以咱们还是需要理论和实践结合来写比较好。等时机成熟,也会将具体的应用编写成一本全新的书籍。
前面写的测试案例看似有点泛泛,可能各位看完也不知道具体用到哪里,接下来我们来看一个具体的应用案例吧!以下程序运行在秉火STM32F103霸道的开发板上,参考官方提供的程序demo,经过个人修改而来。
用DS18B20温度传感器,设置4个窗值,找最大值,由于温度带有小数,所以类型应是浮点型数据:
#include "stm32f10x.h" #include "bsp_usart.h" #include "bsp_SysTick.h" #include "bsp_ds18b20.h" #define NR(x) (sizeof(x)/sizeof(x[0])) static float find_buffer_max(float buffer_value_max,u32 size,float *buffer); int main(void) { int i = 0; float temp_max; //设置温度保存的缓存有4个窗值,可以更改 float temp_buffer[4] ; uint8_t uc, ucDs18b20Id [ 8 ]; SysTick_Init(); USART_Config(); while( DS18B20_Init() ) printf("\r\n no ds18b20 exsit \r\n"); DS18B20_ReadId ( ucDs18b20Id ); for ( uc = 0; uc < 8; uc ++ ) printf ( "%.2x", ucDs18b20Id [ uc ] ); while(1) { //当计数等于测试窗值时,则从4个窗值找温度的最大值 if(i == NR(temp_buffer)) { temp_max = find_buffer_max(0.0,NR(temp_buffer),temp_buffer); printf"温度的最大值为:%.1f\n",temp_max); //清计数器 i = 0 ; } //将当前温度保存到窗值数组 temp_buffer[i] = DS18B20_GetTemp_MatchRom (ucDs18b20Id); Delay_ms(1000); printf("当前温度值为:%.1f\n",temp_buffer[i]); i++ ; } return 0 ; } //找最大值 static float find_buffer_max(float buffer_value_max,u32 size,float *buffer) { u8 count = 0 ; float max = buffer_value_max ; for(count = 0 ; count < size ; count++) { if(buffer[count] > max) max = buffer[count]; } return max ; }
运行结果:
根据现实的工程应用情况,我们可能会对一个传感器的数据进行长时间的观察就需要用到这样的方法。
又如,像光强值,加热值,声音值等模拟量也是可以用这样的方法。