基于单片机的智能门控制系统_第1页
基于单片机的智能门控制系统_第2页
基于单片机的智能门控制系统_第3页
基于单片机的智能门控制系统_第4页
基于单片机的智能门控制系统_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

河南科技学院新科学院

2014届本科毕业论文(设计)

基于单片机的自动门控制系统

基于单片机的自动门控制系统

摘要

当今社会是一个智能化、信息化为主的社会。随着科技的迅速发展以及社会的不断进步,人们对生活的要求越来越高,也渐渐的学会了享受生活。人工智能和自动化渐渐的成为主流。对于大型的商场,宾馆等一些现代的建筑物来说,自动门成为了主要的设备。它不仅具有修饰的作用,而且美观大方具有日常生活中我们接触到的门的所有优点,同时它还可以自动开闭,方便人们的使用。优良的防噪功能可以防止外界的噪音。有的带有自动报警功能,更加提高了安全性和可靠性。虽然自动门具有很多优点,但是对于这种新型的产业,它还有一些需要完善和改进的地方。自动门在追求利益最大化的同时忽略了原材料和它的技术工艺;在安装技术方面没有经过严格的培训,安装后达不到美观,修饰的效果,最主要的是售后没有保证;有关自动门产品的制作及销售的流程还不完善。本次的设计主要针对自动门的硬件结构,以51单片机为核心进行控制,外围链接直流电机、热释电红外传感器等。

关键词:自动门;单片机;控制;热释电红外传感器

TheAutomaticDoorControlSystem

BasedOnSCM

Abstract

Alongwithsociety'sdevelopment,thetechnicalprogressaswellasthepeoplelivingstandard'sgradualenhancement,automaticvalvestartstoenterpeople'slife.Itisnotonlyindispensableforhotels,supermarkets,banksandothermodernarchitecture,butalsobecomeanimportantindicatorofthelevelofconstructionofintelligent.Thereisbeautiful,generous,windbreak,dustproof,lowernoise.Meanwhileitisconvenientforpeopletoaccess.Anditfacilitatethemanagement,enhancethesafety.Itsusable,hefunctioniscomplete,thetechnologicaladvance,causesthepeopletobelievethatthisistheadvanceintechnologyachievement.ItletsthehumanityunderstandthatDigitalAge'sdevelopmentwillchangehumanity'slife,willspeedupthescienceandtechnologythedevelopment.Automaticcontrolsystemistheheartofthedesign,andthemeasureoftheimportantindexes,themanufacturelevel.Also,itgraduallytowardlarge-scale,complicatedandintelligentdirection.

Thisdesignmainly8052takesthecontrolcoreusingthemonolithicintegratedcircuit,directcurrentsystemwhichtheelectricalmachinery,thepyroelectricinfraredsensor,thepotentiometerunify.Hasdisplayedmonolithicintegratedcircuit'sperformancefully.Itsmerithardwarecircuitissimple,thesoftwarefunctionisperfect,thecontrolsystemisreliable,theperformance-to-priceratiohighercharacteristic,hascertainuseandthereferencevalue.

Keyword:automaticdoor;SCM;control;PIRS

目录

TOC\o"1-3"\h\u

1绪论

1

1.1自动门发展历史

1

1.2单片机的发展及89C51系列的运用

1

1.3红外探测技术的发展

2

2系统总体方案

2

2.1系统总体规划

2

2.2器件介绍

3

3硬件设计

8

3.1基本单片机系统

8

3.2红外检测电路

9

3.3电动机电路

11

4控制系统软件设计

11

4.1主程序设计

12

4.2调试

13

5总结与展望

14

参考文献

15

致谢

16

附录

17

附录I总电路图

17

附录II程序

17

1绪论

1.1自动门发展历史

根据人们对门的理解及对自己需求的满足,渐渐地就有了自动门的出现及自动门的发展。自动门是一种不需要人亲自进行开门或关门的动作,而是通过门上安装的红外感应系统来感应是否有人的到来,然后将信息传给单片机,通过单片机的分析处理,将控制信号输送给电机,进而实现门的开启和闭合。这种门的出现为人们的生活提供了大大的方便。

二十年代后期,自动门开始在美国的超级市场上使用,并渐渐的应用到其他建筑物上。世界上第一家自动门品牌——多玛在这个时期应运而生,并且在1945年开发出了油压式和空气式自动门,并在新建的大楼的正门正式投入使用。电气是时代的到来,大大促进了自动门的发展,并有油压式和空气式转变为电机式自动门。

到来21世纪的今天,人们更加注重安全问题,所以门更加突出了安全理念,为了有效地对人流的防范、方便通行和及时疏散,人们还更加注重建筑艺术的理念,尤其强调门与建筑物以及周围环境的整体协调与和谐。一百五十年前开始对自动门进行大规模专业化生产,大批的生产制造商在门的不断发展和完善期间形成规模。从自动门的初具规模到现在的大批量生产,门的性能,种类,功能越来越齐全。门在现阶段的发展模式也是朝着智能化的方向发展,切切实实的为满足人们的需要而蓬勃发展。

1.2单片机的发展及89C51系列的运用

单片机是将CPU,运行内存(ROM),存储内存(RAM),输入输出接口(I/O),时钟计数器(timer/counter)以及中断系统(interruptsystem)集成在一块半导体上的微控制器。单片机的初级阶段以Intel公司的8位MCS-48系列为标志形成的,具有体积小,重量轻,价格低但控制功能齐全的优势。随着单片机需求量的增加8位单片机发展到功能越来越完善,发展到极致。在这种情况下单片机就从八位发展到十六位,将模数转换器集成到了单片机内。单片机控制功能比较强大,抗干扰性能好,而且体积比较小,重量轻便于携带,最吸引人的是价格便宜,实惠耐用。

51系列的单片机更为人们所熟知,系统开发和硬件的设计中,51单片机更受大家的欢迎。抛去价格低廉这个原因外,51单片机的内存,寻址范围的功能也是比较诱人的。它的Flash内存最高可达20K,数据存储器最高到256,ROM和RAM均可寻址到64K,一般情况下都有32个并行口,一个串行口,3—7个中断源,工作频率在24MHz以上。51系列单片机之间更具兼容性。

本文的设计采用的是STC89C51RC系列单片机。STC51单片机的工作频率高达35MHz,编程种类可分为在线编程和在系统编程,可以增加看门狗,性价比高,具有较好的加密性。这种类型的单片机有4KB的片内Flash存储器,512KB的片内存储器,两个定时器计数器,一个全双工串行口,还可以外加看门狗,兼容性强。

1.3红外探测技术的发展

红外探测技术应用非常广泛,在军事、工控、家电都有所体现。红外探测技术以红外光波为载波来传送测量信号或指令达到控制的,生活中较为常见的电视机红外遥控,自动控制门(红外感应的)家用安全报警系统。采用红外光波作为测控光源主要原因是由于红外接收器件,红外发射器件市面上易于获得。并且的发光与受光峰值波长一般为0.88μm~0.94μm易于做后续处理。落在近红外波段内,发射与接收能够很好地匹配非常容易实现,可获得较高的可靠性及传输效率。红外测控系统一般包括发射、处理以及接收部分。在本设计中,红外线探测器中的热电元件可以检测到人体的存在或移动,并把热电元件热信号经过电路处理转换成电压信号。然后,对电压信号采样滤波处理。当处理的信号达到设定值便认为有输入,才输出检测信号。例如,在两个不同的频率范围内处理电压信号,不同的频率来源是由于外输入所致。输出不同的值便可判断是否有预设输入信号。然后实现所谓的自动控制[3]

2系统总体方案

本章围绕总体设计的系统,介绍系统框图、单片机的内部硬件资源和其接口技术及整个系统所用到的其它模块的介绍。

2.1系统总体规划

本系统主要由其外围电路,红外检测电路、单片机(CPU)、电机控制电路组成。,单片机的工作方式循环检测采样红外检测电路输出信号,采到设定的信号,检测输出电路,发出输出控制信号,电机控制电路接到指令,控制电机有相应的动作,便完成了自动控制的要求。当然自动门是与人有关的,所以安全是第一位的,一旦采到有人,便程序无条件跳转到打开门的方向,主控电路应有备用电池,以防出现断电。能够其原理方框图如2-1所示。

图2-1原理方框图

2.2器件介绍

2.2.1单片机

单片机处理模块部分选用的芯片为89C52RC。。选用STC单片机的原因是:这一款单片机较为便宜,性能能够达到要求并且原有程序有些可以直接使用,硬件改动较少。使产品更轻更小,功耗更低。满足当代的设计理念。用STC提供的专用工具,很容易的将2进制代码、16进制代码直接下载进STC单片机。这些代码执行效率较高。

图2-289C52RC引脚图

如图2-2为89C52RC的引脚图;各引脚功能如表2-1。

管脚

管脚编号

说明

管脚

LQFP44

PDIP40

PLCC44

说明

P0.0~P0.7

37-30

39-32

43~36

P0:P0口既可作为输入/输出口,也可作为地址/数据复用总线使用。当P0口作为输入/输出口时,P0是一个8位准双向口。P0口内部无上拉电阻,所以作I/O口必须上拉电阻。当P0作为地址/数据复用总线使用时,是低8位地址线[A0~A7]和低八位的数据线[D0~D7],此时无需上拉电阻。

P1.0/T2

40

1

2

P1.0

标准I/O口PORT[0]

P.0/T2

40

2

T2

定时器/计数器2的外部输入

P1.1/T2EX

41

2

3

P.

标准I/O口PORT[1]

P./T2EX

4

2

3

T2EX

定时器/计数器2捕捉/重装方式的触发控制

P1.2

42

3

4

标准I/O口PORT[2]

P1.3

43

4

5

标准I/O口PORT[3]

P1.4

44

5

6

标准I/O口PORT[4]

P1.5

1

6

7

标准I/O口PORT[5]

P1.6

2

7

8

标准I/O口PORT[6]

P1.7

3

8

9

标准I/O口PORT[7]

P2.0~P2.7

18-25

21-28

24-3

Port2:P2口内部有上拉电阻,既可作为输入/输出口,8位准双向口,也可作为高8位地址总线使用(A8~A5)。

P3.0/RxD

5

10

11

P3.0

标准I/O口PORT3[0]

P3.0/RxD

5

0

RxD

串口1数据接收端

P3.1/TxD

7

11

3

P3.1

标准I/O口PORT3[1]

P3./TxD

7

3

TxD

串口1数据发送端

P3.2/INT0

8

12

14

P3.2

标准I/O口PORT3[2]

P3.2/INT0

8

2

4

INT0

外部中断0,下降沿中断或低电平中断

P3.3/INT

9

13

15

P3.3

标准I/O口PORT3[3]

P3.3/INT

9

3

5

INT

外部中断1,下降沿中断或低电平中断

P3.4/T0

10

14

16

P3.4

标准I/O口PORT3[4]

P3.4/T0

0

4

6

T0

定时器/计数器0的外部输入

P3.5/T

11

15

17

P3.5

标准I/O口PORT3[5]

P3.5/T

5

7

T1

定时器/计数器1的外部输入

P3.6/WR

12

16

18

P3.6

标准I/O口PORT3[6]

P3.6/WR

2

6

8

WR#

外部数据存储器写脉冲

P3.7/RD

13

17

19

P3.7

标准I/O口PORT3[7]

RD#

外部数据存储器读脉冲

P4.0

17

23

P4.0

标准I/O口PORT4[0]

P4.1

28

34

P4.1

标准I/O口PORT4[1]

P4.2/INT3#

39

1

P4.2

标准I/O口PORT4[2]

INT3#

外部中断3,下降沿中断或低电平中断

P4.3/INT2#

6

12

P4.3

标准I/O口PORT4[3]

INT3#

外部中断2,下降沿中断或低电平中断

P4.4/PSEN#

26

29

32

P4.4

标准I/O口PORT4[4]

PSEN#

外部程序存储器选通信号输出引脚

P4.5/ALE

27

30

33

P4.5

标准I/O口PORT4[5]

ALE

地址锁存允许信号输出引脚/编程脉冲输入引脚

P4.6/EA#

29

31

35

P4.6

标准I/O口PORT4[6]

EA#

内外存储器选�引脚

RST

4

9

10

RST

复位脚

XTAL1

15

19

21

内部时钟电路反相放大器输入端,接外部晶振。此引脚也是外部时钟源的输入端。

XTAL2

14

18

20

内部时钟电路反相放大器的输出端,接外部晶振。此引脚可浮空,此时XTAL2将XTAL1输入的时钟进行输出。

VCC

38

40

44

电源正极

Gnd

16

20

22

电源负极,接地

表2-189C52RC引脚功能[2]

1时钟电路[8]

STC89C52内部有一个高增益反相放大器,此放大器的输入端是RXD引脚和输出端TXD引脚。可以由内部时钟方式产生或外部时钟方式产生供给单片机运行的时钟信号。内部的时钟方式电路如图2-3(a)所示,在RXD和TXD引脚上需要外接定时元件,这样内部振荡器就产生自激振荡。通常采用石英晶体和电容组成的并联谐振回路实现定时功能。晶体振荡频率一般为6或12MHz,电容值不是一个固定的数值可以在5~30pF之间进行选择,选择的电容值的大小可对振荡频率起微调的作用。外部的时钟方式电路如图2-3(b)所示,此时要将RXD接地,TXD接外部振荡器。外部时钟电路对外部振荡器产生的振荡信号无特殊要求,唯一的要求是保证脉冲宽度,一般情况下采用频率小于等于12MHz的方波信号。外部时钟电路或内部时钟电路产生的时钟会经过片内时钟发生器把振荡频率进行两分频,产生两相时钟:P1和P2,提供给单片机。

(a)内部方式时钟电路(b)外部方式时钟电路

图2-3时钟电路

2复位及复位电路[10]

A复位操作

复位是单片机必不可少的的初始化操作。主要是对PC进行初始化,以便于让单片机从0000H单元开始执行程序。为了防止程序运行时出错,或者进入死锁状态也需要系统除了进行的正常初始化之外,也需要对电路进行复位重新启动,保证正常运行。

复位操作对其他寄存器有影响及它们的复位状态如表2-2所示。

寄存器

复位状态

寄存器

复位状态

PC

0000H

TCON

00H

ACC

00H

TL0

00H

PSW

00H

TH0

00H

SP

07H

TL1

00H

DPTR

0000H

TH1

00H

P0-P3

FFH

SCON

00H

IP

XX000000B

SBUF

不定

IE

0X000000B

PCON

0XXX0000B

TMOD

00H

表2-2一些寄存器的复位状态

B复位信号及其产生[15]

复位信号的输入端(RST引脚),高电平有效,必须保证有效时间持续24个振荡周期(即二个机器周期)以上的时长。例如,使用颇率为6MHz的晶振,则复位信号持续时间应超过4us。图2-4将为我们展示复位信号产生的电路

图2-4复位信号的电路逻辑图

复位电路包括片内和片外两部分。首先将外部电路产生的复位信号(RST)输送到施密特触发器内部,再通过片内复位电路采样施密特触发器的输出,这样就可以得到内部所需的复位信号了。

复位操作包括上电自动复位和按键手动复位两种方式。[9]

上电自动复位是一种通过外部复位电路的电容充放电来实现的一种复位方式,电路如图2-5(a)所示。这时要求电源在不超过1ms的时间内达到稳定,这样就可以实现上电自动复位了,此时接通电源就完成了系统的初始化。

按键手动复位又包含电平复位和脉冲复位。单片机开始工作后,开始对电容进行充电,这时电阻两端开路,系统正常工作;当按键按下电容开始放电,当电容内的电量渐渐释放到最小时,系统就实现了自动复位。本文以按键电平复位为主。其电路图分别如2-5(b),2-5(c)所示:

(a)上电复位(b)按键电平复位(c)按键脉冲复位

图2-5复位电路

2.2.2热释电红外传感器

热释电红外传感器和热电偶都是基于热电效应原理的热电型红外传感器。不同的是热释电红外传感器的热电系数远远高于热电偶,其内部的热电元由高热电系数的铁钛酸铅汞陶瓷以及钽酸锂、硫酸三甘铁等配合滤光镜片窗口组成,其极化随温度的变化而变化。为了抑制因自身温度变化而产生的干扰该传感器在工艺上将两个特征一致的热电元反向串联或接成差动平衡电路方式,因而能以非接触式检测出物体放出的红外线能量变化并将其转换为电信号输出。热释电红外传感器在结构上引入场效应管的目的在于完成阻抗变换。由于硬件要求,在电路中不能直接接入电阻,需要用电压跟随器进行变换,但此时必须保证电阻的阻抗值不小于104兆欧。热释电红外传感器由传感探测元、干涉滤光片和场效应管匹配器三部分组成。设计时应将高热电材料制成一定厚度的薄片,并在它的两面镀上金属电极,然后加电对其进行极化,这样便制成了热释电探测元。经上述变换得到的电压是有极性的,这就意味着我们使用的探测元也有正负。[4]

人是恒温动物,正常体温是37摄氏度,所以人是一个热源,会发出波长为10UM左右的红外光波,而安装在门两侧的红外感应传感器就可以探测这种红外光波。红外感应上有一个菲泥尔滤光片增强可以增强人体发出的这种红外光波,以保证红外能正确感知是否有人的到来,使得后续的程序顺利进行。红外感应中所具有的热释电元件是有人体辐射的温度的变化来向外界释放电荷的,并将这种电荷转换为电信号输送给电路进行检测。

1——D脚2——S脚3——G脚

图2-6热释电红外传感器内部结构

热释电红外传感器的结构示意图如图2-6所示。其中D为电源正极端,G为电源负极端,S则为信号输出端。为了消除各种因素包括自身所造成的干扰,需要使用这种类型的传感器。它的主要原理是利用互补的两个或若干个干扰信号通过彼此之间的叠加抵消来补偿传感器。对于如何将辐射转换为电压,要解决这个问题就要使用上面所介绍的菲涅尔透镜了。

红外传感器是一种感知热源的原件,我们通常使用高热电的材料来进行制作,这样能使它感知到的红外辐射转换为电信号供电路使用,并且保证即使是微弱的电信号也能被电路系统感知,这样才不会出现人来而门不开,人去门也不开的情况。这样我们制作自动门的意义就不复存在了。[6]

3硬件设计

3.1基本单片机系统

我们大多对单片机有一定的了解,在制作电路中仅仅只用一个单片机芯片就可以实现许多功能,但单片机大都以控制为主。本文的设计依然延续这种思想,以单片机为控制核心,如非必要无需对单片机进行外围扩展。电路图如图3-1。

图3-1单片机电路图

3.2红外检测电路

红外检测是一种不用接触人就可以对信号进行采集的电路,主要通过红外传感器,检测电路,将微弱的红外信号转变为电压信号。不需要红外线和电磁波发射源以及各种主动接触开关由于敏感元件的输出电压极微弱且其阻抗很高,故在传感器内部设有场效应管及偏置厚膜电阻,从而构成信号放大及阻抗变换电路,一般热释电红外传感器自身的接收灵敏度较低,检测距离仅2m左右。当有人靠近自动门时,被热释电红外传感器接收下来,并将其转换成信号,经检测放大电路内部放大等处理后输出给单片机。[11]其热电释红外检测电路如图3-2所示。

图3-2热电释红外检测电路

3.2.1放大信号电路

我所采用的放大电路是将四个运放集成到一个电路中的LM324,它采用14脚双列直插塑料封装,lm324原理图如图3-3所示。它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立。[13]

每一组运算放大器可用图3-3(1)所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的相位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。lm324引脚图见图3-3(2)。

图3-3LM324放大电路

当去掉运放的反馈电阻时,或者说反馈电阻趋于无穷大时(即开环状态),理论上认为运放的开环放大倍数也为无穷大(实际上是很大,如LM324运放开环放大倍数为100dB,既10万倍)。此时运放便形成一个电压比较器,其输出如不是高电平(V+),就是低电平(V-或接地)。当正输入端电压高于负输入端电压时,运放输出低电平。[14]

图3-4中使用两个运放组成一个电压上下限比较器,电阻R1、R1ˊ组成分压电路,为运放A1设定比较电平U1;电阻R2、R2ˊ组成分压电路,为运放A2设定比较电平U2。输入电压U1同时加到A1的正输入端和A2的负输入端之间,当Ui>U1时,运放A1输出高电平;当Ui<U2时,运放A2输出高电平。运放A1、A2只要有一个输出高电平,晶体管BG1就会导通,发光二极管LED就会点亮。

若选择U1>U2,则当输入电压Ui越出[U2,U1]区间范围时,LED点亮,这便是一个电压双限指示器。若选择U2>U1,则当输入电压在[U2,U1]区间范围时,LED点亮,这是一个“窗口”电压指示器。

此电路与各类传感器配合使用,稍加变通,便可用于各种物理量的双限检测、短路、断路报警等。

图3-4内部电路图

3.3电动机电路

电机电路是由单片机控制的一个普通的直流电机,一般为了促进电机的转动需要接驱动芯片。本文为了设计简单,采用其他方式代替了电路驱动芯片。电动机电路图如图3-5所示。

图3-5电动机电路图

4控制系统软件设计

本文通过优先设计出硬件结构再用C语言对软件部分编程。最程序是电机如何转动以及延迟时间的多少。

4.1主程序设计

4.1.1主程序流程图

图4-1主程序流程图

4.1.2主程序

#include<reg52.h>sbitL=P1^0;bitFlag;

sbitR=P1^3;sbitD=P1^4;

//接受传感器信号//标志位//正转//反转

//指示灯//1ms延时函数

sbitLED=P1^7;

voidDelay_1ms(unsignedintDATA)

{

unsignedintx,y;

for(x=DATA;x>0;x--)

}

voidLd_Display(){

if(L==1)

{

}

if(Flag==1)

{

R=0;D=0;R=0;D=1;Delay_1ms(3000);Delay_1ms(4000);R=0;D=0;Delay_1ms(2000);R=1;D=0;Delay_1ms(3000);Delay_1ms(4000);Delay_1ms(700);if(L==1){}Flag=1;//显示L函数for(y=110;y>0;y--);

}

}

Flag=0;

voidmain()

{

{

}

}//主函数L=D=R=0;LED=1;Delay_1ms(6000);Delay_1ms(6000);Delay_1ms(5000);Delay_1ms(5000);L=D=R=0;LED=0;while(1)L=D=R=0;LED=0;Ld_Display();L=D=R=0;LED=0;//延时,减少传感器误差;

4.2调试

4.2.1硬件调试

将电路板焊接完毕后,通过肉眼观察是否有虚焊,漏焊以及焊点松动的地方,然后检查导线及元器件有没有被烫伤,特别是二极管和三极管是否由于高温而截至或者导通的现象存在。通过与原始电路图对比观看是否有二极管或三极管连接反向的情况出现,如有立即改正。还要观察转印出来的电路板是否能正常工作。

4.2.1软件调试

在软件编辑器中用C语言将我们需要的程序编写出来,通过软件自带的调试仿真系统去除所有的错误和警告,反复修改直至程序编写无错误,无警告。然后把程序下载到我们画好的电路图内进行初步的调试,观察实验结果是不是我们需要的或是不是对我们有用,如果并不能得到我们预期的效果,则需要重新对程序进行修改,直至结果令我们满意。当一切准备工作准备完毕之后,就要将程序正式写入我们焊好的电路板内了,接通电源进行演示,观察是不是成功。如果不成功则要进一步检验是程序的问题还是电路板的问题,当一切问题解决之后,我们的自动门也就大功告成了。

4.2.3调试中出现的问题

像虚焊,导线不能正常连接这种问题很难用肉眼观察出来,需要我们通电实验之后才能排除这种问题。在软件编译的过程中标点符号用错就是一个错误,更不用说语法的问题了。尤其在软硬结合的调试过程,问题更是层出不穷,一个一个的问题都无从下手去解决。不过还是坚持到最后把各种问题都解决掉了,最后软件和硬件都能正常工作了,二者结合后也能得到令人满意的结果了。付出的艰辛也收到了成果。

5总结与展望

大学生涯中的最后一个设计就这样结束了,虽然艰辛但也有许多的收获。电路图的设计及画法,软件的编程及调试,以及最后的软硬结合,虽然苦但中间也有自己感觉好的一部分。这些都使我学到了好多,成长了好多。通过查找各种资料以及设计中所经历的失败,我懂得了耐心的重要性,画电路图培养了我的细心,调试过程挑战了我的坚持能力,打磨了我的性格。这次设计带给我的是对所学知识的复习,是对新知识的拓展.是对遇到各种困难的坚持,也是对坚持就是胜利这种信仰的肯定。在这期间同学们相互合作,和老师之间的交流也逐渐增多。这对以后的人生都是有帮助的。要知道问题总会解决的,身边总会有人帮助你的,老师也并不是那么的遥不可及,我们之间还是有共同话题的。这次经历锻炼的不仅是自己的耐心还有细心,执着以及对事的态度,为人处世的方法。

我通过采用便宜廉价的及优点于一身的单片机为主来做本次设计的控制中心,外接感知人体的红外传感器,控制门转动的直流电机就实现了一个简单的自动门控制系统。通过本次设计我们可以知道科技也不是那么的神秘,自动门也没有想象中的无法接触,不然自动门的发展也不会这么迅速,也就不会那么快的被人们接受。我们需要的就是安全强,可靠性高,并且易于操作。

国家经济的增长也促使了人们生活水平的提高,人们的享受程度也越来越难以满足,像自动门这种经济,实惠,安全,环保的东西必定会成为主流产业,发展前景也会越来越好的。相信以后的门会融入许多现代化的元素在里面,会更受人们的喜爱。

参考文献

[1]马争、汪亚南.微计算机与单片机原理及应用[M].高等教育出版社2009.

[2]林立、张俊亮、曹旭东、刘得军.单片机原理及应用[M].电子工业出版社,2009.[3]肖俊峰、郑小琴.一种红外线自动门单片机控制系统[J].门窗,2008(10).

[4]吴英才、林华清.热释电红外传感器在防盗系统中的应用[J].传感器技术,2002(7):121-124.

[5]于洋、葛斌、苏晓鹭.基于单片机技术的自动门智能控制系统[J].计算机系统应用,2008(4):15-18.

[6]何希才传感器及其应用实例[M].徐州:机械工业出版社,2003.

[7]单成祥.传感器的理论与设计基础及其应用[M].北京:国际工业出版社,2002.

[8]张迎新.单片微行计算机原理应用及接口技术[M].四川:国防工业出版社,2000.

[9]康华光,陈大钦.电子技术基础[M].上海:高等教育出版社,1998.

[10]胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2004.

[11]陈永甫.红外线探测与控制电路[M].北京:人民邮电出版社,2004.

[12]黄继昌,徐巧鱼,等.传感器工作原理及应用实例[M].武汉:人民邮电出版社,2002.

[13]沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社,2005.

[14]张友德.单片机原理应用与实验[M].上海:复旦大学出版社,2000.

[15]李朝青.单片机原理及接口技术[M].北京:北京航空航天大学出版社,1996.

[16]黄闽海.LM324四运放实用电路的设计-《福建轻纺》-2002

[17]李洪明.LM324四运放的应用-《无线电》-1991

[18]傅斌全.浅析LM324运放在有线电视机房伴音侦测电路的应用-《有线电视技术》-2006

致谢

大学四年的学习生活,过多的注重书面知识,在实际操作能力有限的情况下,我也出现过许多问题。幸亏有老师的指导,同时同学的协助,最终能够完成毕业设计,给几经波折的设计过程画上一个句号。

我非常感谢我的指导老师对我的监督指导,老师不仅仅在设计方面给予引导,在选材方面给予参考,而且时刻监督着我们的进程。在老师的指导下,我也不敢松懈,尽可能早的完成毕业设计。由于经验的缺乏,设计进程缓慢,我非常感谢老师的鼓励和引导,也感谢同学们的雪中送炭。我会铭记老师的教诲,同时我也感谢我所有的老师,教会了我知识,教会了我做人。

附录

附录I总电路图

附录II程序

#include<reg52.h>sbitL=P1^0;bitFlag;

sbitR=P1^3;sbitD=P1^4;

sbitLED=P1^7;

voidDelay_1ms(unsignedintDATA)

{

unsignedintx,y;

for(x=DATA;x>0;x--)for(y=110;y>0;y--);

}

voidLd_Display(){if(L==1){Delay_1ms(700);if(L==1){Flag=1;

}

}

if(Flag==1){R=1;D=0;

Delay_1ms(3000);Delay_1ms(4000);R=0;

D=0;

//接受传感器信号//标志位//正转//反转//指示灯

//1ms延时函数//显示L函数

Delay_1ms(2000);R=0;D=1;

Delay_1ms(3000);Delay_1ms(4000);R=0;D=0;Flag=0;

}}

voidmain(){L=D=R=0;LED=1;Delay_1ms(6000);

Delay_1ms(6000);Delay_1ms(5000);Delay_1ms(5000);L=D=R=0;LED=0;while(1)

{L=D=R=0;LED=0;

Ld_Display();L=D=R=0;LED=0;

}}

//主函数

//延时,减少传感器误差;

附录资料:不需要的可以自行删除

C语言编程规范(仅供参考)

1.基本要求

1.1程序结构清析,简单易懂,单个函数的程序行数不得超过100行。

1.2打算干什么,要简单,直接了当,代码精简,避免垃圾程序。

1.3尽量使用标准库函数和公共函数。

1.4不要随意定义全局变量,尽量使用局部变量。

1.5使用括号以避免二义性。

2.可读性要求

2.1可读性第一,效率第二。

2.2保持注释与代码完全一致。

2.3每个源程序文件,都有文件头说明,说明规格见规范。

2.4每个函数,都有函数头说明,说明规格见规范。

2.5主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。

2.7常量定义(DEFINE)有相应说明。

2.8处理过程的每个阶段都有相关注释说明。

2.9在典型算法前都有注释。

2.10利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为6个

字节。

2.11循环、分支层次不要超过五层。

2.12注释可以与语句在同一行,也可以在上行。

2.13空行和空白字符也是一种特殊注释。

2.14一目了然的语句不加注释。

2.15注释的作用范围可以为:定义、引用、条件分支以及一段代码。

2.16注释行数(不包括程序头和函数头说明部份)应占总行数的1/5到1/3。

3.结构化要求

3.1禁止出现两条等价的支路。

3.2禁止GOTO语句。

3.3用IF语句来强调只执行两组语句中的一组。禁止ELSEGOTO和ELSERETURN。

3.4用CASE实现多路分支。

3.5避免从循环引出多个出口。

3.6函数只有一个出口。

3.7不使用条件赋值语句。

3.8避免不必要的分支。

3.9不要轻易用条件分支去替换逻辑表达式。

4.正确性与容错性要求

4.1程序首先是正确,其次是优美

4.2无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。

4.3改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。

4.4所有变量在调用前必须被初始化。

4.5对所有的用户输入,必须进行合法性检查。

4.6不要比较浮点数的相等,

如:10.0*0.1==1.0,不可靠

4.7程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否

逻辑锁定、打印机是否联机等。

4.8单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。

5.可重用性要求

5.1重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。

5.2公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。

5.3公共控件或类应建立使用模板。

附:C++编程规范,delphi作相应的参考

1适用范围

本标准适用于利用VisulC++,BorlandC++进行软件程序开发的人员.。

.2变量命名

命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意

义字符串,如果连续意义字符串仅两个,可都大写.如OK.

具体例程:

BOOL类型bEnable;

ch*charchText

c*类对象cMain(对象实例)

h*Handle(句柄)hWnd

i*int

n*无符号整型

p*指针

sz,str*字符串

wWORD

x,y坐标

Char或者TCHAR类型与WindowsAPI有直接联系的用szAppName[10]形式否则用

FileName[10]形式,单个字符也可用小写字母表示;

Int类型nCmdShow;

LONG类型lParam;

UINT类型uNotify;

DWORD类型dwStart;

PSTR类型pszTip;

LPSTR类型lpCmdLine

LPTSTR类型lpszClassName;

LPVOID类型lpReserved

WPARAM类型wParam,

LPARAM类型lParam

HWND类型hDlg;

HDC类型hDC;

HINSTANCE类型hInstance

HANDLE类型hInstance,

HICON类型hIcon;

intiTmp

floatfTmp

DWORDdw*

String,AnsiStringstr*

m_类成员变量m_nVal,m_bFlag

g_全局变量g_nMsg,g_bFlag

局部变量中可采用如下几个通用变量:nTemp,nResult,I,J(一般用于循环变量)。

其他资源句柄同上

.3常量命名和宏定义

常量和宏定义必须具有一定的实际意义;

常量和宏定义在#include和函数定义之间;

常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一

条定义的右侧必须有一简单的注释,说明其作用;

资源名字定义格式:

菜单:IDM_XX或者CM_XX

位图:IDB_XX

对话框:IDD_XX

字符串:IDS_XX

DLGINIT:DIALOG_XX

ICON:IDR_XX

.4函数命名

函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源:模

块名及文件名,如是内部函数,只要注释其定义文件名;

第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线

间隔,示例如下:

voidUpdateDB_Tfgd(TRACK_NAME);file://ModuleName:r01/sdw.c

voidPrintTrackData(TRACK_NAME);file://ModuleName:r04/tern.c

voidImportantPoint(void);file://ModuleName:r01/sdw.c

voidShowChar(int,int,chtype);file://LocalModule

voidScrollUp_V(int,int);file://LocalModule

.5结构体命名

结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用

大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数

据区,必须注明其所属的进程。全局数据定义只需注意其用途。

示例如下:

typedefstruct

{

charszProductName[20];

charszAuthor[20];

charszReleaseDate[16];

charszVersion[10];

unsignedlongMaxTables;

unsignedlongUsedTables;

}DBS_DATABASE;

DBS_DATABASEGdataBase;

6控件的命名:

用小写前缀表示类别

用小写前缀表示类别:

fm窗口

cmd按钮

cobcombo,下拉式列表框

txt文本输入框

lablabal,标签

imgimage,图象

picpicture

grdGrid,网格

scr滚动条

lst列表框

frmfram

7注释

原则上注释要求使用中文;

文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复

杂的算法需要加上流程说明;

函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂的函数

需要加上变量用途说明;

程序中注释包括:修改时间和作者、方便理解的注释等;

引用一:文件开头的注释模板

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

**文件名:

**Copyright(c)1998-1999*********公司技术开发部

**创建人:

**日期:

**修改人:

**日期:

**描述:

**

**版本:

**

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

引用二:函数开头的注释模板

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

**函数名:

**输入:a,b,c

**a

**b

**c

**输出:x

**x为1,表示...

**x为0,表示...

**功能描述:

**全局变量:

**调用模块:

**作者:

**日期:

**修改:

**日期:

**版本

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

引用三:程序中的注释模板

/**/

/*注释内容*/

/**/

8程序

a.程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,

尽量不采用递归模式。

b.编写程序时,亦必须想好测试的方法,换句话说,”单元测试”的测试方案应

在程序编写时一并拟好。

c.注释一定要与程序一致。

d.版本封存以后的修改一定要将老语句用/**/封闭,不能自行删除或修改,并要

在文件及函数的修改记录中加以记录。

e.程序中每个block的开头”{"及"}”必须对齐,嵌套的block每进一套,

缩进一个tab,TAB为4个空格,block类型包括if、for、while、do等关键字引出的。

f.对于比较大的函数,每个block和特殊的函数调用,都必须注明其功能,举例如下

count.divisor=1193280/freq;//computethepropercount

OutByte((unsignedshort)67,(unsignedchar)182);//tell8253thata

countiscoming

OutByte((unsignedshort)66,count.c[0]);//sendlow-orderbyte

OutByte((unsignedshort)66,count.c[1]);//sendhigh-orderbyte

×××××××××××××××××××××××××××××××××××××××

bcb,delphi中的变量命名:

遵循匈牙利命名法,命

名必须有意义,制定如下规定

窗体:以大写的W开始,如About版权窗体,命名为WAbout

文件:以大写的F开始,如About版权窗体,文件命名为FAbout.cpp

按钮(Button):如退出按钮,命名为btnExit

……

基类:加base标记,如报表基类,窗体命名为:WBaseRep,文件命名为FBaseRep.cpp

转贴

>1.在.h/.cpp的开头应有一段格式统一的说明,内容包括:

>a.文件名(FileName);

>b.创建人(Creater);

>c.文件创建时间(Date);

>d.简短说明文件功能、用途(Comment)。

好习惯

>2.除非极其简单,否则对函数应有注释说明。内容包括:功能、入口/出口参数,必

>时还可有备注或补充说明。

还是好习惯

>3.每列代码的长度推荐为80列,最长不得超过120列;折行以对齐为准。

太宽了,我的限制是60列,因为文本方式下屏幕一共80列,如果你用BC这一类的编辑

器,窗口边框等又要占据一定空间,所以80列太宽

>4.循环、分支代码,判断条件与执行代码不得在同一行上。

很对

>5.指针的定义,*号既可以紧接类型,也可以在变量名之前。

>

>例:可写做:int*pnsize;

>

>也可写做:int*pnsize;

>

>但不得写做:int*pnsize;

建议采用第二种,除非附加另外一条规定:一次只声明一个变量,否则就会让人混淆,

比如:

int*a,b;

看起来b好像也是个指针,其实不是。

>6.在类的成员函数内调用非成员函数时,在非成员函数名前必须加上"::"。

这一条我倒觉得并不是必需的,我的看法是决不要让你的类成员函数和全局函数的名称

相同(或类似)

>7.函数入口参数有缺省值时,应注释说明。

>

>例:BOOLCWpsDib::PaintDIB(CDC*pDC,CRect&rc,

>intnBrightness,file://*=0*//

>BOOLbGrayScalefile://*=FALSE*//)

每个变量写一行,必要时加上/*in,out*/注释

>8.elseif必须写在一行。

应该尽量避免elseif这样的结构

>9.与‘{’、‘}’有关的各项规定:

>

>9.1‘{’、‘}’应独占一行。在该行内可有注释。

>9.2‘{’必须另起一行,‘{’之后的代码必须缩进一个Tab。‘{’与‘}’必须在

>一列上。

>9.3在循环、分支之后若只有一行代码,虽然可省略‘{’、‘}’,但不推荐这么

>做。若省略后可能引起歧义,则必须加上‘{’、‘}’。

持保留意见,因为GNU的代码规范是这样的:

if(NULL==ptr)

{

//dosomethinghere

}

或者

if(NULL==ptr){

//dosomethinghere

}

争论哪个更好并没有意义,关键是统一,如果用VC当然你的办法最方便,可是如果你用

emacs或者vi,就不是这样了。

>10.与空格有关的各项规定。

>

>10.1在所有两目、三目运算符的两边都必须有空格。在单目运算符两端不必空格。

>在‘—>’、‘::’、‘.’、‘[’、‘]’等运算符前后,及‘&’(取地址)、‘*

>’(取值)等运算符之后不得有空格。

>10.2for、while、if等关键词之后应有1个空格,再接‘(’,之后无空格;在结

>的‘)’前不得有空格。

我认为在括号两端加空格并不是什么错误,尤其是在一个条件十分复杂的if语句里

>10.3调用函数、宏时,‘(’、‘)’前后不得有空格。

>10.4类型强制转换时,‘(’‘)’前后不得有空格

同上

>11.与缩进有关的各项规定

>

>11.1缩进以Tab为单位。1个Tab为4个空格

我认为这个值应该更大,我自己使用8个空格,如果你的代码因为缩进幅度太大而导致

折行,那么几乎可以肯定你的程序设计方案有问题。

>11.2下列情况,代码缩进一个Tab:

>1.函数体相对函数名及'{'、'}'。

>2.if、else、for、while、do等之后的代码。

>3.一行之内写不下,折行之后的代码,应在合理的位置进行折行。若有+-*/等

>算符,则运算符应在上一行末尾,而不应在下一行的行首。

这一条我反对,运算符应该放在下一行行首,以使人能清楚的知道这一行是续上一行

的,比如

if(something

&&somethingelse

&&otherthings)

如果写做

if(something&&

somethingelse&&

otherthings)

反而看不清楚

>11.3下列情况,不必缩进:switch之后的case、default。

编程规范与范例

目录

1排版6

2注释11

3标识符命名18

4可读性20

5变量、结构22

6函数、过程28

7可测性36

8程序效率40

9质量保证44

10代码编辑、编译、审查50

11代码测试、维护52

12宏53

1排版

1-1:程序块要采用缩进风格编写,缩进的空格数为4个。

说明:对于由开发工具自动生成的代码可以有不一致。

1-2:相对独立的程序块之间、变量说明之后必须加空行。

示例:如下例子不符合规范。

if(!valid_ni(ni))

{

...//programcode

}

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

应如下书写

if(!valid_ni(ni))

{

...//programcode

}

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。

示例:

perm_count_msg.head.len=NO7_TO_STAT_PERM_COUNT_LEN

+STAT_SIZE_PER_FRAM*sizeof(_UL);

act_task_table[frame_id*STAT_TASK_CHECK_NUMBER+index].occupied

=stat_poi[index].occupied;

act_task_table[taskno].duration_true_or_false

=SYS_get_sccp_statistic_state(stat_item);

report_or_not_flag=((taskno<MAX_ACT_TASK_NUMBER)

&&(n7stat_stat_item_valid(stat_item))

&&(act_task_table[taskno].result_data!=0));

1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。

示例:

if((taskno<max_act_task_number)

&&(n7stat_stat_item_valid(stat_item)))

{

...//programcode

}

for(i=0,j=0;(i<BufferKeyword[word_index].word_length)

&&(j<NewKeyword.word_length);i++,j++)

{

...//programcode

}

for(i=0,j=0;

(i<first_word_length)&&(j<second_word_length);

i++,j++)

{

...//programcode

}

¹1-5:若函数或过程中的参数较长,则要进行适当的划分。

示例:

n7stat_str_compare((BYTE*)&stat_object,

(BYTE*)&(act_task_table[taskno].stat_object),

sizeof(_STAT_OBJECT));

n7stat_flash_act_duration(stat_item,frame_id*STAT_TASK_CHECK_NUMBER

+index,stat_object);

¹1-6:不允许把多个短语句写在一行中,即一行只写一条语句。

示例:如下例子不符合规范。

rect.length=0;rect.width=0;

应如下书写

rect.length=0;

rect.width=0;

1-7:if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。

示例:如下例子不符合规范。

if(pUserCR==NULL)return;

应如下书写:

if(pUserCR==NULL)

{

return;

}

1-8:对齐只使用空格键,不使用TAB键。

说明:以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐,不要使用BC作为编辑器合版本,因为BC会自动将8个空格变为一个TAB键,因此使用BC合入的版本大多会将缩进变乱。

1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。

1-10:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。

示例:如下例子不符合规范。

for(...){

...//programcode

}

if(...)

{

...//programcode

}

voidexample_fun(void)

{

...//programcode

}

应如下书写。

for(...)

{

...//programcode

}

if(...)

{

...//programcode

}

voidexample_fun(void)

{

...//programcode

}

1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

说明:采用这种松散方式编写代码的目的是使代码更加清晰。

由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最清晰的标志了。

在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。

示例:

(1)逗号、分号只在后面加空格。

inta,b,c;

(2)比较操作符,赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。

if(current_time>=MAX_TIME_VALUE)

a=b+c;

a*=2;

a=b^2;

(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。

*p='a';//内容操作"*"与内容之间

flag=!isEmpty;//非操作"!"与内容之间

p=&mem;//地址操作"&"与内容之间

i++;//"++","--"与内容之间

(4)"->"、"."前后不加空格。

p->id=pid;//"->"指针前后不加空格

(5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。

if(a>=b&&c>d)

1-1:一行程序以小于80字符为宜,不要写得过长。

2注释

2-1:一般情况下,源程序有效注释量必须在20%以上。

说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。

2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。

示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。

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

Copyright(C),1988-1999,HuaweiTech.Co.,Ltd.

Filename://文件名

Author:Version:Date://作者、版本及完成日期

Description://用于详细说明此程序文件完成的主要功能,与其他模块

//或函数的接口,输出值、取值范围、含义及参数间的控

//制、顺序、独立或

温馨提示

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

评论

0/150

提交评论