STC89C51单片机和ADXL345三轴加速度模块实现简易计步器程序

发布者:大泉人家最新更新时间:2019-12-10 来源: 51hei关键字:STC89C51  单片机  ADXL345  三轴加速度模块  计步器 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include "STC51PRJ.h"


extern BYTE BUF[8];//接收数据缓存区


/*****************起始信号***************/

void ADXL345_Start()

{

        SDA = 1;                    //拉高数据线

        SCL = 1;                    //拉高时钟线

        Delay5us();                 //延时

        SDA = 0;                    //产生下降沿

        Delay5us();                 //延时

        SCL = 0;                    //拉低时钟线

}


/**************停止信号************/

void ADXL345_Stop()

{

        SDA = 0;                    //拉低数据线

        SCL = 1;                    //拉高时钟线

        Delay5us();                 //延时

        SDA = 1;                    //产生上升沿

        Delay5us();                 //延时

}


/********发送应答信号,入口参数:ack(0:ACK 1:NAK)***********/

void ADXL345_SendACK(bit ack)

{

        SDA = ack;                  //写应答信号

        SCL = 1;                    //拉高时钟线

        Delay5us();                 //延时

        SCL = 0;                    //拉低时钟线

        Delay5us();                 //延时

}


/**********接收应答信号************/

bit ADXL345_RecvACK()

{

        SCL = 1;                    //拉高时钟线

        Delay5us();                 //延时

        CY = SDA;                   //读应答信号

        SCL = 0;                    //拉低时钟线

        Delay5us();                 //延时

        return CY;

}


/********向IIC总线发送一个字节数据************/

void ADXL345_SendByte(BYTE dat)

{

        BYTE i;

        for(i=0;i<8;i++)         //8位计数器

        {

                dat <<= 1;              //移出数据的最高位

                SDA = CY;               //送数据口

                SCL = 1;                //拉高时钟线

                Delay5us();             //延时

                SCL = 0;                //拉低时钟线

                Delay5us();             //延时

        }

        ADXL345_RecvACK();

}


/*********从IIC总线接收一个字节数据**************/

BYTE ADXL345_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_ADXL345(uint8 REG_Address,uint8 REG_data)

{

        ADXL345_Start();                  //起始信号

        ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号

        ADXL345_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页 

        ADXL345_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页 

        ADXL345_Stop();                   //发送停止信号

}


/********单个读取内部寄存器数据***********/

uint8 Single_Read_ADXL345(uint8 REG_Address)

        uint8 REG_data;

  ADXL345_Start();                          //起始信号

  ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号

  ADXL345_SendByte(REG_Address);                   //发送存储单元地址,从0开始        

  ADXL345_Start();                          //起始信号

  ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号

  REG_data=ADXL345_RecvByte();              //读出寄存器数据

        ADXL345_SendACK(1);   

        ADXL345_Stop();                           //停止信号

  return REG_data; 

}


/***连续读出ADXL345内部加速度数据,地址范围0x32~0x37****/

void Multiple_read_ADXL345(void)

{   

        uint8 i;

        ADXL345_Start();                          //起始信号

        ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号

        ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始        

        ADXL345_Start();                          //起始信号

        ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号

        for(i=0;i<6;i++)                      //连续读取6个地址数据,存储中BUF

        {

                BUF[i] = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据

                if (i == 5)

                {

                        ADXL345_SendACK(1);                //最后一个数据需要回NOACK

                }

                else

                {

                        ADXL345_SendACK(0);                 //回应ACK

                }

  }

        ADXL345_Stop();                           //停止信号

        Delay5ms();

}


/****初始化ADXL345,根据需要请参考pdf进行修改**/

void Init_ADXL345()

{

        Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式

        Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页

        Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页

        Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断

        Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页

        Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页

        Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页

}



关键字:STC89C51  单片机  ADXL345  三轴加速度模块  计步器 引用地址:STC89C51单片机和ADXL345三轴加速度模块实现简易计步器程序

上一篇:51单片机电子琴制作
下一篇:51单片机+MPU6050驱动程序,1602显示

推荐阅读最新更新时间:2024-11-06 08:47

ATmega103单片机在跳频系统数字信号处理中的应用
摘要:文中介绍了ATMEL公司的高性能AVR单片机ATmega103的主要性能特点,给出了ATmega103在FH跳频系统数字信号处理模块中的应用方法,详细介绍了片内同步串口SPI的使用技巧,同时给出了SPI的通信应用程序。 关键词:单片机;跳频;SPI;数字信号处理;ATmega103 ATmega103单片机是ATMEL公司推出的精简指令集(RISC)AVR(ADVANCE RISC)系列单片机产品,这是一种增强型RISC结构,采用了CMOS技术的8位微控制器该结构能有效支持高级语言以及密集度极大的汇编器代码程序。 跳频系统(FH)是指载波频率按某种跳频图案(跳频序列)在很宽的频带范围内跳变的通信系统,由于该系统具有
[单片机]
单片机电机测速程序
这个51单片机+电机霍尔测速程序是从一个制作成功的智能小车里面提取出来的 原理图及其源代码压缩包的下载地址:http://www.51hei.com/bbs/dpj-19526-1.html 下面是主要的程序文件预览: #include reg52.h unsigned int i=0; sbit P36=P3^6; unsigned char j; unsigned int kop; unsigned char a ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char b ={0xff,0xff,0xff,0xff,0xff,0xff,0xf
[单片机]
<font color='red'>单片机</font>电机测速程序
MSP430单片机设计的婴儿睡眠监护系统
本文将介绍利用MSP430单片机设计的婴儿睡眠监护系统,该系统包括多点尿湿检测模块、声音检测模块、声光报警模块和无线传输模块。以低功耗的MSP430为主控,利用DHT11芯片检测温湿度,单片机处理后的温、湿度信息由nRF24L01发送给接收端,当温湿度超出阈值或检测到婴儿啼哭时进行声光报警。经实际测试,该系统运行可靠,低功耗、低成本、高实用性,具有推广价值。 在当今生活和工作节奏日益紧张的社会,女性往往要兼顾工作和家庭,尤其初为人母,既要照顾婴儿,还要料理家务,新妈妈们往往手忙脚乱。婴儿一天中大部分时间都在睡眠,如何对其进行睡眠监护,在婴儿醒来时及时安抚、如何解决尿湿问题一直困扰着忙碌的新妈妈们。绝大多数的家庭选择使用方便的纸尿裤
[单片机]
MSP430<font color='red'>单片机</font>设计的婴儿睡眠监护系统
基于单片机的LCD1602电子时钟设计
学习任务: (1)基本了解LCD1602 (2)基于51单片机用LCD1602实现分秒的计时; (3)按键控制分秒的调整(两个按键分别控制分和秒的增加); (4)能实现整时报时的功能(蜂鸣器响); (5)了解下载模块、下载原理; (6)基本上了解并使用DXP绘制PCB板; 知识点总结: 一、LCD1602: 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本次使用的LCD1602为16*2型。 1、基本操作时序 1、1读状态:输入:RS=L,Rw=H,E=H 输出:D0~D7=状态字; 1、2写指令:输入:RS=L,Rw=L,D0~D7=指令码,E=高脉冲,输出:无; 1、3读数据:输入:RS
[单片机]
MCU:ARM产品蚕食工业市场 固守核心优势
嵌入式应用MCU业务被证明是半导体产品市场上一项赚钱的业务。根据市场调研公司iSuppli的统计,仅仅在中国,目前嵌入式应用MCU市场每年都有20亿美元左右的规模。因此,在半导体业务增速放缓,经济大环境并不乐观的情况下,大多数拥有MCU业务的公司都在加强该项业务。而在此过程中,MCU厂商的策略各有不同。 CortexM3拓展消费和工业市场或将形成三足鼎立局面 毫无疑问,基于ARMCortex-M3的MCU产品目前在嵌入式MCU市场掀起了一股热潮。多家MCU企业已经推出或计划推出基于该核心的MCU。例如,意法半导体、恩智浦、Atmel和东芝半导体等企业已推出多款基于ARMCortex-M3的MCU。德州仪器通过收购L
[嵌入式]
51单片机混合编程
keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragma ENDASM 2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择 Options for ... ,点击右边的 Generate Assembler SRC File 和 Assemble SRC File ,使检查框由灰色变成黑色(有效)状态; 3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 KeilC51LibC51S.Lib)加入工程中, 该
[单片机]
C8051F30x单片机低成本射频读卡器方案
该方案采用超低功耗SOC型单片机C8051F30X,流水线指令结构,70%指令执行时间为一个或两个系统时钟周期,速度可达25MIPS;灵活的时钟源;3V电压供电,端口I/O均可耐压5V,硬件增强型URAT可与外部设备直接进行串口通信,或通过UART转USB桥接芯片同外部设备进行USB接口进行通讯;SMBus总线直接与ST的射频专用收发芯片CRX14连接,对CRX14控制来实现非接触射频卡的读写。   一、单片机特性:  工作电压: 3.3V  超低功耗: 典型工作电流  5mA@25MHz 11uA@32KHz  典型停机电流 0.1uA  16位可编程计数器/定时器阵列,有三个捕捉/比较模块  使用PCA或定时器和外部时钟
[单片机]
C8051F30x<font color='red'>单片机</font>低成本射频读卡器方案
抢占医疗照护商机 德州仪器推出16/32位MCU
  全球高龄、少子化趋势下,医疗照护需求已陆续在先进国家萌芽,有鉴于可携式与联网医疗电子为大势所趋,将激励高整合度、节能及支持联网功能的16位、32位微控制器(MCU)方案需求上扬,半导体大厂德州仪器(TI)已积极展开布局。   德州仪器医疗与高可靠事业群总经理Karthik Vasanth认为,可携式、低功耗、高效能与低单价的医疗电子势不可当,半导体组件商将在其中扮演不可或缺要角。   德州仪器医疗与高可靠事业群总经理Karthik Vasanth表示,由于MCU为诉求可携式、联网功能的消费性医疗和个人保健领域中不可或缺的关键组件,因此,德州仪器已推出强调支持完整讯号链、低耗电量的高整合度16位MCU方案,锁定血压计、呼
[医疗电子]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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