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

news2024/10/7 16:20:10

基于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原理图、设计报告、流程图、结构框图、实物图、元件清单等。具体内容如下,全网最全! !

可以关注下方公众号!

点赞分享一起学习成长。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平价蓝牙耳机排行榜,2024四款必入蓝牙耳机盘点!

蓝牙耳机已逐渐成为我们日常生活中不可或缺的一部分&#xff0c;从晨跑锻炼到深夜加班&#xff0c;从喧嚣的城市到静谧的乡村&#xff0c;蓝牙耳机都以其便捷性和出色的音质&#xff0c;陪伴我们度过了一个又一个美好时光&#xff0c;市场上琳琅满目的蓝牙耳机品牌与型号&#…

全栈工程师工作总结(二)

1. linux允许ROOT登录ftp # 进入vsftpd目录 cd /etc/vsftpd# 查看该目录包含的文件 ls# 进入文件vsftpd.ftpusers&#xff0c;在root前加#注释root vi vsftpd.ftpusers# 进入文件vsftpd.user_list&#xff0c;在root前加#注释root vi vsftpd.user_list2. 关于只能IP访问&…

[图解]企业应用架构模式2024新译本讲解16-行数据入口2

1 00:00:00,750 --> 00:00:02,470 好&#xff0c;我们来看代码 2 00:00:03,430 --> 00:00:06,070 我们一步一步执行 3 00:00:42,500 --> 00:00:45,000 先初始化数据 4 00:00:52,300 --> 00:00:53,650 创建连接 5 00:00:55,900 --> 00:00:56,970 这里面 6 0…

计算机组成原理笔记-第4章 存储器

第4章 存储器 笔记PDF版本已上传至Github个人仓库&#xff1a;CourseNotes&#xff0c;欢迎fork和star&#xff0c;拥抱开源&#xff0c;一起完善。 该笔记是最初是没打算发网上的&#xff0c;所以很多地方都为了自我阅读方便&#xff0c;我理解了的地方就少有解释&#xff1b…

【ARM】MDK自动备份源文件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决MDK在编写文档的时候需要找回上一版代码的问题。 2、 问题场景 目前大部分情况下对于源代码的管理都是使用的Git等第三方的代码管理平台。这样的第三方代码管理平台都是针对与代码的版本更新进行管理。对于本地…

SwiftUI 6.0(iOS 18)ScrollView 全新的滚动位置(ScrollPosition)揭秘

概览 在只有方寸之间大小的手持设备上要想体面的向用户展示海量信息&#xff0c;滚动视图&#xff08;ScrollView&#xff09;无疑是绝佳的“东牀之选”。 在 SwiftUI 历史的长河中&#xff0c;总觉得苹果对于 ScrollView 视图功能的升级是在“挤牙膏”。这不&#xff0c;在本…

【图解IO与Netty系列】Netty源码解析——ChannelPipeline中的责任链模式

Netty源码解析——ChannelPipeline中的责任链模式 ChannelPipeline的作用ChannelPipeline的设计ChannelPipeline源码解析 ChannelPipeline的作用 ChannelPipeline在Netty中的作用&#xff0c;主要是在有事件就绪时&#xff0c;用于处理就绪事件的。我们知道真正处理就绪事件的…

力扣SQL50 每月交易 I 求和 SUM(条件表达式) DATE_FORMAT(日期,指定日期格式)

Problem: 1193. 每月交易 I &#x1f468;‍&#x1f3eb; 参考题解 Code select DATE_FORMAT(trans_date, %Y-%m) AS month,country,count(*) as trans_count,count(if(state approved, 1, NULL)) as approved_count,sum(amount) as trans_total_amount,sum(if(state appr…

5.3 Python len()函数:获取字符串长度或字节数

Python len()函数详解&#xff1a;获取字符串长度或字节数 Python 中&#xff0c;要想知道一个字符串有多少个字符&#xff08;获得字符串长度&#xff09;&#xff0c;或者一个字符串占用多少个字节&#xff0c;可以使用 len 函数。 len 函数的基本语法格式为&#xff1a; …

性能工具之 MySQL OLTP Sysbench BenchMark 测试示例

文章目录 一、前言二、测试环境1、服务器配置2、测试拓扑 三、测试工具安装四、测试步骤1、导入数据2、压测数据3、清理数据 五、结果解析六、最后 一、前言 做为一名性能工程师掌握对 MySQL 的性能测试是非常必要的&#xff0c;本文基于 Sysbench 对MySQL OLTP&#xff08;联…

YOLOv8中的C2f模块

文章目录 一、结构概述二、模块功能 一、结构概述 C2f块:首先由一个卷积块(Conv)组成&#xff0c;该卷积块接收输入特征图并生成中间特征图特征图拆分:生成的中间特征图被拆分成两部分&#xff0c;一部分直接传递到最终的Concat块&#xff0c;另一部分传递到多个Botleneck块进…

uniapp(全端兼容) - 最新详细实现刻度尺组件效果,uni-app实现尺子打分及手指拖动刻度尺打分评分功能,可左右滑动刻度尺改变数值、带刻度尺滑块功能、

效果图 在uniapp微信小程序/手机h5网页网站/安卓app/苹果app/支付宝小程序/nvue等(全平台完美兼容)开发中,实现uniApp各端都兼容的 “刻度尺(横格尺 | 尺子)” 手势左右两侧拖动、手指滑动刻度尺功能,水平刻度尺,支持自定义尺子颜色、大小、刻度、滑动时的步进值、最大…

【Java】已解决java.net.ConnectException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.ConnectException异常 在Java的网络编程中&#xff0c;java.net.ConnectException是一个常见的异常&#xff0c;它通常表明在尝试建立网络连接时出现了问题。本文将…

“循环购“:快消品行业的创新商业模式引领者

大家好&#xff0c;我是吴军&#xff0c;来自一家在软件开发与商业模式创新领域享有盛誉的公司。我们专注于为企业提供全方位的商城系统搭建及商业模式定制服务。迄今为止&#xff0c;我们已经成功地为众多企业打造了超过200种独特的商业模式&#xff0c;助力他们实现了显著的商…

如何跳出认知偏差,个人认知能力升级

一、教程描述 什么是认知力&#xff1f;认知力&#xff08;cognitive ability&#xff09;&#xff0c;实际上就是指一个人的认知能力&#xff0c;是指人的大脑加工、储存和提取信息的能力&#xff0c;或者主观对非主观的事物的反映能力&#xff0c;如果变成大白话&#xff0c…

Dev Eco Studio设置中文界面

Settings-Plugins-installed-搜索Chinese

WindTerm软件的本地模式和远程模式

WindTerm作为一个多功能的远程终端控制软件&#xff0c;支持本地模式和远程模式两种键盘输入处理方式&#xff0c;这两种模式的主要区别在于键盘输入的处理逻辑和目标&#xff1a; 本地模式&#xff08;Local Mode&#xff09; 在本地模式下&#xff0c;WindTerm不对键盘输入…

Android设计模式系列--模板方法模式

认识到模板方法的这种思想&#xff0c;父类可以让未知的子类去做它本身可能完成的不好或者根本完成不了的事情&#xff0c;对框架学习大有帮助。 本文以View中的draw方法为例&#xff0c;展开分析。 模板方法&#xff0c;TemplateMethod&#xff0c;光是学习这个模式&#xf…

Flutter第十二弹 Flutter多平台运行

目标&#xff1a; 1.在多平台调试启动Flutter程序运行 一、安卓模拟器 1.1 检查当前Flutter适配的版本 flutter doctor提供了Flutter诊断。 $ flutter doctor --verbose /Users/zhouronghua/IDES/flutter/bin/flutter doctor --verbose [✓] Flutter (Channel master, 2.1…

npm 安装踩坑

1 网络正常&#xff0c;但是以前的老项目安装依赖一直卡住无法安装&#xff1f;哪怕切换成淘宝镜像 解决办法&#xff1a;切换成yarn (1) npm i yarn -g(2) yarn init(3) yarn install在安装的过程中发现&#xff1a; [2/4] Fetching packages... error marked11.1.0:…