173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

基于stm32的adxl345程序

keros@mark 2023-03-17 资讯中心

求用51单片机控制ADXL345测量角度的程序,通过ADXL345传感器,用51单片机控制,测量倾角的程序!

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

// GY-29 ADXL345 IIC测试程序

// 使用单片机STC89C51

// 晶振:11.0592M

// 显示:LCD1602

// 编译环境 Keil uVision2

// 参考宏晶网站24c04通信程序

// 时间:2011年3月1日

// QQ:531389319

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

#include REG51.H

#include math.h //Keil library

#include stdio.h //Keil library

#include INTRINS.H

#define uchar unsigned char

#define uint unsigned int

#define DataPort P0 //LCD1602数据端口

sbit SCL=P1^0; //IIC时钟引脚定义

sbit SDA=P1^1; //IIC数据引脚定义

sbit LCM_RS=P2^0; //LCD1602命令端口

sbit LCM_RW=P2^1; //LCD1602命令端口

sbit LCM_EN=P2^2; //LCD1602命令端口

#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改

//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区

uchar ge,shi,bai,qian,wan; //显示变量

int dis_data; //变量

int data_xyz[3];

void delay(unsigned int k);

void InitLcd(); //初始化lcd1602

void Init_ADXL345(void); //初始化ADXL345

void WriteDataLCM(uchar dataW);

void WriteCommandLCM(uchar CMD,uchar Attribc);

void DisplayOneChar(uchar X,uchar Y,uchar DData);

void conversion(uint temp_data);

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据

uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据

void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据

//------------------------------------

void Delay5us();

void Delay5ms();

void ADXL345_Start();

void ADXL345_Stop();

void ADXL345_SendACK(bit ack);

bit ADXL345_RecvACK();

void ADXL345_SendByte(BYTE dat);

BYTE ADXL345_RecvByte();

void ADXL345_ReadPage();

void ADXL345_WritePage();

//-----------------------------------

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

void conversion(uint temp_data)

{

wan=temp_data/10000+0x30 ;

temp_data=temp_data%10000; //取余运算

qian=temp_data/1000+0x30 ;

temp_data=temp_data%1000; //取余运算

bai=temp_data/100+0x30 ;

temp_data=temp_data%100; //取余运算

shi=temp_data/10+0x30 ;

temp_data=temp_data%10; //取余运算

ge=temp_data+0x30;

}

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

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;ik;i++)

{

for(j=0;j121;j++)

{;}}

}

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

void WaitForEnable(void)

{

DataPort=0xff;

LCM_RS=0;LCM_RW=1;_nop_();

LCM_EN=1;_nop_();_nop_();

while(DataPort0x80);

LCM_EN=0;

}

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

void WriteCommandLCM(uchar CMD,uchar Attribc)

{

if(Attribc)WaitForEnable();

LCM_RS=0;LCM_RW=0;_nop_();

DataPort=CMD;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

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

void WriteDataLCM(uchar dataW)

{

WaitForEnable();

LCM_RS=1;LCM_RW=0;_nop_();

DataPort=dataW;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

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

void InitLcd()

{

WriteCommandLCM(0x38,1);

WriteCommandLCM(0x08,1);

WriteCommandLCM(0x01,1);

WriteCommandLCM(0x06,1);

WriteCommandLCM(0x0c,1);

}

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

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

Y=1;

X=15;

if(Y)X|=0x40;

X|=0x80;

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

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

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

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

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

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

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

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

void Delay5ms()

{

WORD n = 560;

while (n--);

}

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

起始信号

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

void ADXL345_Start()

{

SDA = 1; //拉高数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿

Delay5us(); //延时

SCL = 0; //拉低时钟线

}

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

停止信号

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

void ADXL345_Stop()

{

SDA = 0; //拉低数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿

Delay5us(); //延时

}

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

发送应答信号

入口参数:ack (0:ACK 1:NAK)

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

void ADXL345_SendACK(bit ack)

{

SDA = ack; //写应答信号

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

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

接收应答信号

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

bit ADXL345_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

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

向IIC总线发送一个字节数据

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

void ADXL345_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i8; i++) //8位计数器

{

dat = 1; //移出数据的最高位

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

ADXL345_RecvACK();

}

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

从IIC总线接收一个字节数据

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

BYTE ADXL345_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据,

for (i=0; i8; i++) //8位计数器

{

dat = 1;

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

//******单字节写入*******************************************

void Single_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(); //发送停止信号

}

//********单字节读取*****************************************

uchar Single_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

//

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

void Multiple_read_ADXL345(void)

{ uchar i;

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i6; i++) //连续读取6个地址数据,存储中BUF

{

BUF[i] = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据

if (i == 5)

{

ADXL345_SendACK(1); //最后一个数据需要回NOACK

}

else

{

ADXL345_SendACK(0); //回应ACK

}

}

ADXL345_Stop(); //停止信号

Delay5ms();

}

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

//初始化ADXL345,根据需要请参考pdf进行修改************************

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页

}

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

//显示x轴

void display_x()

{ float temp;

dis_data=(BUF[1]8)+BUF[0]; //合成数据

if(dis_data0){

dis_data=-dis_data;

DisplayOneChar(2,0,'-'); //显示正负符号位

}

else DisplayOneChar(2,0,' '); //显示空格

temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页

conversion(temp); //转换出显示需要的数据

DisplayOneChar(0,0,'X'); //第0行,第0列 显示X

DisplayOneChar(1,0,':');

DisplayOneChar(3,0,qian);

DisplayOneChar(4,0,'.');

DisplayOneChar(5,0,bai);

DisplayOneChar(6,0,shi);

DisplayOneChar(7,0,'g');

}

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

//显示y轴

void display_y()

{ float temp;

dis_data=(BUF[3]8)+BUF[2]; //合成数据

if(dis_data0){

dis_data=-dis_data;

DisplayOneChar(2,1,'-'); //显示正负符号位

}

else DisplayOneChar(2,1,' '); //显示空格

temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页

conversion(temp); //转换出显示需要的数据

DisplayOneChar(0,1,'Y'); //第1行,第0列 显示y

DisplayOneChar(1,1,':');

DisplayOneChar(3,1,qian);

DisplayOneChar(4,1,'.');

DisplayOneChar(5,1,bai);

DisplayOneChar(6,1,shi);

DisplayOneChar(7,1,'g');

}

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

//显示z轴

void display_z()

{ float temp;

dis_data=(BUF[5]8)+BUF[4]; //合成数据

if(dis_data0){

dis_data=-dis_data;

DisplayOneChar(10,1,'-'); //显示负符号位

}

else DisplayOneChar(10,1,' '); //显示空格

temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页

conversion(temp); //转换出显示需要的数据

/*

DisplayOneChar(10,0,'Z'); //第0行,第10列 显示Z

DisplayOneChar(11,0,':');

DisplayOneChar(11,1,qian);

DisplayOneChar(12,1,'.');

DisplayOneChar(13,1,bai);

DisplayOneChar(14,1,shi);

DisplayOneChar(15,1,'g');

*/

}

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

//******主程序********

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

void main()

{

uchar devid;

float Roll,Pitch,Q,T,K;

delay(500); //上电延时

InitLcd(); //液晶初始化ADXL345

Init_ADXL345(); //初始化ADXL345

devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确

while(1) //循环

{

Init_ADXL345(); //初始化ADXL345

Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中

data_xyz[0]=(BUF[1]8)+BUF[0]; //合成数据

data_xyz[1]=(BUF[3]8)+BUF[2]; //合成数据

data_xyz[2]=(BUF[5]8)+BUF[4]; //合成数据

//分别是加速度X,Y,Z的原始数据,10位的

Q=(float)data_xyz[0]*3.9;

T=(float)data_xyz[1]*3.9;

K=(float)data_xyz[2]*3.9;

Q=-Q;

Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180); //X轴角度值

Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180); //Y轴角度值

conversion(Roll); //转换出显示需要的数据X轴,或者Y轴

DisplayOneChar(9,1,'A');

DisplayOneChar(10,1,':');

DisplayOneChar(11,1,bai);

DisplayOneChar(12,1,shi);

DisplayOneChar(13,1,ge);

delay(200); //延时

}

}

基于STM32的ADXL335传感器的程序,谁能发一份给我呀,谢谢!

一、硬件电路接口图片

1.ADXL345硬件接口图片使用的是SPI端口进行通信,这样读取数据比较快且后续也可以转化为IIC通信接口。

在网上找一些发现IIC接口的比较多,所以本人就DIY做SPI的通信。

2.STM32F103T系列单片机作为MCU 资源比较丰富、本人比较熟悉开发速度较快

硬件电路首先是为了实现功能,所以设计比较简单。后续小编想做无线蓝牙的数据传输,所以硬件上也留了蓝牙串口通信的硬件接口和3.3V电源管理。

暂且将硬件这样设计,设计为双层PCB 这样减少了空间。电容、电阻为0805的易焊接。器件都选为贴片。

二、单片机驱动代码

1.ADXL345的端口配置函数

#define ADXL345_FLAG_TIMEOUT ((uint32_t)0x1000)

#define ADXL345_SPI SPI1

#define ADXL345_SPI_CLK RCC_APB2Periph_SPI1

#define ADXL345_SPI_SCK_PIN GPIO_Pin_5

#define ADXL345_SPI_SCK_GPIO_PORT GPIOA

#define ADXL345_SPI_SCK_GPIO_CLK RCC_APB2Periph_GPIOA

#define ADXL345_SPI_SCK_SOURCE GPIO_PinSource5

#define ADXL345_SPI_SCK_AF GPIO_AF_5

#define ADXL345_SPI_MISO_PIN GPIO_Pin_6

#define ADXL345_SPI_MISO_GPIO_PORT GPIOA

#define ADXL345_SPI_MISO_GPIO_CLK RCC_APB2Periph_GPIOA

#define ADXL345_SPI_MISO_SOURCE GPIO_PinSource6

#define ADXL345_SPI_MISO_AF GPIO_AF_5

#define ADXL345_SPI_MOSI_PIN GPIO_Pin_7

#define ADXL345_SPI_MOSI_GPIO_PORT GPIOA

#define ADXL345_SPI_MOSI_GPIO_CLK RCC_APB2Periph_GPIOA

#define ADXL345_SPI_MOSI_SOURCE GPIO_PinSource7

#define ADXL345_SPI_MOSI_AF GPIO_AF_5

#define ADXL345_SPI_CS_PIN GPIO_Pin_2

#define ADXL345_SPI_CS_GPIO_PORT GPIOB

#define ADXL345_SPI_CS_GPIO_CLK RCC_APB2Periph_GPIOB

#define ADXL345_SPI_INT1_PIN GPIO_Pin_0

#define ADXL345_SPI_INT1_GPIO_PORT GPIOB

#define ADXL345_SPI_INT1_GPIO_CLK RCC_APB2Periph_GPIOB

#define ADXL345_SPI_INT1_EXTI_LINE EXTI_Line0

#define ADXL345_SPI_INT1_EXTI_PORT_SOURCE EXTI_PortSourceGPIOB

#define ADXL345_SPI_INT1_EXTI_PIN_SOURCE EXTI_PinSource0

#define ADXL345_SPI_INT1_EXTI_IRQn EXTI0_IRQn

#define ADXL345_SPI_INT2_PIN GPIO_Pin_1

#define ADXL345_SPI_INT2_GPIO_PORT GPIOB

#define ADXL345_SPI_INT2_GPIO_CLK RCC_APB2Periph_GPIOB

#define ADXL345_SPI_INT2_EXTI_LINE EXTI_Line1

#define ADXL345_SPI_INT2_EXTI_PORT_SOURCE EXTI_PortSourceGPIOB

#define ADXL345_SPI_INT2_EXTI_PIN_SOURCE EXTI_PinSource1

#define ADXL345_SPI_INT2_EXTI_IRQn EXTI1_IRQn

#define ADXL345_WHO_AM_I_ADDR 0x0F

#define ADXL345_CTRL_REG1_ADDR 0x20

#define ADXL345_CTRL_REG2_ADDR 0x21

#define ADXL345_CTRL_REG3_ADDR 0x22

#define ADXL345_CTRL_REG4_ADDR 0x23

#define ADXL345_CTRL_REG5_ADDR 0x24

#define ADXL345_REFERENCE_REG_ADDR 0x25

#define ADXL345_OUT_TEMP_ADDR 0x26

#define ADXL345_STATUS_REG_ADDR 0x27

#define ADXL345_OUT_X_L_ADDR 0x28

#define ADXL345_OUT_X_H_ADDR 0x29

#define ADXL345_OUT_Y_L_ADDR 0x2A

#define ADXL345_OUT_Y_H_ADDR 0x2B

#define ADXL345_OUT_Z_L_ADDR 0x2C

#define ADXL345_OUT_Z_H_ADDR 0x2D

#define ADXL345_FIFO_CTRL_REG_ADDR 0x2E

#define ADXL345_FIFO_SRC_REG_ADDR 0x2F

#define ADXL345_INT1_CFG_ADDR 0x30

#define ADXL345_INT1_SRC_ADDR 0x31

#define ADXL345_INT1_TSH_XH_ADDR 0x32

#define ADXL345_INT1_TSH_XL_ADDR 0x33

#define ADXL345_INT1_TSH_YH_ADDR 0x34

#define ADXL345_INT1_TSH_YL_ADDR 0x35

#define ADXL345_INT1_TSH_ZH_ADDR 0x36

#define ADXL345_INT1_TSH_ZL_ADDR 0x37

#define ADXL345_INT1_DURATION_ADDR 0x38

#define I_AM_ADXL345 ((uint8_t)0xD4)

#define ADXL345_MODE_POWERDOWN ((uint8_t)0x00)

#define ADXL345_MODE_ACTIVE ((uint8_t)0x08)

#define ADXL345_OUTPUT_DATARATE_1 ((uint8_t)0x00)

#define ADXL345_OUTPUT_DATARATE_2 ((uint8_t)0x40)

#define ADXL345_OUTPUT_DATARATE_3 ((uint8_t)0x80)

#define ADXL345_OUTPUT_DATARATE_4 ((uint8_t)0xC0)

#define ADXL345_X_ENABLE ((uint8_t)0x02)

#define ADXL345_Y_ENABLE ((uint8_t)0x01)

#define ADXL345_Z_ENABLE ((uint8_t)0x04)

#define ADXL345_AXES_ENABLE ((uint8_t)0x07)

#define ADXL345_AXES_DISABLE ((uint8_t)0x00)

#define ADXL345_BANDWIDTH_1 ((uint8_t)0x00)

#define ADXL345_BANDWIDTH_2 ((uint8_t)0x10)

#define ADXL345_BANDWIDTH_3 ((uint8_t)0x20)

#define ADXL345_BANDWIDTH_4 ((uint8_t)0x30)

#define ADXL345_FULLSCALE_250 ((uint8_t)0x00)

#define ADXL345_FULLSCALE_500 ((uint8_t)0x10)

#define ADXL345_FULLSCALE_2000 ((uint8_t)0x20)

#define ADXL345_BlockDataUpdate_Continous ((uint8_t)0x00)

#define ADXL345_BlockDataUpdate_Single ((uint8_t)0x80)

#define ADXL345_BLE_LSB ((uint8_t)0x00)

#define ADXL345_BLE_MSB ((uint8_t)0x40)

#define ADXL345_HIGHPASSFILTER_DISABLE ((uint8_t)0x00)

#define ADXL345_HIGHPASSFILTER_ENABLE ((uint8_t)0x10)

#define ADXL345_INT1INTERRUPT_DISABLE ((uint8_t)0x00)

#define ADXL345_INT1INTERRUPT_ENABLE ((uint8_t)0x80)

#define ADXL345_INT2INTERRUPT_DISABLE ((uint8_t)0x00)

#define ADXL345_INT2INTERRUPT_ENABLE ((uint8_t)0x08)

#define ADXL345_INT1INTERRUPT_LOW_EDGE ((uint8_t)0x20)

#define ADXL345_INT1INTERRUPT_HIGH_EDGE ((uint8_t)0x00)

#define ADXL345_BOOT_NORMALMODE ((uint8_t)0x00)

#define ADXL345_BOOT_REBOOTMEMORY ((uint8_t)0x80)

#define ADXL345_HPM_NORMAL_MODE_RES ((uint8_t)0x00)

#define ADXL345_HPM_REF_SIGNAL ((uint8_t)0x10)

#define ADXL345_HPM_NORMAL_MODE ((uint8_t)0x20)

#define ADXL345_HPM_AUTORESET_INT ((uint8_t)0x30)

#define ADXL345_HPFCF_0 0x00

#define ADXL345_HPFCF_1 0x01

#define ADXL345_HPFCF_2 0x02

#define ADXL345_HPFCF_3 0x03

#define ADXL345_HPFCF_4 0x04

#define ADXL345_HPFCF_5 0x05

#define ADXL345_HPFCF_6 0x06

#define ADXL345_HPFCF_7 0x07

#define ADXL345_HPFCF_8 0x08

#define ADXL345_HPFCF_9 0x09

#define ADXL345_CS_LOW() GPIO_ResetBits(ADXL345_SPI_CS_GPIO_PORT, ADXL345_SPI_CS_PIN)

#define ADXL345_CS_HIGH() GPIO_SetBits(ADXL345_SPI_CS_GPIO_PORT, ADXL345_SPI_CS_PIN)

void ADXL345_Init(ADXL345_InitTypeDef *ADXL345_InitStruct);

void ADXL345_RebootCmd(void);

void ADXL345_INT1InterruptCmd(uint8_t InterruptState);

void ADXL345_INT2InterruptCmd(uint8_t InterruptState);

void ADXL345_INT1InterruptConfig(ADXL345_InterruptConfigTypeDef *ADXL345_IntConfigStruct);

uint8_t ADXL345_GetDataStatus(void);

void ADXL345_FilterConfig(ADXL345_FilterConfigTypeDef *ADXL345_FilterStruct);

void ADXL345_FilterCmd(uint8_t HighPassFilterState);

void ADXL345_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite);

void ADXL345_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead);

2.ADXL345的SPI配置函数

void SPI_init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

SPI_InitTypeDef SPI_InitStructure;

R

msp430f149控制ADXL345的程序

ADXL345使用独立5v电源 SPI方式可以参考ti例子因为初始化是固定的呀

比如

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

// MSP-FET430P140 Demo - USART0, SPI Full-Duplex 3-Wire Slave P1.x Exchange

//

// Description: SPI Master communicates at fast as possible, full-duplex with

// SPI Slave using 3-wire mode. The level on P1.4/5 is TX'ed and RX'ed to P1.0

// and P1.1. Master will pulse slave Reset on init to insure synch start.

// Slave normal mode is LPM4.

// ACLK = n/a, MCLK = SMCLK = DCO ~ 800kHz, ULCK = external

//

// fet140_slav0 fet140_mstr0

// MSP430F169 Slave MSP430F169 Master

// ----------------- -----------------

// | XIN|- /|\| XIN|-

// | | | | |

// | XOUT|- --|RST XOUT|-

// | | /|\ | |

// | RST|--+----|P3.0 |

// LED -|P1.0 | | P1.4|-

// LED -|P1.1 | | P1.5|-

// -|P1.4 | | P1.0|- LED

// -|P1.5 | | P1.1|- LED

// | SIMO0/P3.1|-------|P3.1 |

// | SOMI0/P3.2|-------|P3.2 |

// | UCLK/P3.3|-------|P3.3 |

//

// M. Buccini

// Texas Instruments Inc.

// Feb 2005

// Built with IAR Embedded Workbench Version: 3.21A

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

#include msp430x14x.h

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog

P1OUT = 0x00; // P1.0 setup for LED output

P1DIR |= 0x03;

P3SEL |= 0x0E; // P3.1,2,3 SPI option select

U0CTL = CHAR + SYNC + SWRST; // 8-bit, SPI

U0TCTL = CKPL + STC; // Polarity, 3-wire

U0BR0 = 0x02; // SPICLK = SMCLK/2

U0BR1 = 0x00;

U0MCTL = 0x00;

ME1 |= USPIE0; // Module enable

U0CTL = ~SWRST; // SPI enable

IE1 |= URXIE0 + UTXIE0; // RX and TX interrupt enable

_BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/ interrupt

}

#pragma vector=USART0RX_VECTOR

__interrupt void SPI0_rx (void)

{

P1OUT = RXBUF0; // RXBUF0 to TXBUF0

}

#pragma vector=USART0TX_VECTOR

__interrupt void SPI0_tx (void)

{

unsigned int i;

i = P1IN;

i = i 4;

TXBUF0 = i; // Transmit character

}

知识豪杰,快来加入430f149团队吧,一起答疑助人,没你不行!团队地址:

adxl345如何应用

ADXL345非常强大,有很多内置寄存器,用它为当前的毕业设备制作一个计步器。

用51单片机控制ADXL345与IIC通信。Adxl345权力可以选择单/双电源工作模式,额定电压3.3v,而51单片机使用5v电压,电压转换模块的必要性,焊接更麻烦,花23元(运费12)在互联网上购买Adxl345模块、电压转换为3.3v,可以直接使用。

扩展资料:

与MCU连接:图1右侧,5V引脚高电平,直接GND,3V3,VS,CS未连接,因为模块已经内部连接。在第一个图的左边,SCL和SDA分别连接到51单片机的一个foot上。

SCL模拟时钟信号和SDA传输数据(I2C通信)。SDO未连接。如果使用中断,INT1和INT2分别连接到INT0和INT1。

ADXL345 三轴加速器如何连接到单片机上面,如何编程跌倒

iic(也叫i2c)模式的连接方法:

---------------------------------------

5V脚接高电平、 GND直接接地 、SCL、SDA分别与单片机某一脚(*1)相连,

这两个引脚的作用:SCL模拟时钟信号,SDA传数据(I2C通信)。

其余引脚无需连接。

*1:某一引脚是哪个引脚?以C51单片机为例:

//**********从这里开始修改**********//

#define   DataPort P1    //LCD1602 数据端口

sbit  SCL=P1^0;      //IIC 与 SCL 链接的引脚 ***** 第二行

sbit   SDA=P1^1;      //IIC 与 SDA 链接的引脚 ***** 第三行

sbit      LCM_RS=P2^4;   //LCD1602 数据端口

sbit      LCM_RW=P2^3;   //LCD1602 数据端口

sbit      LCM_EN=P2^2;   //LCD1602 数据端口

//**********改到这里为止!**********//

为上面代码的 2、3行。

具体要做到判断跌倒,这个就比较麻烦了。所有公司的产品都能从传感器读取数据,

然后处理数据,但是,数据的处理考的是算法,算法好产品就好。

防止跌倒的算法有很多种,要实现防跌倒,编程都是不容易的。

比如:

检测到adxl345在某个单位时间的某几个轴上的变化量超过了某值,

就可以假设这个人可能跌倒了,

接下来判断(adxl345可以通过程序读出角度的变化量)角度是否有大的改变?

如果有就判断跌倒,否则复位后重新检测当前状态。

ps:这只是一个小小的个人想法……

本文标签:基于stm32的adxl345程序

产品列表
产品封装
友情链接