找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 732|回复: 0
收起左侧

单片机驱动MMA7455源程序

[复制链接]
ID:467203 发表于 2022-9-9 15:56 | 显示全部楼层 |阅读模式
MMA7455.C文件
  1. #include "MMA7455.H"
  2. //sbit sda=P2^3;              //I2C 数据传送位
  3. //sbit scl=P2^4;              //I2C 时钟传送位
  4. unsigned char sign_flag;  //输出数据正负标记位
  5. void IIC_MMA7455_init()
  6. {
  7. IIC_start();
  8. IIC_writebyte(MMA7455_ADDER_WRITE);     //1. 在IIC总线上寻址MMA7455
  9. while(IIC_respons());
  10. IIC_writebyte(MMA7455_Mode_Control_Register);    //2. 模式设置寄存器寻址
  11. while(IIC_respons());
  12. IIC_writebyte(MMA7455_2G_Measurement_Mode);         //3. 模式寄存器数据写入
  13. while(IIC_respons());
  14. IIC_stop();
  15. IIC_start();
  16. IIC_writebyte(MMA7455_ADDER_WRITE);     //1. 在IIC总线上寻址MMA7455
  17. while(IIC_respons());
  18. IIC_writebyte(MMA7455_Mode_Control_Register);    //2. 模式设置寄存器寻址
  19. while(IIC_respons());
  20. IIC_writebyte(MMA7455_2G_Measurement_Mode);         //3. 模式寄存器数据写入
  21. while(IIC_respons());
  22. IIC_stop();

  23. }
  24. void IIC_MMA7455_writedata(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
  25. {
  26.      unsigned char  temp;
  27.          temp=(IIC_WRITE<<1);
  28.          IIC_start();
  29.          IIC_writebyte(temp);
  30.          while(IIC_respons());
  31.          IIC_writebyte(byte_add);
  32.          while(IIC_respons());
  33.      IIC_writebyte(wdata);
  34.          while(IIC_respons());
  35.          IIC_stop();
  36. }
  37. unsigned char IIC_MMA7455_readdata(uchar byte_add)                   //函数功能:按地址读出一字节数据
  38. {
  39.      unsigned char temp;
  40.          char x_y_z ;
  41.          temp=(IIC_WRITE<<1);
  42.          IIC_start();
  43.          IIC_writebyte(0x3A);
  44.          while(IIC_respons());
  45.          IIC_writebyte(byte_add);
  46.          while(IIC_respons());
  47.          temp=((IIC_READ<<1)|0x01);
  48.          IIC_start();
  49.          IIC_writebyte(0x3B);
  50.          while(IIC_respons());
  51.          x_y_z=IIC_readbyte();
  52.          while(IIC_respons());
  53.          IIC_stop();
  54.          return x_y_z;
  55. }

  56. unsigned char IIC_MMA7455_test()
  57. {
  58.     unsigned char temp;
  59.         for(temp=255;temp<=1;temp--);
  60.     IIC_MMA7455_writedata(0x16,0x05);
  61.         for(temp=255;temp<=1;temp--);       
  62.     temp=IIC_MMA7455_readdata(0x16);
  63.         if(temp==0x05) {return 1;}
  64.         else{return 0;}       
  65. }
  66. unsigned char IIC_MMA7455_checkbusy()
  67. {
  68.          unsigned char temp;                                                                               
  69.          temp=IIC_MMA7455_readdata(MMA7455_READ_STATUS);
  70.          if((temp&0x01)==1)
  71.          {
  72.                  return 1;
  73.          }
  74.          else
  75.          {
  76.                  return 0;
  77.          }

  78. }
  79. unsigned char IIC_MMA7455_getvalue(unsigned char address_byte)
  80. {
  81.    unsigned char temp;
  82.    while(!IIC_MMA7455_checkbusy());
  83.    temp=IIC_MMA7455_readdata(address_byte);
  84.    if((temp&0x80)==0x00)
  85.    {
  86.             sign_flag=0;
  87.          return temp;
  88.    
  89.    }
  90.    else
  91.    {
  92.             sign_flag=1;
  93.          temp=temp-0x01;
  94.          temp=~temp;
  95.          return temp;
  96.    }
  97. }
  98. unsigned char IIC_MMA7455_getaverage(unsigned char address_byte)
  99. {
  100.     unsigned char num,temp;
  101.         unsigned int  temps=0x00;
  102.         for(num=50;num>0;num--)
  103.         {
  104.                 temp=IIC_MMA7455_getvalue(address_byte);
  105.                 temps=temps+temp;       
  106.         }
  107.         temp=temps/50;
  108.         return temp;
  109. }



  110. unsigned char IIC_MMA7455_getacceleration(unsigned char address_byte)
  111. {
  112.         unsigned int temp;
  113.         temp=IIC_MMA7455_getaverage(address_byte);
  114.         temp=temp*200;
  115.         temp=temp>>7;
  116.         return temp;

  117. }
  118. unsigned char IIC_MMA7455_calibrate_X()
  119. {
  120.    unsigned char tempX,time;                                                                               
  121.    while(!IIC_MMA7455_checkbusy());
  122.    tempX=IIC_MMA7455_readdata(MMA7455_READ_X);
  123.    for(time=100;time>0;time--)
  124.    {
  125.    if((tempX&0x80)==0x00)
  126.    {
  127.             tempX=tempX+tempX;
  128.          tempX=~tempX+1;
  129.          IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempX);   
  130.    }
  131.    else
  132.    {
  133.          tempX=tempX-1;
  134.          tempX=~tempX;
  135.          tempX=tempX+tempX;
  136.          IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempX);
  137.    }
  138.    tempX=IIC_MMA7455_readdata(MMA7455_READ_X);
  139.    if((tempX<=10)&&(tempX>=-10)){break;}
  140.    }
  141.    return 1;
  142. }



  143. unsigned char IIC_MMA7455_calibrate_Y()
  144. {
  145.    unsigned char tempY,time;                                                                               
  146.    while(!IIC_MMA7455_checkbusy());
  147.    tempY=IIC_MMA7455_readdata(MMA7455_READ_Y);
  148.    for(time=100;time>0;time--)
  149.    {
  150.    if((tempY&0x80)==0x00)
  151.    {
  152.             tempY=tempY+tempY;
  153.          tempY=~tempY+1;
  154.          IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempY);   
  155.    }
  156.    else
  157.    {
  158.          tempY=tempY-1;
  159.          tempY=~tempY;
  160.          tempY=tempY+tempY;
  161.          IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempY);
  162.    }
  163.    tempY=IIC_MMA7455_readdata(MMA7455_READ_Y);
  164.    if((tempY<=10)&&(tempY>=-10)){break;}
  165.    }
  166.    return 1;
  167. }




  168. unsigned char IIC_MMA7455_calibrate_Z()
  169. {
  170.    unsigned char tempZ,time;                                                                               
  171.    while(!IIC_MMA7455_checkbusy());
  172.    tempZ=IIC_MMA7455_readdata(MMA7455_READ_Z);
  173.    for(time=100;time>0;time--)
  174.    {
  175.    if((tempZ&0x80)==0x00)
  176.    {
  177.           
  178.          tempZ=64-tempZ;
  179.          if(tempZ==0){break;}
  180.          if(tempZ>0)
  181.          {
  182.                  tempZ=tempZ+tempZ;
  183.                  tempZ=~tempZ+1;
  184.                  IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempZ);
  185.          }
  186.          if(tempZ<0)
  187.          {
  188.                  tempZ=tempZ+tempZ;
  189.                  IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempZ);
  190.          }  
  191.    }
  192.    else
  193.    {
  194.          tempZ=tempZ-1;
  195.          tempZ=~tempZ;
  196.          tempZ=64+tempZ;
  197.          tempZ=tempZ+tempZ;
  198.          IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempZ);
  199.    }
  200.    tempZ=IIC_MMA7455_readdata(MMA7455_READ_Z);
  201.    if((tempZ<=70)&&(tempZ>=50)){break;}
  202.    }
  203.    return 1;
  204. }
复制代码



MMA7455.H头文件
  1. #ifndef __MMA7455_H__
  2. #define __MMA7455_H__
  3. #include "IIC.H"
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define IIC_READ  0x1D      //定义读指令
  7. #define IIC_WRITE 0x1D      //定义写指令
  8. #define MMA7455_ADDER_WRITE 0x3A //0x1D 左移,后边补一写位 0 ,得到0x3A
  9. #define MMA7455_ADDER_READ 0x3B  //0x1D 左移,后边补一读位 1 ,得到0x3B
  10. #define MMA7455_Mode_Control_Register 0x16
  11. #define MMA7455_WHOAMI 0X0F
  12. #define MMA7455_2G_Measurement_Mode 0x05
  13. #define MMA7455_READ_X 0x06   //读 8bits X轴数据地址
  14. #define MMA7455_READ_Y 0x07   //读 8bits y轴数据地址
  15. #define MMA7455_READ_Z 0x08   //读 8bits y轴数据地址
  16. #define MMA7455_READ_STATUS 0x09   // 8位状态寄存器
  17. #define MMA7455_RW_XOFFL 0x10  //X轴补偿低字节
  18. #define MMA7455_RW_YOFFL 0x12  //Y轴补偿低字节、
  19. #define MMA7455_RW_ZOFFL 0x14  //Z轴补偿低字节
  20. void IIC_MMA7455_init();
  21. void IIC_MMA7455_writedata(uchar byte_add,uchar wdata);//函数功能:按地址写入一字节数据
  22. unsigned char IIC_MMA7455_readdata(uchar byte_add);           //函数功能:按地址读出一字节数据
  23. unsigned char IIC_MMA7455_test();
  24. unsigned char IIC_MMA7455_calibrate_X();
  25. unsigned char IIC_MMA7455_calibrate_Y();
  26. unsigned char IIC_MMA7455_calibrate_Z();
  27. unsigned char IIC_MMA7455_getvalue(unsigned char address_byte);
  28. unsigned char IIC_MMA7455_getaverage(unsigned char address_byte);
  29. unsigned char IIC_MMA7455_getacceleration(unsigned char address_byte);
  30. #endif
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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