资源描述
编 号:
审定成绩:
重庆邮电大学
物联网工程课程设计(报告)
设计题目:
行走过程中的加速度测试节点设计
学 院 名 称 :
自动化学院
学 生 姓 名 :
××
专 业 :
物联网工程
班 级 :
××
学 号 :
××
指 导 教 师 :
××
填表时间: 2015 年 11 月
重庆邮电大学教务处制
一、题目:行走过程中的加速度测试节点设计
二、设计任务:
运用所学传感器技术、计算机网络和物联网工程等方面的知识,设计基于三轴加速度传感器的测试节点,获取行走过程中的手臂或小腿加速度,完成数字量输入或模拟量输入的硬件设计和低功耗无线通信协议软件设计等工作。具体任务如下:
三、设计要求:
1.画出加速度测试节点的结构图。
2.选择低功耗无线通信芯片和三轴加速度传感器,设计硬件电路。
3.开发完成ZigBee协议,完成与上位机的通信。
4.画出程序流程图并编写调试代码。
四、参考资料:
1. 李朝青.《单片机原理及接口技术》(简明修订版).北京航空航天大学出版社,1998年.
2. 胡向东.《传感技术》.重庆大学出版社,2006年第1版.
3. 谭浩强.《C语言程序设计》.北京:清华大学出版社,2002年.
4. 谢希仁.《计算机网络》.北京:电子工业出版社,2003年.
摘要
根据要求,基于ZigBee协议使用单片机和三轴加速度传感器的测试节点,并且能够通过低功耗通信协议将采集到的数据发送出去并接收。
器材上,我们选择使用了AT89C51作为主控芯片,两块CC2530用来传输数据组网,加速度传感器则选择了ADXL345三轴加速度传感器模块,通信协议使用ZigBee协议,传感器数据通信协议采用IIC协议。将ADXL345三轴加速度传感器模块连接到一块CC2530上,作为加速度测试节点与ZigBee终端节点,另一块CC2530与AT89C51连接,则作为接收加速度数据的协调器节点,并通过串口通信与上位机通信。
关键词:ZigBee,加速度,IIC
目录
摘要 1
一、设计分析 3
1. 1 ZigBee整体概述 3
1.2 IEEE 802.15.4标准概述 4
1.3 ZigBee协议体系结构 4
1.4 AT89C51简述 5
1.5 CC2530概述 5
1.6 ADXL345概述 6
二、解决方案 8
2.1具体过程 8
三、串口总线对比 12
3.1 CAN总线 12
3.2 UART总线 13
3.3 SPI总线 14
3.4 IIC总线 16
3.5综合对比 17
四、设计总结 20
附录代码 21
一、设计分析
此系统,采集模块采集了数据,通过IIC通信协议传输到其中一块cc2530开发板,然后通过ZigBee协议发送到另一块cc2530开发板子来完成。最后通过串口传输到上位机显示数据。系统分析图如图1.1所示。
图1.1系统分析图
1. 1 ZigBee整体概述
物联网的定义是:物联网(Internet of Things)是一个基于互联网、传统电信网等信息承载体,让所有能够被独立寻址的普通物理对象实现互联互通的网络。它具有普通对象设备化、自治终端互联化和普适服务智能化3个重要特征。
无线传感器网络(Wireless Sensor Network, WSN)是由大量的静止或移动的传感器以自组织和多跳的方式构成的无线网络,以协作地感知、采集、处理和传输网络覆盖地理区域内被感知对象的信息,并最终把这些信息发送给网络的所有者。
ZigBee是基于IEEE802.15.4标准的低功耗局域网协议。根据国际标准规定,ZigBee技术是一种短距离、低功耗的无线通信术。协议栈是指网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程:由上层协议到底层协议,再由底层协议到上层协议。使用最广泛的是英特网协议栈,由上到下的协议分别是:应用层(HTTP,TELNET,DNS,EMAIL等),运输层(TCP,UDP),网络层(IP),链路层(WI-FI,以太网,令牌环,FDDI等),物理层。
1.2 IEEE 802.15.4标准概述
IEEE 802.15.4网络是指在一个POS内使用相同无线信道并通过IEEE 802.15.4标准相互通信的一组设备的集合,又名LR-WPAN网络。在这个网络中,根据设备所具有的通信能力,可以分为全功能设备(Full Function Device , FFD)和精简功能设备(Reduced Function Device , RFD)。
该标准定义了物理层(PHY)和介质访问控制层(MAC)。这种低速率无线个人局域网的网络结构简单、成本低廉、具有有限的功率和灵活的吞吐量。低速率无线个人局域网的主要目标是实现安装容易、数据传输可靠、短距离通信、极低的成本、合理的电池寿命,并且拥有一个简单而且灵活的通信网络协议。
1.3 ZigBee协议体系结构
ZigBee协议栈建立在IEEE 802.15 4的PHY层和MAC子层规范之上。它实现了网络层(networklayer,NWK)和应用层(applicationlayer,APL)。在应用层内提供了应用支持子层(application support sub—layer,APS)和ZigBee设备对象(ZigBee Device Object,ZDO)。应用框架中则加入了用户自定义的应用对。
ZigBee的体系结构由称为层的各模块组成。每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。每个服务实体通过相应的服务接入点(SAP)为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。
1.4 AT89C51简述
AT89C51是市面上一款最常见的单片机,也是国内科教实验最常用的。是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。图1.4所示双列直插式封装(DIP. Dualln-line Package), DIP封装与MCS一51系列单片机的引脚完全兼容,可互换使用。
图1.4 双列直插式封装
1.5 CC2530概述
CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 应用的一个真正的片上系统(SoC)解决方案。它能够以非常低的总的材料成本建立强大的网络节点。CC2530 结合了领先的RF 收发器的优良性能,业界标准的增强型8051 CPU,系统内可编程闪存,8-KB RAM 和许多其它强大的功能。CC2530 有四种不同的闪存版本:CC2530F32/64/128/256,分别具有32/64/128/256KB 的闪存。CC2530 具有不同的运行模式,使得它尤其适应超低功耗要求的系统。运行模式之间的转换时间短进一步确保了低能源消耗。CC2530外围电路图如图1.4所示。
图1.5 CC2530外围电路图
1.6 ADXL345概述
ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量范围达±16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。该器件提供多种特殊检测功能。活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。敲击检测功能可以检测任意方向的单振和双振动作。自由落体检测功能可以检测器件是否正在掉落。这些功能可以独立映射到两个中断输出引脚中的一个。图1.6.1、图1.6.2分别是外围电路图、接线样例。
图1.6.1 ADXL345外围电路图
图1.6.2 接线样例
二、解决方案
解决方案采取的是,AT89C51对加速度传感器进行数据通信采集,然后将数据通过串口发送给相连的CC2530协调器,在与处理和与上位机通信,使用ZigBee协议栈在其应用层进行采集、组网、传输等一系列动作。开发过程中代码选择使用c语言,完成课题,因为汇编相对于C语言不便于理解思考,快速开发。
首先选择硬件,我们选择市面上最常见的单片机AT89C51,这是一款国内科教实验最常见的单片机,简单易上手开发,价格也低廉。
由于需要基于ZigBee协议进行开发,所以我们选择了对ZigBee很好兼容性的cc2530开发板进行组网传输,这是一款比较适合新手开发学习的板子。它有着很好的低功耗收发器能力,总体材料价格很低,作为ZigBee节点低功耗,低成本的方向有着相同的一致性。
对于传感器的选择,我们选择了ADX1345三轴加速度传感器,他是采用数字量输出,有着低功耗、低成本、低误差的特点,采用IIC通信,满足ZigBee要求的低功耗、低成本的主要特点,故选择了它。
传感器支持IIC和spi两种通信方式,选择的时候,选择了,相对较简单,而且连线少的IIC通信方式,速度快,连线少更加适合ZigBee节点。而不是采用SPI,因为它的连线方式比较复杂,虽然它是全双工,但是考虑设计要求,故选择IIC。
整个代码大概可以分成3部分,第一部分是数据采集程序,它包括IIC通信代码和读出传感器寄存器内部的测量数据两部分。第二部分是节点数据传输,节点采集的加速度数据发送给协调器,与协调器相连的51单片机收到数据后进行相关处理。第三部分是上位机的数据传输和显示,52单片机与上位机通过串口连接进行数据通信显示。
2.1具体过程
工作具体过程如图2.1所示。
图2.1 工作流程图
接下来进行部分源代码分析:
1)先进行一系列的串口定义:
第1.2行代码进行IIC总线需要用到的两个串口进行宏定义,然后3.4行分别对需要用到的改变P1_1串口的方向。最后一行宏定义需要用到的硬件地址。
2)串口初始化:
表示串口位真,定义波特率,关闭流量控制,最后打开串口。
3)初始化传感器:
经过查询ADXL355的使用手册后,选择传感器的模式,电源类型,打开中断,偏移量等等基础能力。
4)读取数据:
ADXl345的储存单元是0x3~0x5,先打开IIC总线然后送设备地址+写信号,接下来送存储单元地址,从0x3开始,再给一个起始信息,发送设备地址+读信号,连续读取6个地址数据,存储中BUF,收到最后一个=数据需要回NOACK,写停止信号。
整理数据并放入数组以便发送出去,由于ADXl345采集到的数据是二进制补码的形式所以需要进行转换,例如:
变换完成后并放入数组后就可以利用协议栈自带的发送程序发送给协调器了。最后通过串口通信传送给上位机就完成了整个实验。
三、串口总线对比
本次课程设计,本人负责对加速度传感器与51单片机通信的数据传输协议进行对比研究,从中采取最适合本课程设计的通信协议方式。进行对比的多种工业应用串行总线有:IIC,SPI,UART,CAN四种。
3.1 CAN总线
CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之 间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
CAN是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误,因为它的硬件错误检定特性增强了CAN的抗电磁干扰能力。一个由CAN 总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。CAN 可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,。当信号传输距离达到10Km时,CAN 仍可提供高达50Kbit/s的数据传输速率。
它是一种有效支持分布式控制或实时控制的串行通信网络。较之许多RS-485基于R线构建的分布式控制系统而言,基于CAN总线的分布式控制系统具有明显的优越性。
主要特点:
1) 低成本,结构简单,只有2根线与外部相连。
2) 极高的总线利用率
3) 很远的数据传输距离(长达10Km,速率低于5Kbps)
4) 高速的数据传输速率(高达1Mbit/s,通信距离小于40M)
5) 可根据报文的ID决定接收或屏蔽该报文
6) 内部集成了错误探测和管理模块,可靠性高
7) 发送的信息遭到破坏后,可自动重发
8) 节点在错误严重的情况下具有自动退出总线的功能
9) 报文不含源地址或目标地址,仅用标志符来指示功能信息、优先级信息,没有主从之分。
由于CAN总线具有很高的实时性能,因此,CAN已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。图3.1是CAN总线的简单应用示例
图3.1 CAN总线应用示例图
3.2 UART总线
UART是一种通用串行数据总线,用于异步通信,也就是我们经常所说的串口。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。它比IIC、SPI这两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。主机和从机通信至少要接三根线,RX、TX和GND。TX用于发送数据,RX用于接受数据。如果A是PC机,B是单片机,A和B之间还要接一块电平转换芯片,用于将TTL/CMOS(单片机电平)转换为RS232(PC机电平)。
UART总线,基本都用于调试,是计算机中串行通信端口的关键部分。如我们经常用的单片机和PC机调试,用串口助手。它比较少用于工业应用。图3.2是UART总线简图,图3.3是UART总线结构图。
图3.2 UART总线简图
图3.2 UART总线简图
3.3 SPI总线
SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。
主器件为时钟提供者,可发起读从器件或写从器件操作。这时主器件将与一个从器件进行对话。当总线上存在多个从器件时,要发起一次传输,主器件将把该从器件选择线拉低,然后分别通过 MOSI 和 MISO 线启动数据发送或接收。
图3.3点对点SPI通信原理图
SPI 时钟速度很快,范围可从几兆赫兹到几十兆赫兹,且没有系统开销,这一点比IIC优秀。但是相应地,SPI 在系统管理方面的缺点是缺乏流控机制,无论主器件还是从器件均不对消息进行确认,主器件无法知道从器件是否繁忙。因此,必须设计聪明的软件机制来处理确认问题。同时,SPI 也没有多主器件协议,必须采用很复杂的软件和外部逻辑来实现多主器件架构。每个从器件需要一个单独的从选择信号。总信号数最终为 n+3 个,其中 n 是总线上从器件的数量。因此,导线的数量将随增加的从器件的数量按比例增长。同样,在 SPI 总线上添加新的从器件也不方便。对于额外添加的每个从器件,都需要一条新的从器件选择线或解码逻辑。
SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优 点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控 制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为 SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。
3.4 IIC总线
IIC是一种二线制串行总线接口,工作在主/从模式。二线通信信号分别为开漏 SCL 和 SDA 串行时钟和串行数据。主器件为时钟源。数据传输是双向的,其方向取决于读/写位的状态。每个从器件拥有一个唯一的 7 或 10 位地址。主器件通过一个起始位发起一次传输,通过一个停止位终止一次传输。起始位之后为唯一的从器件地址,再后为读/写位。
I2C总线速度为从0Hz到3.4MHz。它没有SPI 那样快,但对于系统管理器件如温度传感器来说则非常理想。I2C 存在系统开销,这些开销包括起始位/停止位、确认位和从地址位,但它因此拥有流控机制,主器件还是从器件均对消息进行确认,主器件知道从器件是否繁忙。主器件在完成接收来自从器件的数据时总是发送一个确认位,除非其准备终止传输。从器件在其接收到来自主器件的命令或数据时总是发送一个确认位。当从器件未准备好时,它可以保持或延展时钟,直到其再次准备好响应。图3.4为IIC线路结构图。
图3.4 IIC线路结构图
I2C总线上允许连接多个微处理器以及各种外围设备,如存储器、LED及LCD驱动器、A/D及D/A转换器等。为了保证数据可靠地传送,任一时刻总线只能由某一台主机控制,各微处理器应该在总线空闲时发送启动数据,为了妥善解决多台微处理器同时发送启动数据的传送(总线控制权)冲突,以及决定由哪一台微处理器控制总线的问题,I2C总线允许连接不同传送速率的设备。多台设备之间时钟信号的同步过程称为同步化。
I2C允许多个主器件工作在同一总线上。多个主器件可以轻松同步其时钟,因此所有主器件均采用同一时钟进行传输。多个主器件可以通过数据仲裁检测哪一个主器件正在使用总线,从而避免数据破坏。由于 I2C总线只有两条导线,因此新从器件只需接入总线即可,而无需附加逻辑。
I2C总线是各种总线中使用信号线最少,并具有自动寻址、多主机时钟同步和仲裁等功能的总线。使用I2C总线设计计算机系统十分方便灵活,体积也小。
3.5综合对比
下图图3.5是四种总线特性的简单比较,图3.6是特性列举导图。
图3.5 四种总线特性比较
图3.6 特性列举导图
3.5.1 CAN和UART
CAN是一种多主方式的串行通讯总线,高数据率,高抗电磁干扰性,具备错误检定,抗电磁干扰能力,有效支持分布式控制系统和实时控制,主要应用于汽车制造业、航天业等高要求的工业领域。
UART,既常见的串口通信,主要应用于调试和用来主机与辅助设备通信,是计算机中串行通信端口的关键部分。
我负责的是传感器将数据传送给51单片机.,短距离传输,并没有涉及复杂器件,对实时性控制要求不高,同时也考虑到成本问题。因此没必要采用工业级的现场总线CAN总线。而UART是计算机串行通信端口的关键部分,常用于调试。所以不采用此种总线方式。并且,ADXL345手册中指定的通信协议只有IIC和SPI。所以只从IIC和SPI考虑。
3.5.2 SPI和IIC
SPI,比IIC速率快而且没有系统开销,但是没有流控机制,要想解决从机中的发送数据冲突问题,只能设计特定复杂的软件来解决。
而IIC有系统开销,但是本设计并没涉及过多器件,也并未对实时性要求高。由于 I2C总线只有两条导线,因此新从器件只需接入总线即可,而无需附加逻辑。 SPI协议硬件接线相比较更多,软件简单,速度快;IIC硬件接线简单,只需两根线,软件比SPI复杂点,速度慢。
本设计较为简单、小规模,采用SPI和IIC并没有较大区别和对性能有较大影响,也不会因为采用了IIC会产生较大冗余。考虑自身的实际编程能力和以往对51单片机的接触,我们选择了更熟悉了IIC,通用I/O端口作为I2C总线接口模拟IIC,放弃了使用SPI。
四、设计总结
本设计是,以2块CC2530单片机组网通信, ADXL345三轴加速度传感器采集加速度,再串口传给51单片机在传给CC2530,然后数据传送给协调器,最终传输到上位机记录。本设计的实验过程,我们更能体会到物联网的实际应用,尤其在工业应用和智能家居应用。通过组网技术,把更多的传感器互联互通,数据传送给主控芯片处理分析,最后发送到上位机进行查看操控。
其中,我是负责51单片机和加速度传感器的采用的串行总线通讯方式的选择。总共查阅资料研究对比了四种常见的串口总线:CAN,UART,SPI,IIC。开始自在大一时候用过51单片机模拟IIC,而且也是简单的套用网络的标准程序,没有深入学习时序电路图和理解它的作用。也不知道还有SPI、CAN、UART的存在。通过学习这四种串口总线,还是收获不少,学会了时序电路图的看法和用途,了解了常用串口总线的区别和特性。
中途遇到了难题,在此感谢黄庆卿老师和其他小组同学给予关键帮助指导,经过不懈努力,团队最终解决了问题。这次实验,增加了我们实际动手能力和解决和分析问题的能力。在这次的课程设计当中遇到了很多的困难和问题,我们通过查询资料一起讨论最后完成这次的课程设计,收获良多。
20
附录代码
#include <REG51.H>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P2 //LCD1602数据端口
sbit SCL=P0^4; //IIC时钟引脚定义
sbit SDA=P0^3; //IIC数据引脚定义
#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,bai,qian,wan; //显示变量
int dis_data; //变量
void delay(unsigned int k);
void Init_ADXL345(void); //初始化ADXL345
void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据
uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据
void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void ADXL345_Start();
void ADXL345_Stop();
void ADXL345_SendACK(bit ack);
bit ADXL345_RecvACK();
void ADXL345_SendByte(BYTE dat);
BYTE ADXL345_RecvByte();
void ADXL345_ReadPage();
void ADXL345_WritePage();
//*********************************************************
unsigned char ch;
bit read_flag= 0 ;
void Uart_Init(void)
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD |= 0x20 ; //定时器1为模式2,8位自动重装
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;
}
//向串口发送一个字符
void send_char_com( uchar Byte)
{
SBUF = Byte;
while (TI== 0);
TI= 0 ;
}
//串口接收中断函数
void Uart_Int(void) interrupt 4
{
if (RI)
{
RI = 0 ;
ch=SBUF;
read_flag= 1 ; //就置位取数标志
}
}
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++)
{;}}
}
/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
WORD n = 560;
while (n--);
}
/*********************起始信号**********************/
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(uchar REG_Address,uchar REG_da
展开阅读全文