《基于单片机的智能防近视系统设计》12000字(论文)_第1页
《基于单片机的智能防近视系统设计》12000字(论文)_第2页
《基于单片机的智能防近视系统设计》12000字(论文)_第3页
《基于单片机的智能防近视系统设计》12000字(论文)_第4页
《基于单片机的智能防近视系统设计》12000字(论文)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要现在社会科技快速发展,单片机作为热门的微处理器应用十分广泛,智能化产品已经成了每家每户的必需品,而所有智能产品中都不可能缺少了单片机的身影。在我们日常的工作和学习中,很多人因为写字看书以及办公姿势不正确,长时间疲劳的工作和学习导致近视眼及颈椎病。所以,本文介绍了一种基于单片机的智能防近视系统。本设计主要使用STC89C52单片机作为主控制芯片,系统利用超声波测距原理来感应人与桌面的距离,通过光敏电阻检测周围环境内光强度的变化。当光线强度较弱时,系统语音模块会进行语音提示开灯;当人距离桌面太近时,会语音提示保持正确姿势。同时系统还具有定时功能,达到预订时间后会语音提醒使用者应该进行休息,防止长时间疲劳工作和学习。报警距离和定时时间都可以通过按键来设置,方便不同使用者的使用情况。系统使用LCD1602显示器对环境内的光照强度以及人距离桌面的距离等信息进行显示。同时系统还具有蓝牙通信模块,可以和智能手机的蓝牙进行配对,将LCD1602显示器的内容到手机屏幕上进行显示。此设计采用模块化结构,设计思路清晰,控制准确,可靠性高。关键词:单片机;超声测距;LCD显示;蓝牙通信1引言1.1课题研究的目的与意义近年来,国内经济呈现高速发展的趋势,伴随着智能系统控制技术逐渐普遍起来。智能控制技术也进入了普通百姓的生活中,基于智能控制技术,出现了很多智能化控制的应用场景[1]。 目前国内近视人群越来越多以及近视人群年龄段越来越小,其中多数都是由于平时不良的读书写字习惯,姿势不正确或者长时间疲劳学习不运动导致。基于这种现象,本文介绍了一种基于单片机的智能防近视系统,系统可以对人与桌面的距离及学习时间进行实时的监控,并能在距离过近或学习时间过长时进行语音提示,可以有效的督促使用者保持良好的坐姿以及适当的学习时间。1.2研究的内容和意义随着人们生活水平的逐渐提升,对健康高质量的生活也有追求。因此,现在对健康有帮助的智能化产品越来越热门。例如,现在很多智能手环都具有定时提醒的功能,可以提醒使用者按时饮水或者按时进行锻炼,监控心率。本文介绍的是一款智能防近视系统,不仅可以在坐姿不正确,距离近的时候进行提示,同时也具有定时器功能,防止疲劳[2]。同时还具有通信模块,通过蓝牙模块和手机进行通信,可以将系统屏幕显示的内容同步到手机的屏幕进行显示,方便家长对孩子的学习坐姿和学习时长进行观察,非常具有实用价值,可以对孩子进行健康的检测与预防。1.3发展状况及发展前景随着电子产品的普及,我国近视眼的人群逐年增多,同时也有很多学生和上班族出现了颈椎病[3]。因此很多智能产品也都开始有了健康相关的功能,比如智能手机或者手环可以记录每天走路的步数,检测睡眠质量和心率等。相信在未来,随着控制器的体积越来越小,传感器的精度越来越高,各种智能产品也会设计的更加智能,更加方便[4]。2系统方案和硬件选择2.1设计方案模块 本设计是用STC89C52芯片作为主控部分,这个方案使用的是模块化的思路设计。方案中包括超声测距模块,语音模块,蓝牙模块,光线检测模块,LCD显示模块,及电源模块[5]。各模块均与单片机的I/O口进行通信,设计的系统总框图如2-1图所示。图2-1单片机模块系统分别对各个模块的功能做简单的介绍:超声测距模块:HC-SR04超声波模块进行距离的测量,并将采集的值传给单片机处理。语音模块:使用WT588D语音模块进行语音提示。蓝牙模块:实现单片机和手机的通信,将数据从单片机传到手机进行显示。光线检测模块:使用光敏电阻对周围环境的光强进行监测,并将采集的值传给单片机处理。LCD显示模块:对距离及光线强度等信息进行显示。2.2单片机的选择方案一:采用STC89C52单片机 STC89C52单片机是一款常用的微处理器,稳定性可靠性比较强。具有供电电压低,性能高的特点,是一款8位处理器。89C52系列单片机一共有40个引脚,其中包括4组8位并行I/O口,分别记做P0-P3;有一个可以双向通信的串行端口,还拥有可以随时中断程序的中断源,共5个,两个中断优先级以及位数达到16位的定时器。一个4K的程序存储器,和一个128B的数据存储器是STC89C52单片机存储部分的核心,同时STC89C52还带有4KB的FLASH存储空间,FLASH中存的东西可随时擦除修改,这个特点让程序的修改和调试非常方便[6]。STC89C52微控制器的使用效率非常高,因为芯片中将闪存也封装在里面,同时还含有中断控制,定时器等部件。它与工业标准的MCS51指令集也相互兼容,与8051等其他型号单片机兼容,结构简单,灵活性高,价格低廉。方案二:使用AVR单片机 AVR单片机是8位的,它是一款高速单片机。AVR微处理器内部拥有高质量的FLASH。由于始终频率较高,所以,执行指令的速度很快,执行每条指令给程序带来的延时很小。但是AVR单片机内部没有类似累加器的功能,需要反复使用内部的寄存器。方案三:采用MSP430单片机 MSP430单片机是16位的,由TI公司生产的一款单片机,拥有很好的低功耗性能。根据功能和内存大小等具体配置的差异,分为不同系列。从最开始的11x系列,发展到后来的33x系列和F13系列、F14系列等等。由于是16位处理器,因此处理能力很强,同时运算速度也是很快。此外,其片内资源也比较丰富,包括看门狗,定时器,以及一些常见的硬件通信接口等等。同时也有固定的编译软件,方便开发者进行开发。 几种方案相比,MSP430单片机和AVR单片机性能虽好,但是本设计中对资源的硬性需求很少,使用它两相对浪费,而且价格也相对比较贵。而STC89C52单片机的资源就完全可以满足本设计的需求,且价格也相对比较便宜,在兼顾到性价比的前提下采用方案一使用STC89C52更符合本设计需求。2.3显示电路的选择方案一:采用LED数码管动态扫描显示因为LED数码管是采用八段来组成的,所以可显示的值相对比较单一,例如数字或者简单的字母,对一些字符显示实现起来很困难或者不显示。同时与单片机连接时需要用到很多I/O口,并且由于单片机的I/O口电流驱动能力很微弱,需要外接三极管进行驱动,占用电路板空间比较大,而且会增加成本。如果使用多位数码管时情况则更加复杂。方案二:采用LCD1602液晶显示屏LCD1602液晶显示屏尺寸相对大一些,可展示内容更丰富。可显示数字和字母以及各种符号和字符,显示的内容相对比较丰富多彩。LCD1602液晶显示器中的每一个字符都是通过相同的点阵结构组成的,也是根据显示的内容不同,来点亮不同的点阵位置。LCD1602的软件控制指令也比较简单。他既可以用并行数据传输也可以采用串行数据传输。通过两种方案的对比,其实两种方案都可以,但第二种可以显示更多内容,所以,设计选择使用方案二,使用LCD1602屏幕进行距离及光强的显示。2.4光敏模块的选择方案一:使用光敏电阻光敏电阻是一款能将可见光信号转变成电信号输出的光电元件,且价格比较便宜。具响应速度很快,在光强变化的时候能快速反应跟上变化。光敏的体积一般都很小,比较小的直径仅有3毫米。虽然体积小,但可提供最大工作电压却很大,在120或240V交流电路中光敏电阻仍然可以正常工作。光敏电阻具有环氧树脂封装、响应时间很短、占用电路板空间小、可靠性高等特点。方案二:使用光电二极管光电二极管是一种具有特殊功能的二极管,可将光信号转化成电信号。其内部构造和普通的二极管没什么区别,都是由一个PN结构成。为了能更好的接受光信号,不同的是内部PN结面积比普通二极管的PN结大很多。光电二级管的特性是,在光照条件不同的时候,其电流也是不一样的。通过对比方案一的功能和性价比会更合适此次设计。2.5语音模块的选择方案一:WT588D语音芯片WT588D这款语音芯片是具有单片机内核的,功能很多,音质很好,应用的范围很广,性能也是非常的稳定,相对于其他语音芯片优势很大。首先WT588D可以使用MP3模式对其进行控制,除此之外还可以使用按键模式或者按键组合模式,以及使用并口模式进行控制;还有三种模式的串口模式控制,分别是:一线串口控制模式、三线串口控制模式以及三线串口控制I/O口扩展输出模式,具有这么多控制模式可以很方便大家的应用,在很多场景进行控制都没有问题[7]。WT588D语音芯片的最大优势为音质效果,在同级别语音芯片中效果最好,可以播放的音频范围很宽广,播放声音的效果也很好。WT588D芯片可以通过原厂研发的软件对其要播放的语音进行设置。他能够控制的语音地址位非常多,最多能达220个,可加载很多,组合语音的最大值是128。并且他的内部还有SPI-FLASH存储器,不需外接FLASH,因此,能省下很多的电路板空间。同时其内部的SPI-FLASH存储器都是可以任意修改的,通过修改其内容,同时WT588D芯片可以对SPI-FLASH内容进行在线下载,这个功能是非常具有优势的。方案二:LD3320语音芯片LD3320是语音识别芯片,可以识别非特定语音。仅仅使用一个芯片就实现语音识别的功能。LD3320芯片上具有A/D和D/A接口,其精度都比较高。同时其内部具有Flash和RAM,因此均不需要外接,能有效节省电路板空间[8]。不仅可以实现语音识别的功能,同时还可以实现人和机器进行对话互动的功能。如果使用LD3320的话,应用非常的广泛,可以完全满足语音识别功能的需求,并且具有很大的灵活性。综合上两种方案,虽都可以满足语音播报的要求,但方案一价格较低,性价比较高。所以,采用方案一WT588D芯片进行语音播报。2.6本章小结本章介绍了系统设计的整体思路,包括系统设计框图以及主控制单片机的选择,系统显示方式的选择,语音提示模块的选择以及光敏模块的选择,为下文的硬件具体设计做铺垫。3硬件电路设计3.1单片机外围电路STC89C52是一款高性能8位微控制器,其功耗较低。使用的是MCS-51的内核,这款内核非常经典,有很多微处理器都使用了这一款内核。从硬件功能上来看,它使用的是一个8位的CPU。随着成本的降低,它在越来越多的智能化场景中被应用了起来。STC89C52的具体硬件配置如下:一共具有40个引脚,其中32位I/O口线,3个16位定时器,这三个定时器也可以当做计数器来使用。同时内部具有看门狗电路,可以确保单片机的稳定性,还可以通过外部的按键对单片机进行复位。最高主频35M[9],在8位的CPU中,其不仅内部有8k字节Flash,还有RAM资源可供开发者使用。另外STC89C52还支持2种低功耗方式,可通过软件进行选择。第一种是通过让CPU停止工作的方式来降低功耗;第二种是方式是直接切断电源,使所有资源均停止工作。由于单片机的外围电路相对固定,可以被开发者们成为最小系统,其含有STC89C52单片机,晶振电路,复位电路和存储电路等。3.1.1STC89C52的管脚说明STC89C52有两种封装模式可以选择,一种是贴片的PLCC封装,另一种是直插的PDIP。这里采用直插式的封装,相对于PLCC封装便于焊接。为了防止焊接时高温对单片机造成损坏,可以在单片机下面先焊接一个座子,然后将单片机插入卡紧即可,也方便单片机的更换,方便每次换单片机不需要重新焊接。STC89C52一共具有40只引脚,其中有32个可控制引脚,引脚可分为4组,每组8个,可记为P0-P3。这些引脚的配置非常灵活,可以分别单独控制,也可以同时控制。在控制的时候也很简单,明确定义是输出引脚还是输入引脚后,再根据指令执行输入或输出。STC89C52的管脚图如图3-1所示。图3-1STC89C52管脚图P0口是双向的8位三态I/O口,它的一个最重要的特点是其内部不具有上拉电阻,为高阻状态,如果使用P0口时要外接上拉电阻才能正常输出,一般直接在P0口上加一个4.7K的排阻。P1口是准双向的I/O口内部带上拉电阻,所以不需要外接上拉电阻。当输入时必须先进行写1操作,因为其作为输出使用时没有高阻状态。P1.0和P1.1这两个I/O口比较特殊,分别具有额外的附加功能。其中P1.0可以作为T2定时器/计数器的外部输入,而P1.1则作为T2的外部控制端。P2口与P1口相似,不过P2口只有准双向的输入输出功能。P3口的是最复杂的,单片机很多丰富的功能都要靠P3口的资源来实现。其所有的I/O口都具有特殊的功能。一些中断功能,计时器功能都是由这些接口来实现的。3.1.2复位电路复位电路是每个单片机最小系统必须具备的部分,其可以使单片机从一些异常状态中恢复到初始状态,并继续工作。单片机的复位功能在平时使用的还是比较多的,比如单片机开机异常,程序突然中断以及出现未知的状况,再或者死机等情况,一般可以通过复位单片机来解决。复位后,PC程序计数器的内容为0000H。片内RAM中内容不变。本设计采用的是手动开关复位,如图3-2所示。除了此种复位方式之外,还可以使用自动复位的方式。使用手动复位的优点,就在于控制起来非常的方便,需要对单片机进行复位的时候只需手动按一下复位按键即可。图3-2手动开关复位电路3.1.3晶振电路晶振电路同样是单片机最小系统中不可缺少的部分,我们也常常称其为晶体振荡器。单片机内部使用的时钟信号都是来源于外部晶振。晶体振荡器的功能是为系统提供所需的时钟信号。本系统所使用晶振频率为11.0592MHZ,外围电路图如下图3-3所示。单片机片内也有振荡器,经方向放大之后和片外连接,其中19脚和20脚分别是片内振荡器反相放大器的输入端和输出端。采用内部振荡器时,XTAL1和XTAL2通过一个微调频率的小电容接到外部石英晶体的两端;采用外部振荡器时,XTAL2引脚悬空[10]。图3-3晶振外围电路3.2超声测距模块介绍3.2.1超声测距模块介绍 HC-SR04超声波测距模块,不用实物体接触就可实现测距功能。测量的范围可大可小,距离在5米以内都可以进行准确的测量。模块上包括了超声波发射器、接收器与控制电路。模块直接与单片机相连接就可以进行相互通信,使用起来非常的方便。3.2.2超声测距电路 本设计中采用的是超声波测距模块,模块与单片机的接口电路图如图3-4所示,VCC为5V供电,GND连接系统的GND,TRIG触发控制信号输入连接到单片机的第7脚,ECHO回响信号输出连接到单片机第8脚。图3-4模块与单片机的接口电路图3.3光敏模块电路3.3.1光敏模块的应用光敏电阻内部一般是化学物质硫化镉。这种物质的物理特性,由于光波长不同,其电阻的值也会跟着产生变化。有的电阻是正系数变化,有的则是负系数变化。光敏电阻的电极一般采用硫状图案,结构见下图3-5所示:图3-5光敏电阻结构图由于电阻没法实时测量,因此,光敏电阻通过两端电压变化,得到光敏电阻阻值的变化状态。然后利用STC89C52单片机对阻值的变化进行分析,最后判断是光线的强弱程度。3.3.2光敏模块和AD模块电路 光敏模块和AD模块电路如图3-6所示,通过光敏电阻GR1两端电压的变化,间接得到光敏电阻的阻值变化情况。使用它和R6进行分压,根据欧姆定律,电压和电阻是成正比的,因此得到电阻和光强的关系。通过ADC0832芯片,将模拟信号转化成数字信号,再通过STC89C52单片机对数字信号进行分析,最后判断光线的强弱程度。图3-6光敏模块和AD模块电路ADC0832的工作状态由使能引脚CS来进行控制,CS引脚是低电平有效的,当CS为低电平时,器件才被使能。当CS为高电平的时候,器件的模数转换功能被禁止,且CS的电平在AD转换的过程中不能突变,AD转换一刻起一直到转换结束,CS引脚应一直保持低电平不能变化。CLK引脚为器件的时钟引脚,在本设计中,CLK引脚和单片机的P1.4引脚相连接,通过单片机给ADC0832芯片提供时钟。ADC0832有CH0和CH1两个通道可用。在本设计中我们使用的是CH0通道,DO/DI端则使用DI端输入通道功能选择的数据信号。ADC0832转换时序图如图3-7所示,根据时序图分析其具体工作过程:DI引脚应该在第一个时钟下降沿到来之前保持高电平,作为转换开始信号的标志。在第2、3个时钟下降沿到来的时候可以作为系统通道的选择,可以根据这两位的值来选择是使用通道0,还是使用通道1,或者通道0和通道1同时使用。从第3个时钟的下降开始,DO/DI引脚则作为数据输出的引脚。从第4个脉冲下降沿开始由DO端输出转换完的数据的最高位,之后每经过一个下降沿依次输出一位数据,直到8位数据都输出完为止。当都输出完之后将CS置为高电平作为转换结束标志。图3-7ADC0832转换时序图3.4蓝牙模块介绍 本设计蓝牙功能是实现是通过HC-05蓝牙模块,它是一款主机和从机在一起的集成了蓝牙功能的PCBA的板子。其工作的频段是常用的2.4GHz,此款蓝牙模块使用的板载的PCB天线。 它和单片机之间使用串口进行数据的传输,蓝牙模块的电路图如图3-8所示,其4脚和5脚分别接到单片机的P30和P31引脚上进行数据传输。在蓝牙模块和单片机通信过程中,两端设置的波特率一致后就能保证正常的通信了。图3-8蓝牙模块电路图3.5语音模块介绍语音报警电路图如图3-9所示,语音报警模块采用的主芯片是WT588D,使用5V电源对其供电,D8为忙碌指示灯,接到WT588D芯片的BUSY引脚,当BUSY引脚为低电平时,D2点亮,其中R10是阻值为470欧姆的电阻,用在这里起到限流的作用;芯片的RESET复位引脚接到单片机的P24引脚上,可以通过单片机输出的高低电平实现对WT588D复位引脚的控制;P01、P02和P03引脚分别接到单片机的P21、P22和P23引脚,通过单片机控制器输出对应的语音报警消息;PWM+和PWM-为语音输出信号,通过外接喇叭来播放对应的报警语音。图3-9语音报警电路图3.6LCD显示模块介绍3.6.1LCD1602的介绍LCD1602与单片机可使用8位并行连接或4位并行连接两种方式,这里我们使用的是8位并行连接的方式。它是一种可以显示字母、数字和符号等的点阵型液晶模块,所以,被一些人称作LCD1602字符型液晶,因为只能显示字符,不能显示汉字。它名称中02是指分两行进行显示,16是指每行可以最多显示16个字符,每个字符都是由若干点阵组成的,显示的每个字符之前会有间隔,所以LCD1602不适合做图像显示。LCD1602液晶实物图如图3-10所示。图3-10LCD1602液晶实物图3.6.2LCD1602电路图LCD1602具体电路图如图3-11所示。在使用时候将LCD1602的八位数据位D0-D7连接到51单片机的P0上。LCD1602屏幕的清晰度是可以通过外部调节的,改变VL引脚的电压值就可以改变LCD1602屏幕的清晰度,故此处外接滑动变阻器R2的作用就是调整LCD1602屏幕的清晰度。D0-D7引脚可以和单片机进行并行的双向通信。其中EN是使能引脚,起到对数据显示的开关的作用,可以通过改变其电平变化来控制显示屏是否进行显示。RW和RS两个引脚是标志位,通过其不同的组合,可以看出LCD屏幕的状态。RW和RS引脚都只有高电平和低电平两种状态可以切换,因此对其状态排列组合如下,共有四种情况,每种情况对应着不能的状态:RS=0、RW=0——表示向LCM写入指令RS=0、RW=1——表示读取Busy标志RS=1、RW=0——表示向LCM写入数据RS=1、RW=1——表示从LCM读取数据[12]图3-11LCD1602电路图3.7本章小结本章详细介绍了该设计的硬件电路部分,包括单片机的最小系统,以及LCD显示电路、超声测距电路、光敏模块电路、语音模块电路及蓝牙模块电路,分别介绍了其工作原理及和单片机的连接方式,为后面介绍软件部分做了充足的铺垫。4软件设计4.1软件开发环境KeiluVision4程序开发软件是美国KeilSoftware公司研制推出的一款能够用于程序编写的集成开发环境。KeiluVision4可以完全兼容其他版本,并运行其他版本的程序。其程序编译环境和之前的版本没有太大差别,但在功能和性能方面新版本都在原先的基础上做出了很多改进和升级[13]。KeiluVision4支持C语言程序设计与编写,当语法错误出现的时候,可以自动提示用户。STC89C52等大部分产品,均可在使用Keil4进行程序设计。同时,提供的仿真功能,使用户能通过J-LINK或者ST-LINK连接,进行对程序的上位机调试。Keil4软件的部分特点:(1)可以自动生成完善的启动代码,并提供图形化的窗口,看起来非常直观,也容易修改。无论对初学者还是有经验的老手,都能够减少编译程序的时间,让项目更快的进展;(2)KEIL的设备模拟器功能也是异常的强大,对片内资源及外部连接的外设都可以进行仿真;(3)KEIL编译器,占用的内存更少,功能更全面;(4)不需要其他额外的设备,只需要ULINK2仿真器就可以实现程序的下载与仿真,同时用户还能根据自己需求对FLASH进行编写及反复的修改;Keil的优点:(1)开发效率高,设计周期短。(2)集成C环境是单片机等微型芯片的首选开发环境。(3)操作简单,使用方便,内部包含非常多的常用芯片,便于编程和调试[14]。本系统的设计选用Keil4进行程序的编写和调试,当程序可以稳定运行之后,将生成一个.hex文件。通过软件mcuisp下载到STC89C52之中,进行实物现场调试。根据实物的实际运行情况,找出问题,并对相应的程序参数进行调整,直到达到理想的效果。4.2程序软件流程框图程序软件总流程框图如图4-1所示,系统开机上电后,首先进行系统初始化,LCD1602显示屏的初始化,然后将超声测距模块传进来的数字量在LCD1602显示屏上显示出来,并判断其值是否小于预设的报警阈值,若小于则通过语音模块,使用语音进行提醒。图4-1程序总流程软件框图4.2.1报警子程序流程框图系统报警子程序流程框图如图4-2所示,首先进行判断,判断所测量的值是否超出了预设的值,如果超出了预设的值,则触发语音报警进行提示。图4-2语音报警子程序流程框图4.2.2按键子程序流程框图系统按键子程序流程框图如图4-3所示,系统可以通过按键子程序对语音提示的阈值进行设置,可根据具体的需要操作按键来调整报警的阈值,非常方便,且具有一定的通用性。图4-3按键子程序流程框图5实验结果展示本设计实物图如图5-1所示,经过测试系统可以实现当光线强度较弱时,通过语音提示开灯;当人距离桌面太近时,会语音提示保持正确姿势。同时实现了定时功能,达到预订时间后会语音提醒需要休息。报警距离和定时时间都可以通过按键来设置。系统使用LCD1602显示器对环境内的光照强度以及人与桌面的距离等信息进行显示。同时可以和智能手机的蓝牙进行配对,将LCD1602显示器的内容到手机屏幕上进行显示。系统反应速度很快,测量准确,可靠性高。同时在本次设计的硬件完成阶段,也遇到了一些困难,对实物进行焊接之后,发现通电后LCD显示屏显示有时候会乱码,经过仔细查找硬件焊接点,发现由于自己焊接技术不是很好,有个别焊点出现了虚焊的情况,经过重新焊接后,问题得到解决。将单片机烧入程序后测试,功能完全符合,测试效果准确。6总结近些年来,随着人们生活水平的越来越好,人们对身体健康也越来越重视。目前国内患近视眼的人群越来越多,年龄段也越来越早,大多数都是有一些不好的读书写字姿势。基于这种现象,本文设计一种基于单片机的智能防近视系统,可以对人与桌面的距离及学习时间进行监控,可以在距离过近或学习时间过长的时候进行提示,可以有效的督促使用者保持良好的坐姿以及适当的学习时间。本系统具有实时性,可靠性等优势,具有一定的实用价值。本次设计完成了对基于单片机的智能防近视系统的设计与研究,实现预期的所有功能。整套系统的硬件部分和软件部分都设计合理。硬件部分器件通过多个器件比较,使用STC89C52单片机作为主控,通过光敏电阻对环境的光线强度进行监测,并配合超声模块来进行测距,对写字姿势进行有效监测,使用LCD1602显示器对周围光线强度以及人与桌面的距离等信息进行显示。软件部分采用C语言进行编程,用keil作为开发环境,通过蓝牙模块实现单片机和手机之间进行合理有效的通信,结构清晰,单片机和手机之间相互配合,有很高的可靠性和稳定性,系统操作起来也方便。通过这次毕业设计的制作,真正的考验了学生的综合能力,扩展了知识面和学习能力。本文虽然达到了预想的设计效果,但是由于成本的限制,没有选择显示效果更好的其他屏幕进行显示,也没有使用自己绘制的PCB板进行设计,而是选择了可变性更高使用更灵活方便的面包板进行。参考文献[1]罗忠辉,黄世庆.提高超声测距精度的方法[J].机械设计与制造,2005(1):108-109[2]隋美丽,任小龙.基于超声波的距离控制系统的设计与实现[J].汽车实用技术,2019(06):81-83.[3]李倩.基于单片机的超声波测距系统设计与实现[J].无线互联科技,2018,15(24):36-38.[4]周晴.基于单片机的超声波测距仪系统设计[J].电脑知识与技术,2018,14(35):216-217.[5]赵德安.单片机与嵌入式系统原理及应用[M].机械工业出版社,2016.[6]吴险峰.51单片机项目教程(C语言版)[M].人民邮电出版社,2016.[7]李月乔.模拟电子技术基础[M].中国电力出版社,2015.[8]李震梅.数字电子技术基础[M].高等教育出版社,2017.[9]刘伟静,刘增强.模拟电子技术[M].清华大学出版社,2018.[10]王建平.基于声信号的分类器设计及实现[J].电声技术,2014(10):53-55+79.[11]塔米·诺尔加德.嵌入式系统:硬件、软件及软硬件协同[M].北京:机械工业出版社2018.02[12]谭浩强.C程序设计(第四版)[M].北京:清华大学出版社,2010.[13]N.P.Aleshin,G.A.Bigus,andM.A.Lyutov.DiagnosticsofSpacecraftLaunchingFacilitiesUsingAcousticTestingTechniques[J].RussianJournalofNondestructiveTesting,2002,38(3):153-161.[14]G.M.KrekovandL.G.Shamanaeva.AcousticDiagnosticsofLaserSparksintheAtmosphere[J]RussianPhysicsJournal,2000,43(1):975-976.附录附录一原理图附录二程序源码#include<reg52.h>#defineucharunsignedchar//无符号字符型宏定义 变量范围0~255#defineuintunsignedint //无符号整型宏定义 变量范围0~65535#include<intrins.h>#include"eepom52.h"sbitSCL=P1^4; //SCL定义,连接ADC0832SCL脚sbitDO=P1^3; //DO定义,连接ADC0832DO脚sbitCS=P1^5; //CS定义,连接ADC0832CS脚//这三个引脚参考资料sbitrs=P1^0; //1602数据/命令选择引脚H:数据 L:命令sbitrw=P1^1; //1602读写引脚 H:数据寄存器 L:指令寄存器sbite=P1^2; //1602使能引脚下降沿触发sbitc_send=P1^6; //超声波发射sbitc_recive=P1^7; //超声波接收ucharflag_hc_value;//超声波中间变量longdistance; //距离uintset_d; //距离bitflag_csb_juli;//超声波超出量程uintflag_time0;//用来保存定时器0的时候的bitflag_300ms=1;ucharguangxian;//光线的显示变量ucharset_gx; //设置光线的强弱的变量ucharvalue;ucharflag_alarm;//报警变量staticintmiao=0,fen=45;//学习时间 ucharxuexi_start;//开始学习标志位ucharmenu_1;ucharRx_buf[4],Rxnum=0;/***********************语音模块控制IO口的定义************************/sbitVRST=P2^0; sbitVSDA=P2^2;sbitVCS=P2^3;sbitVSCL=P2^4;unsignedcharyujing[3];/***********************1ms延时函数*****************************/voiddelay_1ms(unsignedintq){ unsignedinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}voiddelay_us(unsignedintus){ while(us--) { _nop_(); }}/***********************三线发码子程序************************/voidSend_threelines(unsignedcharaddr){unsignedchari; VRST=0; delay_1ms(5); VRST=1; delay_1ms(20);/*复位拉高20ms*/ VCS=0; delay_1ms(5);/*片选拉低5ms*/for(i=0;i<8;i++) { VSCL=0; if(addr&0x01) { VSDA=1; } else VSDA=0; addr>>=1; delay_us(150);/*150us*/ VSCL=1; delay_us(150);/*150us*/ } VCS=1;}voidInitUART(void) //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。{TMOD=0x20;SCON=0x50;TH1=0xFD;TL1=TH1;PCON=0x00;EA=1;ES=1;TR1=1;}/**UART发送一字节*/voidUART_send_byte(chardat){ SBUF=dat; while(TI==0); TI=0;}/**UART发送字符串*/voidUART_send_string(unsignedchar*buf){ while(*buf!='\0') { UART_send_byte(*buf++); }}/******************把设置温度数据保存到单片机内部eepom中******************/voidwrite_eepom_12(){ SectorErase(0x2000); byte_write(0x2000,set_d%256); byte_write(0x2001,set_d/256); byte_write(0x2002,set_gx); byte_write(0x2057,value); }/******************把数据从单片机内部eepom中读出来*****************/voidread_eepom12(){ set_d=byte_read(0x2001); set_d=set_d*256+byte_read(0x2000); set_gx=byte_read(0x2002); value=byte_read(0x2057);}/**************开机自检eepom初始化*****************/voidinit_eepom(){ read_eepom12(); //先读 if(value!=2) //新的单片机初始单片机内问EEPOM { set_d=15; value=2; set_gx=4; write_eepom_12(); } }/*********************************************************************名称:delay()*功能:延时,延时时间大概为5US。*输入:无*输出:无***********************************************************************/voiddelay_uint(uintq){ while(q--);}/*********************************************************************名称:bitBusy(void)*功能:这个是一个读状态函数,读出函数是否处在忙状态*输入:输入的命令值*输出:无***********************************************************************/bitbusy(void){ bitbusy_flag=0; rs=0; rw=1; e=1; delay_uint(3); busy_flag=(bit)(P0&0x80); e=0; returnbusy_flag;}/*********************************************************************名称:write_com(ucharcom)*功能:1602命令函数*输入:输入的命令值*输出:无***********************************************************************/voidwrite_com(ucharcom){ while(busy()); e=0; rs=0; rw=0; P0=com; delay_uint(3); e=1; delay_uint(25); e=0;}/*********************************************************************名称:write_data(uchardat)*功能:1602写数据函数*输入:需要写入1602的数据*输出:无***********************************************************************/voidwrite_data(uchardat){ while(busy()); e=0; rs=1; rw=0; P0=dat; delay_uint(3); e=1; delay_uint(25); e=0; }/***********************lcd1602上显示两位十进制数************************/voidwrite_sfm2(ucharhang,ucharadd,uchardate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/10%10); write_data(0x30+date%10); }/***********************lcd1602上显示超声波距离************************/voidwrite_sfm_csb(ucharhang,ucharadd,uintdate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/100%10); write_data('.'); write_data(0x30+date/10%10); write_data(0x30+date%10); }/*********************************************************************名称:init_1602()*功能:1602初始化,请参考1602的资料*输入:无*输出:无***********************************************************************/voidinit_1602(){ write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口 write_com(0x0c); //开显示,不显示光标 write_com(0x06); //地址加1,当写入数据的时候光标右移}/*********************************************************************名称:write_string(ucharhang,ucharlie,uchar*p)*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下 write_string(1,5,"abcdef;")*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidwrite_string(ucharhang,ucharadd,uchar*p){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p=='\0')break; write_data(*p); p++; } }ucharkey_can;/********************独立按键程序*****************/voidkey(){ staticucharkey_new; key_can=20; if((P3&0xf0)!=0xf0) { delay_uint(50); if(((P3&0xf0)!=0xf0)&&(key_new==1)) { key_new=0; switch(P3&0xf0) { case0xe0:key_can=1;break; //左边第1个 case0xd0:key_can=2;break; //左边第2个 case0xb0:key_can=3;break; //左边第3个 case0x70:key_can=4;break; //左边第4个 }// write_sfm2(2,0,key_can); } } else key_new=1; }/***********读数模转换数据********************************************************/ //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的 //100通道 //111通道unsignedcharad0832read(bitSGL,bitODD){ unsignedchari=0,value=0,value1=0; SCL=0; DO=1; CS=0; //开始 SCL=1; //第一个上升沿 SCL=0; DO=SGL; SCL=1; //第二个上升沿 SCL=0; DO=ODD; SCL=1; //第三个上升沿 SCL=0; //第三个下降沿 DO=1; for(i=0;i<8;i++) { SCL=1; SCL=0;//开始从第四个下降沿接收数据 value<<=1; if(DO) value++; } for(i=0;i<8;i++) { //接收校验数据 value1>>=1; if(DO) value1+=0x80; SCL=1; SCL=0; } CS=1; SCL=1; if(value==value1) //与校验数据比较,正确就返回数据,否则返回0 returnvalue; return0;}/*********************小延时函数*****************************/voiddelay(){ _nop_(); //执行一条_nop_()指令就是1us _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}/*********************超声波测距程序*****************************/voidsend_wave(){ c_send=1; //10us的高电平触发 delay(); c_send=0; TH0=0; //给定时器0清零 TL0=0; TR0=0; //关定时器0定时 flag_hc_value=0; while(!c_recive); //当c_recive为零时等待 TR0=1; while(c_recive) //当c_recive为1计数并等待 { flag_time0=TH0*256+TL0; if((flag_hc_value>1)||(flag_time0>65000))//当超声波超过测量范围时,显示3个888 { TR0=0; flag_csb_juli=2; distance=888; flag_hc_value=0; return; } else { flag_csb_juli=1; } } if(flag_csb_juli==1) { TR0=0; //关定时器0定时 distance=TH0; //读出定时器0的时间 distance=distance*256+TL0; distance+=(flag_hc_value*65536);//算出超声波测距的时间 得到单位是ms distance*=0.017;//0.017=340M/2=170M=0.017M算出来是米 if(distance>350) //距离=速度*时间 { distance=888; //如果大于3.8m就超出超声波的量程 } }}/*********************定时器0、定时器1初始化******************/voidtime_init() { TMOD&=0xf0; TMOD|=0x01; //设T0为方式1, TH0=0; TL0=0; ET0=1;//允许T0中断}/*********************定时器2初始化******************/voidtime2_init() { RCAP2H=(0xFFFF-50000)/256;//重装载计数器赋初值 RCAP2L=(0xFFFF-50000)%256; ET2=1;//开定时器2中断 TR2=1;//开启定时器,并设置为自动重装载模式}}/*******************按键执行函数******************/voidkey_with(){ if(menu_1==0) { if(key_can==1) { miao=0;fen=45; xuexi_start=1;//开始学习 } if(key_can==2) { xuexi_start=0;//暂停学习 } if(key_can==3) { xuexi_start=1;//继续学习 } } if(key_can==4) { menu_1++; if(menu_1==1) { write_string(1,0,"1.xsb:m"); write_string(2,0,"2.gm:%"); write_sfm_csb(1,6,set_d); write_sfm2(2,5,set_gx); //设置光线的参数 write_com(0x80+0);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁 } if(menu_1==2) { write_com(0x80+0x40+0);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁 } if(menu_1>=3) { menu_1=0; write_string(1,0,"csb: mgm:%"); write_string(2,0,"Time:"); write_com(0x0c);//关闭显示 } } if(menu_1==1)//设置超声波参数 { if(key_can==3)// { set_d++; //加超声波距离报警数据 write_sfm_csb(1,6,set_d); if(set_d>=100) set_d=100; write_com(0x80);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁 } if(key_can==2)// { set_d--; //减超声波距离报警数据 if(set_d<=10) set_d=10; write_sfm_csb(1,6,set_d); write_com(0x80);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁 } write_eepom_12(); //保存数据 } if(menu_1==2) { if(key_can==3)// { set_gx++; //加超声波距离报警数据 write_sfm2(2,5,set_gx); if(set_gx>=100) set_gx=100; write_com(0x80+0x40);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁 } if(key_can==2)// { set_gx--; //减超声波距离报警数据 if(set_gx<=1) set_gx=1; write_sfm2(2,5,set_gx); write_com(0x80+0x40);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁 } write_eepom_12(); //保存数据 } key_can=20;}/*********************报警函数***************************/voidclock_beep(){ staticucharvalue1,value2,value3; if(xuexi_start==1) { if(set_gx>=guangxian) //距离光线报警 { value2++; if(value2>=2) //循环2次都是报警增强抗干扰 { flag_alarm=2; Send_threelines(0x00);delay_1ms(2880); } }else value2=0; if(distance<=set_d) //距离报警 { value1++; if(value1>=2) //循环2次都是报警增强抗干扰 { flag_alarm=1; Send_threelines(0x01);delay_1ms(2880); } }else

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论