ADXL345直接输出角度值C51程序.doc

上传人:11****ws 文档编号:3259995 上传时间:2019-05-27 格式:DOC 页数:13 大小:885KB
下载 相关 举报
ADXL345直接输出角度值C51程序.doc_第1页
第1页 / 共13页
ADXL345直接输出角度值C51程序.doc_第2页
第2页 / 共13页
ADXL345直接输出角度值C51程序.doc_第3页
第3页 / 共13页
ADXL345直接输出角度值C51程序.doc_第4页
第4页 / 共13页
ADXL345直接输出角度值C51程序.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、好的开始时成功的一半ADXL345 测角度1、硬件准备杜邦线 5.1K 电阻最小单片机系统(P1 带上拉电阻) 89C51GY-29-ADXL345 加速度计 1602 液晶显示器2、程序在最后!3、电气连接这个连接时对不熟的非常有用四、测试效果图后记:发现网上有许多的关于测角度的资料都不是很全,在这里总结一下。人人为我,我为人人!程序:/* 文件名 :GY-29 ADXL345 测角度,角度值显示* 创建人 :飞翔的猫* 描述 : 该文件实现了用 GY-29 ADXL345 角度的采集,并在数码管上显示出来。使用单片机 STC89C51 *晶振 :11.0592M*显示 :LCD1602*编

2、译环境 :Keil uVision4*时间 :2013 年 8 月 13 日*QQ :361301011*/#include #include /Keil library #include /Keil library#include #define uchar unsigned char#define uint unsigned int#define DataPort P0 /LCD1602 数据端口sbit SCL=P10; /IIC 时钟引脚定义sbit SDA=P11; /IIC 数据引脚定义sbit LCM_RS=P20; /LCD1602 命令端口sbit LCM_RW=P21; /

3、LCD1602 命令端口sbit LCM_EN=P22; /LCD1602 命令端口 #define SlaveAddress 0xA6 /定义器件在 IIC 总线中的从地址,根据 ALT ADDRESS 地址引脚不同修改/ALT ADDRESS 引脚接地时地址为 0xA6,接电源时地址为 0x3Atypedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF8; /接收数据缓存区 uchar ge,shi,bai,qian,wan; /显示变量int dis_data; /变量int data_xyz3;void delay(u

4、nsigned int k);void InitLcd(); /初始化 lcd1602void Init_ADXL345(void); /初始化 ADXL345void 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); /

5、单个写入数据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 ADXL3

6、45_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=t

7、emp_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(DataPortLCM_EN=0;/*/void WriteCommandLCM(uchar CMD,uchar Attribc)if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;

8、_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);WriteC

9、ommandLCM(0x06,1);WriteCommandLCM(0x0c,1);/*/void DisplayOneChar(uchar X,uchar Y,uchar DData)YXif(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);/*延时 5 微秒(STC90C52RC12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用 1T 的 MCU 时,请调整此延时函数*/void Delay5us()_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop

10、_();_nop_();_nop_();_nop_();_nop_();_nop_();/*延时 5 毫秒(STC90C52RC12M)不同的工作环境,需要调整此函数当改用 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;

11、 /拉低数据线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; /拉低时钟线Del

12、ay5us(); /延时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; /使能内部上拉,准备读取

13、数据 ,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); /内部寄存器地址,请参考

14、中文 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_SendBy

15、te(SlaveAddress+1); /发送设备地址+ 读信号REG_data=ADXL345_RecvByte(); /读出寄存器数据ADXL345_SendACK(1); ADXL345_Stop(); /停止信号return REG_data; /*/连续读出 ADXL345 内部加速度数据,地址范围 0x320x37/*void Multiple_read_ADXL345(void) uchar i;ADXL345_Start(); /起始信号ADXL345_SendByte(SlaveAddress); /发送设备地址+写信号ADXL345_SendByte(0x32); /发送存

16、储单元地址,从 0x32 开始ADXL345_Start(); /起始信号ADXL345_SendByte(SlaveAddress+1); /发送设备地址+ 读信号for (i=0; i6; i+) /连续读取 6 个地址数据,存储中 BUFBUFi = ADXL345_RecvByte(); /BUF0存储 0x32 地址中的数据if (i = 5)ADXL345_SendACK(1); /最后一个数据需要回 NOACKelseADXL345_SendACK(0); /回应 ACKADXL345_Stop(); /停止信号Delay5ms();/*/初始化 ADXL345,根据需要请参考

17、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=(BUF18)+BUF0; /合成数据 if(dis_data0)dis_data=-dis_data;DisplayOneChar(2,0,-); /显示正负符号位

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 医药卫生

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。