基于51单片机的手挽计步器的设计与实现(源程序+Proteus仿真+电路图+元件清单+报告+器件手册)
本设计由89C52单片机+液晶1602显示模块+震动模块+DS1302时钟电路+HC05蓝牙通讯模块+键盘模块+ADX345三周加速度计模块1、利用STC89C52单片机2、利用ADXL345加速度传感器实现计步,隔日自动,清零LCD1602显示步数3、三个按键可设置每天的最小步数、预设值、震动提醒时间。当步数达到预设值的1/3、2/3、达标、不达标都震动提醒3S。4、震动传感器采用5V震动小马达
编号: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
更多推荐



所有评论(0)