单片机源程序如下:
#include "STC51PRJ.h"
extern BYTE BUF[8];//接收数据缓存区
/*****************起始信号***************/
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;i<8;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; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
/******单字节写入***********/
void Single_Write_ADXL345(uint8 REG_Address,uint8 REG_data)
{
ADXL345_Start(); //起始信号
ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号
ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
ADXL345_Stop(); //发送停止信号
}
/********单个读取内部寄存器数据***********/
uint8 Single_Read_ADXL345(uint8 REG_Address)
{
uint8 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)
{
uint8 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[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页
}
上一篇:51单片机电子琴制作
下一篇:51单片机+MPU6050驱动程序,1602显示
推荐阅读最新更新时间:2024-11-06 08:47
设计资源 培训 开发板 精华推荐
- EVAL-AD7686CB,用于评估 AD7686CRM 16 位、500 K 高分辨率 ADC 的评估板
- esp8266+pca9685的32路舵机扩展板
- 使用 ROHM Semiconductor 的 BD45275 的参考设计
- ADR433B 3 Vout 超低噪声 XFET 电压基准的典型应用,具有灌电流和拉电流能力
- MAXREFDES1098:采用MAX17690的小尺寸,24V / 500mA,无光耦反激式DC-DC转换器,效率为92%
- 使用 Microchip Technology 的 MIC28512-1YFL 的参考设计
- NOIP-355PIN-HEAD-BD-A-GEVK:PYTHON 355 评估板
- 用于便携式消费电子产品的 1.2V、1.8V、2.8V DC 到 DC 多输出电源
- 适用于 36V SLA 电池充电器的 LT3791IFE-1 2.5A 降压-升压 LED 驱动器的典型应用电路
- 苹果妙控2代键盘改机械键盘(Cover Nosix)
- 温故而知新——开关电源经典课程学习
- 下载有礼:一起初探5G,赢氮化镓(GaN)充电器、柔性墨水屏等精美礼品
- 看视频赢京东卡 PI汽车专用解决方案学习中心正式上线
- TI 高精度实验室信号链精品课大作战——你学习我送礼!
- Digi-key干货视频教程来袭,意见领袖讲解疑难设计问题,带你突破成长瓶颈~
- 有奖直播:Microchip适用于CryptoAuthentication™系列的可信任平台
- 下载应用文章有礼啦!新方案新标准:助你克服第四代I/O应用中的接收机测试挑战!
- 直播|基于英特尔® Agilex™ FPGA的PCIe Gen5和CXL解决方案
- MPS有奖活动|梦想设计闪亮登场,便携式多功能电工台诞生啦!