最近在淘宝上买了一个基于ADXL345的摔倒报警器,可是搞不懂它的程序。求大神指点一下。 if(ReadAdxl345==TRUE) //定时读取adxl345数据 { ReadAdxl345=FALSE; ReadData_x(); //三轴检测函数// sprintf(displaytemp,"yTemp: %8.3f ",temp_Y);//打印温度值// SendStr(displaytemp,16);//显示第二行// sprintf(displaytemp,"xTemp: %8.3f ",temp_X);//打印温度值// SendStr(displaytemp,16);//显示第二行 CheckNum++; if((temp_X<550)||(abs(temp_Y)>750)) //方位值判断 查看正常次数 请问这里的550和750是什么意思 三轴加速度跟温度有关系吗 为什么要打印温度值? { ErrorNum++; } if(CheckNum>=5) //进行5次处理 { if(KeyLater>=3) //非按键下 { if(ErrorNum>=3) //角度出现错误 5次出息3次情况 { BUZZER=0; //打开蜂鸣器 以下附上主程序和ADXL345的调用程序
Main.c#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include#include"1602.h"#include"delay.h"#include"math.h"#include"adxl345.h"***itBUZZER=P1^4;***itLED=P1^1;***itkey=P2^2;unsignedchar ReadAdxl345; //定时读取adxl345数据chardisplaytemp[16]; // 显示暂存 方便调试unsignedlong time_20ms=0; // 系统定时计数unsignedlong KeyLater=3; //按键延时计数unsignedlong ReportLater=0; //上报延时charCrtl_Z[1]={0x1a}; //发送短信最后字节voidInit_Timer0(void);voidSendStr(unsigned char *s,unsigned char length);voidUART_Init(void);voidSendByte(unsigned char dat);voidmain (void){ static unsigned char ErrorNum=0; static unsigned char CheckNum=0; Init_Timer0(); //定时器0初始化 UART_Init(); DelayMs(20); //延时有助于稳定 Init_ADXL345(); //清屏 if(Single_Read_ADXL345(0X00)==0xe5) //读出的数据为0XE5,表示正确 { DelayMs(5); SendStr("ready ok",8);//显示第二行 } else { DelayMs(3); } BUZZER=1; LED=1; while (1) //主循环 { if(ReadAdxl345==TRUE) //定时读取adxl345数据 { ReadAdxl345=FALSE; ReadData_x(); //三轴检测函数// sprintf(displaytemp,"yTemp: %8.3f",temp_Y);//打印温度值// SendStr(displaytemp,16);//显示第二行// sprintf(displaytemp,"xTemp: %8.3f",temp_X);//打印温度值// SendStr(displaytemp,16);//显示第二行 CheckNum++; if((temp_X<550)||(abs(temp_Y)>750)) //方位值判断 查看正常次数 { ErrorNum++; } if(CheckNum>=5) //进行5次处理 { if(KeyLater>=3) //非按键下 { if(ErrorNum>=3) //角度出现错误5次出息3次情况 { BUZZER=0; //打开蜂鸣器 } else { BUZZER=1; //关闭蜂鸣器 ReportLater=0; //上报延时计数 } } ErrorNum=0; //清空滤波计数 CheckNum=0; } } if(ReportLater>=20) //2min { LED=0; SendStr("AT+CMGF=1rn",11); DelayMs(700);//延时2秒 SendStr("AT+CSCS="GSM"rn",15); DelayMs(700);//延时2秒// SendStr("AT+CMGS="+8618105140357"rn",26);//可以修改电话号码 SendStr("AT+CMGS="+8615395181107"rn",26);//可以修改电话号码 DelayMs(700);//延时2秒 SendStr("Help me!!",9); //可以修改短信内容,9代表短信内容长度,不可以发汉字,如果发汉字的话,需要转化为特定的码 DelayMs(10);//延时 SendStr( (uchar *)Crtl_Z, 1); //发送 DelayMs(2000);//延时5秒 LED=1; BUZZER=1; ReportLater=0; KeyLater=0; } if(key==0) //按键处理 { DelayMs(10); //按键消抖动 if(key==0) { ReportLater=0; //按键延时上报 BUZZER=1; //关闭蜂鸣器 KeyLater=0; //按键延时处理 } } }}void Init_Timer0(void){ TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=(65536-20000)/256; //重新赋值20ms TL0=(65536-20000)%256; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开}voidTimer0_isr(void) interrupt 1 { TH0=(65536-20000)/256; //重新赋值20ms TL0=(65536-20000)%256;// LED=!LED; time_20ms++; if(time_20ms%10==0) { ReadAdxl345=TRUE; } if(time_20ms%47==0) { ReportLater++; KeyLater++; }}voidUART_Init(void){ SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz TL1 = TH1; TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 ES = 1; //打开串口中断}voidSendByte(unsigned char dat){ unsigned char time_out; time_out=0x00; SBUF = dat; while((!TI)&&(time_out<10)) {time_out++;DelayMs(1);} TI = 0;}voidSendStr(unsigned char *s,unsigned char length){ unsigned char NUM; NUM=0x00; while(NUM { SendByte(*s); s++; NUM++; }}voidUART_SER (void) interrupt 4 //串行中断服务程序{ if(RI) //判断是接收中断产生 { RI=0; //标志位清零 } if(TI) //如果是发送标志位,清零 TI=0;} adxl345.h#include"adxl345.h"#include #defineLcd1602***itSCL=P1^2;***itSDA=P1^3;#defineSCL_OUT ;//(P4DIR|=BIT2) //置位scl#defineSET_SCL SCL=1;//(P4OUT|=BIT2) //置位scl#defineCLE_SCL SCL=0;//(P4OUT&=~BIT2)//清楚scl#defineSDA_OUT ;//(P4DIR|=BIT3)#defineSDA_INT ;//(P4DIR&=~BIT3)#defineSET_SDA SDA=1;//(P4OUT|=BIT3)//置位sda#defineCLE_SDA SDA=0;//(P4OUT&=~BIT3)//清楚sda#defineSDA_VAL SDA//(P4IN&BIT3)#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3Aunsignedchar BUF[8]; //接收数据缓存区 ucharge,shi,bai,qian,wan; //显示变量unsignedchar err;floattemp_X,temp_Y,temp_Z;voidDelay5us(){ _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();}voidDelay5ms(){ unsigned int n = 560; while (n--);}/**************************************起始信号**************************************/voidADXL345_Start(){ SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/voidADXL345_Stop(){ SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时}/**************************************发送应答信号入口参数:ack(0:ACK 1:NAK)**************************************/voidADXL345_SendACK(uchar ack){ SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时}/**************************************接收应答信号**************************************/ucharADXL345_RecvACK(){ bit CY00; SCL = 1; //拉高时钟线 Delay5us(); //延时 CY00 = SDA; //读应答信号 SCL = 0; //拉低时钟线 Delay5us(); //延时 return CY00;}/**************************************向IIC总线发送一个字节数据**************************************/voidADXL345_SendByte(unsigned char dat){ unsigned char i; for (i=0; i<8; i++) //8位计数器 { if(dat&0x80) //dat <<= 1; //移出数据的最高位 { SDA = 1; //送数据口 // SDA = CY; //送数据口 } else SDA=0; dat <<= 1; SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } ADXL345_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/unsignedchar ADXL345_RecvByte(){ unsigned char i; unsigned char dat = 0; SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 { dat <<= 1; SCL = 1; //拉高时钟线 Delay5us(); //延时 dat |= SDA; //读数据 SCL = 0; //拉低时钟线 Delay5us(); //延时 } return dat;}//******单字节写入*******************************************voidSingle_Write_ADXL345(uchar REG_Address,uchar REG_data){ ADXL345_Start(); //起始信号 ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号 ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页 ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页 ADXL345_Stop(); //发送停止信号}//********单字节读取*****************************************ucharSingle_Read_ADXL345(uchar REG_Address){ uchar REG_data; ADXL345_Start(); //起始信号 ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号 ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始 ADXL345_Start(); //起始信号 ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=ADXL345_RecvByte(); //读出寄存器数据 ADXL345_SendACK(1); ADXL345_Stop(); //停止信号 return REG_data; }//*********************************************************////连续读出ADXL345内部加速度数据,地址范围0x32~0x37////*********************************************************voidMultiple_Read_ADXL345(void){ uchar i; ADXL345_Start(); //起始信号 ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号 ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始 ADXL345_Start(); //起始信号 ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号 for(i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { BUF = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 5) { ADXL345_SendACK(1); //最后一个数据需要回NOACK } else { ADXL345_SendACK(0); //回应ACK } } ADXL345_Stop(); //停止信号 Delay5ms();}//*****************************************************************//初始化ADXL345,根据需要请参考pdf进行修改************************voidInit_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页}//***********************************************************************//显示x轴voidReadData_x(){ int dis_data; //变量 Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中 dis_data=(BUF[1]<<8)+BUF[0]; //合成数据 // if(dis_data<0)// {// dis_data=-dis_data;// } temp_X=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页 dis_data=(BUF[3]<<8)+BUF[2]; //合成数据 // if(dis_data<0)// {// dis_data=-dis_data;// } temp_Y=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页 dis_data=(BUF[5]<<8)+BUF[4]; //合成数据 // if(dis_data<0)// {// dis_data=-dis_data;// } temp_Z=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
}