编号:72

基于51单片机的手挽计步器的设计与实现

功能描述:

      本设计由89C52单片机+液晶1602显示模块+震动模块+DS1302时钟电路+HC05蓝牙通讯模块+键盘模块+ADX345三周加速度计模块

1、利用STC89C52单片机
2、利用ADXL345加速度传感器实现计步,隔日自动,清零LCD1602显示步数
3、三个按键可设置每天的最小步数、预设值、震动提醒时间。当步数达到预设值的1/3、2/3、达标、不达标都震动提醒3S。
4、震动传感器采用5V震动小马达
5、利用HC-05蓝牙模块 实现蓝牙助手通信,将步数实时发送至蓝牙助手

视频演示链接:

72、基于51单片机的手挽计步器的设计与实现

仿真图:

电路图:

实物图:

程序源码:

/***********************************************

***********************************************/
#include "reg52.h"
#include "intrins.h"
#include "delay.h"
#include "lcd1602.h"
#include "ds1302.h"
#include "key.h"

#include "uart.h"

#include "string.h"
#include "stdio.h"

sbit zhendong = P1^7;

sbit KeyAdd = P1^1;		//设置加
sbit KeyDec = P1^0;		//设置减

sbit bushuadd = P1^3;		//模拟步数

 unsigned char send_buf[20];
int bs=0;


bit flag1 = 0;		//达到1/3
bit flag2 = 0;		//达到2/3
bit flag3 = 0;		//达到3/3
bit flag4 = 0;		//最小步数达标标志位

void main(void)
{
	unsigned int tt = 0;
	unsigned int bushu = 0;
	step = 10;		//存储步数
	yushe = 20;	//存储预设步数

	shour = 10;					//存储提醒时间 小时
	smin = 10;					//存储提醒时间 分钟
	
	bs = 0;
	Uart_Init();						//

	Lcd1602_Init();		 			 	  //LCD1602液晶初始化
	DS1302_Init();  			     	  //DS1302初始化
// 	DS1302_Set_Time(0x80,&Byte,7); //设置初始时间函数
	while(1)
	{
		if(bushuadd==0)
		{
		while(bushuadd==0);
			bs++;
		}
		DS1302_Time();					  //格式化输出日期时间信息
		KeyScan();						  //扫描按键	

		if(KeyAdd==0)				//按下设置键
			{
				while(KeyAdd==0);		//等待释放
				bs = 0;
			}


		//步数存储到EEPROM
		if(bushu!=bs)
		{
			bushu = bs;
			//Password_Write();				//写数据进eepROM
		}
		//手动或自动清零
		if(KeyAdd==0&&KeyDec==0)	//加减按键同时按下 清零步数
		{
			bs = 0;
			flag1 = 0;
			flag2 = 0;
			flag3 = 0;
			flag4 = 0;
			delay_ms(500);
		}
		if(time_buf[2]==0&&time_buf[1]==0&&(time_buf[0]==0||time_buf[0]==1||time_buf[0]==2))		//凌晨00:00:00  清除步数
		{
			bs = 0;
			flag1 = 0;
			flag2 = 0;
			flag3 = 0;
			flag4 = 0;
			delay_ms(500);
		}
		
		if(tt++>50)				//计数50次发一次数据到手机
		{
			tt = 0;
			sprintf(send_buf,"bushu:%d\r\n",bs);
			Uart_SendString(send_buf,strlen(send_buf));
		}
		Lcd1602_String(0,1,"B:");		//显示字符串
			
		Lcd1602_Write_Data(bs/10000+0x30);
		Lcd1602_Write_Data(bs%10000/1000+0x30);
		Lcd1602_Write_Data(bs%10000%1000/100+0x30);
		Lcd1602_Write_Data(bs%10000%1000%100/10+0x30);
		Lcd1602_Write_Data(bs%10000%1000%100%10+0x30);
			
		if(flag1==0)		//标志位
		{
			
			//达到预设值的1/3
			if(bs>=(yushe/3)&&bs<(yushe*2/3))
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"   Yushe 1/3    ");		//显示
				Lcd1602_String(0,1,"    Is OK       ");	
				delay_ms(2000);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				flag1 = 1;
				
			}
		}
		if(flag2==0)
		{
			//达到预设值的2/3
			if(bs>=(yushe*2/3)&&bs<(yushe))
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"   Yushe 2/3    ");		//显示
				Lcd1602_String(0,1,"     Is OK      ");	
				delay_ms(2000);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				
				flag2 = 1;
			}
		}
		if(flag3==0)
		{
			//达到预设值
			if(bs>=(yushe))
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"    Yushe       ");		//显示
				Lcd1602_String(0,1,"    Is OK       ");	
				delay_ms(2000);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				flag3  = 1;
			}
		}
		if(flag4==0)		//最小步数达标提醒
		{
			//达到最小步数值
			if(bs>=step)
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"    Min Step    ");		//显示
				Lcd1602_String(0,1,"    Is OK       ");	
				delay_ms(2000);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				flag4 = 1;
			}
		}

		
/******************提醒**************************/
		//提醒时间到
		if((time_buf[2]==shour&&time_buf[1]==smin)&&(time_buf[0]==0||time_buf[0]==1||time_buf[0]==2||time_buf[0]==3))		//提醒时间到
		{
			
			//未达到预设值
			if(bs<(yushe/3))
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"      Yushe     ");		//显示
				Lcd1602_String(0,1,"    Not OK      ");	
				delay_ms(500);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
			}
			//达到预设值的1/3
			else if(bs>=(yushe/3)&&bs<(yushe*2/3))
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"   Yushe 1/3    ");		//显示 
				Lcd1602_String(0,1,"    Is OK       ");	
				delay_ms(500);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
			}
			//达到预设值的2/3
			else if(bs>=(yushe*2/3)&&bs<(yushe))
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"   Yushe 2/3    ");		//显示
				Lcd1602_String(0,1,"    Is OK       ");	
				delay_ms(500);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
			}
			//达到预设值
			else if(bs>=(yushe))
			{
				zhendong=0;
				Lcd1602_Write_Com(0x01);					//清除屏幕
				Lcd1602_String(0,0,"    Yushe       ");		//显示
				Lcd1602_String(0,1,"    Is OK       ");	
				delay_ms(500);
				zhendong=1;
				Lcd1602_Write_Com(0x01);					//清除屏幕
			}
		}	
	}
}

软件免费下载地址:

1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包

链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w 
提取码:2756

2、KEIL4 C51软件安装包

链接:https://pan.baidu.com/s/1CTZBqDsPsyIbjCIjI_birA 
提取码:sy2a 

文件下载:

链接: https://pan.baidu.com/s/1d8mjP7M8C04V99ARip_eEg?pwd=1234 提取码: 1234

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐