单片机智能循光小车毕业设计论文 - 图文

更新时间:2024-04-09 20:27:01 阅读量: 综合文库 文档下载

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

毕业设计(论文)

智能循光小车设计

教学单位: 专业名称: 学 号: 学生姓名: 指导教师: 指导单位: 完成时间:

智能循光小车设计

摘要

本系统采用STC12C5A60S2单片机为主控芯片,该芯片常用于电机控制和强干扰场合。系统中采用五个光敏电阻模块和一个光强传感器BH1750FVI模块作为信号检测部分。光敏电阻模块采用了LM393比较器芯片,通过电位器调节比较电压进而来控制光敏电阻的灵敏度。BH1750FVI 模块是一种用于两线式串行总线接口的数字型光强度传感器集成电路,利用它的高分辨率可以探测0LX到65535LX范围的光强度变化。系统以小车的四个电机为执行部分,电机驱动采用的是L298N芯片,该芯片可以驱动两台直流电机,本系统采用了两个L298N芯片来驱动四个直流电机。

本系统通过传感器来检测光照强度,把光照信息反馈给主控芯片,进而由主控芯片根据光的强弱和光源的方位来控制小车以最快的速度向光源走去。本小车通过一些改进可以用于实际应用中,如灭火机器人,搬运机器人等。

关键词:智能小车;寻找光源;单片机;STC12C5A60S2;传感器

I

Intelligent Light Seeking Car Design

Abstract

This system uses STC12C5A60S2 single-chip microcomputer as main control chip, the chip used in motor control and strong interference. Of five photo resistance module and a light intensity sensor BH1750FVI module as part signal detection. Photosensitive resistance module adopts the LM393 comparator chips, by comparing potentiometer to adjust voltage and then to control the sensitivity of photosensitive resistance. BH1750FVI module is two line serial bus interface for a type of digital light intensity sensor IC, take advantage of its high resolution can detect 0 lx to 65535 lx range of light intensity changes. Four motors to perform part of the system to the car, motor driver is adopted L298N chip, the chip can drive two dc motors, this system adopts two four L298N chip to drive the dc motor.

This system through the sensors to detect light intensity, the illumination information feedback to the main control chip, and then according to the strength of the light by the main control chip and the orientation of the light source to control the car with the fastest speed to the light source. This car through some improvements can be used in practical applications, such as fire-fighting robot, handling robot and so on.

Keywords:The smart car;Light seeking;MCU;STC12C5A60S2;The sensor

II

目 录

摘要 ........................................................................................................................................ I ABSTRACT .......................................................................................................................... II 1 绪论 .................................................................................................................................... 1 1.1 智能小车的背景和意义 ............................................................................................. 1 1.2 智能小车的作用和前景 ............................................................................................. 1 2 总体方案设计 .................................................................................................................... 2 2.1 循光小车的功能分析 ................................................................................................. 2 2.2 主控部分的设计 ......................................................................................................... 2 2.3 信号采集部分的设计 ................................................................................................. 2 2.4 执行部分的设计 ......................................................................................................... 3 2.5 整体设计框架 ............................................................................................................. 3 3 硬件的设计 ........................................................................................................................ 4 3.1 单片机控制单元 ......................................................................................................... 4 3.1.1 单片机简介 .......................................................................................................... 4 3.1.2 电源系统 .............................................................................................................. 5 3.1.3 诺基亚5110液晶 ................................................................................................ 6 3.1.4 光敏电阻模块 ...................................................................................................... 7 3.1.5 光强传感器 .......................................................................................................... 8 3.1.6 单片机控制单元原理图 ...................................................................................... 9 3.2 直流电机控制单元 ................................................................................................... 10 3.2.1 H桥电机驱动电路 ............................................................................................ 10 3.2.2 电机驱动芯片L298N ......................................................................................... 11 3.2.3 直流电机控制单元原理图 ................................................................................ 12 4 软件的设计 ...................................................................................................................... 13 4.1 整体程序分析 ........................................................................................................... 13 4.2 光强传感器程序 ....................................................................................................... 13 4.3 PWM电机调速程序 ................................................................................................. 16 5 系统调试 .......................................................................................................................... 18 5.1 软件调试 ................................................................................................................... 18 5.1.1 Altium Designer软件简介................................................................................. 18 5.1.2 Keil C51软件简介............................................................................................. 18

III

5.1.3 软件调试问题及排除 ........................................................................................ 18 5.2 硬件调试 ................................................................................................................... 19 5.2.1 系统实物图 ........................................................................................................ 19 5.2.2 硬件调试问题及排除 ........................................................................................ 19 总结 ..................................................................................................................................... 20 参考文献 ............................................................................................................................. 21 附录A 主控板原理图 ........................................................................................................ 22 附录B 主控板PCB图 ....................................................................................................... 23 附录C 电机驱动板原理图 ................................................................................................ 24 附录D 电机驱动板PCB图 ............................................................................................... 25 附录E 主控板实物正面图 ................................................................................................ 26 附录F 主控板实物反面图 ................................................................................................. 27 附录G 电机驱动板实物正面图 ........................................................................................ 28 附录H 电机驱动板实物反面图 ........................................................................................ 29 附录I 系统整体实物图 ...................................................................................................... 30 附录J 系统程序 ................................................................................................................. 31 致谢 ..................................................................................................................................... 44

IV

1 绪论

1.1 智能小车的背景和意义

在20世纪50年代初,美国Electronics公司研发出世界上第一台自动引导车辆,也是世界上第一台智能车辆,从严格意义上来说,这是一台移动机器人。从50年代后期到60年代前期,以美国为首,德国、英国和日本等国家就已经开展了智能车辆的自动驾驶和车辆导航技术的研究。直到今天,世界各国对智能车辆的研究表现出了空前的热情,也为此投入了大量的人力和物力,智能车辆也有了突破性的发展。我们在一些全国性的电子设计大赛中经常会看到智能小车的身影,也有一些专门为智能小车而举办的设计大赛,如:飞思卡尔智能车大赛等等。由此可见,智能车的发展一直受到各方面的关注和支持。智能小车也叫无人小车,它通过自带的传感器来感知周围的环境,再由传感器把信息反馈给主控芯片,然后通过主控芯片把反馈回来的信息进行解读和分析,进而再完成相应的动作。智能小车能工作在一些环境比较恶劣的岗位上,能完成一些人类难以完成的工作,也可以工作在无人生产线上,提高人类的工作效率。智能小车的出现,是20世纪自动化领域的重大成就。智能小车作为无人机器人的一种,它属于人工智能的综合体现。人工智能处于计算机技术的前沿,它的研究成果对工业、农业、军事和我们的日常生活都有着极大的影响。人们不断发明机器来代替人类工作,这是科技发展的必定走势,所以智能小车的出现和发展对我们有着重大的意义。

1.2 智能小车的作用和前景

在移动机器人快速发展的今天,人类已经进入了文明的新阶段。移动机器人已经广泛应用于军事、工业、农业和服务业等领域。例如科学勘测、灭火、扫地、浇花、防盗巡查和搬运货物等等。随着移动机器人的技术水平的不断提高,不仅大大提高了现今的劳动效率,而且还减轻了劳动强度。智能小车作为移动机器人的一种,无论在日常看到的智能玩具中还是在各行各业中都有着一些实质成果。机器人和人类的生产生活已经密不可分了,在无人生产线中,机器人给人类带来了革命性的成果。智能小车是一个综合性系统,它集环境感知、规划决策和自动驾驶等功能于一体,它运用了机械结构、理论力学、模拟电路、数字电路、单片机、传感器、控制理论和控制算法等多门学科的知识,它涵盖了机械、电子、计算机、传感技术、自动控制原理和人工智能等多个学科和领域,它是典型的高新技术综合体。智能小车的不断发展也能使我们充分感受到智能化给我们带来的方便和好处。在不久的将来,智能小车将作为移动机器人的一种,出现在我们的身边,甚至普及到每一个家庭。我们应该重视智能小车的发展,使智能小车向更稳定和更实用的方向发展。智能小车的前景是美好的,智能小车有着改变人类生活习惯的强大力量。

1

2 总体方案设计

本系统主要包括主控部分、信号采集部分和执行部分。首先通过信号采集部分对小车周围的环境进行感知,然后把得到的信息反馈给主控部分,最后由主控部分对信息进行解读和分析并根据信息的内容对执行部分进行相应的控制。

2.1 循光小车的功能分析

循光小车最基本的功能就是前进、后退和左右拐弯,本小车主要根据四个电机的差速和转向来控制它的行走方向。小车速度的快慢可以通过单片机模拟PWM来控制。在检测不到小车周围有光源存在时,小车处于静止状态,此时周围的光照强度可以通过小车前面的光强传感器检测出来,然后在液晶上显示出来。当小车左侧的光敏传感器检测到光源时,小车向左慢慢拐弯。同理,当小车右侧的光敏传感器检测到光源时,小车向右慢慢拐弯。当小车后面的光敏传感器检测到光源时,小车快速从右边向后面转弯。这样的话小车就可以一直往光源走去,当小车前面的光强传感器检测出来的光照强度大于1500LX时,也就是说当小车走到光源处时,即是当小车找到光源时,小车停止。总的来说就是当小车发现周围有光源时,小车立刻向光源走去,然后找到光源并且停在光源处。

2.2 主控部分的设计

本系统的主控部分采用了直插式的STC12C5A60S2单片机,之所以选择这种单片机,是因为它有着高速、低功耗和超强抗干扰的性能。该种单片机常用于电机控制和强干扰场合。在本设计中,单片机外接12M的石英晶体振荡器,并且外接可按键复位的复位电路。该单片机在本系统中控制的外围元器件包括:光敏电阻模块、诺基亚5110液晶模块、光强传感器BH1750FVI模块和电机驱动L298N模块。主控部分就像人类的大脑一样,使各个部分相互配合共同有序地完成本系统的功能。

2.3 信号采集部分的设计

本系统的信号采集部分主要采用了五个光敏电阻模块和一个光强传感器BH1750FVI模块。五个光敏电阻模块平均分布在车子的左前方、右前方、后方、左边和右边,它们主要是用来感知光源相对小车来说所在的位置。一个光强传感器模块主要分布在小车的正前方,它主要是用来实时测量光源的光照强度,进而判断小车和光源之间的距离是多少。这样分配的话,就可以使各个传感器相互配合,进而使小车能够全视角地去检测光源的位置。两种传感器相互合作,就能准确找到光源的位置和知道光源的强度,并且实时把光照强度在诺基亚5110液晶上显示出来。信号采集部分就像人类的眼睛一样,快速准确地锁定目标。

2

2.4 执行部分的设计

本系统的执行部分采用了四个TT马达,它是带有减速箱的直流减速电机,减速比为1:48。电机驱动采用的是15脚直插式封装的L298N芯片。通过单片机的控制线对该芯片的信号输入端写入不同的信号,则该芯片的信号输出端就会输出放大后的相应的信号给电机,进而对电机进行相应的控制。一个L298N芯片可以驱动两个直流电机,本系统采用了两个L298N芯片来驱动四个直流电机。执行部分就像人类的手和脚,它能快速地去执行大脑分配给自己的工作。

2.5 整体设计框架

本系统通过两种传感器的相互配合来检测出光源的强度和方位,把光照信息反馈给主控芯片,进而由主控芯片STC12C5A60S2单片机根据光的强弱和光源所在的位置来给小车提供不同的控制信息,最后使小车以最快的速度向光源走去。系统设计框架如图2-1所示。

图2-1 系统设计框架图

3

3 硬件的设计

3.1 单片机控制单元

本单元主要由STC12C5A60S2单片机最小系统、诺基亚5110液晶、光敏电阻模块和光照传感器BH1750FVI模块组成。单片机的最小系统由电源电路、复位电路、时钟电路和下载电路组成。

3.1.1 单片机简介

本系统使用的是STC12C5A60S2单片机,该单片机是宏晶科技生产的机器周期为1T的单片机,是高速、低功耗和超强抗干扰的新一代51单片机,工作电压为3.3V-5.5V(5V单片机)。指令代码完全兼容传统的51单片机,但速度快8到12倍。内部集成了专用复位电路和2路PWM,还有8路高速10位A/D转换,该单片机性价比高,极具竞争力,常用于电机控制和强干扰场合。

STC12C5A60S2单片机包括:一个8位的微型处理器;一个1K的片内数据存储器;一个64K的片内程序存储器;四个8位并行的I/O接口即P0到P3,每个接口既可以输入,也可以输出;两个定时器或记数器;两路PCA模块;五个中断源的中断控制系统;一个全双工的串行I/O口;也有片内振荡器和时钟产生电路,但石英晶体振荡器和微调电容需要外接。各个单片机的组成部分可以通过它的内部总线相连接。STC12C5A60S2单片机的管脚图如图3-1所示。

图3-1 STC12C5A60S2管脚图

各引脚功能简单介绍如下: ①电源及晶振引脚

4

VCC(第40脚):+5V电源引脚; GND(第20脚):接地引脚;

XTAL1(第19脚):反向振荡放大器的输入及内部时钟工作电路的输入; XTAL2(第18脚):来自反向振荡器的输出; ②控制引脚

RST(第9脚):复位输入,当单片机要进行复位时,要保持RST脚两个机器周期的高平时间;

ALE/PROG(第30脚):地址锁存使能输出/编程脉冲输入; PSEN(第29脚):输出访问片外程序存储器读选通信号; EA/VPP(第31脚):外部ROM允许访问/编程电源输入; ③并行I/O口引脚

并行I/O口共有32个,其中P0^0-P0^7(第39-32脚)统称为P0口;P1^0-P1^7(第1-8脚)统称为P1口;P2^0-P2^7(第21-28脚)统称为P2口;P3^0-P3^7(第10-17脚)统称为P3口;

P0-P3口可以作为通用输入/输出(I/O)口使用。此外,P2口可以作为地址总线的高8位,P0口可以作为地址总线的低8位,它们一起组成16位的地址总线。P0口还可以作为8位的数据总线。P3口可作为控制总线,它具有第二功能作用;P3口的第二功能定义如表3-1所示。

表3-1 P3口第二功能定义表

引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能定义 RXD(串行通信数据接收端) TXD(串行通信数据发送端) INT0(外部中断0请求端口,低电平有效) INT1(外部中断1请求端口,低电平有效) T0(定时/计数器0外部计数输入端口) T1(定时/计数器1外部计数输入端口) WR(片外数据存储器写选通信号输出端,低电平有效) RD(片外数据存储器读选通信号输出端,低电平有效)

3.1.2 电源系统

因为系统各个部分所需要的电压不同,所以要对电压进行合理的分配。电源部分采用了两个标称电压为3.7V的18650可充电锂电池。两个电池并联,一共7.4V作为电机驱动芯片的驱动电压。然后又通过稳压芯片LM7805把7.4V稳压到5V作为电机驱动芯片的工作电压,也作为单片机的供电电压。最后又通过稳压芯片AMS1117-3.3把5V稳压到3.3V为诺基亚5110液晶供电。

5

LM7805是三端稳压集成电路,它可以将8-12V电压转变成5V电压,芯片内部还有过流、过热及调整管的保护电路,使用时要安装散热器。它不仅可靠和方便,而且价格便宜。连接电路如图3-2所示。

图3-2 LM7805稳压电路图

AMS1117-3.3是一个正向低压降稳压器,固定输出3.3V。输入电压的上限值是15V,但这类线性稳压器一般适用于输入输出电压差不太大(3-5V)的场合。芯片内部集成过热保护和限流电路,是便携式计算机的最佳选择。连接电路如图3-3所示。

图3-3 AMS1117-3.3稳压电路图

3.1.3 诺基亚5110液晶

诺基亚5110液晶是84乘以48的点阵液晶,可以显示15个汉字,也可以显示30个字符,还可以显示图案。它采用串行接口与主处理器进行通信,接口信号线的数量少,包括电源线在内的信号线仅有8根。它支持多种串行通信协议,传输速率高达4Mbps,可以全速写入显示数据并且无需等待时间。液晶的驱动器芯片已经绑定到了液晶晶片

6

上,所以模块的体积很小。液晶的工作电压为3.3V,正常显示时的工作电流为200uA以下,具有掉电模式。它速度快,是LCD12864的20倍,也是LCD1602的40倍,性价比高,适合电池供电的便携式移动设备。在电路设计方面把液晶的5根控制线直接与单片机的普通I/O口相连。背光线直接接3.3V,即是使背光一直处于开启状态,电路设计如图3-4所示。

图3-4 液晶的电路设计图

3.1.4 光敏电阻模块

光敏电阻模块主要由LM393比较器、光敏电阻和可调电位器组成。LM393是由两个独立的、高精度的电压比较器组成的集成电路。LM393的输出为集电极开路,主要是为了适应不同电平的需要。我们可以将输出上拉到不同的电平,例如3.3V、5V和10V等,以适应后级电路的需要。按照电路结构分析,在正常使用的情况下,输出时必须接上拉电阻。

电压比较器的功能是比较两个电压的大小,它用输出高电平或低电平来表示两个输入电压的大小关系。当“+”输入端电压高于“-”输入端电压时,电压比较器输出为高电平。当“+”输入端电压低于“-”输入端电压时,电压比较器输出为低电平。

光敏电阻是利用半导体的光电效应制成的一种电阻器。它的电阻阻值随着入射光的强弱而变化。主要原理是材料的电阻与该材料内部电子受到的束缚力有关,束缚力越大,电子就越难自由运动,电阻就越大,反之则越小。当电子吸收外来的一定能量的光子后,动能增加,材料对电子的束缚力减弱,电阻减小。所以当光照越强时,光敏电阻的阻值就越小。当光照越弱时,光敏电阻的阻值就越大。

可调电位器主要是用来调节自身电阻的大小,进而来改变比较器基准电压的大小。根据比较器基准电压的不同,光敏电阻模块的感光性也会不同。也就是说可调电位器主要是用来改变光敏电阻模块的感光性能。

光敏电阻模块的电路设计如图3-5所示。

7

图3-5 光敏电阻模块电路图

光敏电阻模块的引脚包括电源引脚VCC和GND,VCC接5V电压。还有模拟输出引脚A0和数字输出引脚D0。模块的原理是把可调电位器分压所得到的电压作为比较电压,接到比较器的反向输入端。把光敏电阻所分得的电压接到比较器的正向输入端。当光敏电阻受到光的照射时,光敏电阻的阻值变小,所分得的电压也变小。当光敏电阻所分得的电压小于比较器的比较电压时,比较器输出低电平。此时单片机就会在模块的D0引脚读到低电平。也就是说可调电位器决定了模块对光的灵敏度,当光源的亮度大于模块的灵敏度时,模块返回低电平给单片机。

3.1.5 光强传感器

光强传感器BH1750FVI模块的引脚包括电源引脚VCC和GND,VCC接3-5V电压。还有IIC总线的时钟引脚SCL、IIC总线的数据引脚SDA和IIC总线的设备地址引脚ADD。模块与单片机的连接方法如图3-6所示。

图3-6 BH1750FVI模块与单片机的连接图

8

在整个模块中起主导作用的是BH1750FVI芯片。它是一种数字型光强度传感器集成电路,用于两线式串行总线接口。该芯片可以利用它的高分辨率测出0-65535勒克司的光强度变化。它有着和人类视觉灵敏度一般的光谱灵敏度特性。芯片支持IIC接口,直接输出亮度所对应的数字值。它的光源依赖性弱,并且受红外线的影响很小。对测量结果影响较大的因素是光入口的大小。芯片有除光噪音功能,能够实现稳定的测量。其内部框图如图3-7所示。

图3-7 BH1750FVI芯片内部框图

框图描述如下:

①PD:为接近人类肉眼反应的光敏二极管。

②AMP:为集成运算放大器,主要功能是将PD电流转换为PD电压。 ③ADC:为模数转换器,主要是为了把PD电压转换为16位的数字信息。

④Logic+IIC Interface:为逻辑运算器和IIC界面部分,它的主要功能是完成光强度计算,同时它也是IIC总线接口。

⑤OSC:为内部振荡器,该时钟为内部逻辑时钟,它的时钟频率典型值是320kHz。 BH1750FVI集成电路的原理是:当光敏二极管受到光的照射时,把光转换成相应的电流,再由集成运算放大器将电流转换成相应的电压,然后由模数转换器把电压转换为数字信息,再通过逻辑运算器完成光强度的计算,最后通过IIC总线把运算出来的光强度信息送给单片机。光强传感器采集回来的信息存储在单片机的数据寄存器中,每连续的两个字节信息合并成一个以2进制形式存在的光强数据,将其化为10进制则是0-65535的光强数据,其单位为勒克司,即是1流明的光通量均匀照在1平方米表面上所产生的照度。

3.1.6 单片机控制单元原理图

本系统的单片机控制单元整体原理图如图3-8所示。

9

图3-8 单片机控制单元原理图

3.2 直流电机控制单元

本单元的主要部件为L298N电机驱动芯片。L298N是一种二相和四相电机的专用驱动器。它是内部含有两个H桥的高电压大电流双全桥式驱动器。一个L298N芯片可以驱动两个直流电机。

3.2.1 H桥电机驱动电路

H桥是一个典型的直流电机控制电路,也叫全桥。因为外形像H所以被称作H桥。基本电路如图3-9所示。

图3-9 H桥基本电路图

从电路中可以看出当三极管Q1和Q4导通时,电流从Q1流过电机再流到Q4,此时电机顺时针旋转。同理当三极管Q3和Q2导通时,电流从Q3流过电机再流到Q2,此时电机逆时针旋转。这样就可以通过控制三极管的导通状态来控制电机的转向。但是这样

10

的话我们必须要同时导通对角线上的两个三极管,同时也要防止同一边的两个三极管同时导通。所以要对电路进行改良,改良后的电路如图3-10所示。

图3-10 H桥改良后电路图

电路中的ENABLE为使能端,置1。当信号端DIR-L为0而DIR-R为1时,通过非门和与门对信号进行相应的变换后,三极管Q1和Q4导通同时Q2和Q3不导通,此时电流的流向为Q1→电机→Q4,电机顺时针转动。当信号端DIR-L为1而DIR-R为0时,三极管Q3和Q2导通同时Q1和Q4不导通,电流的流向为Q3→电机→Q2,电机逆时针转动。这样的话就可以保证对角线上的两个三极管同时导通,又可以防止同一边的两个三极管同时导通。

3.2.2 电机驱动芯片L298N

L298N是ST公司生产的一种15脚封装的电机驱动芯片。该芯片的工作电压高,最高工作电压可以达到46V。它的输出电流也大,持续工作电流为2A,瞬间的峰值电流可以达到3A,其额定功率为25W。该芯片是内部含有两个H桥的全桥式驱动器,一个L298N可以用来驱动两台直流电机或一台两相步进电机或一台四相步进电机。它具有两个使能控制端,并且采用标准的逻辑电平信号来控制。其内部结构如图3-11所示。

图3-11 L298N内部结构图

11

在本系统中,电路的OUT1和OUT2接电机1两端,OUT3和OUT4接电机2两端;Vs接7.4V;Vss、EnA和EnB接5V;SENSEA和SENSEB接GND;In1、In2、In3和In4直接与单片机的I/O口相连。该芯片的控制方式和电机的运动状态如表3-2所示。

表3-2 L298N芯片的控制方式表

IN1/IN3 0

IN2/IN4 0 1 0 1 电机1/电机2状态 制动 正转 反转 制动

0 1 1 由上表可知,单片机通过I/O口对芯片的信号输入端写入不同的高或低电平组合,就可以对电机的转向进行相应的控制。如果想要对电机的速度进行控制的话,单片机可以模拟PWM,通过改变L298N芯片输入端信号的占空比来实现。

3.2.3 直流电机控制单元原理图

本系统的直流电机控制单元整体原理图如图3-12所示。

图3-12 直流电机控制单元原理图

12

4 软件的设计

4.1 整体程序分析

本系统程序主要包括定时器中断程序、诺基亚5110液晶驱动程序、模拟IIC总线程序、模拟PWM程序、光强传感器程序、光敏电阻的光源定位程序和小车的运动程序。整

体程序框图如图4-1所示。

图4-1 整体程序框图

4.2 光强传感器程序

光强传感器主要是通过IIC总线和单片机进行通信。IIC总线是PHILIPS公司推出的一种新型总线标准,它接口线少、控制简单和通信速率高,是同步通信的一种特殊形式。IIC总线由时钟线SCL和数据线SDA组成,既可以接收数据,也可以发送数据,最高传送速率为400kbps。虽然各个器件都并联在IIC总线上,但是它们都有唯一的地址,

13

并且彼此独立。IIC总线支持多主和主从两种工作方式,本系统用的是主从工作方式,主器件(单片机)主要是发出启动信号,产生时钟信号和发出停止信号。

在本系统中是通过软件来模拟IIC总线的工作时序。单片机在模拟IIC总线时,需要包括如下关键程序:总线初始化、启动信号、应答信号、停止信号、写一个字节和读一个字节。

①总线初始化 void init() {

SCL = 1; DELAY(); SDA = 1; DELAY(); }

主要是将数据总线和时钟总线都拉高以释放总线。 ②启动信号

void start() {

SCL = 1; DELAY(); SDA = 1; DELAY(); SDA = 0; DELAY(); }

在SCL为高电平期间,SDA出现下降沿则为启动信号。此信号由主机发出,具有IIC总线接口的从器件会检测到该信号。发送完启动信号后,主机会发出寻址信号并在得到从机的应答后就可以进行数据传输。

③应答信号

void respons() {

unsigned char i = 0; SCL = 1; DELAY();

while((SDA == 1) && (i < 255)) i++;

SCL = 0; DELAY(); }

在SCL为高电平时,SDA被从设备拉为低电平表示应答,即数据传输正确。如果在一段时间内没有收到从器件的应答则默认从器件已经收到数据,同时也不再等待应答信号。IIC总线协议规定,每传送一个字节数据后都要有一个应答信号,用来确定传送的数据是否被对方接收到,此信号由接收设备产生。每次在传输数据时,都要在得到应答信号后才可以进行下一个字节的传送。当主机作为接收设备时,主机对最后一个字节不应答,以向发送设备表示数据传输结束。

④停止信号

14

void stop() {

SCL = 1; DELAY(); SDA = 0; DELAY(); SDA = 1; DELAY(); }

在SCL为高电平期间,SDA上产生一个上升沿信号,此信号是在全部数据传输结束后由主机发送。

⑤写一个字节

void write_byte(uchar dat) {

unsigned char i,tem; tem = dat;

for(i = 0;i<8;i++) {

tem = tem << 1;

SCL = 0; DELAY(); SDA = CY; DELAY(); SCL = 1; DELAY(); }

SCL = 0; DELAY(); SDA = 1; DELAY(); }

串行发送一个字节时,要把一个字节中的8位数据一位一位地发出去,把字节左移一位,最高位移动到PSW寄存器的CY位中,再把CY赋给SDA进而在SCL的控制下将其发送出去。

⑥读一个字节

unsigned char read_byte() {

unsigned i, k; SCL = 0; DELAY(); SDA = 1; for(i = 0;i < 8;i++) {

SCL = 1; DELAY(); k = (k << 1) | SDA; SCL = 0; DELAY(); }

DELAY(); return k; }

15

串行接收一个字节时,需要一位一位地接收,然后再将其组合成一个字节。 系统中运用定时器1的方式1把读回来的光强数据每隔500MS刷新一遍,并在5110液晶中显示出来。定时器方式1的定时时间如公式4-1所示。

t?(216?a)?12fosc (4-1)

其中a为计数初值;fosc为晶振频率,本系统为12M。定时器1的中断函数如下: void Timer1_int() interrupt 3 {

uchar flag; flag++;

TH1 = (65536-50000)/256; //放定时器高八位初值 TL1 = (65536-50000)%6; //放定时器低八位初值 if(flag == 10) //每隔500MS进来刷新一遍 {

flag = 0; //计数清0

conversion(); //执行光强度运算函数 Dispaly_char(36,3,0x30+wan); //显示万位数据 Dispaly_char(42,3,0x30+qian); //显示千位数据 Dispaly_char(48,3,0x30+bai); //显示百位数据 Dispaly_char(54,3,0x30+shi); //显示十位数据 Dispaly_char(60,3,0x30+ge); //显示个位数据 } }

4.3 PWM电机调速程序

PWM脉冲宽度调制技术的原理就是通过对一系列脉冲的宽度进行调制,进而得到所需要的等效波形。脉冲的占空比与电机的平均速度的关系如图4-2所示。

图4-2 占空比与平均速度的关系图

16

占空比是指在一个周期内通电时间t1与一个周期的总时间T的比值,一个周期内通电时间越长,占空比越大。其关系如公式4-2所示。

D?t1T (4-2)

由图可得占空比和平均速度可以近似地看成线性关系。脉冲的占空比越大,提供给电机的平均电压越大,电机的平均速度就越大,反之脉冲占空比越小,提供给电机的平均电压越小,电机的平均速度就越小。并且不管是通电(高电平)还是断电(低电平)时,电机都是转动的,电机的转速取决于平均电压。系统中采用单片机定时器0的方式2作为脉宽调制的定时方式,精度极高。定时器方式2的定时时间如公式4-3所示。

8 t?(2?a)?12fosc (4-3)

其中a为计数初值;fosc为晶振频率,本系统为12M。定时器0的中断函数如下: void Timer0_int() interrupt 1 {

TH0 = TL0 = 256-10;//放定时器初值

count ++;

if(count >= 100){count = 0;}

} 由程序可得PWM脉冲的周期为1MS,其占空比可以由下列函数求得: void Wheel_g(uchar speed) {

if(count <= speed) go;//通电 else stop;//断电 }

其中通过改变参数speed就可以改变脉冲的占空比,其范围是0-100。本系统中四个电机的speed参数都为50,即是四个电机的占空比都为50%。

电机转动时输出的方波在串口示波器VisualScope中的显示如图4-3所示。

图4-3 电机转动时输出的方波图

17

5 系统调试

5.1 软件调试

5.1.1 Altium Designer软件简介

Altium Designer是位于澳大利亚的Altium公司(其前身为 Protel 公司)推出的一体化电子产品开发系统,主要运行在Windows操作系统上。软件把原理图设计、PCB绘制和电路仿真等技术完美融合,为设计者提供了完善的设计解决方案,使设计者可以轻松地进行设计。

Altium Designer的原理图设计系统的特点有:强大的编辑功能、强大的元件及元件库的组织功能、分层次组织的设计环境、方便易用的连线工具和准确的设计检验。其PCB设计系统的特点有:丰富的设计法则、易用的编辑环境、轻松的交互性手动布线、简便的封装形式的编辑及组织、高智能的基于形状的自动布线和万无一失的设计校验。原理图设计系统和PCB设计系统紧密相连,共同完成电路板的设计。

5.1.2 Keil C51软件简介

Keil C51是位于美国德克萨斯州的Keil Software公司(ARM公司之一)推出的单片机集成开发软件,它是目前最受欢迎的51单片机开发软件。Keil主要运行在Windows操作系统上,提供了包括C编译器,宏汇编在内的丰富库函数,也有一个功能强大的集成开发仿真调试器。

5.1.3 软件调试问题及排除

本系统的程序采用了分模块编写,主要包括诺基亚5110液晶模块、传感器检测模块和电机运动模块。在Keil C51环境中把各个模块完美融合,先用Keil检查是否有语句错误,然后把程序下载到单片机中,观察实物的现象是否达到预期要求。

在本次程序编写中遇到的问题如下:

①小车总是在光源前面左右快速摆动,不能稳定地停在光源处。通过这个现象我判断是因为传感器的反应太慢而小车的速度太快,它们不能互相融合。经过调试摸索,我决定用定时器模拟PWM来控制电机进而来降低小车的速度,最后解决了这个问题。

②诺基亚5110液晶一直亮着但不能显示文字和字符,刚开始我以为是硬件问题,但是经过不断地调试摸索和参考此液晶的数据手册,发现是程序中设定的偏置电压太低,经过不断地修改最后解决了这个问题。

③光敏电阻模块返回来的数据和预期的不一致,经过调试摸索和查阅此模块的数据手册,发现我是用单片机在模块的模拟输出端读取数据,然而正确的做法是从模块的数据输出端读取数据,经过调整最后解决了这个问题。

18

5.2 硬件调试

5.2.1 系统实物图

系统整体实物图如图5-1所示。

图5-1 系统实物图

5.2.2 硬件调试问题及排除

①有一个电机不转动,经过检测发现是因为此电机的一个引脚虚焊了,经过重新焊接得以解决问题。

②下载程序时发现一直下载不了,经过检测发现两根串口线短路了,经过焊接处理后解决了这个问题。

19

总结

本设计是基于STC12C5A60S2单片机的智能循光小车设计,通过单片机控制传感器、液晶和电机,充分发挥了单片机在测控领域中的作用。本小车就是一个小型的移动机器人,传感器是它的眼睛,单片机是它的大脑,电机是它的手和脚,从感知周围环境到做出相应的运动都能独立完成,实现了真正的全自动控制。本系统的特点有:

①本系统硬件方面采用了STC12C5A60S2单片机作为主控芯片,采用了直流减速电机、光敏电阻模块、诺基亚5110液晶、BH1750FVI模块和L298N芯片等,这些元件性价比高,性能稳定,经济实用。

②本系统软件方面运用到单片机模拟IIC总线来控制BH1750FVI模块,也用单片机定时器模拟PWM来控制电机的转速。

③只要按下小车的电源按钮,小车就会全自动地寻找光源,并且实时把周围的光照强度在液晶上显示出来。当小车找到光源时,会自动停在光源处,实现了整个过程的全自动化。

④本设计虽然制作简单,但是经过一些改进也可以应用在实际生活中,如灭火机器人、搬运机器人和防盗巡查机器人等等。

⑤由于成本限制和个人能力不足,不能做出一个可以直接运用到实际生活中的智能小车是本设计的遗憾之处。

20

参考文献

[1]党智乾. 基于单片机的智能寻光避障小车的设计与实现[J]. 自动化技术与应用,2015,01:26-29+39. [2]解永勃,宋自若,樊跃龙. 一做就成——灵便的寻光小车[J]. 电子世界,2009,12:43.

[3]何晔. 基于AT89S52单片机自动避障自动追光小车新设计[J]. 科技致富向导,2011,09:130-131. [4]施芸. 基于PCF8591t的智能小车追光系统的设计[J]. 数字技术与应用,2011,04:148-150. [5]王洋. 基于单片机的智能小车设计[J]. 网友世界,2014,12:36.

[6]张伟娟,王菊,李昆. 基于单片机的智能环保小车设计[J]. 电子质量,2014,05:28-30. [7]陈懂. 智能小车运动控制系统的研究与实现[D].东南大学,2005. [8]王晶. 智能小车运动控制技术的研究[D].武汉理工大学,2009.

[9]王松,李永超,郑建飞. 基于AT89S52单片机的智能小车系统设计制作[J]. 硅谷,2010,18:51-52. [10]孙学智. 基于STC12C5A60S2智能小车控制系统设计[J]. 电子世界,2013,22:127-128. [11]孙绪才. L298N在直流电机PWM调速系统中的应用[J]. 潍坊学院学报,2009,04:19-21. [12]张天鹏,徐磊. L298N控制直流电机正反转[J]. 工业设计,2011,03:98-99. [13]郭天祥. 新概念51单片机C语言教程[M]. 北京:电子工业出版社,2009. [14]林立,张俊亮. 单片机原理及应用[M]. 北京:电子工业出版社,2013. [15]陈飞鹏. 基于STC89C52单片机智能小车设计[J]. 硅谷,2012,11:43-44. [16]Intel. Microcontroller Handbook[M]. Intel Corporation,1988.

21

附录A 主控板原理图

22

附录B 主控板PCB图

23

附录C 电机驱动板原理图

24

附录D 电机驱动板PCB图

25

附录E 主控板实物正面图

26

附录F 主控板实物反面图

27

附录G 电机驱动板实物正面图

28

附录H 电机驱动板实物反面图

29

附录I 系统整体实物图

30

附录J 系统程序

/*-------------------------------------------------------------------------- 诺基亚5110液晶驱动函数

--------------------------------------------------------------------------*/ #ifndef __5110_H #define __5110_H #include \

sbit RST_5110=P3^4;//RST sbit CE_5110=P3^5;//CE

sbit DC_5110=P3^6;//Date-1 Control-0 sbit DIN_5110=P3^7;//DIN sbit CLK_5110=P2^0;//CLK #define SET_RESET #define CLR_RESET

(RST_5110=1)//置1 (RST_5110=0)//置零

#define SET_CE (CE_5110=1) #define CLR_CE (CE_5110=0) #define SET_DC (DC_5110=1) #define CLR_DC (DC_5110=0) #define SET_SDIN (DIN_5110=1) #define CLR_SDIN (DIN_5110=0) #define SET_SCLK (CLK_5110=1) #define CLR_SCLK (CLK_5110=0) void delay(unsigned int nCount);

void LCD_write_byte(unsigned char dat,unsigned char command); void LCD_set_XY(unsigned char X, unsigned char Y); void LCD_clear(void); void LCD_init(void);

void LCD_dispaly_char(unsigned char c);

void Dispaly_char(unsigned char X,unsigned char Y,unsigned char c); void LCD_display_String(unsigned char X,unsigned char Y, char *s);

void LCD_write_chinese_string1(unsigned char X, unsigned char Y, unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);

void LCD_write_chinese_string2(unsigned char X, unsigned char Y, unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);

void LCD_write_chinese_string3(unsigned char X, unsigned char Y, unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);

void display_init();

31

#endif

#include \#include \#include \/**

* @brief 延时函数 * @param 无

* @retval nCount */

void delay(uint nCount) {

for( ; nCount != 0; nCount--); } /**

* @brief LCD_write_byte

* @param dat: 写入的数据;command: 写数据、命令选择; * @retval 无

*/

void LCD_write_byte(uchar dat,uchar command) {

uchar i; CLR_CE;

//5110片选有效,允许输入数据 CLR_DC;//写命令 //些数据

//传送8bit 数据

if(command==0) else SET_DC; for(i=0;i<8;i++) { }

if(dat&0X80) SET_SDIN; else CLR_SDIN; CLR_SCLK; dat=dat<<1; SET_SCLK;

//取消使能5110

SET_CE; } /**

* @brief 设置LCD坐标函数 * @param x : 0-83 Y : 0-5 * @retval 无 */

32

void LCD_set_XY(uchar X, uchar Y) {

LCD_write_byte(0x40 | Y, 0); // 写列坐标 LCD_write_byte(0x80 | X, 0); // 写行坐标 } /**

* @brief 清屏函数 * @param 无 * @retval 无

*/

void LCD_clear() {

uchar k,t;

LCD_set_XY(0,0); for(t=0;t<6;t++) for(k=0;k<84;k++)

LCD_write_byte(0x00,1); } /**

* @brief 5110初始化 * @param 无 * @retval 无 */

void LCD_init(void) {

//DDRA |= RESET | DC | SCLK | SDIN | CE; //这是AVR的GPIO配置,要注释掉 delay(1000); //上电等待 CLR_RESET; //拉低复位 delay(100);

SET_RESET; //拉高停止复位 CLR_CE; // 使能片选信号 delay(100);

SET_CE; // 关闭屏幕 delay(100);

LCD_write_byte(0x21, 0); //使用扩展命令

LCD_write_byte(0xc8, 0); //设定偏置电压为3.3V0xB7 LCD_write_byte(0x07, 0); //温度校正 LCD_write_byte(0x13, 0); //1:48

33

LCD_write_byte(0x20, 0); //使用基本命令集 LCD_clear(); //清屏

LCD_write_byte(0x0c, 0); //设定显示模式,正常显示 }

void Dispaly_char(uchar X,uchar Y,uchar c) {

uchar line;

LCD_set_XY(X, Y); c -= 32; //数组的行号

for (line=0; line<6; line++)

LCD_write_byte(font6x8[c][line], 1); } /**

* @brief 在LCD上显示汉字

* @param X、Y :显示汉字的起始X、Y坐标 * ch_with :汉字点阵宽度 * num :显示汉字的个数

* line :汉字点阵数组中的起始行数(从哪一个字开始,一行一个字) * row :汉字显示的行间距 * @retval 无

*/

void LCD_write_chinese_string1(uchar X, uchar Y, uchar ch_with,uchar num,uchar line,uchar row)

{

uchar i,n;

LCD_set_XY(X,Y); //起始位置 for (i=0;i

for (n=0; n

if (n==ch_with) //写汉字的下部分 {

if (i==0)

LCD_set_XY(X,Y+1); else

LCD_set_XY((X+(ch_with+row)*i),Y+1); }

LCD_write_byte(write_chinese1[line+i][n],1);

34

} i++;

LCD_set_XY((X+(ch_with+row)*i),Y); } }

void LCD_write_chinese_string2(uchar X, uchar Y, uchar ch_with,uchar num,uchar line,uchar row)

{

uchar i,n;

LCD_set_XY(X,Y); //起始位置

for (i=0;i

for (n=0; n

if (n==ch_with) //写汉字的下部分

{

if (i==0)

LCD_set_XY(X,Y+1); else

LCD_set_XY((X+(ch_with+row)*i),Y+1); }

LCD_write_byte(write_chinese2[line+i][n],1); } i++;

LCD_set_XY((X+(ch_with+row)*i),Y); } }

void LCD_write_chinese_string3(uchar X, uchar Y, uchar ch_with,uchar num,uchar line,uchar row)

{

uchar i,n;

LCD_set_XY(X,Y); //起始位置 for (i=0;i

for (n=0; n

if (n==ch_with) //写汉字的下部分 {

35

if (i==0)

LCD_set_XY(X,Y+1); else

LCD_set_XY((X+(ch_with+row)*i),Y+1); }

LCD_write_byte(write_chinese3[line+i][n],1); } i++;

LCD_set_XY((X+(ch_with+row)*i),Y); } }

void display_init() {

LCD_write_chinese_string1(7, 0, 12, 4, 0, 8); LCD_write_chinese_string2(3, 2, 12, 2, 0, 1); LCD_write_chinese_string3(18, 4, 12, 3, 0, 5); Dispaly_char(28,3,':'); Dispaly_char(70,3,'L'); Dispaly_char(76,3,'X'); }

/*-------------------------------------------------------------------------- BH1750FVI函数

--------------------------------------------------------------------------*/ #ifndef __BH1750_H #define __BH1750_H #include \

#include \#include \ #include \#include \

#define uchar unsigned char #define uint unsigned int

#define SlaveAddress 0x46 sbit sbit

SCL=P2^7; //IIC时钟引脚定义 SDA=P2^6; //IIC数据引脚定义

extern float light; void Delay5us();

void BH1750_Start(); void BH1750_Stop();

void BH1750_SendACK(bit ack);

36

void BH1750_SendByte(uchar dat);

void Single_Write_BH1750(uchar REG_Address); void Multiple_read_BH1750(void); void Init_BH1750(); void conversion(); #endif

#include \

uchar BUF[8]; //接收数据缓存区 int dis_data; //变量

float wan,qian,bai,shi,ge,light; void Delay5us() {

uchar a,b;

for(b=3;b>0;b--) for(a=28;a>0;a--); }

/************************************** 起始信号

**************************************/ void BH1750_Start() {

SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线

}

/************************************** 停止信号

**************************************/ void BH1750_Stop() {

SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时

37

}

/************************************** 发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/ void BH1750_SendACK(bit ack) {

SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时

}

/************************************** 接收应答信号

**************************************/ bit BH1750_RecvACK() {

SCL = 1; //拉高时钟线 Delay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 Delay5us(); //延时

return CY; }

/************************************** 向IIC总线发送一个字节数据

**************************************/ void BH1750_SendByte(uchar dat) {

uchar i;

for (i=0; i<8; i++) //8位计数器 {

dat <<= 1; //移出数据的最高位 SDA = CY; //送数据口 SCL = 1; //拉高时钟线

38

Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 }

BH1750_RecvACK(); }

uchar BH1750_RecvByte() {

uchar i;

uchar dat = 0;

SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 {

dat <<= 1;

SCL = 1; //拉高时钟线 Delay5us(); //延时

dat |= SDA; //读数据 SCL = 0; //拉低时钟线 Delay5us(); //延时

}

return dat; }

void Single_Write_BH1750(uchar REG_Address) {

BH1750_Start(); //起始信号

BH1750_SendByte(SlaveAddress); //发送设备地址+写信号 BH1750_SendByte(REG_Address); //内部寄存器地址, BH1750_Stop(); //发送停止信号

}

/********************************************************* 连续读出BH1750内部数据

*********************************************************/ void Multiple_read_BH1750(void) {

uchar i; BH1750_Start(); //IIC起始信号

BH1750_SendByte(SlaveAddress+1); //IIC发送设备地址+读信号

39

for (i=0; i<3; i++) //IIC连续读取2个地址数据,存储进BUF {

BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 3)

BH1750_SendACK(1); //最后一个数据需要回IIC的NOACK else

BH1750_SendACK(0); //回应IIC的ACK }

BH1750_Stop(); //IIC的停止信号 }

//初始化BH1750,根据需要请参考pdf进行修改**** void Init_BH1750() {

Single_Write_BH1750(0x01); }

void conversion() {

uint temp_data;

Single_Write_BH1750(0x01); // power on

Single_Write_BH1750(0x10); // H- resolution mode Multiple_read_BH1750(); //连续读出数据,存储在BUF中 dis_data=BUF[0];

dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据 temp_data=(float)dis_data/1.2; light = temp_data;

wan=temp_data/10000;

temp_data=temp_data000; //取余运算 qian=temp_data/1000;

temp_data=temp_data00; //取余运算 bai=temp_data/100;

temp_data=temp_data0; //取余运算 shi=temp_data/10;

temp_data=temp_data; //取余运算 ge=temp_data; }

void Timer1_int() interrupt 3 {

uchar flag; flag++;

40

if(flag == 10) {

flag = 0;

conversion();

Dispaly_char(36,3,0x30+wan); Dispaly_char(42,3,0x30+qian); Dispaly_char(48,3,0x30+bai); Dispaly_char(54,3,0x30+shi); Dispaly_char(60,3,0x30+ge); } }

/*-------------------------------------------------------------------------- 电机运动函数

--------------------------------------------------------------------------*/ #ifndef __MOTOR_H #define __MOTOR_H #include \#define uchar unsigned char sbit gm1 = P2^2; sbit gm2 = P0^6; sbit gm3 = P0^1; sbit gm4 = P3^3; sbit gm5 = P2^3;

#define go (P1 = 0xaa) #define left (P1 = 0x69) #define right (P1 = 0x96) #define stop (P1 = 0xff) void car();

void Init_timer(); #endif

#include %uchar count,gm; void Init_timer() {

TMOD = 0x12; EA = 1;

TH0 = 256-10; TL0 = 256-10; TR0 = 1; ET0 = 1;

41

TH1 = (65536-50000)/256; TL1 = (65536-50000)%6; TR1 = 1; ET1 = 1; }

void Wheel_g(uchar speed) {

if(count <= speed) go; else stop; }

void Wheel_l(uchar speed) {

if(count <= speed) left; else stop; }

void Wheel_r(uchar speed) {

if(count <= speed) right; else stop; }

void car() {

if((gm1==0) && (gm2==0)) gm = 1; else

if((gm1==0) || (gm5==0)) gm = 2; else

if((gm2==0) || (gm3==0)) gm = 3; else

if(gm4 == 0) gm = 4; else gm = 5;

42

switch(gm) { case 1: Wheel_g(50); break; case 2: Wheel_r(50); break; case 3: Wheel_l(50); break; case 4: right; break; case 5: stop; break; } }

void Timer0_int()interrupt 1 {

count ++;

if(count >= 100){count = 0;} }

/*-------------------------------------------------------------------------- 主函数

--------------------------------------------------------------------------*/ #include \#include \#include \void main() {

LCD_init();

Init_BH1750(); //初始化BH1750 Init_timer(); display_init(); while(1) {

if(light>1500) stop; else car(); } }

43

致谢

在这三个多月中,从做实物到写论文,收获了好多知识。在写论文的过程中遇到了好多困难,通过去图书馆找资料和指导老师的帮助,把难题一个一个地解决掉,觉得把我大学所学的知识又巩固了一遍。尤其要强烈感谢我的论文指导老师。没有指导老师耐心的指导和帮助,无私的为我进行论文的修改和改进,我就不能把这篇论文完成。

在此,我向指导和帮助过我的老师和同学们表示最衷心的感谢!同时,我也要感谢本论文所引用的各位学者的专著,如果没有这些专著的启发和帮助,我将无法去完成本篇论文。

44

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

Top