基于加速度传感器ADXL345的计步器设计 - 图文

更新时间:2024-01-08 16:45:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于加速度传感器ADXL345的计步器设计

摘要:计步器是一种颇受欢迎的日常锻炼进度监控器,可以激励人们挑战自己,增强体质,帮助瘦身。早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器。晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左右摆动敲击挡块。计步器功能可以根据计算人的运动情况来分析人体的健康状况。而人的运动情况可以通过很多特性来进行分析。与传统的机械式传感器不同,ADXL345是电容式三轴传感器,由它捕获人体运动时加速度信号,更加准确。信号通过低通滤波器滤波,由单片机内置A/D转换器对信号进行采样、A/D转换。软件采用自适应算法实现计步功能,减少误计数,更加精确。单片机STC89C52控制液晶显示计步状态。整机工作电流只有1-1.5mA,实现超低功耗。 关键词:计步器;加速度传感器;ADXL345;低功耗

0 前言

随着社会的发展,人们的物质生活水平日渐提高,人们也越来越关注自己的健康。计步器作为一种测量仪器,可以计算行走的步数和消耗的能量,所以人们可以定量的制定运动方案来健身,并根据运行情况来分析人体的健康状况,因而越发流行。手持式的电子计步器是适应市场需求的设计,使用起来简单方便。

计步器是一种颇受欢迎的日常锻炼进度监控器,可以激励人们挑战自己,增强体质,帮助瘦身。早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器。晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左右摆动敲击挡块。电子计步器主要组成部分是振动传感器和电子计数器。步行的时候人的重心会上下移动。以腰部的上下位移最为明显,所以记步器挂在腰带上最为适宜。所谓的振动传感器其实就是一个平衡锤在上下振动时平衡被破坏使一个触点能出现通/断动作,由电子计数器完成了主要的记录与显示功能,其他的属于热量消耗,路程换算均由电路完成。计步器中一般采用一种加速度计来感受外界的震动。常用的加速度计原理如下:在一段塑料管中密封着一小块磁铁,管外缠绕着线圈,当塑料管运动时,磁铁由于惯性在管中反向运动,切割线圈,由于电磁感应,线圈中产生电流,人体运动时,上下起伏的加速度近似为正弦过程,线圈的输出电流也是正弦波,测量正弦波的频率就可以得出运动的步数,再计算的出速度,距离,和消耗卡路里。

第1页

1 总体方案设计

1.1 设计要求

(1)掌握加速度传感器ADXL345的工作原理。 (2)掌握LCD1602的工作原理及编程方法。 (3)该系统能够有效的检测人体步行动作。

(4) 能够显示并且记录单位时间内的步数,一段时间内总步数,行走的距离以及消耗的热量。

(5) 使用单片机技术处理数据。 1.2 单片机芯片的选择方案和论证

采用AT89S51芯片作为硬件核心,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,所以在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

采用STC89C52芯片,STC89C52是一种低功耗、高性能的8位CMOS微控制器,具有8K的可编程Flash存储器。同样具有AT89S51的功能,且具有在线编程可擦除技术,当对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,因此选择采用STC89C52作为主控制系统核心。 1.3 显示模块选择方案和论证 方案一:

采用LED数码管动态扫描,LED数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。 方案二:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,若采用在显示数字显得太浪费,且价格也相对较高,所以在此也不用此种作为显示。 方案三:

采用LCD1602液晶显示屏;它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD可以显示的内容为16X2,即可以显示两行。该液晶显示屏的显示功能强大,内置192种字符,可显示大量符号、数字,清晰可见,而且功率消耗小寿命长抗干扰能力强。

综上,在此设计中采用1602液晶显示屏。

第2页

1.4 传感器的选择方案和论证 方案一:选择机械式振动传感器

机械式振动传感器内部有一个平衡锤,当传感器振动时,平衡被破坏,如此会造成上下触点的通断。佩戴者在跑步过程中,身体起伏重心高低产生变化,计步器内部的振动传感器就会将这一变化转换为数字量送至控制单元,从而获得佩戴者的运动信息。机械式振动传感器原理简单、精度和成本低,适用于振幅较大的场合。 方案二:选择加速度传感器

三轴加速度传感器分为压阻式,压电式和电容式。加速度的变化能够改变电阻、电压或者电容的变化,从而获得空间位置三个垂直方向的加速度分量。佩戴者在跑步过程中,身体上下起伏,计步器内部的微控制器读取三轴加速度传感器的三组模拟量,通过计步算法分析,获取运动信息。三轴加速度传感器具有精度高、反应速度快、通讯协议简单可靠等特点,广泛使用于汽车、数码产品、航天设备等领域。 方案三:选择压力传感器

压力传感器是将压力的变化转化为电压的变化。利用这一特性,可将压力传感器内置在鞋的底部,当用户在行进过程中,压力传感器受到的压力不同(抬脚时脚对鞋无压力,放脚时脚对鞋有持续压力),这样,计步器的主控单元读取压力值,经过计步算法即可判断运动状态。

为选择一款最适合本课题的计步传感器将三种传感器对比如下表:

表1 三种传感器对比表 类型 工作电流 工作精度 价格(元) 机械式振动传感器 5mA 0.1g 1.0元 加速度传感器 30mA 0.002g 5.0元 压力传感器 -- -- -- 目前内置于鞋底的压力传感器属于柔性传感器。在2008年北京奥运会上曾将它用于检测运动员的蹬地力、蹬地时间、足底接触形状、运动速度、离心力等信息,以便指导运动员取得更好的成绩。这种传感器价格昂贵,设计难度较大,不适合本设计。机械设振动传感器应用于早期的计步器,测量精度低,误判、漏判严重,不符合本课题高精度的设计原则。随着加速度传感器的工艺逐渐成熟,测量精度也逐渐提高,同时也有很高的灵敏度,功耗已达到微安级别,温度漂移小,具有良好的稳定性,随着市场的大量使用,价格也降

第3页

了下来,加速度传感器非常适合移动设备应用。综上,加速度传感器符合本课题的设计理念。表2列出了不同型号的三轴加速度传感器的特性。

表2 加速度传感器特性对比表 加速度计代表型号 工作电流 精度 价格(元) LSM303DLH 0.83mA 0.0003g 40.0 MPU-6050 500uA 0.0003g 50.0 ADXL345 150uA 0.008g 3.0 结合价格、功耗和精度等多方面考虑,本课题选择的三轴加速度传感器ADXL345作为计步传感器。 1.5 系统最终方案设计

该计步器是由ADXL345加速度传感器、STC89C52单片机以及LCD1602显示屏等组成。传感器采集数据,经内部A/D转换后,输入单片机内部,将数据处理后输出至液晶显示器显示。

ADXL345传感器采集器微处理器STC89C52单片机图1 总体方框图

LCD1602数据显示

2 硬件电路设计

2.1 系统硬件概述

本电路是以STC89C52单片机为控制核心,该芯片具有在线编程功能,功耗低,能在3.3V的超低压下工作,在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案;加速度传感器采用ADXL345,它是一款小而薄的超低功耗3轴加速度计,测量范围达正负16g,数字输出数据为16位的二进制补码格式,可通过SPI(3线或4线)或IIC数字接口访问。显示模块使用LCD1602液晶显示屏来实现,该显示屏具有低功耗、寿命长、可靠性高,可供显示的字符较多,控制指令简单的特点,其工作电压为5V。 2.2 主要单元电路的设计

第4页

2.2.1 系统主控制模块的设计

本设计中单片机主要负责对外设的控制和各个功能模块间的协调,没有复杂的数据计算,因此,8位的52系列单片机足以胜任,它具有体积小、控制功能强、成本低,易扩展,可靠性好、使用温度范围宽等众多优点。通常使用的国产STC89C52单片机以其低廉的价格以及较出色的性能成了很多控制系统的首选。它具有丰富的内部资源,较大的数据存储区和程序存储区。同时,由于学习52单片机容易上手,指令简单易懂,编程灵活,在本设计中具有较高的应用价值。

一个典型的单片机最小系统一般由时钟电路、复位电路、电源指示灯和外部扩展接口等部分组成,本系统也不例外,当单片机具备了这些最基本的条件后,就可以正常工作了。STC89C52单片机外部结构图如图2所示。

STC89C5219XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7 图2 单片机外部结构图

1、复位电路的设计

复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这上状态开始工作。

(1)单片机常见的复位电路

通常单片机复位电路有两种:上电复位电路,按键复位电路。上电复位电路:上电复位是单片机上电时复位操作,保证单片机上电后立即进入规定的复位状态。它利用的是电容充电的原理来实现的。按键复位电路:它不仅具有上电复位电路的功能,同时它的操作比上电复位电路的操作要简单的多。如果要实现复位的话,只要按下RESET键即可。它主要是利用电阻的分压来实现的

第5页

在此设计中,采用的按键复位电路。按键复位电路如图3所示。

C310uFRSTR110k2P 图3 复位电路

(2)复位电路工作原理

上电复位要求接通电源后,单片机自动实现复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。上电与按键均有效的复位电路不仅在上电时可以自动复位,而且在单片机运行期间,利用按键也可以完成复位操作。

2、晶振电路的设计

晶振电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作。

通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,如图4中X1、C1、C2。可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择30nF左右的瓷片电容。

C130nfXTAL1X111.592MHzC2XTAL230nf 图4 时钟振荡电路

第6页

2.2.2计步器传感器采集模块

ADXL345的内部功能结构如图5所示,X、Y、Z三个相互正交的方向上的加速度由 G-Cell传感器感知,经过容压变换器、增益放大、滤波器和温度补偿后以电压信号输出。

图5 ADXL345内部结构功能框图

所谓的G-Cell传感器是由半导体材料(多晶硅)经半导体工艺加工得到,其结构可简化为三块电容极板,如图6。两端的极板圈定,中间的极板在加速度的作用下,偏离无加速度的位置,这样它到两端极板的距离发生变化,造成电容值的变化.这个变化值经容压变换、增益放大,滤波等后体现在最后的电压输出值上,从而完成对加速度的测量。

图6 G-Cell传感器的物理模型

ADXL345的三个相互正交的测量方向如图7,固定在人体上后,这三个方向上的数

第7页

据意义也就随之确定了。

图7 ADXL345的三测量轴向

引脚配置(顶视图):

图8 引脚功能图

ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量范围达±16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。

如图9所示,为传感器底座,接口电路连接:

第8页

P11 VCC C7 0.1uF 1 2 3 4 P12 VDD RESE GND S1 CS INT2 RESE Y outSDA 1 3 5 7 9 11 13 2 GND 4 GND VS 6 8 INT1 10 NC Z out 12 SDOX out 14 SCL

X out 4 Y out 3 2 Z out 1

ADXL345

图9 传感器连接模块

此模块电路主要功能就用于做ADXL345加速度传感器的一个转接口,而且利用ADXL345该加速度传感器产生相应的变化值。相当于整个系统的信号产生模块。 2.2.3 显示模块的设计

本设计中由于要对时间进行显示,所以选择液晶显示屏1602模块作为输出。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,就能看到字母“A”。 管脚功能如表3所示:

表3 LCD1602引脚功能 引脚 1 2 3 4 5 6 7 符号 VSS VDD V0 RS R/W E DB0~DB7 功能说明 一般接地 接电源(+5V) 液晶显示器对比度调整端。 RS为寄存器选择。 R/W为读写信号线。 E(或EN)端为使能(enable)端,下降沿使能。 三态、 双向数据总线 第9页

LCD1602主要管脚介绍:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生鬼影使用时可以通过一个10K的电位器调整对比度。RS为寄存器选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。R/W为读写信号线端,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址;当RS为高电平R/W 为低电平时可以写入数据。E为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

将LCD1602的RS端和P2.0,R/W端和P2.1,E端和P2.2相连,当RS=0时,对LCD1602写入指令;当RS=1时,对LCD1602写入数据。当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端。当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示的示数。图10为1602液晶显示屏与单片机的硬件连接图。

图10 LCD液晶与单片机硬件连线图

3 系统软件设计

第10页

GNDLCD1602液晶接口

LCD1LCD1602BG/GNDBG/VCCGNDVCCRWDB0DB1DB2DB3DB4DB5DB6DB7VORSE12345678910111213141516P10P11P12P00P01P02P03P04P05P06P07R12KGNDVCCVCCVCC 10uFS1C1 10KC2C3GND S2 R2S3 2020Y112M 1234567891011121314151617181920按键电路 GNDP1 U1STC89C52P1.0VCCP1.1P0.0P1.2P0.1P1.3P0.2P1.4P0.3P1.5P0.4P1.6P0.5P1.7P0.6RSTP0.7(RXD)P3.0EA/VPP(TXD)P3.1ALE/PROG(INT0)P3.2PSEN(INT1)P3.3P2.7(T0)P3.4P2.6(T1)P3.5P2.5(WR)P3.6P2.4(RD)P3.7P2.3XTAL2P2.2XTAL1P2.1GNDP2.0 4039383736353433323130292827262524232221 P00P01P02P03P04P05P06P07 VCC P15P14 U212345SCLSDASDOINT2INT1ADXL345 单片主控电路 VCC5VCC3.3GNDVSCS 109876 GND

12 SW152 4631sw-?òé?VCC 电源接口电路

GND

图18 系统仿真图

4 系统硬件电路的测试

如表5为在实际步数中显示步数以及总步数不复位情况下记录。下图表6为在实际步数中显示步数每5步复位一次总步数不复位情况下记录。由图可得到实物对步数统计准确率在90%以上。

表5 实际测试不复位记录表

实际步数 显示步数 总步数

5 5 5 10 9 9 15 14 14 20 18 18 25 22 22 30 27 27 表6 实际测试每5步复位一次 实际步数 显示步数 总步数 5 4 4 10 5 9 15 4 13 20 5 18 25 5 23 30 5 28 基于ADXL345的计步器的电路比较复杂,对于焊接方面不可轻视,需要有一定的焊接基

第16页

础和尝试,只要电路系统中出于一处的错误,就会对检测造成很大的不便,而且电路的交线较多,所以在焊接的时候要边焊接,边检测是否有电路,断路,跳线情况发生,如果有,则要及时修正,否则会对续后的电路焊接造成极大地困难。对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。

在本次课题的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

(1)在显示步数、总步数、路程以及卡路里有时LCD液晶显示屏被屏蔽掉,造成不亮现象。

解决:根据仪器的测试,发现电路的驱动能力不足,在接入2.4K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。

(2)烧入程序后,LCD液晶显示屏不显示或者亮度不好。

解决:不显示时首先使用万用表对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏的现象。若无此问题查看烧写的程序是否正确无误,对程序进行认真修改。当显示亮度不好时一遍旋转10K欧的滑动变阻器,一遍观看LCD显示屏,直到看到合适的亮度为止。

经过多次的反复调试试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。同时在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。如下为硬件实物图如图18所示。计步器工作时的实物图如图19所示。

图18 计步器实物图

第17页

图19 计步器工作时的实物图

5 结论及进一步设想

至此,关于课程设计的所有内容就介绍完了,进行这次课程设计一切都是从零开始,从最简单查资料、了解各个元件的功能起步,再确定设计方案、画流程图、编写程序到最后进行仿真,这次课题设计可以说成功完成。系统的硬件、软件设计合理,功能完备,运行稳定、可靠。实验结果表明此系统实现后具有读取方便、显示直观、功能多样、电路简洁、等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

在整个设计过程中,充分发挥了人的主观能动性,自主学习,学到了许多没学到的知识。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考查资料,和同学讨论,向老师请教,理清了思路,完成对程序的编写。通过设计提高了对单片机的认识,进一步熟悉和掌握单片机的结构及工作原理。通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术,提高软件设计、调试能力;通过这次设计熟悉以单片机核心的应用系统开发的全过程,掌握硬件电路设计的基本方法和技术,掌握相关电路参数的计算方法。最终较好的完成了设计,达到了预期的目的,完了最初的设想。

但是由于时间和个人能力的原因,整个系统看起来还是显得非常的简单,只实现了一些最基本的功能,还有许多不足和可以扩展的地方。由于LCD1602还有剩余位置可以显示其他字符,我们可以在系统中加入时钟芯片,可以实时显示时间,消除从手机上看时间的麻烦。也可以加入湿度传感器,实时监测环境湿度并显示,或者也可以加入烟雾传感器、等组成综合系统,使该系统在起到计步器的作用外还可以起到提醒人们适不适合户外运动的作用。所以,该拓展部分是非常有价值,且非常有必要的。

第18页

参考文献

[1] 曹赟,周宇,徐寅林.加速度传感器在步态信号采集系统中的应用[J].信息化研究, 2009,35(9).

[2] 钱朋安,葛运建,唐毅等.加速度计在人体运动检测中的应用[J].计算机技术与应用进展,2004:632—636.

[3] 陈义华.基于加速度传感器的定位系统研究[D].福建:厦门大学,2006.

[4] 孟维国.三轴加速度计ADXL345的特点及其应用[J].电子设计工程,2007(2):47-50. [5] 贾朱红,张晓冬.基于I2C总线的单主多从单片机之问的通信[J].微计算机信息,2009,25(3-2):101.

[6] 高吉祥.模拟电子线路设计[M].北京:北京电子工业出版社,2007. [7] 陈尔绍.电子控制电路实例[M].北京:电子工业出版社,2004. [8] 王彦朋.大学生电子设计与应用[M].北京:中国电力出版社,2007.

[9] 屈翠香,李刚.具有数字信号输出的三轴加速度传感器ADXL345[J].国外电子元器件,1999(8):8—12.

[10] 彭勃,何晓平,苏伟.微机械静电伺服加速度计[J].中国惯性技术学报,2000,8(1):63—66.

[11] 刘宗林,李圣怡,吴学忠.新型三轴加速度计[J].传感器技术学报,2004,17(3):488—492.

第19页

课设体会

两周的课程设计结束了,在这次课程设计里确实感到收货颇丰。从课设一开始课设题目的分析,选择最佳方案,到后来的程序的编写,proteus仿真,以及到最后的硬件电路的焊接,每一个环节都让我能学到很多之前从未学到的知识和技能。

本次课程设计是一个比较综合的课程设计,包含数字电路,模拟电路,电路,单片机等相关课程的知识,由于我之前对这些课程的知识的掌握并不是特别扎实,所以在做课设的过程中遇到很多阻碍,但通过图书馆查资料,网上搜寻,同学帮助等途径都得到了一一解决,在此要特别感谢帮助我的老师和同学的制导。

由于本次课设中所用到的液晶显示器和加速度传感器之前从未通透的学过,在做课设之前都重新学,这个独立学习的过程是非常令人难忘的。本次课设需要焊接硬件,这就需要有一定的焊接基础,之前学过一点焊接知识,在本次课设中完全运用上了,虽然焊接不是很完美,但也没出现很严重的错误。

通过本次课设,我明白了我们需要学习的知识还有很多,需要脚踏实地,扎实的掌握本专业的知识,除此之外,还要学习其他知识,全面学习,才能在以后生活工作中减少不必要的麻烦。

[2016年1月 15日完成]

第20页

附录1 电路原理图

第21页

附录2 程序清单

#include #include

#define uchar unsigned char #define uint unsigned int

#define DataPort P0 //LCD1602数据端口

sbit SCL=P1^5; //IIC时钟引脚定义; sbit SDA=P1^4; //IIC数据引脚定义 uchar code table_num[]=\

/* *********** LCD1602设置 *************/

sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit e =P1^2; //片选信号 下降沿触发 /* ***********清零按键设置 ********/ sbit key1 = P1^6; sbit key2 = P1^7; sbit key3 = P1^3;

#define SlaveAddress 0xA6 /*定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A*/ long bushu,zong; //步数

uchar BUF[8]; //接收数据缓存区 uchar ge,shi,bai,qian,wan; //显示变量 int dis_data; //变量 int c; int s;

int h=30.5;

void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据 #define RdCommand 0x01 //定义ISP的操作命令 #define PrgCommand 0x02 #define EraseCommand 0x03 #define Error 1 #define Ok 0

#define WaitTime 0x01 //定义CPU的等待时间 sfr ISP_DATA=0xe2; //寄存器申明 sfr ISP_ADDRH=0xe3; sfr ISP_ADDRL=0xe4; sfr ISP_CMD=0xe5; sfr ISP_TRIG=0xe6; sfr ISP_CONTR=0xe7; uchar a_a;

/**************打开 ISP,IAP 功能 ********* */ void ISP_IAP_enable(void) {

第22页

EA = 0; //关中断 ISP_CONTR = ISP_CONTR & 0x18; // 0001,1000 ISP_CONTR = ISP_CONTR | WaitTime; // 写入硬件延时 ISP_CONTR = ISP_CONTR | 0x80; // ISPEN=1 }

/************** 关闭 ISP,IAP 功能 *************** */ void ISP_IAP_disable(void) { ISP_CONTR = ISP_CONTR & 0x7f; // ISPEN = 0 ISP_TRIG = 0x00; EA = 1; // 开中断 }

/*****************公用的触发代码********* */ void ISPgoon(void) { ISP_IAP_enable(); //打开 ISP,IAP 功能 ISP_TRIG = 0x46; //触发ISP_IAP命令字节1 ISP_TRIG = 0xb9; //触发ISP_IAP命令字节2 _nop_(); }

/**********字节读 *********** */

unsigned char byte_read(unsigned int byte_addr) { EA = 0; ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 地址赋值 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; //清除低3位 ISP_CMD = ISP_CMD | RdCommand; // 写入读命令 ISPgoon(); //触发执行 ISP_IAP_disable // 关闭ISP,IAP功能 EA = 1; return (ISP_DATA); // 返回读到的数据 }

/************ 扇区擦除*********** */ void SectorErase(unsigned int sector_addr) { unsigned int iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); // 取扇区地址 ISP_ADDRH = (unsigned char)(iSectorAddr >> 8); ISP_ADDRL = 0x00; ISP_CMD = ISP_CMD & 0xf8; //清空低3位 ISP_CMD = ISP_CMD | EraseCommand; //擦除命令3 ISPgoon(); //触发执行 ISP_IAP_disable(); //关闭ISP,IAP功能 }

第23页

/********** 字节写 ******* */

void byte_write(unsigned int byte_addr, unsigned char original_data) { EA = 0;

// SectorErase(byte_addr); ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 取地址 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; // 清低3位 ISP_CMD = ISP_CMD | PrgCommand; //写命令2 ISP_DATA = original_data; //写入数据准备 ISPgoon(); //触发执行 ISP_IAP_disable(); //关闭IAP功能 EA =1; }

/**********把数据保存到单片机内部eeprom中**************/ void write_eeprom() //保存数据 { SectorErase(0x2000); byte_write(0x2000, bushu); byte_write(0x2001, bushu >> 8); byte_write(0x2002, bushu >> 16); byte_write(0x2003, zong); byte_write(0x2004, zong >> 8); byte_write(0x2005, zong >> 16); byte_write(0x2055, a_a); }

/******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() //读出保存数据 { bushu = byte_read(0x2002); bushu <<= 8; bushu |= byte_read(0x2001); bushu <<= 8; bushu |= byte_read(0x2000); zong = byte_read(0x2005); zong <<= 8; zong |= byte_read(0x2004); zong <<= 8; zong |= byte_read(0x2003); a_a = byte_read(0x2055); }

/**************开机自检eeprom初始化*****************/ void init_eeprom() //开始初始化保存的数据

第24页

{ read_eeprom(); //读出保存数据 if(a_a != 14) //新的单片机初始单片机内问eeprom { zong = 0; bushu = 0; a_a = 14; write_eeprom(); //保存数据 } }

void conversion(uint temp_data) {

wan=temp_data/10000+0x30 ;

temp_data=temp_data000; //取余运算 qian=temp_data/1000+0x30 ;

temp_data=temp_data00; //取余运算 bai=temp_data/100+0x30 ;

temp_data=temp_data0; //取余运算 shi=temp_data/10+0x30 ;

temp_data=temp_data; //取余运算 ge=temp_data+0x30; }

void delay_1ms(uint q) { uint i,j; for(i=0;i

void delay_uint(uint q) { while(q--); }

void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(25); e=1; delay_uint(100); e=0; }

void write_data(uchar dat) {

第25页

本文来源:https://www.bwwdw.com/article/3nyo.html

Top