并行数字输入输出端口的使用_4_第1页
并行数字输入输出端口的使用_4_第2页
并行数字输入输出端口的使用_4_第3页
并行数字输入输出端口的使用_4_第4页
并行数字输入输出端口的使用_4_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 并行数字输入/输出端口的使用 数码管显示电路的设计目标通过本章的学习,应掌握以下知识 MSP430系列微控制器的并行数字输入/输出端口 数码管的结构和工作原理 数码管的显示数据与显示代码之间的关系 利用查表实现代码转换的方法译码程序 函数的格式以及函数的调用 数据类型 循环语句 利用循环语句实现时间延迟引言显示电路是应用系统的一个组成部分,使用者用这个部分可以获取系统工作结果和工作状态的信息。在学习过程中,通常首先掌握这部分内容的相关知识,这样就能够用显示电路来获得将要学习电路的工作结果和工作状态。数码管是一种最常用的显示器件,虽然它只能显示数值,而不能像液晶显示器那样还可以显示字符和

2、图形,但是它使用简单,价格便宜,很适用初学者使用,而且数码管电路的工作原理与基于发光二极管的流水灯电路非常类似。数码管显示电路的工作方式分静态显示和动态显示两种。前者,数码管的每一个管脚需要占用微控制器芯片的一个信号输出管脚;后者虽然可以减少对微控制器管脚资源的占用,但是这时需要微控制器不停地输出控制信号,即几乎占用了CPU的全部时间。这里只描述数码管静态显示电路。本章首先描述MSP430系列微控制器并行数字输入/输出端口的相关寄存器,通过这些寄存器可以完成工作方式的选择以及数据传输的实现;接着讨论如何将显示数据转换为数码管的显示代码;微控制器的工作速度很快,完成一次并行数据传输仅需几个us,

3、因此在连续向数码管进行数据发送之间需要添加具有时间延迟功能的程序块。4.1 MSP430系列微控制器的并行数字输入/输出端口MSP430系列微控制器最多可以提供8个并行数字输入/输出端口,它们被分别命名为P1P8。每个并行数字输入/输出端口最多可以提供8个数字输入/输出管脚,它们被分别命名为Px.0Px.7,这里x可以理解为变量,它表示MSP430系列微控制器可以提供的8个并行数字输入/输出端口中的任意一个。MSP430系列芯片具有多种封装型式,因此并不是所有芯片都能够提供所有这些并行数字输入/输出管脚资源。例如MSP430G2231微控制器芯片的14-PDIP(14管脚,塑料、双列、直插封装

4、)封装只能提供具有8个管脚的P1数字输入/输出端口,P1.0P1.7;具有2个管脚的P2数字输入/输出端口,P2.6和P2.7。MSP430F2619微控制器芯片的64-PIN LQFP(一种具有64个管脚的表贴形式封装)封装可以提供6个并行数字输入/输出端口,P1P6。每一个并行数字输入/输出端口都具有8个管脚。微控制器对数字输入/输出端口工作情况的配置,工作状态的控制也是通过访问相关寄存器来实现。并行数字输入/输出端口的相关寄存器包括任意端口都具有的寄存器和只有P1端口和P2端口具有的寄存器,因为只有P1和P2端口具有中断能力。所有并行数字输入/输出端口都具有的寄存器包括输入寄存器(PxI

5、N)、输出寄存器(PxOUT)、方向寄存器(PxDIR)和功能寄存器(PxSEL)。P1端口和P2端口涉及中断的寄存器包括中断使能寄存器(PxIE)、中断触发边沿选择寄存器(PxIES)和中断标志寄存器(PxIFG)。本章不讨论P1端口和P2端口涉及中断的寄存器,这些内容在后面结合按键电路予以描述。 功能选择寄存器(PxSEL)位76543210位名称PxSEL.7PxSEL.6PxSEL.5PxSEL.4PxSEL.3PxSEL.2PxSEL.1PxSEL.0操作方式rwrwrwrwrwrwrwrw复位值00000000PxSEL.x:管脚功能选择0普通并行数字输入/输出管脚1外围功能模块管

6、脚MSP430系列微控制器的大部分管脚是复用管脚,即一个管脚可以扮演多种作用。功能选择寄存器(PxSEL)用来配置管脚实现不同的功能。每一个端口都具有功能选择寄存器,该寄存器的每一位控制1个管脚。一些MSP430微控制器芯片的管脚具有更多功用,因此它们还具有功能选择寄存器2(PxSEL2),这时功能选择寄存器(PxSEL)和功能选择寄存器2(PxSEL2)联合实现对管脚功能的选择。 方向控制寄存器(PxDIR)位76543210位名称PxDIR.7PxDIR.6PxDIR.5PxDIR.4PxDIR.3PxDIR.2PxDIR.1PxDIR.0操作方式rwrwrwrwrwrwrwrw复位值00

7、000000无论管脚设置为普通并行数字输入/输出管脚,还是外围模块管脚,即无论功能选择寄存器中的位取何值,都必须合适地设置方向控制寄存器的位PxDIR.x内容,以决定管脚信号的流向。PxDIR.x:管脚信号传输方向选择0输入 1输出 输入寄存器(PxIN)位76543210位名称PxIN.7PxIN.6PxIN.5PxIN.4PxIN.3PxIN.2PxIN.1PxIN.0操作方式rrrrrrrr当管脚设置为普通并行数字输入/输出管脚,输入传输方向时,读输入寄存器中位PxIN.x内容就可以获得对应管脚的状态。PxIN.x:管脚输入状态0低电平 1高电平 输出寄存器(PxOUT)位7654321

8、0位名称PxOUT.7PxOUT.6PxOUT.5PxOUT.4PxOUT.3PxOUT.2PxOUT.1PxOUT.0操作方式wwwwwwww当管脚设置为普通并行数字输入/输出管脚,输出传输方向时,写入输出寄存器位PxOUT.x内容将控制对应管脚的状态。PxOUT.x:管脚输出状态0低电平 1高电平4.2 基于并行数据传输的数码管电路4.2.1 数码管数码管是应用电路中常用的显示器件。数码管内部包含8个发光二极管,它的原理图、外形图和电路符号图如图4.1所示。数码管原理图如图4.1的(a)和(b)所示。数码管分共阴极和共阳极两种类型。共阴极数码管内部8个二极管的N极被连接在一起,再和管脚CO

9、M相接。在使用时管脚COM应该接低电平,这样当数码管其余的某个管脚接高电平,则该管脚对应的发光二极管将被点亮,也就是数码管对应的发光段被点亮。共阳极数码管内部8个二极管的P极被连接在一起,再和管脚COM相接。在使用时管脚COM应该接高电平,这样当数码管其余的某个管脚接低电平,则该管脚对应的发光二极管将被点亮,也就是数码管对应的发光段被点亮。数码管外形图如图4.1的(c)所示。数码管有2个COM管脚,这两个管脚在数码管内部被连接在一起,在使用时,应用电路中只需要连接一个COM管脚即可。数码管的电路符号图如图4.1的(d)所示。图4.1 数码管的原理图、外形图和电路符号图数码管显示电路可以由图2.

10、1所示的流水灯电路改装来实现。从流水灯电路中去掉发光二极管,换上一个共阴极数码管,就成为基于MSP430微控制器芯片的P1并行输入/输出端口的数码管显示电路。具体电路如图4.2所示。这里数码管的各个管脚与MSP430芯片P1端口各个管脚的连接关系如表4.1所示。表4.1 数码管管脚与P1端口管脚的连接关系P1口P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0数码管abcdefgdp图4.2 基于P1端口的数码管电路在图4.2中,数码管也可以采用共阴极数码管,也可以采用共阳极数码管。如果使用共阴极数码管,它的管脚COM应该通过一个限流电阻和接地线相接;如果使用共阳极数码管,它的管

11、脚COM应该通过一个限流电阻和电源线相接。不使用数码管的小数点时,控制共阴极数码管发光段“dp”的管脚P1.7可以一直输出低电平。这种情况下,数码管的显示字符与输入代码,即P1端口的输出数据,之间的关系如表4.2所示。在表4.2中,共阳极数码管的显示字符与输入代码的关系也被同时列出。注意,两种显示代码都不驱动小数点的发光段“dp”。表4.2 数码管的显示代码显示字符共阴极数码管共阳极数码管显示字符共阴极数码管共阳极数码管00xfc0x0390xf60x0910x600x9fa0xee0x1120xda0x25b0x3e0xc130xf20x0dC0x9c0x6340x660x99d0x7a0x

12、8550xb60x49E0x9e0x6160xbe0x41F0x8e0x7170xe00x1f“灭”0x000xff80xfe0x01“全亮”0xff0x00硬件是软件的基础。数码管接收的显示代码就是微控制器数字输出端口的输出数据,两者不同的连接关系将会具有不同的显示代码。可以尝试采用更为方便的连接关系来组装电路,因为编写显示代码比在电路板上连线方便。图4.2所示的数码管电路是由图2.1所示的流水灯电路改装来实现,数码管显示的控制程序同样可以由图2.8所示的MSP430系列微控制器开发软件的工作窗口中程序示例为模板写出。逐个、顺序向P1端口输出寄存器(P1OUT)传送表4.2所示的数码管显示代

13、码就可以实现数字的顺序、循环显示。仿照图2.8中的程序示例,读者试着编写一个实现字符从0F连续、循环显示的程序。4.2.2 显示数据的译码以图2.8中的程序示例为模板写出的数码管显示程序可以实现字符从0F连续、循环的显示,但是只能按照预先设定的模式进行显示。如果希望使用数码管显示电路来显示一个测量结果,由于数据不可能事先知道,因此不可能在程序中向端口输出寄存器赋值对应的显示代码。也不可以将测量数据直接送到端口输出寄存器,因为数据必须转换为对应的显示代码才能驱动数码管,实现希望的数据显示。程序示例4.1能够自动地将希望显示的数据转换为相应的显示代码,这样就可以驱动数码管,实现数据显示的目的。程序

14、示例4.1/ 程序名称:seg1_1p/ 程序功能:1 个 8 段共阴极数码管显示/ MSP430 与数码管之间通过 P1 并行数据接口连接#include <MSP430.h> / 包含名称定义和对应地址或数据的头函数const unsigned char decoder_seg718=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00,0xff;/ 共阴极数码管显示代码 / 连接关系按表 4.1 所示int main(void) / 主函数 unsigned c

15、har data_seg7; / 声明显示数据变量 WDTCTL=WDTPW+WDTHOLD; / 关闭看门狗 P1SEL=0x00; / 设置 P1 端口为并行数字输入 / 输出口 P1DIR=0xff; / 设置 P1 端口为输出口 while(1) / 重复执行 for(data_seg7=0x00; data_seg7<0x10; data_seg7+)/ 利用循环语句产生显示数据 P1OUT=decoder_seg7data_seg7;/ 数据译码, 显示代码送 P1 端口 对比图2.8所示的MSP430系列微控制器开发软件工作窗口中的程序示例,程序示例4.1在包含语句和主函数

16、之间放置了1个常数表。关键词“const”声明这个常数表将存储到程序存储器。关键词“unsigned char”声明这个常数表中数据的类型,这里为无符号字符型数据类型,也可以理解为无符号8位数据类型。unsigned char数据类型的值域为0x000xff,或者0255。“decoder_seg7”为给这个常数表起的名称。名称后面中括号中的内容为这个常数表的容量。主函数中的第1句unsigned char data_seg7; / 声明显示数据变量关键词“unsigned char”用来声明变量“data_seg7”的数据类型。使用的数据,包括常量和变量,必须首先声明,然后再使用。在程序中,

17、通常将声明语句写在前面,将可执行语句写在声明语句的后面。接着的语句用来关闭“看门狗”,这句的功用在第2章中已经介绍,这里不再重复。再接着的2条语句涉及并行数字输入/输出端口相关寄存器的配置。完成驱动数码管的并行数字输入/输出端口P1所需要的配置的语句如下P1SEL=0x00; / 设置 P1 端口为并行数字输入 / 输出口 P1DIR=0xff; / 设置 P1 端口为输出口向寄存器P1SEL赋值完成端口P1在并行数字输入/输出管脚,或者外围功能模块管脚之间的选择;向寄存器P1DIR赋值完成信号传输方向为流出MSP430微控制器芯片,或者流入MSP430微控制器芯片之间的选择。现在的选择为端口

18、P1用作并行数字输入/输出管脚,信号传输方向从MSP430微控制器芯片流出。上述配置工作完成以后,当向并行数字输入/输出端口P1的输出寄存器P1OUT写入数据将使得对应的管脚电平发生相应的反应,进而驱动数码管,显示所需要的字符。在实现重复执行的语句while(1)中存在一个循环语句。for(data_seg7=0x00; data_seg7<0x10; data_seg7+)这里使用这个循环语句来产生显示数据,模拟希望显示的测量结果。循环语句起始数据为0,结束数据为F,完成1次循环数据加1。这样数据循环语句实现显示数据变量data_seg7从0x00到0x0f的顺序、循环变化。循环体中的

19、语句P1OUT=decoder_seg7data_seg7;/ 数据译码, 显示代码送 P1 端口以显示数据变量data_seg7作为地址对常数表decoder_seg7查表。常数表decoder_seg7中放置着按照图3.2进行连线的共阴极数码管的显示代码。显示代码按照显示数据从0x00到0x0f的顺序放置,这样显示代码的地址就是它对应的显示数据。常数表decoder_seg7,即显示代码表,中查出来的显示代码送到并行数字输入/输出端口P1的输出寄存器P1OUT。由于已经将端口P1配置为普通数字输入/输出端口、数据输出方向,这样端口P1的管脚电平以2进制数据格式反映输出寄存器P1OUT中的内

20、容。管脚上的电压最终驱动数码管的发光段,显示相应的字符。从一种数据编码形式转换为另一种数据编码形式的过程通常称为“译码”,程序示例4.1利用查表的方法完成显示数据编码到数码管的显示代码的转换,因此将这样的程序也称为译码程序。注意,程序示例4.1只能进行模拟调试和单步仿真,不能进行全速仿真,也不能用来对芯片进行编程,因为程序执行的速度太快。如果MSP430微控制器芯片全速运行程序示例4.1,数码管的所有发光段看起来就像全部都亮起来一样。4.3 延时函数对于数码管显示,MSP430微控制器芯片的工作速度显得非常快,因此程序示例4.1不能全速运行。如果在每次向并行数字输入/输出端口P1的输出寄存器P

21、1OUT进行赋值以后,设法延迟一段时间,例如1s左右,然后再进行第二次赋值,这样就能观察到数码管的数字显示情况。在C语言中,重复使用的语句块都写成函数形式,使得这个语句块能够在程序的不同地方使用。使用函数能够提高程序存储器的使用效率,同时也简化程序的结构,提高程序的阅读性。MSP430系列微控制器开发软件中,函数的声明、定义以及函数的调用格式将在本节结合一个可以独立运行的1位数码管演示程序予以说明。4.3.1 延时函数实现1s左右时间的延迟函数如下。void delay_1s(void) / 1s 延迟函数 unsigned long data_delay; / 声明循环次数变量/ 利用循环语

22、句实现时间延迟 for(data_delay=0; data_delay<126654; data_delay+) 语句void delay_1s(void) / 1s 延迟函数中第1个关键词“void”用来声明这个函数无返回值。“delay_1s”为函数名,函数名可以随便选取,但是不能使用关键词。括号中的关键词“void”用来声明这个函数无参量,即调用这个函数不需要向函数传递数据。延迟函数使用循环语句实现时间延迟,虽然现在循环体内部什么都没有做,但是即使空转也需要花费时间。循环变量data_delay的循环终值控制循环次数。具体的循环次数可以通过模拟调试获得。按照所示的循环语句计数终值

23、,调用函数delay_1s可以获得999999个机器周期的时间延迟。当MSP430系统时钟频率为1MHz时,就可以获得非常接近于1s的时间延迟。变量在使用之前必须声明,语句unsigned long data_delay; / 声明循环次数变量声明了变量data_delay,并指出这个变量的数据类型为无符号长整型,unsigned long。无符号长整型数据具有32位,取值范围为04294967295。4.3.2 函数的使用在程序示例4.1中,通过使用具有1s左右时间延迟的函数delay_1s(),使得这段程序能够被下载到MSP430微控制器芯片之中,并能够独立运行。下面的程序示例4.2包含了

24、函数的声明、函数原型以及函数调用。程序示例4.2/ 程序名称:seg71p_delay/ 程序功能:1 个 8 段共阴极数码管显示/ 显示数据之间插入 1s 延迟/ MSP430 与数码管之间通过 P1 并行数据接口#include <MSP430.h> / 包含名称定义和对应地址或数据的头函数void delay_1s(void); / 声明 1s 延迟函数const unsigned char decoder_seg718=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8

25、e,0x00,0xff;/ 共阴极数码管显示代码int main(void) / 主函数 unsigned char data_seg7; / 声明显示数据变量 WDTCTL=WDTPW+WDTHOLD; / 关闭看门狗 P1SEL=0x00; / 设置 P1 端口为并行数字输入 / 输出口 P1DIR=0xff; / 设置 P1 端口为输出口 while(1) / 重复执行 for(data_seg7=0x00; data_seg7<0x10; data_seg7+)/ 利用循环语句产生显示数据 P1OUT=decoder_seg7data_seg7;/ 数据译码, 显示代码送 P1

26、端口 delay_1s( ); / 调用 1s 延迟函数 void delay_1s(void) / 1s 延迟函数 unsigned long data_delay; / 声明循环次数变量/ 利用循环语句实现时间延迟 for(data_delay=0; data_delay<126654; data_delay+) 程序示例4.2中,接着包含语句的语句void delay_1s(void); / 声明 1s 延迟函数被用来声明延迟函数。在对显示数据进行译码、并将显示代码送到并行数字输入/输出端口P1的输出寄存器P1OUT的语句之后的语句delay_1s( ); / 调用 1s 延迟函数

27、用来调用延迟函数。由于调用的这个函数没有返回值,因此不需要向变量赋值,可以单独成行。函数不需要传递参数,因此括号内为空。程序示例4.2将延迟函数放在主函数之后。函数也可以放在主函数之前。如果函数放在主函数之前,这时就不需要在主函数之前对函数进行声明。对于存在函数的程序调试,使用调试工具“Step Into”(快捷键F11),或者“Step Over” (快捷键F10)是有区别的。“Step Into” 调试工具与“Step Over”调试工具的区别是可以进入其它的函数内部逐条执行,完全描述微控制器内部程序的执行过程。在被调用函数已经调试通过的情况下,使用工具“Step Over”可以加快调试速

28、度。程序示例4.2可以被下载到MSP430微控制器芯片,并独立运行。4.4 数据类型变量在使用之前必须声明其数据类型,便于编译系统为这个变量分配存储空间。MSP430系列微控制器开发软件支持的数据类型和存储各种数据类型数据占用的存储空间如表4.3所示。表4.3 数据类型和存储各种数据类型数据占用的存储空间数据类型值域存储空间unsigned char02551个字节signed char-1281271个字节unsigned int065 5352个字节signed int-32 76832 7672个字节unsigned long04 294 967 2954个字节signed long-2

29、 147 483 6482 147 483 6474个字节float±1.176E-38±3.40E+38(具有6位有效数字)4个字节数据类型的选择必须合适,即不能发生数据溢出,也不要浪费存储器资源。不必要地选择较大值域的数据类型,不仅浪费存储器资源,而且完成同样的运算还会花费过长的时间,这点尤其在选择浮点数数据类型的情况。通过模拟调试程序示例4.3可以直观地观察到在选择不同的数据类型对存储空间的占用和完成同样的加法运算所花费的时间。程序示例4.3/ 程序名称:operate/ 程序功能:检查不同数据类型对运算时间、存储器资源的影响#include<msp430.h&

30、gt; / 包含名称定义和对应地址或数据的头函数int main(void) / 主函数 float data_a, data_b, data_c; / 声明显示数据变量 data_a=10; / 数据变量赋值 data_b=10; while(1) / 重复执行 data_c=data_a+data_b; / 完成加法运算_NOP(); / 避免 while 语句对运算时间的测量影响 在程序示例4.3中,变量data_a、data_b和data_c可以被声明为表4.3列出的任意一种数据类型。在加法运算后面添加一条语句的目的是为了准确地测量加法运算所需要的时间,否则时间测量会受到循环语句的影响

31、。当变量data_a、data_b和data_c被声明为不同的数据类型,程序示例4.3需要的存储空间和完成加法运算所需要的时间如表4.4所示。表4.4 程序示例4.3在取不同数据类型时对资源的占用和完成加法运算所需时间数据类型CODE memoryDATA memory运算时间(CPU时钟周期)unsigned char60502signed char60502unsigned int60502signed int60502unsigned long72504signed long72504float43450120表4.4显示,对于整型数据变量,同类型的有符号数和无符号数对资源的占用和完成加

32、法运算所需要的时间是一样的。字符型(char)数据变量和整型(int)数据变量对资源的占用和完成加法运算所需要的时间是一样的,这是因为MSP430微控制器是一种16位器件。长整型(long)数据变量由于数据宽度为32位,16位MSP430微控制器需要分2次完成加法运算,因此将占用较多的资源,需要较多的运算时间。浮点型(float)数据变量在编译过程中需要调用MSP430系列微控制器开发软件提供的函数,并把函数添加到用户程序之中,所以这时将占用更多的资源,需要更多的运算时间。MSP430系列微控制器中的存储器是按字节为单位来组织,因此不存在字节对准问题,数据结构的成员是顺序放置的。例如整型变量的

33、长度为16位,它的存储需要2个字节,如果这个整型变量的数值为0x1234,它在存储器中按以下方式存储。图4.3 数据的存储方式浮点型数据的长度为32位,它存储需要4个字节,它的组成和在存储器中的存储方式如图4.4所示。图4.4 浮点型数据的组成和在存储器中的存储方式图中,S:符号位。1表示负,0表示正; E:阶码; M:尾数。4.5 循环语句在需要进行规律性的重复操作时,循环语句能够简化程序结构。例如,程序示例4.1和程序示例4.2中采用循环语句产生显示数据比使用顺序程序结构具有很大的优势。循环语句由循环体和循环终止条件两部分组成。MSP430系列微控制器开发软件支持的循环语句有以下3种:wh

34、ile语句、do while语句以及for语句。4.5.1 while语句while语句的格式为while(表达式)/ 循环终止条件可执行语句;/ 循环体括号中的表达式的计算结果用来判定循环体中的语句是否被执行。当表达式的计算结果为非0,即逻辑真,就执行循环体中的语句;循环体中的语句被执行完以后,再次计算这个括号中的表达式,并再次判断是否执行循环体中的语句。当表达式的计算结果为0,即逻辑假,循环体中的语句将不被执行,并且不再判断是否执行循环体中的语句,转为执行该循环语句后面跟着的语句。while语句的特点首先进行是否执行循环体的条件判断,即首先计算表达式,因此循环体中的内容可能一次都不执行。如

35、果循环体内具有多条语句,循环体必须使用花括号 ,表示循环体是一个语句块。如果循环体内只有一条语句,循环体可以不使用花括号 。推荐使用花括号 将循环体包括起来,使程序更加安全可靠。在前面所有的程序示例中,主函数内部都有一个while语句的应用实例while(1) / 重复执行 这里的表达式的值恒为1,因此循环体的内容将被一直执行。4.5.2 do while语句do while语句的格式为do可执行语句;/ 循环体while(表达式)/ 循环终止条件do while语句的特点首先执行循环体,然后进行是否再次执行循环体的条件判断,因此循环体中的内容至少被执行一次。括号中的表达式的计算结果用来判定循

36、环体中的语句是否被再次执行。当表达式的计算结果为非0,即逻辑真,就再次执行循环体中的语句。当表达式的计算结果为0,即逻辑假,循环体中的语句将不被执行,转为执行该循环语句后面跟着的语句。在第3章给出的高频振荡器(XT2)初始化函数clkxt2_begin中有一个do while语句的应用实例do IFG1&=OFIFG; / 清除振荡器错误标志_NOP( ); / 产生一个 MSP430 系统时钟周期的延时 while(IFG1 & OFIFG)!=0); / 如果标志为 1,继续等待这里首先清除标志OFIFG,然后进行检测,如果标志OFIFG没有清除,再次清除标志OFIFG,直到完成

温馨提示

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

评论

0/150

提交评论