超声波视力保护器

更新时间:2024-05-06 10:13:01 阅读量: 综合文库 文档下载

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

届 别 2013届 .. 学 号

毕业设计

多功能视力保护器的设计

姓 名 系 别、 专 业 导 师 姓 名、职 称 完 成 时 间

1

摘要

本文提出了一种基于单片机的多功能视力保护器。讨论了89c52型单片机的硬件电路和软件设计。并在此硬件基础上实现传感器报警电路、光线强度报警电路及定时报警电路。目前各种单片机控制的理论和实际应用系统的设计正在引起人们的广泛关注。主要为单片机的发展概况以及视力保护器的发展概况,并通过89c52单片机实现控制电路并利用c语言编程,以及利用单片机的定时功能实现定时的方法。可以知道单片机控制的原理及设计和系统主要硬件组成部分及其作用,给出了整个系统软件流程图和部分子程序流程图。介绍了该技术的应用前景和推广价值。而且提出了本系统尚需解决的一些问题,并给出了可能解决这些问题的途径和方法。本设计以超声波技术为主要理论依据。具体就视力保护器的理论与硬件的设计进行了研究。 关键词: 单片机;超声波;视力保护

ABSTRACT

This paper presents a multi-function eyesight protection device based on mcu.Discusses the hardware circuit and software design of 89C52 single chip microcomputer.Based on the hardware realization and alarm circuit timing sensor alarm circuit alarm circuit, light intensity.Design the SCM control theory and practical application system has attracted widespread attention.Mainly for the development of MCU and eyesight protection development of device, and using C language programming and control circuit through the 89C52 MCU, timing method and timing functions using scm.We can know the main principle of hardware and system and design of single chip computer control part and its function, the system software flowchart and some

2

subroutine flow chart is given.Introduced in this paper. The application prospect and popularization value.And put forward some problems of the system needed to solve, ways and methods and gives the possibility to solve these problems.The design of ultrasonic technology as the main theoretical basis.The research of the theory and hardware design vision protection. Key words:MCU; ultrasonic; vision protection

1 绪论

1.1 课题背景

21 世纪是广大中小学生学习压力最大的时期。2006年09月13日,黑龙江省暨哈尔滨市青少年心理健康宣传月活动圆满结束,活动月期间,50余名心理咨询专家对 2000余名大中小学生进行义务咨询时发现,近30%学生处理人际关系困难,近60%中小学生学习压力大。学生近视在我国已成为一个日益严重的社会问题。国家有关部门对许多职业均有明确的视力要求,而一旦近视,花再多的钱医治也不可能恢复原有的视力。专家认为造成学生近视的最主要原因是读写姿势不正确。国家教委规定:学生在读写时,应在一定亮度下,眼睛离读物一尺,身离书桌一拳。学习压力如此之大,学习时间如此之多,那么,有一个保护视力的装置便显得越来越重要。

3

目前,青少年视力低下,已成为国内外共同关心的公共卫生问题。资料显示,我国小学生视力低下率为26.96%,初中生53.43%,高中生72.8%,大学生77.95%。 特别是调查显示50%以上的学生及家长缺乏视力保健最基本的科普知识,不懂得“近视与盲只差一步”的危害性,因而有41.6%视力低下的学生并未采取任何矫正措施,又缺专业机构的治疗。对此我们进行了多功能视力保护器的研究设计。通过创造健康的读写环境和科学方式,避免因长期读写(现代意义的读写包括:看书、写字、用电脑、看 电视等)而导致的近视、驼背、脊柱侧弯、斜视、颈椎病等疾病的发生和发展,用非医药的手段,防范和解除因不良读写习惯,避免给人们身体带来伤害。这个时代在给了我们太多好处的同时,也给了我们太多的附属和悲哀,比如:如果顺其自然 90%的孩子将来注定要和眼镜做一辈子“伴侣” 近视,作为一种现代通病,几乎没有办法根治它。目前的激光切除手术其实是伤害了人体的自然完整,戕害着身心的健全。于是,百年来人们沿用着“玻璃凹凸”的笨办法维系着人们对外界求索的目光。 既然治疗近视这么困难,人们为什么不听听2000年前中国中医经典的劝谏呢?“是故圣人不治已病治未病” ,防患于未然正和现在的“预防医学”不谋而合。研究表明,造成近视 99%的原因,源自于孩子们平时读书、写字时坐姿不标准,导致眼睛距离书本太近所致。大部分孩子喜欢趴在课桌上读写,并且老师、家长屡教不改,很难扭转习惯,是家长一直头疼的事。

综上所述:为了避免因长期使用不正确的读书写字姿势而导致的近视、脊椎弯曲变形、驼背、斜视以及颈椎病等。有必要设计一款视力保护器进行防范。从而纠正人们读写的不良姿势,习惯。避免给人们的身心带来伤害。尤其对学生群体而言,可帮助学生矫正坐姿,改善学习环境,培养学生良好的学习习惯,保护学生视力。

1.2 视力保护器的现状

现在国内外已经有许多电子公司都有自己公司生产的视力保护器。国内

4

这方面的研究现状为:在国内生产的视力保护器,又称坐视宝,它能有效的对使用者的坐姿不当进行语音提示。还有国内一些厂家生产的坐姿矫正器。可以纠正看书,写字的不良坐姿。总体看来,国内生产的视力保护器功能特点比较单一,与人们的个性化需求尚有很大的差距。故不能很好的满足广大使用者的需求。 国外也致力于对保护视力的研究,但是他们更侧重于对近视原因的研究。美国德克萨斯大学西南医学中心何于光博士表示,吃鱼和新鲜蔬菜能够保护视力,降低发生近视的概率。他们认为通过合理的饮食营养搭配,以及正确的学习习惯,对视力的保护能起到事半功倍的作用。 研究证明,市场上真正的多功能视力保护器几乎没有。现有的产品只是侧重视力保护的一方面,功能比较单一,不能从多个角度保护使用者的视力。 现在市场上设计的有以超声波技术为主要理论依据的视力保护器。它就具体就视力保护器的理论与硬件的设计进行了研究。

基于实验室现有的硬件平台,研究目标是完成多功能视力保护器的硬件开发与设计,并完成相应的硬件制作。其研究内容分为两部分:对视力保护器的硬件设计和硬件制作。在设计中存在着如何有效的提高视力保护以及对硬件电路准确调试的难点。在硬件设计中,基于超声波技术设计的多功能视力保护器电路,通过超声波接收头对接收的超声波信号进行调制输出,实现控制声光提示电路工作的理论研究有一定的研究意义。通过实践证明该视力保护器可行且可靠性良好,使用方便但也存在一些问题,比如说没有光线控制报警的功能,光线也是伤害学生的视力的一个重要因素。该设计通过该电子硬件的制作和理论的研究,能为后期进一步设计多功能视力保护器并采取合理措施提高视力保护的有效性提供可靠和有效的数据源和信息依据。由于现在国内外大量的市场需求,视力保护器的起步才刚刚开始,存在很大的发展空间,各个国家的很多公司均在此方面展开了研究,相信未来视力保护器一定会得到巨大的发展,为广大的中小学生的视力保护做出根本的保障。

1.3 设计要求

5

鉴于单片机芯片的智能处理功能本设计采用理论计算和实验验证的方法相结合的以单片机芯片为核心的主体电路。首先是对各单元电路进行设计,并选择合适的元器件。在选择元器件时,要注意所选芯片的性价比,对于电阻、电容等常用元件要先进行参数计算后再选择。其次是设计整个电路,并在计算机上对各单元电路进行相应功能的调试仿真!其中单片机芯片选用较为普遍的STC89C52,坐姿传感器选用超声波传感器,光线报警选用光敏电阻来实现,报警发声蜂鸣器发声硬件电路。本次毕业设计的研究内容是设计一个多功能视力保护器。它具备以下功能:

1.当使用者脸部与桌面之间的距离小于30CM时,电路将发出声音提示; 2.当读写环境光线照度不足时,电路将发出声音提示;

3.当使用时间达到45分钟时,电路自动发出声音提示,提醒使用者注意休息;

4.电路测光报警的灵敏度可调;

5. 电路可靠,做出实物能够实现相应的功能。真正帮助学生做到国家教委规定:学生在读写时,应在一定亮度下,眼离读物一尺,身离书桌一拳。

2 总体方案设计

系统采用STC89C52单片机作为多功能视力保护器的核心控制单元,本系统通过光敏电阻采集光线信号,通过AD采集光线信号的强弱,把光线强度等级化,通过设定报警等级来确定光照不足时报警。利用超声波测距传感器测出人脸部与桌面的距离,当小于30CM时发出报警声提醒。通过单片机内部定时器计时,当使用达到45分钟时电路自动发出声音提示,提醒使用者注意休息。系统采用的提示电路由三极管驱动蜂鸣器组成。系统总体的设计方框图如图1所示。

电源模块 6

光线强度检测模块 图1 系统总体方框图

超声波模块 STC89C52主控模块 蜂鸣器报警模块

2.1 硬件设计

2.1.1 电源稳压电路设计

由于本系统采用电池供电,我们考虑了如下几种方案为系统供电。

方案1:

采用12V蓄电池稳压后为系统供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。但是蓄电池的体积过于庞大,更换成本高,在报警器上使用极为不方便。因此我们放弃了此方案。 方案2:

采用3节1.5 V干电池共4.5V做电源,为单片机,传感器供电。经过实验验证系统工作时,单片机、传感器的工作电压稳定能够满足系统的要求,而且电池更换方便。

综上所述采用方案2 2.1.2 主控制器模块

7

方案1:

采用可编程逻辑器件CPLD 作为控制器。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。且从使用及经济的角度考虑我们放弃了此方案。 方案2:

采用STC89C52单片机作为整个系统的核心,系统采用STC89C52单片机作为多功能视力保护器的核心控制单元,充分分析我们的系统,其关键在于实现系统的自动报警与提醒,处理超声波测得的信号,以及处理光照强度信息,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。STC89C52单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是STC89C52单片机价格非常低廉。

因此,这种方案是一种较为理想的方案。 从方便使用的角度考虑,我们选择了方案2。 2.1.3 光照强度检测模块 光照度传感器的选择 方案1:

采用光照度传感器M124749,该光照度传感器采用先进的电路模块技术开发变送器,用于实现对环境光照度的测量,输出标准的电压及电流信号,体积小,安装方便,线性度好,传输距离长,抗干扰能力强,量程可调。但价格昂贵,性价比不高,且不易购买。 方案2:

采用光敏电阻。光敏电阻的工作原理是当有光线照射时,电阻内原本处

8

于稳定状态的电子受到激发,成为自由电子,所以光线越强,产生的自由电子也就越多,电阻就会越小。光敏电阻的优点有内部的光电效应和电极无关(光电二极管才有关),即可以使用直流电源。灵敏度和半导体材料、以及入射光的波长有关,价格低廉,性价比高。

比较以上两个方案,方案一虽然具有更好的设计精度和线性度,但性价比不如光敏电阻好。方案二具有较高的性价比且同时也能满足系统的设计要求,故采用方案2光敏电阻作为光照度传感器。

2.1.4 报警提示模块

本系统为多功能视力保护器,对于报警器来说,其提醒的方式有很多种。我们综合考虑了一下两种方案。 方案1:

采用语音报警,可以实现语音提示用户休息,和姿势是否正确,直接明了。虽然采用语音提醒有诸多优点,但是语音芯片编程需要专业编程器,价格昂贵编程复杂,不适用于多功能视力保护器的普及。经综合比较考虑,我们放弃了此方案。 方案2:

采用蜂鸣器报警。蜂鸣器,体积小,重量轻,装配简单,使用方便。价格实惠,对推动视力保护器的普及有很好的优势。能够较好的满足系统的要求,因此我们选择了此方案。 2.1.5 坐姿检测模块

本系统需要检测坐姿是否正确,我们选了两种方案

9

方案1:

采用红外热释电传感器,红外热释电传感器对红外线感应灵敏,当人把坐姿坐好,然后开启视力保护器,如果坐姿发生变化,红外热释电传感器就会有一个由高到低的电信号输出。虽然红外热释电传感器敏感度高,但是对于用在视力保护器上不合适,当人只是轻微的移动视力保护器也会报警,误报警的情况很多。除非人坐在那一动不动,因此红外热释电传感器不适用于多功能视力保护器的的坐姿检测。经综合考虑,我们放弃了此方案。 方案2:

采用超声波传感器检测。通过测量人脸与桌面的距离来确定坐姿。当距离小于30CM时就提醒。超声波体积小,重量轻,使用方便。价格实惠,对推动视力保护器的普及有很好的优势。能够较好的满足系统的要求,因此我们选择了此方案。 2.1.8 显示模块 方案1:

用数码管进行显示。数码管显示速度快,使用简单,显示效果简洁明了,但是显示单一,不能表达出很好的人机界面,因此我们放弃用数码管显示。 方案 2:

用LCD1602液晶进行显示。LCD1602由于其显示清晰,显示内容丰富、清晰,显示信息量大,使用方便,显示快速而得到了广泛的应用。单对于此系统我们需要显示丰富的内容,人机界面需要友好,因此我们选择了此方案。 综上所述我们选择方案2

2.2 最终方案

经过反复论证,我们最终确定了如下方案: 1、电源采用3节5号电池

2、采用STC89C52单片机作为主控制器。

10

图15 避障原理

如图15所示,超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:

s=340t/2

就是所谓的时间差测距法

21

3.7 定时报警电路

报警电路分为单片机控制电路和报警发声电路。它主要通过单片机的定时计数功能完成定时45分钟并使报警电路发出报警声,用以提醒学生休息! 89c52单片机内有两个可编程的定时器/计数器,满足诸如对外部脉冲进行记数,产生精确的定时时间,作串行口的波特发生器等功能的需要。它们具有两种工作模式(计数器模式和定时器模式)及4种工作方式(方式0,方式1,方式2,方式3)。其控制字均在相应的特殊功能寄存器中,通过对它的特殊功能寄存器的编制,可以方便的选择适当的工作模式和工作方式。 当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计数满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为:

T=1/(12×106)Hz×1/12=1μs

这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。

当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳变需要两个机器周期,故外部事年的最高计数频率为振荡频率的1/24。例如,如果选用12MHz晶振,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。工作方式控制寄存器TMOD用于控制定时器/计数器的工作模式及工作方式,它的字节地址为89H。定时器/计数器的两个作用是用来精确的模拟一段时间间隔(作定时器用)或累计外部输入的脉冲个数(作计数器用)。

22

当作定时器用时,在其输入端输入周期固定的脉冲个数,即可计算出所定时间的长度。当89c52内部的定时器/计数器被选定为定时器工作模式时,记数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1,因此,定时器/计数器的输入脉冲和机器周期一样,为时钟频率的1/12。本设计采用的时钟周期为6MHz,记数速度为500KHz,输入脉冲的时间间隔为0.5秒。

23

4 系统软件设计方案

该方案的编程思路是先确定主程序,之后根据各硬件电路功能来设计子程序模块,最后再将各模块嵌入主程序中。这样编程结构简单,由于子程序模块与硬件电路一一对应,所以调试起来十分方便。本设计软件方框图如图18所示。

多功能视力保护器主程序 测光子程序 计时子程序 报警子程序 超声波子程序 图18 系统软件设计方框图

24

4.1 系统主程序流程图

如图19所示为系统坐姿检测超声波测量主程序流程图。

开始 系统初始发送超声波脉等待发射超声计算避障 显示结果

图19 超声波测距子程序流程图

25

bit flag_200ms = 1 ;

uchar guangxian; //光线的显示变量 uchar set_gx; uchar value;

uchar flag_alarm; //报警变量

uchar miao = 55,fen = 44,shi;

uchar xuexi_start; //开始学习标志位 uchar menu_1;

/******************把设置温度数据保存到单片机内部eepom中******************/ void write_eepom_12() { }

/******************把数据从单片机内部*****************/ void read_eepom12() {

set_d = byte_read(0x2001);

eepom

中读出来

SectorErase(0x2000);

byte_write(0x2000, set_d % 256); byte_write(0x2001, set_d / 256); byte_write(0x2002, set_gx); byte_write(0x2057, value);

//设置光线的强弱的变量

31

}

set_d =set_d * 256 + byte_read(0x2000); set_gx = byte_read(0x2002); value = byte_read(0x2057);

/**************开机自检eepom初始化*****************/ void init_eepom() { }

/********************************************************************

* 名称 : delay()

* 功能 : 延时,延时时间大概为5US。 * 输入 : 无 * 输出 : 无

***********************************************************************/

read_eepom12(); if(value != 2) {

set_d = 300; value = 2; set_gx = 50; write_eepom_12();

//先读

//新的单片机初始单片机内问EEPOM

}

32

void delay_uint(uint q) { }

/********************************************************************

* 名称 : bit Busy(void)

* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态 * 输入 : 输入的命令值 * 输出 : 无

***********************************************************************/ bit busy(void) { }

/********************************************************************

* 名称 : write_com(uchar com)

bit busy_flag = 0; rs = 0; rw = 1; e = 1;

delay_uint(3);

busy_flag = (bit)(P1 & 0x80); e = 0;

return busy_flag; while(q--);

33

* 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无

***********************************************************************/

void write_com(uchar com) { }

/********************************************************************

* 名称 : write_data(uchar dat) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无

***********************************************************************/

void write_data(uchar dat)

while(busy()); e=0; rs=0; rw=0; P1=com; delay_uint(3); e=1;

delay_uint(25); e=0;

34

{ while(busy()); e=0; rs=1; rw=0; P1=dat; delay_uint(3); e=1;

delay_uint(25); e=0;

}

/***********************lcd1602上显示两位十进制************************/

void write_sfm2(uchar hang,uchar add,uchar date) { if(hang==1) write_com(0x80+add); else

write_com(0x80+0x40+add);

write_data(0x30+date/10); write_data(0x30+date);

}

/***********************lcd1602上

************************/

void write_sfm_csb(uchar hang,uchar add,uint date)

35

{ }

/********************************************************************

* 名称 : init_1602()

* 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无

***********************************************************************/

void init_1602() { }

write_com(0x38); // write_com(0x0c); write_com(0x06); if(hang==1)

write_com(0x80+add); write_com(0x80+0x40+add);

else

write_data(0x30+date/100); write_data('.');

write_data(0x30+date/10); write_data(0x30+date);

36

/********************************************************************

* 名称 : write_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示\cd ef\,调用该函数如下

write_string(1,5,\* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/

void write_string(uchar hang,uchar add,uchar *p) { }

uchar key_can;

/********************独立按键程序*****************/ void key()

if(hang==1)

write_com(0x80+add); write_com(0x80+0x40+add); while(1) {

if(*p == '\\0') break; write_data(*p); p++;

else

}

37

{ static uchar key_new; key_can = 20;

if((P2 & 0x0f) != 0x0f) { delay_uint(50);

if(((P2 & 0x0f) != 0x0f) && (key_new == 1)) { key_new = 0; switch(P2 & 0x0f) { case 0x0e: key_can = 1; break; //左边第1个 case 0x0d: key_can = 2; break; //左边第2个 case 0x0b: key_can = 3; break; //左边第3个 case 0x07: key_can = 4; break; //左边第4个 }

//

write_sfm2(2,0,key_can);

}

} else

key_new = 1; }

/***********

********************************************************/

38

//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的 {

unsigned char i=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++;

//开始

//第一个上升沿

// 1 0 0 通道 // 1 1 1 通道

unsigned char ad0832read(bit SGL,bit ODD)

39

}

for(i=0;i<8;i++) { } CS=1; SCL=1;

if(value==value1)

return value;

//与校验数据比较,正确就返回

//接收校验数据

value1>>=1; if(DO)

value1+=0x80; SCL=1; SCL=0;

数据,否则返回0

return 0;

/*********************小延时函数*****************************/ void delay() { }

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

//执行一条_nop_()指令就是1us

40

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

Top