资源描述
word基于加速度传感器ADXL345的计步器设计摘要:计步器是一种颇受欢迎的日常锻炼进度监控器,可以激励人们挑战自己,增强体质,帮助瘦身。早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器。晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左右摆动敲击挡块。计步器功能可以根据计算人的运动情况来分析人体的健康状况。而人的运动情况可以通过很多特性来进展分析。与传统的机械式传感器不同,ADXL345是电容式三轴传感器,由它捕获人体运动时加速度信号,更加准确。信号通过低通滤波器滤波,由单片机内置A/D转换器对信号进展采样、A/D转换。软件采用自适应算法实现计步功能,减少误计数,更加准确。单片机STC89C52控制液晶显示计步状态。整机工作电流只有1-1.5mA,实现超低功耗。关键词:计步器;加速度传感器;ADXL345;低功耗0 前言随着社会的开展,人们的物质生活水平日渐提高,人们也越来越关注自己的健康。计步器作为一种测量仪器,可以计算行走的步数和消耗的能量,所以人们可以定量的制定运动方案来健身,并根据运行情况来分析人体的健康状况,因而越发流行。手持式的电子计步器是适应市场需求的设计,使用起来简单方便。计步器是一种颇受欢迎的日常锻炼进度监控器,可以激励人们挑战自己,增强体质,帮助瘦身。早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器。晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左右摆动敲击挡块。电子计步器主要组成局部是振动传感器和电子计数器。步行的时候人的重心会上下移动。以腰部的上下位移最为明显,所以记步器挂在腰带上最为适宜。所谓的振动传感器其实就是一个平衡锤在上下振动时平衡被破坏使一个触点能出现通/断动作,由电子计数器完成了主要的记录与显示功能,其他的属于热量消耗,路程换算均由电路完成。计步器中一般采用一种加速度计来感受外界的震动。常用的加速度计原理如下:在一段塑料管中密封着一小块磁铁,管外缠绕着线圈,当塑料管运动时,磁铁由于惯性在管中反向运动,切割线圈,由于电磁感应,线圈中产生电流,人体运动时,上下起伏的加速度近似为正弦过程,线圈的输出电流也是正弦波,测量正弦波的频率就可以得出运动的步数,再计算的出速度,距离,和消耗卡路里。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液晶显示屏。1.4 传感器的选择方案和论证方案一:选择机械式振动传感器机械式振动传感器内部有一个平衡锤,当传感器振动时,平衡被破坏,如此会造成上下触点的通断。佩戴者在跑步过程中,身体起伏重心上下产生变化,计步器内部的振动传感器就会将这一变化转换为数字量送至控制单元,从而获得佩戴者的运动信息。机械式振动传感器原理简单、精度和本钱低,适用于振幅较大的场合。方案二:选择加速度传感器三轴加速度传感器分为压阻式,压电式和电容式。加速度的变化能够改变电阻、电压或者电容的变化,从而获得空间位置三个垂直方向的加速度分量。佩戴者在跑步过程中,身体上下起伏,计步器内部的微控制器读取三轴加速度传感器的三组模拟量,通过计步算法分析,获取运动信息。三轴加速度传感器具有精度高、反响速度快、通讯协议简单可靠等特点,广泛使用于汽车、数码产品、航天设备等领域。方案三:选择压力传感器压力传感器是将压力的变化转化为电压的变化。利用这一特性,可将压力传感器内置在鞋的底部,当用户在行进过程中,压力传感器受到的压力不同抬脚时脚对鞋无压力,放脚时脚对鞋有持续压力,这样,计步器的主控单元读取压力值,经过计步算法即可判断运动状态。为选择一款最适合本课题的计步传感器将三种传感器比照如下表:表1 三种传感器比照表类型机械式振动传感器加速度传感器压力传感器工作电流5mA30mA-工作精度-价格元-目前内置于鞋底的压力传感器属于柔性传感器。在2008年奥运会上曾将它用于检测运动员的蹬地力、蹬地时间、足底接触形状、运动速度、离心力等信息,以便指导运动员取得更好的成绩。这种传感器价格昂贵,设计难度较大,不适合本设计。机械设振动传感器应用于早期的计步器,测量精度低,误判、漏判严重,不符合本课题高精度的设计原如此。随着加速度传感器的工艺逐渐成熟,测量精度也逐渐提高,同时也有很高的灵敏度,功耗已达到微安级别,温度漂移小,具有良好的稳定性,随着市场的大量使用,价格也降了下来,加速度传感器非常适合移动设备应用。综上,加速度传感器符合本课题的设计理念。表2列出了不同型号的三轴加速度传感器的特性。表2 加速度传感器特性比照表加速度计代表型号LSM303DLHMPU-6050ADXL345工作电流500uA150uA精度价格元结合价格、功耗和精度等多方面考虑,本课题选择的三轴加速度传感器ADXL345作为计步传感器。1.5 系统最终方案设计该计步器是由ADXL345加速度传感器、STC89C52单片机以与LCD1602显示屏等组成。传感器采集数据,经内部A/D转换后,输入单片机内部,将数据处理后输出至液晶显示器显示。图1 总体方框图2 硬件电路设计2.1 系统硬件概述本电路是以STC89C52单片机为控制核心,该芯片具有在线编程功能,功耗低,能在3.3V的超低压下工作,在单芯片上,拥有灵巧的8 位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案;加速度传感器采用ADXL345,它是一款小而薄的超低功耗3轴加速度计,测量X围达正负16g,数字输出数据为16位的二进制补码格式,可通过SPI3线或4线或IIC数字接口访问。显示模块使用LCD1602液晶显示屏来实现,该显示屏具有低功耗、寿命长、可靠性高,可供显示的字符较多,控制指令简单的特点,其工作电压为5V。2.2 主要单元电路的设计2.2.1 系统主控制模块的设计本设计中单片机主要负责对外设的控制和各个功能模块间的协调,没有复杂的数据计算,因此,8位的52系列单片机足以胜任,它具有体积小、控制功能强、本钱低,易扩展,可靠性好、使用温度X围宽等众多优点。通常使用的国产STC89C52单片机以其低廉的价格以与较出色的性能成了很多控制系统的首选。它具有丰富的内部资源,较大的数据存储区和程序存储区。同时,由于学习52单片机容易上手,指令简单易懂,编程灵活,在本设计中具有较高的应用价值。一个典型的单片机最小系统一般由时钟电路、复位电路、电源指示灯和外部扩展接口等局部组成,本系统也不例外,当单片机具备了这些最根本的条件后,就可以正常工作了。STC89C52单片机外部结构图如图2所示。图2 单片机外部结构图1、复位电路的设计复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这上状态开始工作。1单片机常见的复位电路通常单片机复位电路有两种:上电复位电路,按键复位电路。上电复位电路:上电复位是单片机上电时复位操作,保证单片机上电后立即进入规定的复位状态。它利用的是电容充电的原理来实现的。按键复位电路:它不仅具有上电复位电路的功能,同时它的操作比上电复位电路的操作要简单的多。如果要实现复位的话,只要按下RESET键即可。它主要是利用电阻的分压来实现的在此设计中,采用的按键复位电路。按键复位电路如图3所示。图3 复位电路2复位电路工作原理上电复位要求接通电源后,单片机自动实现复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间2个机器周期,单片机就可以进展复位操作。上电与按键均有效的复位电路不仅在上电时可以自动复位,而且在单片机运行期间,利用按键也可以完成复位操作。2、晶振电路的设计晶振电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作。通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,如图4中X1、C1、C2。可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择30nF左右的瓷片电容。图4 时钟振荡电路ADXL345的内部功能结构如图5所示,X、Y、Z三个相互正交的方向上的加速度由 G-Cell传感器感知,经过容压变换器、增益放大、滤波器和温度补偿后以电压信号输出。图5 ADXL345内部结构功能框图所谓的G-Cell传感器是由半导体材料(多晶硅)经半导体工艺加工得到,其结构可简化为三块电容极板,如图6。两端的极板圈定,中间的极板在加速度的作用下,偏离无加速度的位置,这样它到两端极板的距离发生变化,造成电容值的变化这个变化值经容压变换、增益放大,滤波等后表现在最后的电压输出值上,从而完成对加速度的测量。图6 G-Cell传感器的物理模型ADXL345的三个相互正交的测量方向如图7,固定在人体上后,这三个方向上的数据意义也就随之确定了。图7 ADXL345的三测量轴向引脚配置(顶视图): 图8 引脚功能图ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量X围达的倾斜角度变化。如图9所示,为传感器底座,接口电路连接:1234P111234P12C7X outY outZ outVCC1357911246101281314ADXL345SDOSDASCLVDDGNDGNDRESERESEINT2GNDNCVSCSINT1X outZ outS1Y out图9 传感器连接模块此模块电路主要功能就用于做ADXL345加速度传感器的一个转接口,而且利用ADXL345该加速度传感器产生相应的变化值。相当于整个系统的信号产生模块。2.2.3 显示模块的设计本设计中由于要对时间进展显示,所以选择液晶显示屏1602模块作为输出。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格廉价,具有很高的性价比。1602液晶模块内部的字符发生存储器CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,比如大写的英文字母“A的代码是01000001B41H,显示时模块把地址41H中的点阵字符图形显示出来,就能看到字母“A。 管脚功能如表3所示:表3LCD1602引脚功能引脚符号功能说明1VSS一般接地2VDD接电源+5V3V0液晶显示器比照度调整端。4RSRS为存放器选择。5R/WR/W为读写信号线。6EE(或EN)端为使能(enable)端,下降沿使能。7DB0DB7三态、 双向数据总线LCD1602主要管脚介绍:V0为液晶显示器比照度调整端,接正电源时比照度最弱,接地电源时比照度最高,比照度过高时会产生鬼影使用时可以通过一个10K的电位器调整比照度。RS为存放器选择端,高电平时选择数据存放器,低电平时选择指令存放器。R/W为读写信号线端,高电平时进展读操作,低电平时进展写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址;当RS为高电平R/W为低电平时可以写入数据。E为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。将LCD1602的RS端和P2.0,R/W端和,E端和相连,当RS=0时,对LCD1602写入指令;当RS=1时,对LCD1602写入数据。当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端。当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示的示数。图10为1602液晶显示屏与单片机的硬件连接图。图10LCD液晶与单片机硬件连线图3 系统软件设计 系统主程序设计图11 系统主程序流程图3.2 计步器算法的实现在可用于分析跑步或步行的特征当中,我们选择“加速度作为相关参数。个体与其相关轴的运动包括三个分量,分别是前向“滚动、竖向“偏航和侧向“俯仰,如图12所示。ADXL345检测其三个轴x、y和z上的加速度。计步器处于未知方向,因此测量精度不应严重依赖于运动轴与加速度计测量轴之间的关系。图12 跑步时的三个分量让我们考虑步行的特性。一个步伐,我们将其定义为单位步行周期,步行周期各阶段与竖向和前向加速度变化之间有一定的关系。要实现检测步数首先要对人走路的姿态有一定了解。行走时,脚、腿、腰部,手臂都在运动,它们的运动都会产生相应的加速度,并且会在某点有一个峰值。从脚的加速度来检测步数是最准确的,但是考虑到携带的方便,我们选择利用腰部的运动来检测步数。图13显示了与一名跑步者的竖向、前向和侧向加速度相对应的x、y和z轴测量结果的典型图样。无论如何穿戴计步器,总有至少一个轴具有相对较大的周期性加速度变化,因此峰值检测和针对所有三个轴上的加速度的动态阈值决策算法对于检测单位步行或跑步周期至关重要。图13从一名跑步者测得的x、y和z轴加速度的典型图样1步伐参数数字滤波器:首先,为使信号波形变得平滑,需要一个数字滤波器。可以使用四个存放器和一个求和单元,如图14所示。当然,可以使用更多存放器以使加速度数据更加平滑,但响应时间会变慢。图14 数字滤波器图15显示了来自一名步行者所戴计步器的最活跃轴的滤波数据。对于跑步者,峰峰值会更高。图15 最活跃轴的滤波数据动态阈值和动态精度:系统持续更新三轴加速度的最大值和最小值,每采样50次更新一次。平均值(Max + Min)/2称为“动态阈值。接下来的50次采样利用此阈值判断个体是否迈出步伐。由于此阈值每50次采样更新一次,因此它是动态的。这种选择具有自适应性,并且足够快。除动态阈值外,还利用动态精度来执行进一步滤波。步伐迈出的条件定义为:当加速度曲线跨过动态阈值下方时,加速度曲线的斜率为负值(sample_new sample_old)。峰值检测:步伐计数器根据x、y、z三轴中加速度变化最大的一个轴计算步数。如果加速度变化太小,步伐计数器将忽略。步伐计数器利用此算法可以很好地工作,但有时显得太敏感。当计步器因为步行或跑步之外的原因而非常迅速或非常缓慢地振动时,步伐计数器也会认为它是步伐。为了找到真正的有节奏的步伐,必须排除这种无效振动。利用“时间窗口和“计数规如此可以解决这个问题。“时间窗口用于排除无效振动。假设人们最快的跑步速度为每秒5步,最慢的步行速度为每2秒1步。这样,两个有效步伐的时间间隔在时间窗口0.2 s - 2.0 s之内,时间间隔超出该时间窗口的所有步伐都应被排除。ADXL345的用户可选输出数据速率特性有助于实现时间窗口。表4列出了TA = 25C、VS = 2.5 V、VDD I/O = 1.8 V时的可配置数据速率以与功耗。表4 数据速率和功耗输出数据速率(Hz)带宽(Hz)速率代码IDD (A)320016001111146160080011101008004001101145400200110014520010010111451005010101455025100110025100065011155011040此算法使用50 Hz数据速率(20 ms)。采用interval的存放器记录两步之间的数据更新次数。如果间隔值在10与100之间,如此说明两步之间的时间在有效窗口之内;否如此,时间间隔在时间窗口之外,步伐无效。“计数规如此用于确定步伐是否是一个节奏模式的一局部。步伐计数器有两个工作状态:搜索规如此和确认规如此。步伐计数器以搜索规如此模式开始工作。假设经过四个连续有效步伐之后,发现存在某种规如此(in regulation),那么步伐计数器就会刷新和显示结果,并进入“确认规如此工作模式。在这种模式下工作时,每经过一个有效步伐,步伐计数器就会更新一次。但是,如果发现哪怕一个无效步伐,步伐计数器就会返回搜索规如此模式,重新搜索四个连续有效步伐。3.3 系统程序的编译编译是对程序进展查找错误的过程,在编译之前需要对keil软件进展设置,首先建立一个工程,保存该工程时选择与自己硬件一样的单片机型号。然后新建文件,编写完程序,保存时为后缀为“.c。点击编译按钮,假如出现错误,如此修改错误,假如无错,如此生成“.hex文件,以供仿真与硬件使用。编译软件如图16所示。图16 系统程序的编译图3.4 系统电路软件仿真系统仿真需要在proteus软件里进展,在仿真之前,要先设计好系统电路以与元器件各自的参数,在proteus里面找到元器件并连接好电路。同时设置它们的参数。并且用调试助手将程序烧录到单片机中,进展仿真。调试助手界面如图17所示。仿真图如图18。图17 调试助手界面图546231SW1sw-12P1GNDVCC12345678RST91011121314151617XTAL218XTAL119GND202122232425262728PSEN29ALE/PROG30EA/VPP313233343536373839VCC40U1STC89C52Y112MC220C320VCCGNDR210KC110uFVCCS1S3S2GND单片主控电路电源接口电路LCD1602液晶接口按键电路GND1VCC2VO3RS4RW5E6DB07DB18DB29DB310DB411DB512DB613DB714BG/VCC15BG/GND16LCD1LCD1602GNDGNDVCCVCCR12KP00P01P02P03P04P05P06P07P00P01P02P03P04P05P06P07P10P11P12SCL1SDA2SDO3INT24VS7GND89VCC510INT15CS6U2ADXL345GNDP14P15图18 系统仿真图4 系统硬件电路的测试如表5为在实际步数中显示步数以与总步数不复位情况下记录。如下图表6为在实际步数中显示步数每5步复位一次总步数不复位情况下记录。由图可得到实物对步数统计准确率在90%以上。表5 实际测试不复位记录表实际步数51015202530显示步数5914182227总步数5914182227表6 实际测试每5步复位一次实际步数51015202530显示步数454555总步数4913182328基于ADXL345的计步器的电路比拟复杂,对于焊接方面不可轻视,需要有一定的焊接根底和尝试,只要电路系统中出于一处的错误,就会对检测造成很大的不便,而且电路的交线较多,所以在焊接的时候要边焊接,边检测是否有电路,断路,跳线情况发生,如果有,如此要与时修正,否如此会对续后的电路焊接造成极大地困难。对于各种锋利的引脚要注意处理,否如此会刺破带有包皮的导线,如此会对电路造成短路现象。在本次课题的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以防止的,以下为主要的问题: 1在显示步数、总步数、路程以与卡路里有时LCD液晶显示屏被屏蔽掉,造成不亮现象。 解决:根据仪器的测试,发现电路的驱动能力不足,在接入的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。 2烧入程序后,LCD液晶显示屏不显示或者亮度不好。 解决:不显示时首先使用万用表对电路进展测试,观察是否存在漏焊,虚焊,或者元件损坏的现象。假如无此问题查看烧写的程序是否正确无误,对程序进展认真修改。当显示亮度不好时一遍旋转10K欧的滑动变阻器,一遍观看LCD显示屏,直到看到适宜的亮度为止。 经过屡次的反复调试试与分析,可以对电路的原理与功能更加熟悉,同时提高了设计能力与与对电路的分析能力。同时在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。如下为硬件实物图如图18所示。计步器工作时的实物图如图19所示。图18 计步器实物图图19计步器工作时的实物图5 结论与进一步设想至此,关于课程设计的所有内容就介绍完了,进展这次课程设计一切都是从零开始,从最简单查资料、了解各个元件的功能起步,再确定设计方案、画流程图、编写程序到最后进展仿真,这次课题设计可以说成功完成。系统的硬件、软件设计合理,功能完备,运行稳定、可靠。实验结果明确此系统实现后具有读取方便、显示直观、功能多样、电路简洁、等诸多优点,符合电子仪器仪表的开展趋势,具有广阔的市场前景。在整个设计过程中,充分发挥了人的主观能动性,自主学习,学到了许多没学到的知识。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考查资料,和同学讨论,向教师请教,理清了思路,完成对程序的编写。通过设计提高了对单片机的认识,进一步熟悉和掌握单片机的结构与工作原理。通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术,提高软件设计、调试能力;通过这次设计熟悉以单片机核心的应用系统开发的全过程,掌握硬件电路设计的根本方法和技术,掌握相关电路参数的计算方法。最终较好的完成了设计,达到了预期的目的,完了最初的设想。但是由于时间和个人能力的原因,整个系统看起来还是显得非常的简单,只实现了一些最根本的功能,还有许多不足和可以扩展的地方。由于LCD1602还有剩余位置可以显示其他字符,我们可以在系统中参加时钟芯片,可以实时显示时间,消除从手机上看时间的麻烦。也可以参加湿度传感器,实时监测环境湿度并显示,或者也可以参加烟雾传感器、等组成综合系统,使该系统在起到计步器的作用外还可以起到提醒人们适不适合户外运动的作用。所以,该拓展局部是非常有价值,且非常有必要的。参考文献1 曹赟,周宇,徐寅林.加速度传感器在步态信号采集系统中的应用J.信息化研究, 2009,35(9).2 钱朋安,葛运建,唐毅等.加速度计在人体运动检测中的应用J.计算机技术与应用进展,2004:632636.3 陈义华.基于加速度传感器的定位系统研究D.某某:某某大学,2006.4 孟维国三轴加速度计ADXL345的特点与其应用J.电子设计工程,2007(2):47-505 贾朱红,X晓冬基于IC总线的单主多从单片机之问的通信J微计算机信息,2009,25(3-2):1016 高吉祥.模拟电子线路设计M.:电子工业,20077 陈尔绍.电子控制电路实例M.:电子工业,20048 王彦朋.大学生电子设计与应用M.:中国电力,20079 屈翠香,李刚.具有数字信号输出的三轴加速度传感器ADXL345J.国外电子元器件,19998:812.10 彭勃,何晓平,苏伟.微机械静电伺服加速度计J.中国惯性技术学报,2000,8(1):6366.11 X宗林,李圣怡,吴学忠.新型三轴加速度计J.传感器技术学报,2004,173:488492.课设体会两周的课程设计完毕了,在这次课程设计里确实感到收货颇丰。从课设一开始课设题目的分析,选择最优方案,到后来的程序的编写,proteus仿真,以与到最后的硬件电路的焊接,每一个环节都让我能学到很多之前从未学到的知识和技能。本次课程设计是一个比拟综合的课程设计,包含数字电路,模拟电路,电路,单片机等相关课程的知识,由于我之前对这些课程的知识的掌握并不是特别扎实,所以在做课设的过程中遇到很多阻碍,但通过图书馆查资料,网上搜寻,同学帮助等途径都得到了一一解决,在此要特别感谢帮助我的教师和同学的制导。由于本次课设中所用到的液晶显示器和加速度传感器之前从未通透的学过,在做课设之前都重新学,这个独立学习的过程是非常令人难忘的。本次课设需要焊接硬件,这就需要有一定的焊接根底,之前学过一点焊接知识,在本次课设中完全运用上了,虽然焊接不是很完美,但也没出现很严重的错误。通过本次课设,我明白了我们需要学习的知识还有很多,需要脚踏实地,扎实的掌握本专业的知识,除此之外,还要学习其他知识,全面学习,才能在以后生活工作中减少不必要的麻烦。2016年1月 15日完成附录1 电路原理图附录2 程序清单#include #include #define uchar unsigned char#define uint unsigned int#define DataPort P0 /LCD1602数据端口sbit SCL=P15; /IIC时钟引脚定义; sbit SDA=P14; /IIC数据引脚定义uchar code table_num=0123456789abcdefg; /* * LCD1602设置 */sbit rs=P10; /存放器选择信号 H:数据存放器 L:指令存放器sbit rw=P11; /存放器选择信号 H:数据存放器 L:指令存放器sbit e =P12; /片选信号 下降沿触发 /* *清零按键设置 */sbit key1 = P16; sbit key2 = P17;sbit key3 = P13;#defineSlaveAddress 0xA6 /*定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A*/long bushu,zong; /步数uchar BUF8; /接收数据缓存区 uchar ge,shi,bai,qian,wan; /显示变量int dis_data; /变量int c;int s;int h=30.5;void Multiple_Read_ADXL345(); /连续的读取内部存放器数据#define Rdmand 0x01 /定义ISP的操作命令#define Prgmand 0x02#define Erasemand 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) 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 | Rdmand; / 写入读命令 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 | Erasemand; /擦除命令3 ISPgoon(); /触发执行 ISP_IAP_disable(); /关闭ISP,IAP功能/* 字节写 * */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 | Prgmand; /写命令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() /开始初始化保存的数据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_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_1ms(uint q)uint i,j;for(i=0;iq;i+)for(j=0;j= 1000000)write_data(0x30+date/1000000%10);if(date = 100000)write_data(0x30+date/100000%10);if(date = 10000)write_data(0x30+date/10000%10);if(date = 1000)write_data(0x30+date/1000%10);if(date = 100)write_data(0x30+date/100%10);if(date = 10)write_data(0x30+date/10%10);write_data(0x30+date%10);/*lcd1602上显示这字符函数*/void write_string(uchar hang,uchar add,uchar *p)if(hang=1) write_(0x80+add);elsewrite_(0x80+0x40+add);while(1)if(*p = 0) break;write_data(*p);p+;/*lcd1602初始化设置*/void init_1602()/lcd1602初始化write_(0x38);write_(0x0c);write_(0x06);delay_uint(1000);write_string(1,0,B:0 Z:0 );write_string(2,0,S:0 C:0 );/*lcd1602上显示特定的字符*/void write_zifu(uchar hang,uchar add,uchar date)if(hang=1) write_(0x80+add);elsewrite_(0x80+0x40+add);write_data(date);void Delay5us() _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void Delay5ms() uint 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(uchar dat) uchar i; for (i=0; i8; i+) /8位计数器 dat = 1; /移出数据的最高位 SDA = CY; /送数据口 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时 ADXL345_RecvACK();/*从IIC总线接收一个字节数据*/uchar ADXL345_RecvByte() uchar i; uchar dat = 0; SDA = 1; /使能内部上拉,准备读取数据, for (i=0; i8; i+) /8位计数器 dat = 1; SCL = 1; /拉高时钟线 Delay5us(); /延时 dat |= SDA; /读数据 SCL = 0; /
展开阅读全文