《单片微型计算机原理及应用》课件第5章_第1页
《单片微型计算机原理及应用》课件第5章_第2页
《单片微型计算机原理及应用》课件第5章_第3页
《单片微型计算机原理及应用》课件第5章_第4页
《单片微型计算机原理及应用》课件第5章_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

5.1I/O概述5.2输入/输出传送方式5.3存储器的扩展5.4I/O口的扩展第5章输入/输出及存储器扩展5.1I/O概述5.1.1I/O接口电路的作用一个计算机系统的组成,除了CPU、存储器外,还必须有外部设备。计算机通过I/O(输入/输出)设备和外界进行通信。计算机所用的数据以及现场采集的各种信息都要通过输入设备送到计算机;而计算的结果和计算机产生的各种控制信号又需通过输出设备输出到外部设备。

计算机的I/O操作,即CPU和外部设备之间的数据传送却十分复杂。主要表现在以下几个方面:

(1)外部设备的工作速度与计算机相比要低得多。

(2)外部设备的种类繁多,有机械式、机电式及电子式等等。

(3)外部设备的数据信号是多种多样的,既有电压信号,也有电流信号;既有数字量,还有模拟量。

(4)外部设备的数据传送有近距离的,也有远距离的;有的使用并行数据传送,而有的则使用串行传送数据。

具体说来,接口电路主要有以下几项功能:

(1)速度协调。

(2)数据锁存。

(3)三态缓冲。

(4)数据转换。5.1.2接口与端口

“接口”一词是从英文interface翻译过来的,具有界面、相互联系等含义。接口这个术语在计算机领域中应用十分广泛,

本章所讲述的接口则特指计算机与外设之间在数据传送方面的联系,其功能主要是通过电路实现的,因此称之为接口电路,简称接口。5.1.3I/O的编址方式在计算机中,凡需进行读写操作的设备都存在着编址问题。具体说来在计算机中有两种需要编址的器件:一种是存储器,另一种就是接口电路。存储器是对存储单元进行编址,而接口电路则是对其中的端口进行编址。对端口编址是为I/O操作而进行的,因此也称为I/O编址。常用的I/O编址有两种方式:独立编址方式和统一编址方式。

1.独立编址方式

2.统一编址方式

5.2输入/输出传送方式

5.2.1无条件传送方式无条件传送也称为同步程序传送,类似于CPU和存储器之间的数据传送。只有那些一直为数据I/O传送作好准备的外部设备,才能使用无条件传送方式。这种传送方式不需要测试外部设备的状态,可以根据需要随时进行数据传送操作。无条件传送方式适用于以下两类外部设备的输入输出:(1)外设的工作速度非常快,足以和CPU同步工作。

(2)具有常驻的或变化缓慢的数据信号的外设。5.2.2查询传送方式查询传送又称为条件传送,即数据的传送是有条件的。在输入/输出之前,先要检测外设的状态,以了解外设是否已为数据输入输出作好了准备,只有在确认外设已“准备好”的情况下,CPU才能执行数据输入/输出操作。通常把通过程序对外设状态的检测称之为“查询”,所以这种有条件的传送方式又叫做程序查询方式。查询的流程图如图5―1所示。图5―1查询方式流程图5.2.3中断传送方式由于查询传送方式为CPU主动要求传送数据,而它又不能控制外设的工作速度,因此只能用等待的方式来解决配合的问题。中断方式则是在外设为数据传送作好准备之后,就向CPU发出中断请求信号(相当于通知CPU),CPU接收到中断请求信号之后立即作出响应,暂停正在执行的原程序(主程序),而转去为外设的数据输入输出服务,待服务完之后,程序返回,CPU再继续执行被中断的原程序。

由于CPU的工作速度很快,传送1次数据(包括转入中断和退出中断)所需的时间很短。对外设来讲,似乎是对CPU发出数据传送请求的瞬间,CPU就实现了;对主程序来讲,虽然中断了1个瞬间,但由于时间很短,也不会有什么影响。5.3存储器的扩展5.3.1存储器扩展概述

MCS-51系列单片机具有64KB的程序存储器空间,其中8051、8751型单片机含有4KB的片内程序存储器,而8031型单片机则无片内程序存储器。当采用8051、8751型单片机而程序超过4KB,或采用8031型单片机时,就需要进行程序存储器的扩展。

MCS-51系列单片机的数据存储器与程序存储器的地址空间是互相独立的,其片外数据存储器的空间可达64KB,而片内的数据存储器空间只有128B。如果片内的数据存储器不够用时,则需进行数据存储器的扩展。存储器扩展的核心问题是存储器的编址问题。所谓编址就是给存储单元分配地址。由于存储器通常由多片芯片组成,为此存储器的编址分为两个层次:即存储器芯片的选择和存储器芯片内部存储单元的选择。存储器芯片的选择有两种方法:线选法和译码法。

1.线选法所谓线选法,就是直接以系统的地址线作为存储器芯片的片选信号,为此只需把用到的地址线与存储器芯片的片选端直接相连即可。

2.译码法所谓译码法就是使用地址译码器对系统的片外地址进行译码,以其译码输出作为存储器芯片的片选信号。

译码法又分为完全译码和部分译码两种。

(1)完全译码。地址译码器使用了全部地址线,地址与存储单元一一对应,也就是1个存储单元只占用1个唯一的地址。

(2)部分译码。地址译码器仅使用了部分地址线,地址与存储单元不是一一对应,而是1个存储单元占用了几个地址。1根地址线不接,一个单元占用2(21)个地址;2根地址线不接,一个单元占用4(22)个地址;3根地址线不接,则占用8(23)个地址,依此类推。

在设计地址译码器电路时,如果采用地址译码关系图的话,将会带来很大的方便。所谓地址译码关系图,就是一种用简单的符号来表示全部地址译码关系的示意图。例如:

从地址译码关系图上可以看出以下几点:①属完全译码还是部分译码;②片内译码线和片外译码线各有多少根;③所占用的全部地址范围为多少。例如在上面的关系图中,有1个“·”(A15不接),表示为部分译码,每个单元占用2个地址。片内译码线有11根(A10~A0),片外译码线有4根。其所占用的地址范围如下:

当A15为0时,所占用地址为0010000000000000~0010011111111111,即2000H~27FFH。当A15为1时,所占用地址为1010000000000000~1010011111111111,即A000H~A7FFH。共占用了两组地址,这两组地址在使用中同样有效。

应该指出的是,随着半导体存储器的不断发展,大容量、高性能、低价格的存储器不断推出,这就使得存储器的扩展变得更加方便,译码电路也越来越简单了。5.3.2程序存储器的扩展

1.只读存储器简介半导体存储器分为随机存取存储器(RandomAccessMemory)和只读存储器(ReadOnlyMemory)两大类,前者主要用于存放数据,后者主要用于存放程序。只读存储器是由MOS管阵列构成的,以MOS管的接通或断开来存储二进制信息。按照程序要求确定ROM存储阵列中各MOS管状态的过程叫做ROM编程。根据编程方式的不同,ROM可分为以下3种:1)掩膜ROM

掩膜ROM简称为ROM,其编程是由半导体制造厂家完成的,即在生产过程中进行编程。

2)可编程ROM(PROM)PROM芯片出厂时并没有任何程序信息,其程序是由用户写入的,与掩膜ROM相比,有了一定的灵活性,批量也不一定很大。

3)可擦除ROM(EPROM或EEPROM)

可擦除ROM芯片的内容由用户写入,并允许反复擦除重新写入。EEPROM芯片每个字节可改写万次以上,信息的保存期大于10年。这种芯片给计算机应用系统带来很大的方便,不仅可以修改参数,而且断电后能保存数据。它的缺点是价格偏高。

2.EPROM2764简介

1)2764的引脚自从EPROM2716芯片被逐渐淘汰后,目前比较广泛采用的是2764芯片。该芯片为双列直插式28引脚的标准芯片,容量为8K×8位,其管脚如图5―2所示。图5―2EPROM2764引脚图

其中:

A12~A0:13位地址线。

D7~D0:8位数据线。

:片选信号,低电平有效。

:输出允许信号,当时,

输出缓冲器打开,被寻址单元的内容才能被读出。

VPP:编程电源,当芯片编程时,该端加上编程电压(+25V或+12V);正常使用时,该端加+5V电源。(NC为不用的管脚)。2)2764的工作时序

2764在使用时,只能将其所存储的内容读出,其过程与RAM的读出十分类似。即首先送出要读出的单元地址,然后使和均有效(低电平),则在芯片的D0~D7数据线上就可以输出要读出的内容。其过程的时序关系如图5―3所示。图5―3EPROM2764的读出时序3)2764的编程

EPROM的一个重要特点就在于它可以反复擦除,即在其存储的内容擦除后可通过编程(重新)写入新的内容。这就为用户调试和修改程序带来很大的方便。EPROM的编程过程如下:

(1)擦除:如果EPROM芯片是第一次使用的新芯片,则它是干净的。干净的标志通常是每一个存储单元的内容都是FFH。

(2)编程:EPROM的编程有两种方式:标准编程和灵巧编程。

灵巧编程方式要比标准编程方式快5倍左右。同时,这种方式编程有更高的可靠性和安全性。该方法的时序图及程序流程图分别由图5-4和图5-5所示。时序图中的时序仅表示各信号间的相互关系,而波形的持续时间并不成比例。这里应注意的是,对于不同型号、不同厂家生产的EPROM芯片,其编程电压Vpp是不一样的,有+12V,+18V,+21V,+24V等数种。编程时一定要根据芯片所要求的电压来编程。若不注意,极易烧坏芯片。图5―4灵巧编程时序图图5―5EPROM灵巧编程流程图3.程序存储器扩展举例现分3种情况说明程序存储器的扩展方法。

(1)不用片外译码的单片程序存储器的扩展。例1:试用EPROM2764构成8031的最小系统。解:由于8031无片内程序存储器,因此必须外接程序存储器以构成最小系统。其连接方法是在图4―2的基础上,将2764按3总线的要求连接,其连接的关键在于地址译码。由于一般所采用的芯片其字节数均超过256个单元,也就是说片内地址线超过8条,故地址译码的核心问题是高8位地址线的连接。(2)采用线选法的多片程序存储器的扩展。例2:在图5―7所示的连接图中,使用了两片2764,一共构成了8K×2=16K的有效地址。现采用线选法编址,以P2.7(A15)直接作为片选信号,当P2.7=0时,选中左边1片2764,其地址范围为0000H~1FFFH;当P2.7=1时,选中右边1片2764,其地址范围为8000H~9FFFH。这是部分译码,有2根地址线未接,1个单元要占用22=4个地址号。以上只是4组地址中的1组。若需地址连续的话,可取如下1组地址:6000H~7FFFH和8000H~9FFFH。

(3)采用地址译码器的多片程序存储器的扩展。图5―62764与8031的连接图图5―7两片程序存储器扩展连接图

例3:要求用2764芯片扩展8031的片外程序存储器空间,分配的地址范围为0000H~3FFFH。解:本例采用完全译码的方法,即所有地址线全部连接,每个单元只占用唯一的1个地址。①确定片数:字片数为字片数=(末地址-首地址)+1芯片字数=(3FFFH-0000H)+112000H=4000H2000H=2(片)②分配地址范围:第1组(1片)所占用的地址范围为:00000000000000000000H

00011111111111111FFFH第2组(1片)所占用的地址范围为:00100000000000002000H00111111111111113FFFH位片数为位片数=单元位数芯片位数=

总片数=字片数×位片数=2×1=2(片)③画出地址译码关系图:

第1组

上面打×部分为片内译码,对于2764来说有13位,其地址变化范围为从全0变到全1,其余部分为片外译码。④设计外译码电路:

本例只介绍采用译码器芯片的设计方法,现采用3-8译码器74LS138。片外译码只有3根线(P2.7,P2.6,P2.5),分别接至译码器的C、B、A输入端。控制端G1,,不参与译码,接成常有效。如图5―8所示。图5―874LS138译码器连接图⑤画出存储器扩展连接图:

该连接图如图5―9所示。图中3-8译码器74LS138只用了两个译码输出端,如果需要的话,还可利用其余6个译码输出端。图5―9采用地址译码器扩展程序存储器的连接图

例4:图4―14中3—8译码器74LS138的译码输出端和所对应的地址范围各为多少?

解:对于来说,其地址变化范围为1000000000000000~1001111111111111,即8000H~9FFFH。对于来说,其地址变化范围为1010000000000000~1011111111111111,即A000H~BFFFH。5.3.3数据存储器的扩展

1.数据存储器概述数据存储器即随机存取存储器(RandomAccessMemory),简称RAM,用于存放可随时修改的数据信息。它与ROM不同,对RAM可以进行读、写两种操作。RAM为易失性存储器,断电后所存信息立即消失。按其工作方式,RAM又分为静态(SRAM)和动态(DRAM)两种。静态RAM只要电源加上,所存信息就能可靠保存。2.静态RAM6264简介

6264是8K×8位的静态数据存储器芯片,采用CMOS工艺制造,为28引脚双列直插式封装,其引脚图如图5―10所示。

图5―10RAM6264引脚图3.数据存储器扩展举例数据存储器的扩展与程序存储器的扩展相类似,不同之处主要在于控制信号的接法不一样,不用信号,而用和信号,且直接与数据存储器的端和端相连即可。图5―11为外扩1片6264的连接图。采用线选法,将片选信号与P2.7相连,片选信号CE2与P2.6相连。其地址译码关系为:所占用的地址为:第1组4000H~5FFFH(A13=0)第2组6000H~7FFFH(A13=1)图5-11扩展一片RAM6264的连接图5.3.4全地址范围的存储器最大扩展系统现以8031为例,说明全地址范围的存储器最大扩展系统的构成方法,如图5―12所示。8031的片外程序存储器和数据存储器的地址各为64K。若采用EPROM2764和RAM6264芯片,则各需8片才能构成全部有效地址。芯片的选择采用3—8译码器74LS138,片外地址线只有3根(A15、A14、A13),分别接至74LS138的C、B、A端,其8路译码输出分别接至8个2764和8个6264的片选端。图5―12单片机外存储器最大扩展电路5.3.5I2C总线的E2PROM芯片应用

1.CAT24WCXX概述

CAT24WCXX是一个1~256K位的支持I2C总线数据传送协议的串行CMOSE2PROM芯片,可用电擦除。串行E2PROM一般具有两种写入方式:一种是字节写入方式,另一种页写入方式。允许在一个写周期内同时对一个字节到一页的若干字节的编程写入,一页的大小取决于芯片内页寄存器的大小。其中,CAT24WC01具有8字节数据的页面写能力,CAT24WC02/04/08/16具有16字节数据的页面写能力,CAT24WC32/64具有32字节数据的页面写能力,CAT24WC128/256具有64字节数据的页面写能力。

2.CAT24WCXX的引脚

CAT24WCXX系列E2PROM提供标准的8脚DIP封装和8脚表面安装的SOIC封装。

CAT24WC01/02/04/08/16/32管脚排列图及管脚功能描述分别如图5-13(a)、(b)所示。图5-13CAT24WC02串行管脚排列及管脚功能描述图

3.CAT24WCXX的器件地址主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从器件的地址。8位从器件地址的高4位D7~D4固定为1010,具体见表5-1所示,接下来的3位D3~D1(A2、A1、A0)为器件的片选地址位或作为存储器页地址选择位,用来定义哪个器件以及器件的哪个部分被主器件访问,最多可以连接8个CAT24WC01/02,4个CAT24WC04,2个CAT24WC08,8个CAT24WC32/64,4个CAT24WC256器件到同一总线上,这些位必须与硬连线输入脚A2、A1、A0相对应。一个CAT24WC16/128可单独被系统寻址。从器件8位地址的最低位D0作为读写控制位,“1”表示对从器件进行读操作,“0”表示对从器件进行写操作。在主器件发送起始信号和从器件地址字节后,CAT24WCXX监视总线并当其地址与发送的从地址相符时响应一个应答信号(通过SDA线)。CAT24WCXX再根据读写控制位(R/W)的状态进行读或写操作。表5-1CAT24WCXX的器件地址表

1)字节写图5-14所示为CAT24WC01/02/04/08/16字节写时序图。图5-14CAT24WC01/02/04/08/16字节写时序图2)页写图5-15所示为CAT24WC01/02/04/08/16页写时序图。图5-15CAT24WC01/02/04/08/16页写时序图3)应答查询可以利用内部写周期时禁止数据输入这一特性启动应答查询。一旦主器件发送停止位指示主器件操作结束时,CAT24WCXX启动内部写周期,应答查询立即启动,包括发送一个起始信号和进行写操作的从器件地址。如果CAT24WCXX正在进行内部写操作,不会发送应答信号。如果CAT24WCXX已经完成了内部自写周期,将发送一个应答信号,主器件可以继续进行下一次读写操作。4)写保护写保护操作特性可避免由于不当操作而造成对存储区域内部数据的改写,当WP管脚接高时,整个寄存器区全部被保护起来而变为只可读取。CAT24WCXX可以接收从器件地址和字节地址,但是装置在接收到第一个数据字节后不发送应答信号从而避免寄存器区域被编程改写。5.CAT24WCXX的读操作对CAT24WCXX读操作的初始化方式和写操作时一样,仅把R/W位置为1,有三种不同的读操作方式:读当前地址内容、读随机地址内容、读顺序地址内容。

1)当前地址读(立即地址读)如图5-16所示为CAT24WCXX立即地址读时序图。CAT24WCXX的地址计数器内容为最后操作字节的地址加1。也就是说,如果上次读/写的操作地址为N,则立即读的地址从地址N+1开始。图5-16立即地址读时序2)随机地址读如图5-17所示为CAT24WCXX随机地址读时序图。图5-17CAT24WC01/02/04/08/16随机地址读时序

3)顺序地址读如图5-18所示为CAT24WCXX顺序地址读时序图。图5-18CAT24WCXX顺序地址读时序图6.CAT24C02C与单片机的接口编程图5-19所示是AT89C52单片机(U1)与串行E2PROM芯片24C02C(U2)的接口电路图。

AT89C52单片机的P1.0、P1.1作为I2C总线与24C02C以及I2CDebugger的SCL和SDA相连。P1.2与WP相连,24C02C的地址线A2、A1、A0直接接地。图5-19AT89C52与串行E2PROM芯片24C02C的接口电路图C语言编程代码主要清单如下:/*******************管脚配置*******************/sbitI2C_SCL=P1^0; //定义时钟线sbitI2C_SDA=P1^1; //定义数据线sbitI2C_WP=P1^2; //定义写保护线voidI2C_Delay(uchart)//模拟I2C总线延时,根据具体情况调整延时值{ while(--t!=0); //延时2*t个机器周期}}/***************************************************函数:I2C_Init()功能:I2C总线初始化,使总线处于空闲状态说明:在main()函数的开始处,应当执行一次本函数***************************************************/voidI2C_Init(){ I2C_WP=0; //写保护位清0,允许写入

I2C_SCL=1; //时钟线为高电平

I2C_Delay(10); I2C_SDA=1; //数据线高电平,没有开始或结束信号产生

I2C_Delay(10);}/*********************************************************函数:I2C_Start()功能:产生I2C总线的起始条件说明:SCL处于高电平期间,当SDA出现下降沿时启动I2C总线**********************************************************/voidI2C_Start(){ I2C_SDA=1; //数据线为高电平

I2C_Delay(5); I2C_SCL=1; //时钟线为高电平

I2C_Delay(10); I2C_SDA=0; //数据线由高跳变到低,发送开始信号

I2C_Delay(10); I2C_SCL=0; //时钟线变为低电平,准备发送数据

I2C_Delay(5);}/********************************************************函数:I2C_Stop()功能:产生I2C总线的停止条件说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线******************************************************/voidI2C_Stop(){ I2C_SDA=0; //数据线为低电平

I2C_Delay(5); I2C_SCL=1; //时钟线为高电平

I2C_Delay(10); I2C_SDA=1; //数据线由低跳变到高,发送结束信号

I2C_Delay(10);}/*****************************************************函数:I2C_Write_Byte()功能:主器件通过I2C总线向从器件写1个字节的数据参数:dat是要写入的数据******************************************************/voidI2C_Write_Byte(uchardat){ uchart=8; do { if((dat&0x80)==0x80) I2C_SDA=1;//取当前发送位

else I2C_SDA=0; dat<<=1 //dat左移输入下一位

I2C_SCL=1; //发送到数据线上 I2C_Delay(10); I2C_SCL=0; I2C_Delay(5); }while(--t!=0);}/***********************************************************函数:I2C_Read_Byte()功能:从器件读取1个字节的数据返回:读取的1个字节数据********************************************************/ucharI2C_Read_Byte(){ uchardat; uchart=8; I2C_SDA=1; //在读取数据之前,要把SDA拉高,使之处于输入状态 do { I2C_SCL=0; //置时钟线为低电平,准备接收数据

I2C_Delay(10); I2C_SCL=1; //置时钟线为高电平,数据线的数据开始有效

I2C_Delay(5); dat<<=1; if(I2C_SDA==1)dat++; //接收当前数据位并放入dat中

I2C_SCL=0; I2C_Delay(5); }while(--t!=0); return(dat); //返回接收的数据}/*************************************************************函数:I2C_Get_Ack()功能:读取从器件应答位(应答或非应答),用于判断从器件是否成功接收主器件数据返回:0:从机应答1:从机非应答说明:从器件收到每一个字节后都要产生应答位,主器件如果收到非应答则应当终止传输***************************************************************/bitI2C_Get_Ack(void){ ucharack=0;//无应答信号到来

I2C_SDA=1; //数据线为高电平,处于输入状态

I2C_Delay(10); I2C_SCL=1; //时钟线为高电平,接收到的数据有效

ack=I2C_SDA; //接收到应答信号

I2C_SCL=0; returnack; //返回应答信号}/***********************************************************函数:I2C_Write_NByte()功能:主器件通过I2C总线向从器件发送多个字节的数据参数:addr:地址*dat:要发送的数据size:数据大小(以字节计)返回:1:发送成功0:在发送过程中出现异常***********************************************************/bitI2C_Write_NByte(ucharequ_addr,ucharaddr,uchar*dat,ucharsize){ uchari; I2C_Start(); //发送开始信号,启动I2C总线

I2C_Write_Byte(equ_addr);//发送器件的地址码

if(!I2C_Get_Ack())return(0);//无应答返回0,有应答则发送器件单元地址

I2C_Write_Byte(addr); if(!I2C_Get_Ack())return(0);//无应答返回0,否则连续传发送数据字节 for(i=0;i<size;i++) { I2C_Write_Byte(*dat); //发送数据字节

if(!I2C_Get_Ack())return(0); dat++; } I2C_Stop(); //正常结束后送结束信号,并返回1 return(1);}/******************************************************函数:I2C_Read_NByte()功能:从器件读取多个字节的数据参数:addr:地址size:数据大小(以字节计)返回:1:接收成功0:在接收过程中出现异常*******************************************************/bitI2C_Read_NByte(ucharequ_addr,ucharaddr,uchar*dat,ucharsize){ uchari; I2C_Start(); //发送开始信号,启动I2C总线

I2C_Write_Byte(equ_addr); //发送器件的地址码

if(!I2C_Get_Ack())return(0); //无应答返回0,否则发送器件单元地址

I2C_Write_Byte(addr); if(!I2C_Get_Ack())return(0); //无应答返回0,有应答则重发开始信号,并启动总线

I2C_Start(); I2C_Write_Byte(equ_addr+1); //发送器件地址码

if(!I2C_Get_Ack())return(0); for(i=0;i<size-1;i++) //连续读入字节数据

{ *dat=I2C_Read_Byte(); //读当前字节并送到目的位置

dat++; } *dat=I2C_Read_Byte(); I2C_Stop(); //正常结束,发送结束信号并返回1 return(1);}5.4I/O口的扩展

虽然单片机本身的I/O口能实现简单的I/O操作,但其功能毕竟十分有限。因为在单片机本身的I/O口电路中,只有数据锁存和缓冲功能,而没有状态寄存和命令寄存功能,因此难以满足复杂的I

温馨提示

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

评论

0/150

提交评论