一、驱动说明:

就是使用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. poj1177

    题意:在平面直角坐标系内给出一些与坐标轴平行的矩形,将这些矩形覆盖的区域求并集,然后问这个区域的周长是多少.(边与边重合的地方不计入周长) 分析:线段树.曾经做过类似的求矩形覆盖的总面积的题.这道题同 ...

  2. 最近开始做Android了

    最近开始做Android,在学习的过程中发现找以前知识很不方便啊,于是决定以后还是把知识记录在博客里吧,说不定也能为他人提供参考!

  3. cookie相关内容

    ----客户端删除cookie <script type="text/javascript">                        function DelC ...

  4. nyoj19_排列

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  5. Mathematics:DNA Sorting(POJ 1007)

    DNA排序 题目大意:给定多个ACGT序列,按照字母顺序算出逆序数,按逆序数从小到大排列 这题其实很简单,我们只要用一个归并排序算逆序数,然后快排就可以了(插入排序也可以,数据量不大),但是要注意的是 ...

  6. 线条围绕 div 中心转圈 效果

    1. 用到知识: CSS:animate  ,clipe 2.原理: 用clip 属性 将div  切边 ,会出现 切边的动态效果,然后内部的div 遮住外部的div  ,流出一部分 作为边: 就是旋 ...

  7. java中带继承类的加载顺序详解及实战

    一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...

  8. September 28th 2016 Week 40th Wednesday

    Love all, trust a few, do wrong to none. 爱所有人,信任一些人,不妨害任何人. Reading is a way for me to expand my min ...

  9. 模拟赛1103d1

    取模(mod) [题目描述] 有一个整数a和n个整数b_1, -, b_n.在这些数中选出若干个数并重新排列,得到c_1,-, c_r.我们想保证a mod c_1 mod c_2 mod - mod ...

  10. 1.5 STL中大小相等的概念

    1) 2)