STC89C52上的读写MMA7455程序

发布者:真瓷堂最新更新时间:2017-11-08 来源: eefocus关键字:STC89C52  MMA7455 手机看文章 扫描二维码
随时随地手机看文章

main.c

 

#include 
#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
#include
#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

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
#include
#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


关键字:STC89C52  MMA7455 引用地址:STC89C52上的读写MMA7455程序

上一篇:STM32的DMA演示,USART
下一篇:stm32 串口通讯不成功的解决办法

推荐阅读最新更新时间:2024-03-16 15:43

二极管(STC89C52): 编写程序控制二极管花样流水灯
一. 硬件设计 二. 软件设计 1. 程序功能 编写程序控制二极管花样流水灯. 2. 程序源码 #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code a_ledTable = { 0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xf
[单片机]
二极管(<font color='red'>STC89C52</font>): 编写程序控制二极管花样流水灯
基于STC89C52和HT1621D的液晶显示系统的设计
液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄、可视面积大,画面效果好、分辨率高,抗干扰能力强等许多其他显示器无法比拟的优点,近几年来被广泛应用于单片机控制的智能仪器、仪表和低功耗电子系统中。在以单片机为核心的微控制系统中,单片机与显示器件的接口是一个必不可少的环节,具体工作包括选择显示器件的类型,接口采用串行方式还是并行方式等问题。本文针对单片机控制的智能化工业设备对人机对话接口简单、便捷的要求,详细讨论段式液晶模块HT1621D与单片机STC89C52的一种硬件接口电路和软件编程方法。   1 HT1621液晶模块与STC89CS2单片机   HT1621是128点内存映像和多功能的LCD驱动器,HT1621的软
[电源管理]
基于<font color='red'>STC89C52</font>和HT1621D的液晶显示系统的设计
51单片机STC89C52控制LED闪烁(使用for语句实现延时)
/*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------端口/引脚定义区域----------------------*/ sbit LED=P2^0; //位定义P2.0引脚名为LED /*-----------------------主函数区域-----------------------------*/ void main() { unsigned int i; //定义无符号整形变量i(范围为0~65535) while(1)
[单片机]
STC89C52单片机定时器/计数器详解(含程序和定时器2)
89C51和89C52还是有一些区别的,首先我们要明确,89C51有两个计数器T0和T1,89C52还有一个T2。   PS—串行口中断优先级控制位   PT1—TC1中断优先级控制位   PX1—外部中断1优先级控制位   PT0—TC0中断优先级控制位   PX0—外部中断0优先级控制位   同优先级的中断请求,按默认顺序响应。   【说明】   1. 本文里类似的x均可取值为0或1。   2. TC指TImer/Counter,即定时器/计数器。   3. 机器周期是单片机的基本操作周期,一个机器周期内单片机完成一项基本操作,如取指等。一个机器周期包含12个时钟周期。时钟周期是时钟频率的倒数。   4. T
[单片机]
<font color='red'>STC89C52</font>单片机定时器/计数器详解(含程序和定时器2)
基于STC89C52的智能印章机的设计方案
在银行、政府、学校等机构存在大量文件需要盖章,当需要盖章文件数量过大时则需要消耗大量的人力和时间,本文中设计的智能印章机能明显缩短印章时间并且节约大量人力,满足日常办公所需。并且具有手动设置功能,可通过手动设置盖章的延时时间,和盖章的数量本文设计的智能印章机控制电路的主要组成部分由:供电电路、电机驱动电路、传感器电路、数据存储电路、数据显示电路、手动控制电路组成。 1 系统总体框图 智能印章机盖章的工作原理是通过安装在机器底部的光电传感器检测是否有纸张的信号来开启单片机对电机的控制,通过一系列的传动结构带动印章运动完成盖章动作。盖章动作前可以通过手动控制面板对盖章数量、盖章延时进行调节。同时在印章机工作时,印章机所盖的纸张数会被数
[电源管理]
基于<font color='red'>STC89C52</font>的智能印章机的设计方案
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
相较单倒计时器对timer0初值的设定, 此处将中断处理程序触发时间间隔改为5ms, 目的是给人在视觉上以更好的体验(设定为10ms会明显感觉到闪烁). #include STC89C5xRC.H unsigned char code DIG_CODE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//对应数码管显示0~9 int tcount = 0;//记录经过的5ms区间段个数 int sec1 = 15, sec2 = 25;//倒计时初始值 void T0_INT() interrupt 1 //timer0中断, 每5m
[单片机]
8051单片机(<font color='red'>STC89C52</font>)以定时器中断模式实现两倒计时器异步计时
基于STC89C52的多通道脉搏采集系统设计
0 引言 脉诊之所以重要是由于脉象能传递机体各部分的生理病理信息,是窥视体内功能变化的窗口,可以为诊断疾病提供重要依据。但是传统脉诊主要依赖于医者的经验和主观判断,再加上被诊者的个体差异使得脉象的辨认、识别缺乏统一、精确的标准。因此,脉搏采集系统的研制有助于脉诊的客观化研究。脉搏采集系统设计难点在于如何模拟医者手指,在最佳取脉压力下获取清晰的脉搏波谱,并根据不同的压力变化,完成对寸、关、尺三个脉位复杂脉象的提取和识别。 自20世纪50年代以来,对于脉学的理论、脉诊方法、临床诊断和实验研究等方面均开展了大量工作,取得了较大的进展。英国人Marey最早设计了以弹簧为动力的杠杆式脉搏传感器,并记录了桡动脉脉搏波。1860年首次出现
[测试测量]
基于<font color='red'>STC89C52</font>的多通道脉搏采集系统设计
基于STC89C52的程控恒流源的设计
高精度的程控恒流电源在仪器仪表、传感器技术和测试领域中有着广泛的应用。以往程控恒流源电路大都采用PWM脉冲方式,虽便于控制和调节,但精度难以保证,并且PWM方式的波形占空比调节范围有限,难以满足连续可调大电流的要求。本文介绍一种采用STC89C52单片机控制压控恒流源并通过扩流电路来实现恒流源程序控制的方案,其输出电流值可达2A。 程控恒流源的构成和工作原理 程控恒流源电路由压控电路、扩流电路和数控电路组成,结构如图1所示。 图1 程控恒流源电路的组成框图 本恒流源电路采用STC89C52控制D/A转换电路产生电压控制信号,通过1个精密线性压控电流源和扩流电路输出所需的电流值;取样电路采样后经A/D转换由数控电路读出,然
[工业控制]
基于<font color='red'>STC89C52</font>的程控恒流源的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved