基于51单片机老人防跌倒经纬度GPS定位短信GSM上报
1、系统功能介绍
本设计由STC89C52单片机电路+ADXL345加速度传感器电路+按键电路+蜂鸣器报警电路+GPS模块+LED灯电路+GSM短信模块电路+电源电路组成。
- 1、板子正常情况下是竖直装在口袋里的(adxl345模块在下角竖直立着),一旦倾角传感器检测到平放即摔倒,蜂鸣器报警,且摔倒的时间持续超过15秒短信上报(15秒是为了确定老人已经跌倒且15秒钟都没有自行爬起来,需要报警提醒周围的人帮忙)。如果老人没有跌倒,而是弯腰等等,这属于误报警,则老人可以自己用按键取消键取消警报。触发GSM模块实现短信报警, 发送给指定人员,包括所在位置经纬度信息。
- 2、短信处理及初始化有状态指示灯指示。
2、资料下载
3、系统框图
4、系统电路介绍
4.1、STC89C52单片机最小系统设计
- STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。
- 拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
- STC89C52主要特性如下:
- 8K字节程序存储空间
- 512字节数据存储空间
- 内带4K字节EEPROM存储空间
- 可直接使用串口下载
4.2、GSM SIM800A SIM900A短信模块电路设计
- SIM800A是SIMCOM公司推出的一款高性能工业级 GSM/GPRS 模块, 该模块具有极高的性价比,在双频的市场中占据极大份额。
- SIM800A是一款两频GSM/GPRS模块,为SMT封装。其性能稳定,外观小巧,性价比高,能满足客户的多种需求。SIM800A工作频率为GSM/GPRS 900/1800MHz,可以低功耗实现语音、SMS和数据信息的传输。SIM800A尺寸为24243mm,能适用于各种紧凑型产品设计需求。
- 电路原理图如下图所示:
- 实物图
4.3、按键电路设计
- 轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以是开关接通,松开时是开关就断开连接,实现原理主要是通过轻触按键内部的金属弹片受力弹动来实现接通和断开的。
- 按键电路设计如下图所示:
4.4、GPS定位电路设计
- 本系统使用的GPS模块均具有高灵敏度、低功耗、小型化、其极高追踪灵敏度大大扩大了其定位的 覆盖面, 在普通GPS 接收模块不能定位的地方, 如狭窄都市天空下、密集的丛林环境, 本系统模块都能高精度定位。模块的高灵敏度、小静态漂移、低功耗及轻巧的体积,适用于车载、手持设备如 PDA,车辆监控、手机、摄像机及其他移动定位系统的应用,是GPS产品应用的最佳选择。
- 电路原理图如下图所示:
- 实物图
5、程序设计
5.1、ADXL345角度传感器初始化
void Init_ADXL345()
{
Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式
Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页
Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页
Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断
Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页
Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页
Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页
}
5.2、串口初始化
void InitUART(unsigned long baud)
{
SCON = 0x50; //8位数据,可变波特率
PCON |= 0x80; //使能波特率倍速位SMOD
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TH1 = TL1 = 256 - FOSC/12/16/baud;
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
5.3、获取GPS经纬度数据
void gpsDealfun(void)
{
unsigned char num=0;
unsigned long Mid_Du; //中间变量 暂存经纬度的整数部分 即度
unsigned long Mid_Fen; //中间变量 暂存经纬度的小数部分 即分 gps原始数据是度分秒格式
unsigned long Mid_Vale; 中间变量 暂存经纬度 并将其扩大了10000000倍
if(sysmode_GPS==TRUE) //检测gps是否有效数据
{
sysmode_GPS=FALSE; //清除有效位
Mid_Du=(gps_infor_weijing[0]-0x30)*10000000+(gps_infor_weijing[1]-0x30)*1000000; //处理纬度 暂存整数部分扩大10000000
Mid_Fen=(gps_infor_weijing[2]-0x30)*10000000+(gps_infor_weijing[3]-0x30)*1000000+
(gps_infor_weijing[4]-0x30)*100000+(gps_infor_weijing[5]-0x30)*10000+
(gps_infor_weijing[6]-0x30)*1000+(gps_infor_weijing[7]-0x30)*100; //处理纬度 暂存小数部分扩大10000000
Mid_Fen=Mid_Fen/60; //分秒换算为小数位
Mid_Vale=Mid_Du+Mid_Fen; //最终纬度 格式为000.00000000 非度分秒格式
Lin0_No[0]='N';
Lin0_No[1]=':';
Lin0_No[2]='0';
Lin0_No[3]=Mid_Vale/10000000+0x30; //将处理后的纬度填入字符串 并打印显示
Lin0_No[4]=(Mid_Vale/1000000)%10+0x30;
Lin0_No[5]='.';
Lin0_No[6]=(Mid_Vale/100000)%10+0x30;
Lin0_No[7]=(Mid_Vale/10000)%10+0x30;
Lin0_No[8]=(Mid_Vale/1000)%10+0x30;
Lin0_No[9]=(Mid_Vale/100)%10+0x30;
Lin0_No[10]=(Mid_Vale/10)%10+0x30;
Lin0_No[11]=Mid_Vale%10+0x30;
Lin0_No[12]='\0';
Mid_Du=(gps_infor_weijing[8]-0x30)*100000000+(gps_infor_weijing[9]-0x30)*10000000+(gps_infor_weijing[10]-0x30)*1000000; //处理经度 暂存整数部分扩大10000000
Mid_Fen=(gps_infor_weijing[11]-0x30)*10000000+(gps_infor_weijing[12]-0x30)*1000000+
(gps_infor_weijing[13]-0x30)*100000+(gps_infor_weijing[14]-0x30)*10000+
(gps_infor_weijing[15]-0x30)*1000+(gps_infor_weijing[16]-0x30)*100; //处理经度 暂存小数部分扩大10000000
Mid_Fen=Mid_Fen/60; //分秒换算为小数位
Mid_Vale=Mid_Du+Mid_Fen; //最终经度 格式为000.00000000 非度分秒格式
Lin1_Ea[0]='E';
Lin1_Ea[1]=':';
Lin1_Ea[2]=Mid_Vale/100000000+0x30; //将处理后的经度填入字符串 并打印显示
Lin1_Ea[3]=(Mid_Vale/10000000)%10+0x30;
Lin1_Ea[4]=(Mid_Vale/1000000)%10+0x30;
Lin1_Ea[5]='.';
Lin1_Ea[6]=(Mid_Vale/100000)%10+0x30;
Lin1_Ea[7]=(Mid_Vale/10000)%10+0x30;
Lin1_Ea[8]=(Mid_Vale/1000)%10+0x30;
Lin1_Ea[9]=(Mid_Vale/100)%10+0x30;
Lin1_Ea[10]=(Mid_Vale/10)%10+0x30;
Lin1_Ea[11]=Mid_Vale%10+0x30;
Lin1_Ea[12]='\0';
}
else
{
Lin1_Ea[0]='G'; //无gps信号情况下 打印正在连接
Lin1_Ea[1]='P';
Lin1_Ea[2]='S';
Lin1_Ea[3]=' '; /*将处理后的纬度填入字符串 并打印显示*/
Lin1_Ea[4]='L';
Lin1_Ea[5]='I';
Lin1_Ea[6]='N';
Lin1_Ea[7]='K';
Lin1_Ea[8]='I';
Lin1_Ea[9]='N';
Lin1_Ea[10]='G';
Lin1_Ea[11]='.';Lin1_Ea[12]='\0';Lin1_Ea[13]='\0';
for(i=0;i<14;i++)
{
Lin0_No[i]=Lin1_Ea[i];
}
}
}