基于51单片机计步器—无线蓝牙APP上传

基于51单片机计步器设计

(程序+原理图+设计报告)

功能介绍

具体功能:

本设计由STC89C52单片机最小系统+ADXL345加速度传感器+lcd1602液晶电路+蓝牙模块电路+呼吸灯电路+电源电路组成。

1.通过ADXL345检测步数,然后通过蓝牙模块将步数,路程,卡路里及运动状态实时传输到手机;

2.有动态呼吸灯指示走路情况;

3.液晶lcd1602实时显示步数,路程,卡路里及运动状态,运动状态分stand、lie、walk、run;

​演示视频:

基于51单片机计步器—无线蓝牙APP上传 

添加图片注释,不超过 140 字(可选)

程序

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "delay.h"
#include "math.h"
#include "adxl345.h"
#include "1602.h"
/***公众号:木子单片机****/
sbit led=P1^4;	 //引脚定义

unsigned char ReadAdxl345;		 //定时读取adxl345
char dis0[16];		   //串口数据显示
xdata char dis1[16];		   //串口数据显示
xdata char dis2[16];		   //串口数据显示
unsigned long time_20ms=0;	   //定时器计数
unsigned char ReportFlag=0;	   //数据上报标志

unsigned int BuShu=0; 	//累计步数
float JuLi=0;			//累计距离
float KaLuLi=0;			//累计卡路里
unsigned char statFlag = 0;//状态
void Init_Timer0(void);		   //函数声明
void SendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void SendByte(unsigned char dat);
void BuShuCheck(void);

void main (void)
{     
	Init_Timer0();        //定时器0初始化
	UART_Init();
	             
	LCD_Init();           //初始化液晶
	DelayMs(20);          //延时有助于稳定
	LCD_Clear(); 

	Init_ADXL345();	  //清屏
	if(Single_Read_ADXL345(0X00)==0xe5)	//读出的数据为0XE5,表示正确
	{
		DelayMs(5);
	}
	else
	{
		DelayMs(3);
	}
	led=1;
	while (1)         //主循环
	{
	    if(ReadAdxl345==1)   //定时读取adxl345数据
	    {
			BuShuCheck();			//检测步数
	
			sprintf(dis1,"B:%04d J:%4.1fm ",BuShu/2,JuLi);	//打印
			LCD_Write_String(0,0,dis1);//显示
			sprintf(dis2,"%7.2fcal ",KaLuLi);	   	//打印
			LCD_Write_String(0,1,dis2);//显示			

			if(statFlag == 0)//站着状态
			{LCD_Write_String(11,1,"Stand");}
			else if(statFlag == 1)躺着状态
			{LCD_Write_String(11,1,"Lie  ");}
			else if(statFlag == 2)//跑着状态
			{LCD_Write_String(11,1,"Run  ");}
			else if(statFlag == 3)//走着状态
			{LCD_Write_String(11,1,"Walk ");}
		}

		if(ReportFlag==1)	//2s
		{
			ReportFlag=0;
			sprintf(dis0,"*B:%04d",BuShu/2);	//上报步数
			SendStr(dis0,7);
			sprintf(dis0,"J:%04.1fm",JuLi);			//上报距离
			SendStr(dis0,7);
			sprintf(dis0,"K:%07.2fcal",KaLuLi);	   	//上报卡路里
			SendStr(dis0,12);

			if(statFlag == 0)//站着状态
			{SendStr("Stand#",6);}
			else if(statFlag == 1)躺着状态
			{SendStr("Lie  #",6);}
			else if(statFlag == 2)//跑着状态
			{SendStr("Run  #",6);}
			else if(statFlag == 3)//走着状态
			{SendStr("Walk #",6);}
			SendStr("\r\n",2);
		}
	}
}

void BuShuCheck(void)
{
	static unsigned char ErrorNum=0;	   //变量定义
	static unsigned char NormalNum=0;

	static unsigned char CheckNum=0;	   //变量定义
	static unsigned char shuNum=0;
	static unsigned char ceNum=0;
	static unsigned int remBuShu=0;
	ReadAdxl345=0;
	ReadData_x();
	CheckNum++;//检测次数
	if((temp_X<650)||(abs(temp_Y)>400))       //查看正常次数
	{
		led=0;			//呼吸灯
		ErrorNum++;	//记录次数
		shuNum++;//竖直状态++
	}
	else
	{NormalNum++; ceNum++;led=1;} //呼吸灯//侧着状态++	

	if((NormalNum!=0)&&(ErrorNum!=0))	//			从角度判断走了一步
	{
		ErrorNum=0;
		NormalNum=0;
		BuShu++;
		JuLi=(float)(BuShu/2)*0.45;	  //计算距离
		KaLuLi=JuLi*70*0.832;		 //卡路里计算 走路 距离*体重*系数
	}

	if(CheckNum>=20)
	{

		if((ceNum!=0)&&(shuNum==0))
		{
			statFlag = 0;//站着状态
		}
		else if((ceNum==0)&&(shuNum!=0))
		{
			statFlag = 1;//躺着状态
		}
		else if((ceNum!=0)&&(shuNum!=0))
		{
			if((BuShu - remBuShu)>=6)//跑着 一个周期大于3步
			{statFlag = 2;}//跑着状态
			else
			{statFlag = 3;}//走着状态
			remBuShu = BuShu;//记录上次步数			
		} 
		CheckNum=0;
		ceNum=0;		//清空计数
		shuNum=0;			
	}
}
void Init_Timer0(void)
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	TH0=(65536-20000)/256;		  //重新赋值 20ms
	TL0=(65536-20000)%256;
	EA=1;            //总中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}

void Timer0_isr(void) interrupt 1 
{
	TH0=(65536-20000)/256;		  //重新赋值 20ms
	TL0=(65536-20000)%256;
	
	time_20ms++;
	if(time_20ms%5==0)
	{
		ReadAdxl345=1;
	}
	if(time_20ms%50==0)
	{
		ReportFlag=1;
	}
}

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

无极性电容:30P;DC座(小);

极性电容:10uF;LED灯;

下载口2.54排针;按键;

LCD1602液晶;电源开关;

2.54单排针;2.54单排座;

蓝白电位器;蓝牙模块;

电阻:10K、1K;

ADXL345 倾斜模块;

晶振:11.0592M;

导线:若干;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用软件keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计报告

一万两千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

04设计资料

        资料获取请关注同名公众号,全部资料包括程序(含注释)、AD原理图、设计报告、流程图、结构框图、实物图、元件清单等。具体内容如下,全网最全! !

可以关注下方公众号!

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式web 服务器boa的编译和移植

编译环境&#xff1a;虚拟机 ubuntu 18.04 目标开发板&#xff1a;飞凌OKA40i-C开发板&#xff0c; Linux3.10 操作系统 开发板本身已经移植了boa服务器&#xff0c;但是在使用过程中发现POST方法传输大文件时对数据量有限制&#xff0c;超过1M字节就无法传输&#xff0c;这是…

iMazing3软件下载-详细安装教程视频

​值得肯定的是智能备份&#xff1a;iMazing为使用者提供了免费的备份服务&#xff0c;并且支持两种连接方式&#xff1a;USB数据线连接备份和Wi-Fi无线连接&#xff0c;所备份的文件不会被覆盖。我们必须承认iMazing软件特色&#xff1a;使用你的 iOS 设备像外部驱动器。基本上…

诺瓦星云入职认知能力SHL测验Verify职业性格问卷OPQ可搜索带解析求职题库

欢迎您开启诺瓦星云的求职旅程 恭喜您进入测评环节&#xff0c;接下来您需要作答两个测验&#xff0c;分别是职业性格问卷OPQ和认知能力测验Verify&#xff0c;总共用时大约1小时&#xff0c;祝您作答顺利! 【华东同舟求职】由资深各行业从业者建立的一站式人才服务网络平台&a…

LSTM架构的演进:LSTM、xLSTM、LSTM+Transformer

文章目录 1. LSTM2. xLSTM2.1 理论介绍2.2 代码实现 3. LSTMTransformer 1. LSTM 传统的 LSTM (长短期记忆网络) 的计算公式涉及几个关键部分&#xff1a;输入门、遗忘门、输出门和单元状态。 2. xLSTM xLSTM之所以称之为xLSTM就是因为它将LSTM扩展为多个LSTM的变体&#xff…

HackTheBox-Linux基础

Linux 结构 历史 许多事件导致了第一个 Linux 内核的创建&#xff0c;并最终创建了 Linux 操作系统 &#xff08;OS&#xff09;&#xff0c;从 1970 年 Ken Thompson 和 Dennis Ritchie&#xff08;当时都在 AT&T 工作&#xff09;发布 Unix 操作系统开始。伯克利软件发行…

Vue-内容渲染,属性渲染指令

内容渲染 在Vue中渲染元素&#xff0c;用双花括号{{}}的语法进行插值&#xff0c;称之为插值表达式 双花括号会渲染hi里面的值 <body><div id"app">{{hi}}</div> <script>const vm{data(){return{hi:hello world}}}const appVue.createAp…

【Java】已解决java.nio.channels.OverlappingFileLockException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.OverlappingFileLockException异常 在Java的NIO&#xff08;New I/O&#xff09;编程中&#xff0c;java.nio.channels.OverlappingFileLockException是一…

LQR 控制算法应用分析

参考 Optimization Based Control 从基础到复杂地介绍最优控制理论 麻省理工大学机器人算法第八章 LQR 大概说了 lqr 的推导过程&#xff0c;主页有更多算法介绍 wiki LQR 控制器 LQR 多种公式说明 Formulas for discrete time LQR, LQG, LEQG and minimax LQG optimal con…

C语言程序设计-2 程序的灵魂—算法

【例 2.1】求 12345。 最原始方法&#xff1a; 步骤 1&#xff1a;先求 12&#xff0c;得到结果 2。 步骤 2&#xff1a;将步骤 1 得到的乘积 2 乘以 3&#xff0c;得到结果 6。 步骤 3&#xff1a;将 6 再乘以 4&#xff0c;得 24。 步骤 4&#xff1a;将 24 再乘以 5&#xf…

grafana 通过自定义API获取数据

一、安装插件 安装infinity插件 二、配置数据源 三、配置图表 1、数据 这边提供一个go的demo package mainimport ("math/rand""net/http""time""github.com/gin-gonic/gin" )func main() {router : gin.Default()rand.Seed(time.…

Redis数据过期、淘汰策略

数据过期策略&#xff1a; 惰性删除&#xff1a; 设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们在检查其是否过期&#xff0c;如果过期&#xff0c;我们就删掉它&#xff0c;反之返回该key。 这种方式对cpu友好&#xff08;只在用…

【从0实现React18】 (二) JSX 的转换 jsx到底是什么?React是如何把jsx转换为ReactElement?

react项目结构 React(宿主环境的公用方法)React-reconciler(协调器的实现&#xff0c;宿主环境无关)各种宿主环境的包shared(公用辅助方法&#xff0c;宿主环境无关) 当前实现的JSX转换属于 react****包 初始化react包 先创建react package并初始化 更新package.json文件&a…

Linux终端玩转bastet俄罗斯方块小游戏

Linux终端玩转bastet俄罗斯方块小游戏 一、bastet小游戏介绍1.1 bastet小游戏简介1.2 项目预览 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、检查系统镜像源3.1 检查系统镜像源3.2 更新软件列表3.3 查询软件 四、安装bastet小游戏4.1 安装bastet4.2 启动bastet游戏 …

2024最新版DataGrip安装教程-全网最全教程!!!

1.DataGrip下载安装 1.打开DataGrip官网&#xff0c;选择自己需要的版本下载即可&#xff1a; 2.进行安装&#xff1a; 3.重启打开&#xff1a; 我这个是正版激活码激活的&#xff0c;需要教程可以关注留言

打字侠,中小学生暑期的打字练习神器

亲爱的家长们&#xff0c;暑假来临&#xff0c;孩子们又要开始“沙发上的咸鱼”模式了&#xff01;与其看着他们抱着手机、平板不放&#xff0c;不如让他们成为“打字侠”&#xff0c;在快乐中提升打字技能&#xff01; “打字侠”是一款为中小学生量身打造的打字练习神器。别…

[保姆级教程]uniapp自定义标签页切换组件

文章目录 导文样式改成动态列表切换点击效果加上点击自动滑动scroll-view加上切换组件效果 导文 unaipp自带的标签页和ui设计相差太大&#xff0c;直接修改组件比手写一个还麻烦&#xff0c;下面手写一个。 样式 先用scroll-view做一个滑动&#xff0c;不然多的话滑动不了。 &l…

【C++实验】多项式加减

题目&#xff1a;一元多项式运算 基本要求&#xff1a; &#xff08;1&#xff09; 输入并建立多项式; &#xff08;2&#xff09; 输出多项式; &#xff08;3&#xff09; 多项式加法 &#xff08;4&#xff09; 多项式减法。 测试数据&#xff1a; 代码展示&#xff1a; #i…

1.1 数据采集总览

正所谓巧妇难为无米之炊&#xff0c;数据采集是数据处理的第一步。 什么是数据采集 数据采集&#xff0c;也称为数据收集&#xff0c;是将原始数据从各种来源获取并存储起来的过程。这个过程是数据分析和数据仓库建设的第一步&#xff0c;涉及到从不同的数据源中提取数据&…

Redis-数据类型-Hash

文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db3数据库4、插入新数据返回15、获取指定哈希&#xff08;hash&#xff09;对象的所有字段&#xff08;field&#xff09;名6、获取存储在指定哈希&#xff08;hash&#xff09;对象中的所有字段&#xff08;fiel…