一、驱动说明:

就是使用I2C的通信方式驱动这款加速度计就行了,代码的话选择使用51单片机的代码进行移植。

二、代码分享:

1、头文件:

#ifndef MMA8451_H
#define MMA8451_H /***********函数声明***********/ void MMA8451_Init(void);
void Read_Gray(void); /*****************************/ /***********全局变量声明***********/
extern int delay_time; extern double Gray_X ;
extern double Gray_Y ;
extern double Gray_Z ; /*****************************/ #endif

2、源文件:

#include "include.h"
#include "common.h"
#include "i2c.h"
#include "MMA8451.h"
#include "port.h"
#include "gpio.h"
#include "lptmr.h" double Gray_X ;
double Gray_Y ;
double Gray_Z ; //管脚定义
#define MMA_S_I2C_SDA (PTA16)//(PTB3)//(PTE0) //(PTE22)//(PTC1)//
#define MMA_S_I2C_SCL (PTA14)//(PTB2)//(PTE1)//(PTE20)//(PTC0)// //IO方向设置
#define MMA_I2C_SDA_IN() DDRA16 = 0//输入模式
#define MMA_I2C_SDA_OUT() DDRA16 = 1//输出模式 //IO操作函数
#define MMA_I2C_SCL PTA14_OUT //SCL
#define MMA_I2C_SDA PTA16_OUT //SDA
#define MMA_I2C_READ_SDA PTA16_IN //输入SDA //**********MMA8451内部寄存器地址*********
#define WHO_AM_I 0x0D
#define CTRL_REG1 0x2A
#define CTRL_REG2 0x2B
#define CTRL_REG3 0x2C
#define CTRL_REG4 0x2D
#define CTRL_REG5 0x2E
//#define REFERENCE 0x25
//#define OUT_TEMP 0x26
#define STATUS_REG 0x00
#define OUT_X_H 0x01
#define OUT_X_L 0x02
#define OUT_Y_H 0x03
#define OUT_Y_L 0x04
#define OUT_Z_H 0x05
#define OUT_Z_L 0x06
#define XYZ_DATA_CFG 0x0E #define SlaveAddress 0x38 //定义器件在I2C总线中的从地址,根据ALT ADDRESS地址引脚不同修改
#define SlaveAddfire 0x69 //定义器件在I2C总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //============================================================================
//函数名称:void MMA_I2C_Config(__RAMFUNC void)
//函数返回:无
//参数说明:无
//功能概要:初始化I2C
//============================================================================
void MMA_I2C_Config(void)
{
//MMA_I2C_SDA_OUT();
gpio_init(MMA_S_I2C_SDA,GPO,1);
gpio_init(MMA_S_I2C_SCL,GPO,1); MMA_I2C_SCL=1;
MMA_I2C_SDA=1;
} //============================================================================
//函数名称:void MMA_I2C_Start(__RAMFUNC void)
//函数返回:无
//参数说明:无
//功能概要:I2C通信开始
//============================================================================
void MMA_I2C_Start(void)
{
MMA_I2C_SDA_OUT(); MMA_I2C_SDA = 1;
MMA_I2C_SCL = 1;
lptmr_delay_us(1); MMA_I2C_SDA = 0;
lptmr_delay_us(1);
MMA_I2C_SCL = 0;
} //============================================================================
//函数名称:void MMA_I2C_Stop(void)
//函数返回:无
//参数说明:无
//功能概要:I2C通信结束
//============================================================================
void MMA_I2C_Stop(void)
{
MMA_I2C_SDA_OUT();
MMA_I2C_SDA = 0;
MMA_I2C_SCL = 1; lptmr_delay_us(1);
MMA_I2C_SDA = 1;
lptmr_delay_us(1);
MMA_I2C_SCL = 0;
} void MMA_I2C_Mack(void)
{
MMA_I2C_SDA_OUT(); MMA_I2C_SDA=0;
MMA_I2C_SCL=1; lptmr_delay_us(1); MMA_I2C_SCL=0;
MMA_I2C_SDA=1;
} void MMA_I2C_Mnack(void)
{
MMA_I2C_SDA_OUT();
MMA_I2C_SDA=1;
lptmr_delay_us(1);
MMA_I2C_SCL=1;
lptmr_delay_us(1);
MMA_I2C_SCL=0;
lptmr_delay_us(1);
//MMA_I2C_SDA=0;
} uint8_t MMA_I2C_Cack(void)
{
MMA_I2C_SDA_IN();;
MMA_I2C_SCL=0;
lptmr_delay_us(1);
MMA_I2C_SCL=1;
lptmr_delay_us(1); if(MMA_I2C_READ_SDA)
{
//MMA_I2C_Stop();
//return 0xff;
} MMA_I2C_SCL=0;
MMA_I2C_SDA_OUT();
return 0;
} void MMA_I2C_WriteByte(unsigned char data)
{
unsigned char i=8;
MMA_I2C_SDA_OUT(); while(i--)
{
lptmr_delay_us(1);
if(data & 0x80)
MMA_I2C_SDA=1;
else
MMA_I2C_SDA=0; lptmr_delay_us(1);
MMA_I2C_SCL=1;
lptmr_delay_us(1);
MMA_I2C_SCL=0;
data<<=1;
}
} uint8_t MMA_I2C_ReadByte(void)
{
unsigned char i;
unsigned char data=0;
char temp; MMA_I2C_SDA_IN(); for(i=0;i<8;i++)
{
data<<=1;
lptmr_delay_us(1);
MMA_I2C_SCL = 1;
temp = MMA_I2C_READ_SDA;
if(temp)
data++;
lptmr_delay_us(1);
MMA_I2C_SCL = 0;
}
return data;
} uint8_t MMA_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
{
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(reg_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(writeData); MMA_I2C_Cack();
MMA_I2C_Stop(); return 0;
} uint8_t MMA_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
{
uint8_t read_reg = 0;
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(reg_addr);
MMA_I2C_Cack();
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr + 1);
MMA_I2C_Cack();
read_reg=MMA_I2C_ReadByte();
MMA_I2C_Mnack();
MMA_I2C_Stop(); return read_reg;
} uint8_t MMA_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
{
uint8_t i = 0;
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(reg_addr);
MMA_I2C_Cack();
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr + 1);
MMA_I2C_Cack(); for(i = 0; i < data_num; i++){
*(readBuffer+i) = MMA_I2C_ReadByte();
if(i == data_num - 1)
MMA_I2C_Mnack();
else
MMA_I2C_Mack();
}
MMA_I2C_Stop(); return 0;
} /*----------------*加速度传感器初始化*----------------*/
void MMA8451_Init(void)//初始化为指定模式
{
MMA_I2C_Config();
MMA_I2C_WR_REG(SlaveAddress,CTRL_REG1,0x05); //数据手册30 0xbf 400hz 20~110截止频率
MMA_I2C_WR_REG(SlaveAddress,CTRL_REG2,0x02); //前两位00,后两位高通滤波器模式选择,后四位截止频率 0x29
MMA_I2C_WR_REG(SlaveAddress,XYZ_DATA_CFG,0x10);
} /*-------------*加速度传感器测量值读取接口*------------*/
uint8_t MMA_tmpBuffer[6] = {0}; void Read_Gray(void)
{
MMA_I2C_RD_Buffer(SlaveAddress,0x81,6,MMA_tmpBuffer); int temp; temp = ((short)((MMA_tmpBuffer[0]<<8)|MMA_tmpBuffer[1]))>>4;//2;// 14位精度 1g数值为1024(原本为4096,但是右移了(无效位2位)(有效位14位)两位)
Gray_X = (double)Gray_X*0.5+(double)temp*0.5; temp = ((short)((MMA_tmpBuffer[2]<<8)|MMA_tmpBuffer[3]))>>4;//2;// 14位精度
Gray_Y = (double)Gray_Y*0.5+(double)temp*0.5; temp = ((short)((MMA_tmpBuffer[4]<<8)|MMA_tmpBuffer[5]))>>4;//2;// 14位精度
Gray_Z = (double)Gray_Z*0.5+(double)temp*0.5;
} /*--------------------------------------------------------------------------------------
1.如何确定加速度计或者陀螺仪的IIC通信控制字,理解握手原理,掌握寻址的方法
2.软件调试,结合管脚图
3.数据通信速度匹配问题---如何确定延时的大小
----------------------------------------------------------------------------------------*/

三、使用方法:

#include "include.h"
#include "OLED.h"
#include "init.h"
#include "KeySquare.h"
#include "lptmr.h"
#include "Menu.h"
#include "flash.h"
#include "MMA8451.h" void main()
{
DISABLE_INTERRUPTS; //MPU上电,各模块功能初始化前需要关中断
system_init(); //各模块功能初始化
ENABLE_INTERRUPTS; //开中断使能 //加速度计初始化
MMA8451_Init(); //初始化
OLED_Init();
flash_init(); //屏幕刷屏
OLED_Clear(); while(1)
{
Read_Gray();
OLED_Clear();
OLED_Write_Float(0,0,Gray_X);
OLED_Write_Float(2,0,Gray_Y);
OLED_Write_Float(4,0,Gray_Z);
lptmr_delay_ms(100); //Menu_Key_Detect();
}
}

智能车学习(十)——MMA8451加速度计的使用的更多相关文章

  1. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...

  2. 智能车学习(十六)——CCD学习

    一.使用硬件 1.兰宙CCD四代      优点:可以调节运放来改变放大倍数      缺点:使用软排线(容易坏),CCD容易起灰,需要多次调节   2.野火K60底层     二.CCD硬件电路 ( ...

  3. 智能车学习(二十二)——浅谈速度控制

    一.经典PID控制       使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期..   二.PID加棒棒控制       针对 ...

  4. 智能车学习(二十)——浅谈C车硬连接与软连接

    一.为何要追求软连接?       车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...

  5. 智能车学习(十八)——电机学习

    一.C车电机选择 1.摘要:      因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...

  6. 智能车学习(十四)——K60单片机GPIO学习

    一.头文件: #ifndef __MK60_GPIO_H__ #define __MK60_GPIO_H__ #include "MK60_gpio_cfg.h" /* * 定义管 ...

  7. 智能车学习(十二)——智能车原理

    一.直立行走任务分解 1.任务分解 (1) 控制车模平衡:通过控制两个电机正反向运动保持车模直立平衡状态 (2) 控制车模速度:通过调节车模的倾角来实现车模速度控制,实际上最后还是演变成通过控制电机的 ...

  8. 智能车学习(二十三)——浅谈心得体会

          因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的.       在厦大信科通信系,参加这个比赛,大家都觉得性 ...

  9. 智能车学习(六)——OLED屏幕使用

    一.代码展示 1.头文件: #ifndef OLED_H_ #define OLED_H_ extern unsigned char Draw[]; extern const unsigned cha ...

随机推荐

  1. ios nsdataformatter奇怪的问题

    用nsdataformatter在中文格式下测试, a 标识的是上午,下午,不是AM,pm. 我在24小时格式的机器上测试,存入了一个 时间,却解析不出来了! static NSString *Hom ...

  2. 推荐一篇 OAuth 2.0 必读文章

    http://www.cnblogs.com/artech/p/oauth-03.html 共计有3篇相关内容,请仔细阅读! 再说一下我用box api 开发时的问题,在 box 程序登记页面: 对于 ...

  3. ios 使用xib时,在UIScrollView中添建内容view时,使用约束的注意

    请参与一下链接:http://segmentfault.com/a/1190000002462033 简单的说下,就是必须写满一个view的6个约束,就是上下左右高宽,让scrollview 能够根据 ...

  4. ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

    这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...

  5. HDU 4942 Game on S♂play(线段树、模拟、扩栈)

    比赛的时候想到这题的大概做法,但由于卡别的水题...就赛后做了... 题意:给一个二叉树,每个结点有一个w[i],有3种操作,0 x表示左旋x,1 x表示右旋x,3 x表示询问x结点的价值,其中,价值 ...

  6. 【linux】gcc命令

    来源:http://man.linuxde.net/gcc 语法 gcc(选项)(参数) 选项 -o:指定生成的输出文件: -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -wall:显示警 ...

  7. 20145213祁玮のJava课程总结

    20145213のJava学习总结 每周学习笔记 1.第一周读书笔记 2.第二周读书笔记 3.第三周读书笔记 4.第四周读书笔记 5.第五周读书笔记 6.第六周读书笔记 7.第七周读书笔记 8.第八周 ...

  8. 【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句

    形式1 REGISTER("SAMPLE.DLL", "MyFunction", "AIC") 形式1等效 VBA语句 Declare Fu ...

  9. php数据访问基础

    建一个连接(造一个连接对象) $db = new MySqli("IP地址或者域名,若果是本地则用localhost","用户名","数据库密码&qu ...

  10. 解决sqlite3_key的问题

    报错内容显示如下: ld: warning: ignoring file /Users/rowling/Library/Developer/Xcode/DerivedData/zhinengbango ...