zoukankan      html  css  js  c++  java
  • STC89C52上的读写MMA7455程序

    main.c

    #include <reg52.h>
    #include "mytype.h"
    #include "iic.h"
    #include "mma7455.h"



    uint8 X,Y,Z;
    void main()
    {
     uint8 i,temp;
     EA=1;      //打开中断
     EX1=1;     //打开外部中断INIT1
     
      //初始化IIC总线
     IIC_init();


     //写数据
      IIC_start();
     IIC_write_byte(MMA7455_ADDER_WRITE);     //1. 在IIC总线上寻址MMA7455
     IIC_respons();
     IIC_write_byte(MMA7455_Mode_Control_Register);    //2. 模式设置寄存器寻址
     IIC_respons();
     IIC_write_byte(0x05);         //3. 模式寄存器数据写入
     IIC_respons();
     IIC_stop();

     //写数据
      IIC_start();
     IIC_write_byte(MMA7455_ADDER_WRITE);     //1. 在IIC总线上寻址MMA7455
     IIC_respons();
     IIC_write_byte(MMA7455_Mode_Control_Register);    //2. 量程检测设置寄存器寻址
     IIC_respons();
     IIC_write_byte(MMA7455_2G_Measurement_Mode);    //3. 设置量程为2G,检测模式。量程检测设置寄存器配置数据写入
     IIC_respons();
     IIC_stop();


      while(1)
     {
      //读X轴数据
      IIC_start();
      IIC_write_byte(MMA7455_ADDER_WRITE);    //1. IIC地址寻址
      IIC_respons();
      IIC_write_byte(MMA7455_READ_X);      //2. X轴数据寄存器寻址
      IIC_respons();
      IIC_start();             //3.
      IIC_write_byte(MMA7455_ADDER_READ);     //改变读写方向
      IIC_respons();
      X=IIC_read_byte();        //4.读数据
      IIC_stop();
      //读Y轴数据
      IIC_start();
      IIC_write_byte(MMA7455_ADDER_WRITE);    //1. IIC地址寻址
      IIC_respons();
      IIC_write_byte(MMA7455_READ_Y);      //2. X轴数据寄存器寻址
      IIC_respons();
      IIC_start();             //3.
      IIC_write_byte(MMA7455_ADDER_READ);     //改变读写方向
      IIC_respons();
      Y=IIC_read_byte();        //4.读数据
      IIC_stop();
      //读X轴数据
      IIC_start();
      IIC_write_byte(MMA7455_ADDER_WRITE);    //1. IIC地址寻址
      IIC_respons();
      IIC_write_byte(MMA7455_READ_X);      //2. X轴数据寄存器寻址
      IIC_respons();
      IIC_start();             //3.
      IIC_write_byte(MMA7455_ADDER_READ);     //改变读写方向
      IIC_respons();
      Z=IIC_read_byte();        //4.读数据
      IIC_stop();
     }
    }


    iic.c

    #include <reg52.h>
    #include <intrins.h>
    #include "iic.h"
    #include "mytype.h"

    #define  NOP()   _nop_()  
    #define  _Nop()  _nop_()  



    void IIC_start() 
    {
     SDA=1;        
     _Nop();
     SCL=1;
     _Nop();       
     _Nop();
     _Nop();
     _Nop();
     _Nop();   
     SDA=0;        
     _Nop();       
     _Nop();
     _Nop();
     _Nop();
     _Nop();      
     SCL=0;      
     _Nop();
     _Nop();
    }

    void IIC_stop()  
    {
    SDA=0;     
    _Nop();      
    SCL=1;     
    _Nop();
    _Nop();
    _Nop();
    _Nop();
    _Nop();
    SDA=1;     
    _Nop();
    _Nop();
    _Nop();
    _Nop();
    _Nop();
    _Nop();
    _Nop();
    _Nop();
    }


    void IIC_init()  //
    {
     SDA=1;
     SCL=1;
    }

    void IIC_write_byte(int8 adder)
    {
     uint8 i,temp;
     temp=adder;
     for(i=0;i<8;i++)
     {
      temp=temp<<1;
      SDA=CY;
      SCL=1;              
      _Nop();
      _Nop();            
      _Nop();
      _Nop();
      _Nop();
      SCL=0;
     }
        _Nop();
        _Nop();
        SDA=1;               
        _Nop();
        _Nop();
        SCL=1;
        _Nop();
        _Nop();
        _Nop();
    }

    uint8 IIC_read_byte()
    {
     uint8 i,j,k;
     SCL=0;
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
     SDA=1;
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
     for(i=0;i<8;i++)
     {
      SCL=1;
         _Nop();
         _Nop();
         _Nop();
      j=SDA;
      k=(k<<1)|j;
      SCL=0;
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         _Nop();

     }
        _Nop();
        _Nop();
        _Nop();
     return k;

    }

    uint8 IIC_respons()
    {

        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        _Nop();
        if(SDA==1)
     {
      return 0;
     }
        SCL=0;
        _Nop();
        _Nop();
     return 1;
    }


    iic.h

    #ifndef __IIC_H_
    #define __IIC_H_

    #include <reg52.h>

    sbit SDA = P2^1;  //MA7455的13脚是数据
    sbit SCL = P2^0; //MA7455的14PIN是时钟

    void IIC_delay();
    void IIC_init();
    void IIC_start();
    void IIC_stop();

    void IIC_write_byte(uint8);
    uint8 IIC_read_byte();
    uint8 IIC_respons();

    mma7455.c

    #include <reg52.h>
    #include <intrins.h>
    #include "iic.h"
    #include"mma7455.h"

    #define  NOP()   _nop_()  
    #define  _Nop()  _nop_()  

    void IIC_adder_write_byte(int8 adder,int8 rw)
    {
     uint8 i,temp;
     temp=adder;
     temp=temp<<1;   //从设备地址左移一位,
     temp=temp|rw;  //后面补读一写位

     IIC_delay();
     for(i=0;i<8;i++)
     {
      temp=temp<<1;
      SDA=CY;
      SCL=1;              
      _Nop();
      _Nop();            
      _Nop();
      _Nop();
      _Nop();
      SCL=0;
     }
        _Nop();
        _Nop();
        SDA=1;               
        _Nop();
        _Nop();
        SCL=1;
        _Nop();
        _Nop();
        _Nop();
    }

    mma7455.h

    #ifndef __MMA7455_H__
    #define __MMA7455_H__

    #define MMA7455_ADDER_WRITE 0x3A //0x1D 左移,后边补一写位 0 ,得到0x3A
    #define MMA7455_ADDER_READ 0x3B  //0x1D 左移,后边补一读位 1 ,得到0x3B
    #define MMA7455_Mode_Control_Register 0x16
    #define MMA7455_WHOAMI 0X0F
    #define MMA7455_2G_Measurement_Mode 0x05
    #define MMA7455_READ_X 0x06   //读 8bits X轴数据地址
    #define MMA7455_READ_Y 0x07   //读 8bits y轴数据地址
    #define MMA7455_READ_Z 0x08   //读 8bits y轴数据地址

    void IIC_adder_write_byte(int8,int8);


    mytype.h

    #ifndef _MY_TYPE_H__
    #define _MY_TPYE_H__

    #define uint8 unsigned char 
    #define uint16 unsigned short int
    #define uint32 unsigned long int
    #define uint64 unsigned long long int

    #define int8 signed char
    #define int16 signed short int
    #define int32 signed long int
    #define int64 signed long long int

    #endif

  • 相关阅读:
    MongoDB集群与LBS应用系列(一)
    Docker下构建centos7容器无法使用systemctl命令的解决办法
    重新诠释的OSGi规范
    交互细节中那些变形金刚
    UX黑名单!有哪些常见的移动端UX设计误区需要规避?
    那些门户网站的兼容问题(持续更新)
    Vmware虚拟机网络模式及虚拟机与物理机通信方法
    交互设计阅读(一)
    笑傲江湖:完美解决205:您所选择的线路不存在问题
    笑傲江湖 外网
  • 原文地址:https://www.cnblogs.com/liangbo-1024/p/9198265.html
Copyright © 2011-2022 走看看