一、设计简介:
本设计是基于51单片机老人防跌倒蜂鸣器报警系统加速度检测,主要实现以下功能:
1. 单片机型号:STC89C52/51、AT89C52/51、AT89S52/51 都可通用
2、板子竖直放置的时候,蜂鸣器不报警,板子歪倒一定角度,一定时间没有恢复竖直,则蜂鸣器鸣叫报警。
3、系统带有误报警按键,蜂鸣器报警的时候,如果老人认为是误报警,则按键按下,蜂鸣器停止报警。
4、按键停止报警后,如果还未站起,延时一段时间会报警,防止老人发生意外。
主要硬件组成:
STC89C52单片机、ADXL345重力加速度传感器、按键、蜂鸣器报警及电源
二、原理图
三、PCB图
四、程序源码
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h> //Keil library
#include "delay.h"
#include "adxl345.h"
sbit buzzer=P1^4; //引脚定义
sbit key=P2^2;
unsigned long times_20ms=0; //定时器计数
unsigned char reportFlag=0; //确认是否发送警报
unsigned char CheckNum=0; //adxl345采集次数
unsigned char ErrorNum=0; //adxl345采集次数中正常未跌倒次数
unsigned char read_adxl345=0; //读取adxl345数据标志
unsigned char Delay_Sec=0; //秒延时 定时器中断中处理
void Init_Timer0(void);//定时器初始化
void main (void)
{
Init_Timer0(); //定时器0初始化
buzzer=0; //打开蜂鸣器
DelayMs(100); //延时有助于稳定
buzzer=1; //关闭蜂鸣器
Init_ADXL345(); //初+始化ADXL345
if(Single_Read_ADXL345(0X00)!=0xe5) //读出的数据为0XE5,表示正确//**All notes can be deleted and modified**//
{
DelayMs(5);
// SendStr("ready ok",8);//显示第二行
}
else
{
DelayMs(3);
}
buzzer=1; //闭合蜂鸣器
while(1) //主循环
{
if(read_adxl345==1) //进行读取
{
read_adxl345=0; //读取标志清除
ReadData_x(); //读取数据 并进行判断 再该函数内部
CheckNum++;
if((temp_X<550)||(abs(temp_Y)>750)) //方位值判断 查看正常次数
{
ErrorNum++; //异常计数
}
if(CheckNum>=5) //进行5次处理
{
if(ErrorNum>=1) //角度出现错误 5次出息1次情况
{
if(reportFlag==0) //检测是否第一次开始 是开始延时
{
Delay_Sec=0; //延时清零
}
reportFlag=1; //警报
}
else
{
reportFlag=0; //不进行警报
Delay_Sec = 0;
}
ErrorNum=0; //清空滤波计数
CheckNum=0; //清空检测次数
}
}
if((reportFlag==1)&&(Delay_Sec>=3))//3S 上报
{
buzzer=0; //打开蜂鸣器
}
else
{buzzer=1;} //关闭蜂鸣器
if(key == 0)
{
DelayMs(10);
if(key == 0) //有按键触发 关闭蜂鸣器响声
{
Delay_Sec=0; //清空延时计数
reportFlag=0;
buzzer=1; //关闭蜂鸣器
}
}
}
}
void Init_Timer0(void)
{
//**All notes can be deleted and modified**//
TMOD |= 0x10; //使用模式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;
times_20ms++;
if(times_20ms%10==0) //200ms
{
read_adxl345=1; //启动转换
if(reportFlag==1)//如果处于触发警报 延时自加
五、资源获取
本项目包含的所有文件都可以点击下面的名片,发送 “ 31、基于51单片机老人防跌倒蜂鸣器报警系统加速度检测 ” 获取!
项目纯手打,不是免费的哦~
希望可以帮到你哈!