查看: 4402|回复: 19

[其他] MMA841三轴加速度传感器

[复制链接]

该用户从未签到

13

主题

79

帖子

0

中级会员

Rank: 3Rank: 3

积分
223
最后登录
2018-6-25
发表于 2015-4-26 17:18:17 | 显示全部楼层 |阅读模式
终于调试好了MMA8451三轴加速度传感器的程序,已上传至电路城,有需要的也可以与我联系,目前利用电脑串口显示数据,每秒800组数据,采用的是平民化的stc12系列单片机
我知道答案 目前已有19人回答
回复

使用道具 举报

该用户从未签到

13

主题

79

帖子

0

中级会员

Rank: 3Rank: 3

积分
223
最后登录
2018-6-25
 楼主| 发表于 2015-5-2 12:14:03 | 显示全部楼层
本帖最后由 tashalee 于 2015-5-2 12:19 编辑

#include  <REG51.H>        
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library        
#include  <intrins.h>
#define   uchar unsigned char
#define   uint unsigned int        
sbit      LED=P1^0;
sbit          SCL=P3^6;      //IIC时钟引脚定义
sbit           SDA=P3^7;      //IIC数据引脚定义
sbit      BEEP=P1^5;
#define        SlaveAddress   0x38        //定义器件在IIC总线中的从地址,根据SA0地址引脚不同修改
/////////////////////////////////////////
void Init_Wifi();
void Send_Data();
void Send_Cmd(uchar mode[]);
void Beep();
typedef unsigned char  BYTE;
typedef unsigned short WORD;
unsigned int v;

BYTE BUF[8];                         //接收数据缓存区              
uchar ge,shi,bai,qian,wan;           //显示变量
int  dis_data;                       //变量
int x,y,z;

void delay(unsigned int k);
void Init_MMA8452(void);             //初始化MMA8452
void conversion(uint temp_data);

void  Single_Write_MMA8452(uchar REG_Address,uchar REG_data);   //单个写入数据
uchar Single_Read_MMA8452(uchar REG_Address);                   //单个读取内部寄存器数据
void  Multiple_Read_MMA8452();                                  //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void MMA8452_Start();
void MMA8452_Stop();
void MMA8452_SendACK(bit ack);
bit  MMA8452_RecvACK();
void MMA8452_SendByte(BYTE dat);
BYTE MMA8452_RecvByte();
void MMA8452_ReadPage();
void MMA8452_WritePage();
//串口初始化
//9600 bps @ 11.059 MHz
void init_uart()
{
        SCON=0x50;                           //SM0SM1=01 方式1;REN=1 允许串行接收;
        PCON=0x00;                           //SMOD=1 波特率加倍
        TMOD=0x20;                           //定时器T1 方式2
        TH1=0xFA;                           //22.1184M  115200bps
        TL1=0xFA;        
        ES=1;                                   // 开串口中断
        EA=1;                                   // 开总中断
        TR1=1;                                   // 开定时器T1
}
//*********串口数据发送******************
void  SeriPushSend(uchar send_data)
{
    SBUF=send_data;  
        while(!TI);TI=0;         
}
void delays(unsigned int tt)
{
unsigned int ss,mm;
for(;tt--;tt>0)
for(mm=1000;mm--;mm>0)
for(ss=100;ss--;ss>0);
}
//*********************************************************
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;i<k;i++)
{                        
for(j=0;j<121;j++)                        
{;}}                                                
}

void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}
void Delay5ms()
{
    WORD n = 990;
    while (n--);
}
void MMA8452_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}
void MMA8452_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}
void MMA8452_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}
bit MMA8452_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

    return CY;
}
void MMA8452_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    MMA8452_RecvACK();
}
BYTE MMA8452_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_MMA8452(uchar REG_Address,uchar REG_data)
{
    MMA8452_Start();                  //起始信号
    MMA8452_SendByte(SlaveAddress);   //发送设备地址+写信号
    MMA8452_SendByte(REG_Address);    //内部寄存器地址
    MMA8452_SendByte(REG_data);       //内部寄存器数据
    MMA8452_Stop();                   //发送停止信号
}
void Multiple_read_MMA8452(void)
{   uchar i;
    MMA8452_Start();                          //起始信号
    MMA8452_SendByte(SlaveAddress);           //发送设备地址+写信号
    MMA8452_SendByte(0x01);                   //发送存储单元地址,从0x01开始        
    MMA8452_Start();                          //起始信号
    MMA8452_SendByte(SlaveAddress+1);         //发送设备地址+读信号
         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
    {
        BUF = MMA8452_RecvByte();          //BUF[0]存储0x32地址中的数据
        if (i == 5)
        {
           MMA8452_SendACK(1);                //最后一个数据需要回NOACK
        }
        else
        {
          MMA8452_SendACK(0);                //回应ACK
       }
   }
    MMA8452_Stop();                          //停止信号
    Delay5ms();
}
//初始化MMA8452,根据需要请参考pdf进行修改
void Init_MMA8452()
{
   Single_Write_MMA8452(0x2A,0x01);   
   Single_Write_MMA8452(0x2B,0x02);   

}                                                                                                                                                                                                                                       //显示z轴
display_z()
{   float temp;
    dis_data=(BUF[4]<<8)|BUF[5];    //合成数据  
    dis_data>>=4;
        z=dis_data;
                 if(z<=800)
         {Beep();}
//        dis_data-=0x03e8;
        
        if(dis_data<0){
        dis_data=-dis_data;
    SeriPushSend('-');
        }
        else SeriPushSend('+');
    temp=(float)dis_data;      //计算数据和显示
    conversion(temp);          //转换出显示需要的数据
        SeriPushSend(qian);
        SeriPushSend('.');
        SeriPushSend(bai);
        SeriPushSend(shi);
        SeriPushSend(ge);
        SeriPushSend(0X67);
        v=1000*qian+100*bai+10*shi+ge;
        return v;         
}
//******主程序********
void main()
{
   LED=1;
  init_uart();
  Init_MMA8452();                 //初始化MMA8452
  while(1)                         //循环
  {   
    Multiple_Read_MMA8452();       //连续读出数据,存储在BUF中
    SeriPushSend(0x0d);
        SeriPushSend(0x0a);
    display_z();                   //---------显示Z轴   
        LED=~LED;
   }
  }
void Beep()
{  unsigned int e;
   for(e=200;e>0;e--)
   {
     BEEP=~BEEP;
         delay(2);
   }}
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

79

帖子

0

中级会员

Rank: 3Rank: 3

积分
223
最后登录
2018-6-25
 楼主| 发表于 2015-5-2 12:20:29 | 显示全部楼层
tashalee 发表于 2015-5-2 12:17
只显示了Z 轴  X Y 轴同样调用就行了

有什么不明白的可以与我交流,QQ1061360246(这是小号哦)
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2019-4-28 12:41
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    280

    帖子

    0

    高级会员

    Rank: 4

    积分
    802
    最后登录
    2021-9-5
    发表于 2015-4-30 19:30:09 | 显示全部楼层
    楼主这是要收费的节凑吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13

    主题

    79

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    223
    最后登录
    2018-6-25
     楼主| 发表于 2015-4-30 19:38:59 | 显示全部楼层
    sxdahss 发表于 2015-4-30 19:30
    楼主这是要收费的节凑吗

    不收费。需要的话私信说一声就行
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-4-28 12:41
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    280

    帖子

    0

    高级会员

    Rank: 4

    积分
    802
    最后登录
    2021-9-5
    发表于 2015-4-30 21:48:06 | 显示全部楼层
    直接开源就是了。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    96

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    244
    最后登录
    2016-3-19
    发表于 2015-4-30 23:00:50 | 显示全部楼层
    支持一下,,,,
    回复

    使用道具 举报

    该用户从未签到

    4

    主题

    96

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    244
    最后登录
    2016-3-19
    发表于 2015-4-30 23:01:50 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-4-10 19:06
  • 签到天数: 790 天

    连续签到: 1 天

    [LV.10]以坛为家III

    6

    主题

    1193

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3420
    最后登录
    2025-4-10
    发表于 2015-4-30 23:39:06 | 显示全部楼层
    多谢楼主开源啊,有没有用飞思卡尔的单片的程序啊?这个值得做下分享下。倒是可以利用楼主的程序更改到飞思卡尔的MCU上。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    96

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    244
    最后登录
    2016-3-19
    发表于 2015-5-1 17:54:19 | 显示全部楼层
    都谢楼主啊,真是慷慨,大家以后可以资源共享。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13

    主题

    79

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    223
    最后登录
    2018-6-25
     楼主| 发表于 2015-5-2 12:17:22 | 显示全部楼层
    只显示了Z 轴  X Y 轴同样调用就行了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 15:49 , Processed in 0.244311 second(s), 33 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表