3.5.2 LCD 显示电路设计
系统 LCD 电路引脚为 14 个,51 单片机芯片 8 单个接口分别与 LCD 的 8 个 具有传输命令和数据功能的数据接口连接。 P 2.0,P 2.1 和 P 2.2 端口分 别连接到 LCD 的接口,对 LCD 控制读取功能。 为了保证液晶屏数据显示更稳定,系统正在进行中 LCD 数据输入端口和单片机
芯片的 P3 上拉电阻添加到端口之间限流。 清显示、光标返回、置输入模式、显示开/关控制、置功能 可以给出数据存储器地址、读标志或地址等指令 1602 芯片初始化 根据 1602 型 LCD 用程序模拟读写数据的时序操作。
图 10 LCD 显示电路
3.6 蜂鸣器报警电路设计
本系统使用的蜂鸣器是 PB2130UP002A 无源压电蜂鸣器。因为单片机 I/O 口输出电流有限,蜂鸣器报警电路由放大电路驱动。 报警电路如图所示 11 所示,三极管在单片机输出低电平时即可导通,蜂鸣器开始报 警。
图 11 报警电路
3.7 键盘模块设计
按钮模块采用三个独立按钮,一个按钮端接地,另一端与 I/O 端口连接 于 STC89C51 的 I/O 按下按钮时,端口内部的上拉电阻相当于 I/O 端口接地。按钮复位时,I/O 端口输出高电平。在不同的时刻。 I/O 口的状 可以计算出按下哪个按钮。
p
图 12 按键电路
3.8 电源设计
三节电源 5 供电池串联结构 4.5V 电或 USB 3.7V 接通电源后发电 光二极管被点亮,系统开始工作。开关电路的设计具有自锁功能,如图所示 13 所示, P2 输入电源接口,SW1 是电源开关。
图 13 电源电路 3.9 超声波发射和接收电路设计 超声波收发电路的主要功能是增加脉冲电压的振幅,提高超声波的有效发射
距离。使用本系统 CD4052 芯片的分时选通功能实现了四路传感器的集体控制。
3.9.1 CD4052 芯片的特点
CD4052 芯片是一种差异 4 双四选一数控模拟开关的通道。如图所示 14 所示 为芯片的引脚分布图。实现控制分时选择 4 通过对 A、 B 控制端口的输入信号。INH 为了使能量端口和低电平有效,电平为 1 时能使所 所有的通道都结束了。
图 14 CD4052 引脚分布图
芯片的数字信号输入状态与各通道的关系如表所示 2 所示 16 个引 脚的功能如表 3 所示。 表 4 CD4052 芯片真值表
INH A B 所开通道
0 0 0 X0-Y0
0 1 0 X1-Y1
0 0 1 X2-Y2
0 1 1 X3-Y3
1 * * *
表 5 CD4052 芯片各引脚功能
引脚号 符号 功能
1,2,3,4 X0,X1,X2,X3 独立输入/输出端 5,6,7,8 0,Y1,Y2,Y3 独立输入/输出端 12 X 公共输入端 12 Y 公共输出端 14,15 A,B 选择输入端 11 INH 使能端 16 VCC 正供电电压 10 VEE 负供电电压 9 VSS 接地
3.9.2 超声收发系统电路
单片机芯片 P 1.4 端口和 P 1.5 端口与 CD 4052 芯片的 B 端口和 A 端口分别 用于选择输出信号的连接。单片机 P 1.6 端口连接 CD 4052 芯片的 X 端口,在系 统中工作时,P 1.6 输出频率是 40Khz 脉冲信号,通过 CD4052 芯片输入到驱动 电路。当超声波遇到障碍物时,会随着传感器的接收而发射机械波 用微弱的电信号代替。 超声收发信号电路的工作过程如下:首先,可以在单片机中选择信号,这 一个电信号可以通过 A 和 B 端口输入芯片,P 1.6 端口输出频率为 40kHz 的 脉冲信号,通过 X 端口输入芯片,芯片处理后的信号电压会上升 100 Vpp,超声信号由驱动传感器发射。超声波测量距离受脉冲信号的影响 因此,需要使用专用的超声波脉冲变压器。撞击障碍物反射的机械波将被撞击 接收后,芯片转换为具有一定频率的脉冲电信号。由于信号幅值较小,D1、D2、 D4 二极管都处于截止状态。因此,这个微弱的电信号在 D1 和 D2 和 D4 和变 压器 T 在线圈的共同作用下,不会出现短路。因此,通过回波信号将通过 R6 和 C3,由芯片的 Y 端口将信号输入到下一阶段。
3.10 超声波回波信号的放大电路设计
超声波回波信号很弱,导致它转换成的电信号也很弱。 当超声波传感器接收回波信号时,需要放大转换后的电信号。该系统使用 CX20106A 芯片作为放大电路的控制核心。
3.10.1 CX20106A 芯片的基本特性
CX20106A 芯片使用 5V 供电,芯片包装采用单列八角直插超小方形 式。图 15 芯片引脚分布图
图 15 CX20106A 引脚分布图
各引脚的具体功能如下:
? l 脚:超声信号输入端: ? 2 脚:该脚与 GND 需要连接一个 RC 串联电路形成负反馈网络 推荐参数为 R=4.7Ω,C=3.3μF。 ? 3 脚:该脚与 GND 检波电容器需要连接到之间,作用是传输电信号 推荐参数为检波 3.3μF。 ? 4 脚:接地端(GND)。 ? 5 脚:脚和电源端(VCC)设置电阻的作用是连接到电阻之间 带通滤波器的中心频率 f0, ? 6 脚:该脚与 GND 积分电容器之间需要连接,标准值为 330pF ? 7 脚:脚是遥控命令输出端,引脚必须连接到电源端, 阻值为 22kΩ ? 8 脚:引脚为电源正极,4.5V~5V。 该芯片具有内置放大器,具有自动控制放大倍数的功能用外部电阻 调整带式滤波器中心频率。
3.10.2 CX20106A 介绍芯片的原理
芯片内的电路主要由前放大器和自动偏置电平组成 当芯片 当没有信号输入时,7 脚(OUT 端)输出高电平信号;当有信号输入时, 会由 7 脚输出负脉冲电信号。 CX20106A 芯片的内部工作流程如下:当芯片接收回波电信号时, 首先,它将通过前置和限幅放大器,然后信号的波形将被调整到更合适的位置 处理的幅值;然后会继续通过带通滤波器,该滤波器会将信号中所有的干扰信号 经过最终处理后,通过正常检波器和定型电路输出有用信号 后续工作。
4 系统软件设计
4.1 主程序设计及流程图
在超声波探测中,主程序首先初始化单片机,然后由 TRIG 触发 测距,并在测距模块输入端输入 10us 左右高电平信号。此时,模块将自动化 发送 8 个 40KHz 方波,检测是否有信号返回,并将定时器返回 T0 启动。因此,高 电平的持续时间是探测器从发出超声波到接收超声波的时间。当有信号接收时 根据定时器,系统将执行中断程序,然后调用计算距离的子程序 T0 记录 计算需要测量的距离的时间和声速。然后调用显示子程序计算距离 它将以十进制数字的形式显示 LCD 声音处理子程序同时在液晶显示屏上调用, 蜂鸣器报警。最后,主程序是正确的 P3.3 接收和判断端口的返回值,完成一个 次测距。若判断返回值的结果是标志位清零,则表示再次收到回波信号, 那么主程序将重新从接受回波信号的标志位开始,接着在单片机的 TRIG 端口发 送 10us 将左右高电平信号输入超声波测距模块,重新执行各子程序。如果 在接收回波标志清零之前,将始终执行主程序,直至接收回波标志清零, 说明没有障碍物。因此,系统可以实时测量障碍物。 超声波测距实际上是通过数据测量接收到的往返超声波的时差 计算距离值。主程序流程图如图所示,其中 N 它是计数器的值,然后是声速 定为 340 米每秒即可
。
图 16 主程序流程图
4.2 子程序子程序的设计
模块化设计可以大大提高编程效率,提高程序的可读性。 程序设计包括中断处理、显示、距离、计算等模块。 4.2.1 子程序中断处理 中断程序主要控制超声波探测器在收到回波信号后输送到 P3.3 引脚的 单片机系统中断高电平。定时器中断 T0 将立即关闭并记录返回 高电平持续时间,并清除回波标志位。
图 17 中断程序流程图
4.2.1 显示子程序
对 LCD 液晶显示器的控制由以下程序组成:LCD 初始设置液晶 SETUP、 LCD 液晶初始显示子程序 Logon、LCD 液晶写命令 WRRITE_ UCOM、LCD 液晶显 示子程序 DATA、液晶显示字符 WRTE_ASC16。 以下是每部分程序的设计和说明:
(1)LCD 初始设置液晶 SETUP。该程序的主要功能是 LCD 液晶显示器 主要设置:模式、光标、地址指令和视频指令的设置 等。 (2)LCD 液晶初始显示子程序 Logon。程序的主要功能是 LCD 显示的初始 化,让 LCD 默认正常状态下有初始显示数据。第一行显示REVERSING RADAR第二行显示DISTANCE:CM” (3)LCD 液晶写命令 WRRITE_ UCOM。该程序的功能是控制 LCD 的特殊 用于传输命令的功能引脚。 (4)LCD 液晶显示子程序 DATA。这个程序的功能是将 51 单片机计出来 的最小距离以十进制的数字显示到 LCD 屏上,显示的是 4 位数字而且从第二行的 第九位开始显示。 (5)液晶显示字符 WRTE_ASC16。这个程序可以控制 LCD 显示 16 个字符。 如图 19 所示,主程序进入 LCD 显示模块后,该程序将首先启动对 LCD 的初 始化,设置范围包括显示、光标模块、地址指针和清屏命令等。此进程完成后, LCD 的一行将会等待数据记录。第一行数写入后,指针会指向 LCD 的第二行数据 同时,系统判断 LCD 数据显示是否已经完成。如果没有完成,将继续返回数据显 示程序段,如果已经完成,则显示程序执行结束。
图 18LCD 显示子程序流程图
。
4.2.3 距离计算子程序
距离计算公式为:S=(V*T0)/2=17T0/1000cm(其中 T0 为计数器 T0 的计数值) 计算超声波距离的子程序设计是基于超声波探测器在一定时间发出的超声 波信号。当信号被障碍物反射回来时,超声波探测器接收到回波信号。通过计算
同一个信号从发射到接收的时间间隔,就可以用上述公式计算得出障碍物距离。
当超声波探测器发出超声波信号时,内部计时器 t0 被激活。根据定时器的 计数功能,记录超声波信号从发送到接收的时间。当探测器收到超声波信号时, 接收芯片在 INT1 端将会输出中断请求信号,单片机处理外部中断信号,即处理 中断服务子程序,读出 T0 值。
图 19 距离子程序流程图
5 系统误差分析
5.1 影响超声波探测的因素 在使用超声波传感器时,发射器和接收器都使用相同的一个设备。在通常状
态下超声波频率是 40KHz,但是超声波传感器不能传到所有区域,探测范围非常 有限,并且存在障碍物被其他物体覆盖,而在此情况下是否能够继续检测到障碍 物就与下列因素有关: (1) 根据反射理论,由于入射角与反射角相等,反射回来的超声波信号是
否能够被超声波探测器接收取决于障碍物的表面与信号的传播速度。
因此超声波信号不一定能反射回发射装置中的。
(2) 障碍物的物理属性不同,对超声波的传播速度也有一定的影响。 (3) 在超声波信号的反射过程中,障碍物的物理属性不同,被反射回的超 声波信号也不同,有些物体能吸收一部分超声波信号,而有的会全部 反射。对于相对柔软的障碍物,更不易被检测到。 (4) 空气也是影响超声波信号传播的一个因素。在其他条件不变时,空气 间隔越大,超声波在发射与接收的过程中衰减就越大,障碍物不易被 发现。 由此可见,影响超声波探测器的主要因素有:角度、障碍物材质、与障碍物 的距离。 因此,在实际生活中对超声波探测器造成影响的一些不利因素有:
(1) 在道路凹凸不平或者草坪上前进的情况。 (2) 障碍物比较尖锐的情况。 (3) 在极易吸波的柔软物质情况下。 (4) 在汽车的轰鸣声正对着传感器的情况下。 (5) 在超声波发射装置上有附着物的情况下。 (6) 在遇到金属网格或者细线的情况下。
5.2 误差解决方案 5.2.1 温度补偿法分析 超声波在空气中传播过程中,其速度会受到温度、压强等因素的影响,而且
受温度的影响较大,因此我们需对这一影响进行研究,通常情况下可以利用温度 补偿来弥补这一影响。 温度补偿系统是将温度传感器与系统连接,温度传感器要有较高的抗干扰能 力,当完成温度测量时,单片机对其进行计算。本文选取了 DS18B20 温度传感 器,传感器结构为两条数据总线,这两条总线能够实现温度转换和数据传输功能, 在温度传感器运行过程中,可以将数据总线直接与单片机进行连接,将测量到的 数据输入单片机中,在该过程中不需进行 A/D 转换,并且另一条数据线用于传
输温度转换指令和读写指令。 5.2.2 小波去噪法分析 超声信号是由有效信号与高斯白噪声信号耦合形成的。一般来说,噪声信号
的频率较高,引起的小波分解系数的模较小。这样,对各层小波信号作一个阈值 处理,并将处理后的各层信号分量重新合成即可达到去除信号噪声的目的。 噪声信号一般分布在回波信号小波分解后频率较高的分量当中,随着分解运 算的不断进行,频率较高的细节分量当中的噪声信号将逐渐降低,而真实的超声 接收信号能量则会逐渐变大,这样就可以通过计算其中的高频分量与低频分量之 间的相似性来确定是否还有必要继续进行小波分解。当它们之间的相关性系数比 较小时,说明高频细节分量中还存在着大量噪声,需进一步对信号进行小波分解, 当相关性系数比较大时,说明高频细节分量当中的噪声信号已比较小,这时即可 结束分解运算,达到自动选择小波分解层数的目的,优化运算资源。
结论
本设计主要是利用 STC89C51 单片机,设计一个倒车防撞循迹报警系统,这 个系统具有的功能很多,在设计的过程中对这些功能的控制具有一定的难度,并 且它具有很多的优点,主要可以在性能上、安全上、精度上、技术上等等都具有 很强大优势,应用性比较高。对于这次设计,我还有一些地方由于一些原因的影 响,并没有很好的完成,主要实现了测距循迹报警这三个功能。此次设计最终要 实现的目标是超声波测距仪不仅能够产生超声波并且可以完成波的发送和接收, 以及红外传感器能够探测路径实现循迹,从而实现在 LCD 上显示的测量距离。 在设计的过程中,我进行了大量的资料查找,并且结合学习到的关于单片机
和超声波的知识,在导师的指导下对这个系统进行了设计,对课题要求也基本上 完成了。但是,在本次设计中,我还有很多的不足的地方,由于知识的欠缺,在 实验上不能达到很好的设计,这就使得器件在运用上显得比较粗燥,而且技术上 的叙述也达不到特别精准、具体。 本次毕业设计的完成,对我起到了一个很大的帮助,从中我学到了很多东西, 对软件的编程,对硬件的焊接制作,以及单片机的一些功能都有了一定的认识。 这使我认识到了只学习书本上的知识是远远不够的,因为书本大多都是理论概述 的东西,很难再书本上体会到实践的内涵,所以我们要结合书本上的理论知识很 好的运用到实践中,但是在理论与实践的结合过程中我们会有遇到很多的问题, 需要考虑的东西也很多,因此我们必须要经过一些测试与验证才能得出结果。通 过本次的毕业设计,我更加深信实践才是验证真理的唯一方法,而且在硬件的焊 接制作中,动手能力也得到了提高。最后总结出最重要的一点就是,要充分认识 到只有把理论与实践相结合,才能做好每一件事情。
参考文献
马爱霞,徐音.超声波传感器原理及应用[J].科技风,2016(01):109 郭强.周云仙等.液晶显示手册「M」.电子工业出版社,2003 松井邦彦.传感器实用电路设计与制作[M].北京:科学出版社,2005 孟立凡,郑宾,候文.超声测距换能器及收发电路的研究[J].华北工学学报 刘芹.具有温度补偿功能的超声波测距系统设计[J].山东工业技 术,2018(23):115. 诸葛晶昌,吴军,詹湘琳,于之靖.基于自适应小波去噪法的精密超声波测距 方法[J].吉林大学学报(工学版),2017,47(04):1301-1307.
附录一:主程序
#include <REGX52.H> #include <stdio.h> #include “LCD.H” #include “18B20.H” #include “delay.h”
sbit k1=P3^5; sbit k2=P3^6; sbit csb=P2^5; sbit csbint=P3^2; sbit bg=P2^6; sbit fmq=P3^3;
unsigned char aa[]={’ ‘,’ ‘,‘D’,‘i’,‘s’,‘t’,‘a’,‘n’,‘c’,‘e’,’:’}; //Distance
unsigned char bb[11]={’ ‘,’ ‘,’ ‘,’ ‘,’.’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,}; unsigned char cc[]={‘A’,’.’,‘A’,‘A’,‘m’}; unsigned char zf,a1,a2,a3,xs,e,n,m,z; //zf 温度正负标志位;a1,a2,a3,按键设定 程序中定值的米、分米、厘米临时存储变量 //xs,e 用于按键程序中设定 位闪动显示的变量;flag,未用,n,是背光控制标志位变量;m,z; unsigned int dz,k,s,j,bgz,k; int temp; float temperature,csbc,wdz; bit wh;
main() { TH0=0; TL0=0; TMOD=0X11; //T1,T0 为 16 位定时器 EA=0; bg=0; n=0; m=0; z=0; init(); Init_DS18B20(); dz=80; bb[6]=0xdf; bb[7]=0x43;
e=4; cc[0]=dz/100+‘0’; cc[2]=dz/10%10+‘0’; cc[3]=dz%10+‘0’; LCD_Write_String(0,0,aa); LCD_Write_String(11,1,cc); while(1) { temp=ReadTemperature(); fmq=1; DelayMs(100); if(temp<0) {
} else {
}
temp=-(temp-1); zf=1; bb[0]=’-’;
zf=0; bb[0]=’ ';
csb=0; //启动一次模块 nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop();
csb=1; ET0=1; //启动计数器 T0,用以计时 TR0=1; EA=1; j=80; //延时 while(j–) { } csbint=1; j=0; while(csbint) //判断接收回路是否收到超声波的回波 { j++; if(j>=2500) //如果达到一定时间没有收到回波,则将 csbint 置零,退出接收回波处理程序 csbint=0; } TR0=0; s=TH0256+TL0; //读取时间数据 TH0=0; TL0=0; wdz=0.00000607temp; //温度补偿计算 if(zf==0) {
csbc=0.03315+wdz; } else csbc=0.03315-wdz; csbc=csbc/2; s=s*csbc-8; if(s<5) //测量值小于下限 { cc[0]=’-’; cc[2]=’-’; cc[3]=’-’; } else if(s>500) //测量值大于上限 {
} else {
cc[0]=‘C’; cc[2]=‘C’; cc[3]=‘C’;
cc[0]=s/100+‘0’; cc[2]=s/10%10+‘0’; cc[3]=s%10+‘0’; } if(s<dz) { bgz=s*5; for (k=0;k<bgz;k++) { DelayUs2x(150); fmq=!fmq; //BEEP 取反 } } bb[1]=temp/1000+0x30; bb[2]=temp/100%10+0x30;//显示十位 bb[3]=temp%100/10+0x30;//显示个位 bb[5]=temp%10+0x30; //小数 if(zf==0) { if(temp<1000) { bb[1]=’ '; if(temp<100) {
} } } else {
bb[2]=’ ';
if(temp<1000) { bb[1]=’-’; bb[0]=’ ‘; if(temp<100) { bb[0]=’ ‘; bb[1]=’ ‘; bb[2]=’-’; } } } LCD_Write_String(0,1,bb); LCD_Write_String(11,0,cc);
while(!k2) //液晶背面开关 { n=1; } if(n==1) { bg=~bg; //bg=0;时开背光灯 n=0; } if(!k1) //按键处理程序 { TR1=0; TR0=0; cc[0]=‘A’; cc[1]=’.’; cc[2]=‘A’; cc[3]=‘A’; cc[4]=‘m’; LCD_Write_String(11,1,cc); k=500; while(k) { k–; DelayMs(2); } cc[0]=dz/100+‘0’; cc[2]=dz/10%10+‘0’; cc[3]=dz%10+‘0’; LCD_Write_String(11,1,cc); a1=dz/100; a2=dz/10%10; a3=dz%10; n=1; while(n) { if(!k2) { while(!k2); e=1; xs=3; a1+=1; if(a1>5) a1=0; cc[0]=a1+‘0’;
}
if (e==1) { xs++; cc[0]=a1+‘0’; if(xs>6) {
} } else {
xs=0; e=0;
cc[0]=’ '; xs++; if(xs>3) { xs=0; e=1; } } LCD_Write_String(11,1,cc); if(!k1) { while(!k1); cc[0]=a1+‘0’; m=1; while(m) { if(!k2) { while(!k2); e=1; xs=3; a2+=1; if(a2>9) a2=0; cc[2]=a2+‘0’; LCD_Write_String(11,1,cc); }
if (e==1) {
xs++; cc[2]=a2+‘0’; if(xs>6) {
} } else {
xs=0; e=0;
cc[2]=’ '; xs++; if(xs>3) { xs=0; e=1; } } LCD_Write_String(11,1,cc);
if(!k1) { while(!k1); cc[2]=a2+‘0’; z=1; while(z) { if(!k2) { while(!k2); e=1; xs=3; a3+=1; if(a3>9) a3=0; cc[3]=a3+‘0’; LCD_Write_String(11,1,cc); }
if (e==1) { xs++; cc[3]=a3+‘0’; if(xs>6)
{
} } else {
xs=0; e=0;
cc[3]=’ '; xs++; if(xs>3) { xs=0; e=1; } } LCD_Write_String(11,1,cc);
if(!k1) { while(!k1); dz=a1100+a210+a3; n=0; m=0; z=0; } } } } } } } } }
附录二:LCD 显示子程序
#include"LCD.H"
void write_com(unsigned char com) //写命令
{
RS_CLR; RW_CLR; P0=com; DelayMs(5); EN_SET; DelayMs(5); EN_CLR; }
void write_data(unsigned char date) //写一个字符
{
RS_SET; RW_CLR; P0=date; DelayMs(5); EN_SET; DelayMs(5); EN_CLR; }
void init() //初始化
{
write_com(0x38);
write_com(0x0c); write_com(0x06); write_com(0x01); }
/*------------------------------------------------ 写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,
unsigned char *s)
{
if (y == 0)
{
}
else
{
}
write_com(0x80 + x);
write_com(0xC0 + x);
while (*s)
{
write_data( *s); s ++; }
}
附录三:EEPROM 通讯程序
#include “eeprom.h”
#include “delay.h”
void Start(void) //I2 开始
{
SDA=1; SCL=1; NOP4(); SDA=0; NOP4(); SCL=0; }
void Stop(void) //I2C 停止
{
SDA=0; SCL=0; NOP4(); SCL=1; NOP4(); SDA=1; }
void RACK(void) //读取应答
{
SDA=1; NOP4();
SCL=1; NOP4(); SCL=0; }
void NO_ACK(void) //发送非应答信号
{
SDA=1; SCL=1; NOP4(); SCL=0; SDA=0; }
void Write_A_Byte(uchar b) //写一个字节数据
{
uchar i; for(i=0;i<8;i++) {
b<<=1; SDA=CY; //CY 进位程序状态字寄存器
nop(); SCL=1; NOP4(); SCL=0; }
RACK();
} void Write_IIC(uchar addr,uchar dat) //向指写地地址写数据
{
Start(); Write_A_Byte(0xa0); Write_A_Byte(addr); Write_A_Byte(dat); Stop(); DelayMs(10);
} uchar Read_A_Byte(void) //读取一个字节
{
uchar i,b; for(i=0;i<8;i++) {
SCL=1; b<<=1; b|=SDA; SCL=0; }
return b;
} uchar Read_Current(void) //从当前地址取数据
{
uchar d; Start(); Write_A_Byte(0xa1); d=Read_A_Byte(); NO_ACK(); Stop(); return d; }
uchar Random_Read(uchar addr) //从任意地址读取数据
{
Start(); Write_A_Byte(0xa0); Write_A_Byte(addr); Stop(); return Read_Current();
}
致谢
首先,我要感谢张洛花老师在毕业设计中对我的悉心指导与严格要求,在我 写作毕业论文期间,从确定课题到最终的定稿,张老师为我提供了许多指导,在 此谨向张老师表示由衷的感激与敬意。 接着,我要感谢我的室友在这两年之间,在生活中给予我的支持与关怀,感 谢你们在我毕业设计期间给我的帮助与启发。
感谢河南城建学院为我提供了大学学习机会,我永远不会忘记在这两年中哭 过、笑过的回忆。