标题:
STM32F103C8T6单片机+ADXL345+OLED计步器 (手表,运动手环)源代码
[打印本页]
作者:
dvxchen
时间:
2022-10-13 22:34
标题:
STM32F103C8T6单片机+ADXL345+OLED计步器 (手表,运动手环)源代码
看到网上都是用 LCD1602作为输出的,参考一些论坛的文章,拼成STM32+ADXL345+OLED 计步器。
制作出来的实物图如下:
1.jpg
(237.08 KB, 下载次数: 22)
下载附件
2022-10-14 00:02 上传
单片机源程序如下:
/*
STM32F103C8T6
iic通信0.96寸OLED显示屏;显示中英文、数字、图片
18B20温度传感器
HC-SR04超声波传感器
OLED接线定义:
VCC--3.3V/5V
GND--GND
SCL--PB8
SDA--PB9
18B20接线定义:
DQ--PA5
HC-SR04超声波接线定义:
Trig--PB7
Echo--PB6
*/
#include "sys.h"
#include "delay.h"
#include "oled_iic.h"
#include "stdio.h"
#include "wave.h"
#include "timer.h"
#include "usart.h"
#include "ds18b20.h"
#include "lcd1602.h"
#include "led.h"
#include <stdio.h>
#include "key.h"
#include "exti.h"
#include "adxl345.h"
//Add bgn
unsigned char ReadAdxl345; //定时读取adxl345数据
unsigned char ErrorNum=0; //记录错误次数
unsigned char CheckNum=0; //检测次数
char dis0[16];//液晶数组显示暂存
char dis1[35];
unsigned int xlTab[5];//心率数组
unsigned char count=0; //心率滤波计数
unsigned int xinLater=0;// 心率延时处理
unsigned int xinLv =0; //心率值
unsigned int BuShu=0;//步数
unsigned int Normal_num=0; //正常次数
unsigned int Error_num=0; //倾斜次数
unsigned int disBuShu = 0; //显示步数
float disJuLi = 0;//显示距离
float temperature; //温度
unsigned char readTemp = 0; //读取温度标志
//Add end
int main(void)
{
//Add bgn
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
TIM3_Int_Init(49,7199);//50ms
//EXTIX_Init(); // 初始化外部中断
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
//lcd_GPIO_init(); //初始化lcd引脚
//lcd_Init(); //初始化lcd屏幕
delay_ms(200);
Init_ADXL345();
if(Single_Read_ADXL345(0X00)==0xe5)
{
delay_ms(5);
}
else
{
delay_ms(3);
}
//Add end
u8 a=0;
u8 t=20;//trig引脚高电平持续时间
double temperature;
// u8 Distance;
// u8 disFlag=0;
uart_init(115200);//串口初始化
Wave_SRD_Init();//初始化超声波
Timer_SRD_Init(9998,7199);//定时器初始化
extern const u8 BMP1[];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init();
OLED_Init(); //OLED屏幕初始化
DS18B20_Init(); //DS18B20初始化
while(Wave_SRD_Strat(t))
{
}
OLED_Clear();
while(1)
{
ReadAdxl345= 1;
//Add bgn
if(ReadAdxl345== 1) //定时读取adxl345数据
{
ReadAdxl345= 0;
ReadData_x(); //三轴检测函数
CheckNum++;
if((temp_Y>450)||(temp_Y<-450)) //查看正常次数
{
Normal_num++; //正常次数++
}
else
{
Error_num++;//倾斜次数
}
if((Error_num!=0)&&(Normal_num!=0))//检测到步数
// if (Normal_num!=0)//检测到步数
{
BuShu++; //步数脉冲量++
Error_num=0; //清除一个周期检测
Normal_num=0;
}
}
if(disFlag==1) //显示标志
{
disFlag = 0;
readTemp++; //定时计数
if(readTemp >= 8)//约800ms处理一次数据 温度
{
readTemp =0;//重新计数
temperature=(float)DS18B20_Get_Temp()/10; //缩小10倍为实际值
}
disBuShu = BuShu/2; //显示步数
disJuLi = disBuShu*0.45;//显示距离
sprintf(dis0,"X:%03d/min %4.1f C",xinLv,temperature);//打印
Lcd_Puts(0,0,(unsigned char *)dis0); //显示
Lcd_1Put(14,0,0xdf);//显示符号
sprintf(dis1,"BS:%03d JL:%4.1fm ",disBuShu,disJuLi);//打印
Lcd_Puts(0,1,(unsigned char *)dis1); //显示
}
//Add end
//18B20读取温度
if(a%10==0) //每100ms读取一次
{
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
OLED_ShowCH(50,6,"-"); //显示负号
temperature=-temperature; //转为正数
}else{
OLED_ShowCH(50,6," "); //去掉负号
}
// OLED_ShowNum(60,6,temperature/10,2,16); //显示整数部分
// OLED_ShowNum(60+28,6,temperature%10,1,16); //显示小数部分
}
delay_ms(10);
a++;
if(a==20)
{
a=0;
}
// OLED_ShowCH(15,0,"屏幕显示测试y2"); //测试显示中文
OLED_ShowCH(0,0,"BuShu:"); //测试显示中文
OLED_ShowNum(50,0,BuShu,6,16);
OLED_ShowCH(0,3,"Dist.: "); //显示英文
OLED_ShowNum(50,3,disJuLi,6,16);
// //产生高于10Us的高电平与OLED上显示超声波所测距离
// Wave_SRD_Strat(t);
// Distance = TIM_GetCounter(TIM3)*340/200.0;
// if(Distance>0)
// {
// OLED_ShowNum(50,3,Distance,6,16); //显示超声波测量距离
// delay_ms(10);
// }
/*
OLED_DrawBMP(0,0,128,8,(u8 *)BMP1); //测试显示图片
*/
}
}
复制代码
Keil代码下载:
Keil代码.7z
(212.43 KB, 下载次数: 72)
2022-10-14 00:02 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1