《单片机应用实例开发》课件第8章_第1页
《单片机应用实例开发》课件第8章_第2页
《单片机应用实例开发》课件第8章_第3页
《单片机应用实例开发》课件第8章_第4页
《单片机应用实例开发》课件第8章_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

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

文档简介

8.1I2C总线

8.2单片机与24C16接口的设计

8.3习题实例八外部存储器的应用设计学习目标

◆理解I2C总线的工作过程。

◆理解I2C总线中数据的有效性、起始和停止条件、字节传送与应答、数据帧格式、I2C总线寻址。

◆理解I2C总线典型信号的软件模拟。

◆理解24C16的读/写操作。

工作任务

◆设计、制作与调试单片机与24C16接口电路。

◆设计、调试单片机与24C16接口软件。

◆撰写设计文档与测试报告。8.1I2C总线

学习目标◆理解I2C总线的工作过程。◆理解I2C总线中数据的有效性、起始和停止条件、字节传送与应答、数据帧格式、I2C总线寻址。◆理解I2C总线典型信号的软件模拟。

I2C总线(InterICBus)是Philips半导体(现NXP半导体)推出的一种串行总线,是一种简单的双向两线总线,可用来实现IC间的有效控制。8.1.1I2C总线概述

I2C总线只要求两条信号线:一条为串行时钟线(SCL),另一条为串行数据线(SDA)。连接在总线上的器件通过两线来传递信息。微控制器、LCD驱动器、存储器或键盘接口都有一个唯一的地址,且都可以作为一个发送器或接收器,在数据传输时还可以看做是主机或从机。

I2C总线是一个多主机总线。主机是启动数据的传送、发出时钟信号、传送结束时发出终止信号的器件。被主机寻址的器件称为从机。通常主机由各种单片机或其他微处理器充当,从机可以是各种单片机或微处理器,也可以是其他器件,如存储器、LCD驱动器、时钟日历器件等。在多主机系统中,可能出现同时几个主机企图启动总线传送数据的情况。为了避免混乱,保证数据的可靠传输,任何时刻总线只能由某一台主机控制。I2C总线通过总线仲裁来决定由哪一个器件控制。当有两个或多个主机尝试发送信息到总线时,在其他主机都送“0”的情况下,首先送“1”的主机将丢失仲裁。该过程中的时钟信号是由各个主机产生的异步时钟信号线与的结果。

I2C总线上,通常由主机产生时钟信号。在总线上传输数据时,每个主机产生自己的时钟信号。仅在慢速的从机器件控制时钟并延长时钟信号或在发生仲裁时被另一个主机改变的情况下,主机产生的时钟才会被改变。

SDA和SCL都为双向线路,都通过一个电流源或上拉电阻连接到正电源。当总线空闲时,两条线路都是高电平。连接到总线的器件输出级必须是漏极开路或集电极开路,才能执行线与的功能。I2C总线上数据的传输速率在标准模式下可达100kb/s,在快速模式下可达400kb/s,在高速模式下可达3.4Mb/s。连接到总线的接口数量只由总线的最大电容为

400pF的限制决定。

【练习】

项目:I2C通信系统设计。

项目编号:EX8_1。

任务要求:设计一个由单片机、LCD控制器、日历芯片、外部存储器(所有器件均有I2C接口)组成的系统,画出结构框图。

分析:I2C总线器件间通过SDA、SCL进行通信。显然,结构框图如图8-1所示。图8-1I2C通信系统的结构框图

8.1.2I2C总线的数据传输

1.数据的有效性

SDA线上的数据必须在时钟的高电平期间保持稳定。数据线的高或低电平状态的变换只有在SCL线上的时钟信号为低电平时才能改变,如图8-2所示。

注意:在I2C总线上,每一位数据位的传送都与时钟脉冲相对应,逻辑“0”和逻辑“1”的信号电平取决于相应的正端电源(即上拉电阻所接电源)电压。图8-2位传输的有效性规定

2.起始和停止条件

SCL线为高电平期间,SDA线由高电平向低电平变化表示起始条件;SCL线为高电平时,SDA线由低电平向高电平变化表示停止条件,如图8-3所示。图8-3起始和停止条件起始和停止条件均由主机产生。总线在起始条件产生后,就处于被占用状态;在停止条件产生的某段时间后,总线处于空闲状态。

如果连接到总线上的器件具有I2C总线的硬件接口,那么检测起始和停止条件就比较简便。对于不具备I2C总线硬件接口的单片机来说,为了检测到起始和停止条件,必须保证在每个时钟周期内对数据线采样两次。

3.字节的传送与应答

I2C总线进行数据传送时,无传送字节数的限制,但每个字节必须保证是8位,并且每个字节后必须跟一个应答位。数据传送时,先传送最高位。如果从机要完成某些其他功能后才能接收或发送下一个完整的字节,则可以使SCL线保持低电平迫使主机进入等待状态。直到从机准备好接收下一个数据字节时,数据传输继续并释放SCL线。传输过程的应答时序如图8-4所示。图8-4应答时序应答时钟脉冲由主机产生,在应答时钟脉冲期间,主机释放SDA线(为高)。在应答时钟脉冲期间,从机必须将SDA线拉低,使其在该时钟脉冲为高电平期间保持稳定的低电平。

由于某种原因从机不对主机寻址信号应答时,必须将数据线置于高电平,而由主机产生一个停止条件以结束总线的数据传送。

如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据,则从机可以通过对无法接收的第一个数据字节的非应答通知主机,主机则应发出终止信号以结束数据的继续传送。

当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。该信号是由对从机的非应答来实现的。然后,从机释放SDA线,以允许主机产生停止条件。

4.数据帧格式

I2C总线上传输的数据既包括地址信号,又包括数据信号。完整的数据传输如图8-5所示,在起始条件后必须传送一个从机的地址(7位),第8位是数据的传送方向(读/写)位。“0”表示主机发送数据(写),“1”表示主机接收数据(读)。每次数据传送总是由主机产生的停止条件结束。如果主机希望继续占用总线进行新的数据传送,则可以不产生停止条件,马上再次发出起始条件对另一从机进行寻址。因此,在总线的一次数据传送过程中,可以有以下几种读/写组合方式。图8-5完整的数据传输

(1)主机向从机发送数据,数据传送方向在整个传送过程中不变,如图8-6所示。图8-6读/写组合方式1注:图中阴影部分表示数据由主机向从机传送,无阴影部分表示数据由从机向主机传送。A表示应答,表示非应答。S表示起始条件,P表示停止条件。

(2)主机在第一个字节后,立即从从机中读数据,如图8-7所示。图8-7读/写组合方式2

(3)在每次传送过程中,当需要改变传送方向时,起始条件和从机地址都被重复产生一次,且两次读/写方向位正好反相,如图8-8所示。

由图8-6~图8-8可以看出,无论哪种组合方式,起始条件、停止条件和地址均由主机发出;数据字节的传送方向则由寻址字节中的方向位规定;每个字节的传送都必须有应答位(A或)相随。图8-8读/写组合方式3

5.I2C总线的寻址

通常,I2C总线在起始条件后的第一个字节决定了主机选择哪一个从机。第一字节就是寻址字节。

1)寻址字节的位定义

寻址字节的格式如图8-9所示。图8-9寻址字节的格式图8-9中,D7~D0位组成从机地址。D0位是数据传送方向位,当D0为0时,表示主机写信息到被选中的从机;当D0为1时,表示主机向从机读信息。

主机发送一个地址后,总线上的每个从机都将7位地址码与自己的地址进行比较。若一样,则认为它被主机寻址,根据读/写位判断自己是发送器或接收器。

从机地址由一个固定部分和一个可编程部分组成。在同一个系统中可能接入多个相同的从机,从机地址中可编程部分决定了可接入同一I2C总线的最大数目。例如,一个从机的7位寻址位有4位为固定位,3位为可编程位,也就是说可寻址8个相同的从机。

2)寻址字节中的特殊地址

I2C总线委员会协调I2C地址的分配。I2C总线委员会规定了I2C总线的一些特殊地址。其中,两组8个地址(0000×××和1111×××)保留作特殊用途,如表8-1所示。通用呼叫地址用于寻址连接到I2C总线上的所有设备。如果设备不需要从通用呼叫地址获取数据,则它可以不响应通用呼叫地址;否则,设备接收到这个地址后应作应答,并把自己置为从机接收器方式以接收随后的各字节数据。除遇到不能处理的数据字节时可以不作应答,否则收到每个字节后都应作应答。第一字节为通用呼叫地址,其含义在第二字节说明,如图8-10所示,具体说明将在后面介绍。图8-10通用呼叫地址格式第二字节为“00000110(06H)”时,所有能响应通用呼叫地址的从机设备复位,并由硬件装入从机地址的可编程部分。但要求能响应命令的从机设备复位时不拉低SDA和SCL线,以免堵塞总线。

第二字节为“00000100(04H)”时,所有能响应通用呼叫地址并通过硬件来定义其可编程地址的从机设备,将锁定地址中的可编程位,但不进行复位。

如果第二字节的最低位(LSB) B为1,则该两个字节命令称为硬件通用呼叫命令。该命令由硬件主机设备发出。硬件主机设备就是不能发送所要寻访从机设备地址的发送器,如键盘扫描器等。

3)起始字节

单片机可以用两种方法接入I2C总线。自身带有I2C总线硬件接口的单片机,可通过编程来响应由I2C总线请求而产生的中断。当单片机不具备I2C总线接口时,必须通过软件不断地检测总线,以便及时地响应总线的请求。单片机检测总线或定时查询总线的次数越多,可用于执行自身功能的时间就越少。因此,对于依靠软件定时查询总线的单片机来说,其工作速度的减慢与快速的硬件设备就出现了矛盾。这时I2C总线上的数据传送可以由一个较长的起始过程加以引导,如图8-11所示。图8-11起始字节过程起始字节由起始条件、起始字节、应答位、重复起始条件(Sr)组成。

请求访问总线的主机发出起始信号后,发送起始字节(00000001),另一个单片机可以以一个比较低的速率采样SDA线,直到检测到起始字节中的7个“0”中的一个为止。在检测到SDA线上的高电平后,单片机就可以用较高的采样速率,以便寻找作为同步信号使用的第二个起始信号Sr。

在起始信号后的应答时钟脉冲仅仅是为了和总线所使用的格式一致,并不要求设备在这个脉冲期间作应答。

【练习】

项目:单字节数据发送。

项目编号:EX8_2。

任务要求:SDA接P0.0,SCL接P0.1,编程实现一个字节的数据传输(数据已放于累加器A中)。

分析步骤:

(1)熟悉数据传输的有效性规定。

(2)熟悉I2C数据的传输过程。

(3)学会将一字节数据转化为一位一位输出。参考代码如下:

MOV R0, #08H

WLP: RLC A ;取数据位

MOV P0.0, C

NOP

SETB P0.1 ;模拟时钟信号

NOP

NOP

NOP

NOP

NOP

CLR P0.1

DJNZ R0, WLP

8.1.3I2C总线的软件模拟

MCS-51单片机不带I2C总线接口。当它与带I2C总线接口的器件进行连接时,不能直接相连。可以通过硬件来实现MCS-51单片机与I2C总线接口芯片间的通信,比如I2C总线/并行转换器,还可以采用软件模拟来实现。所谓软件模拟,就是用单片机的I/O口来模拟I2C总线的工作时序,从而达到能够访问带I2C总线接口器件的目的。下面介绍利用STC89C51的P1.0、P1.1来模拟I2C总线的工作时序。

1.I2C总线的典型信号模拟

为了保证数据传送的可靠性,标准的I2C总线的数据传送有严格的时序要求,如I2C总线的时钟信号的最小的低电平周期为7.7μs,最小的高电平周期为4μs等。

I2C总线的起始条件、停止条件、发送“0”及发送“1”的模拟时序如图8-12所示。

表8-2所示为I2C总线的时序特性。由表8-2可见,除了SDA、SCL线的信号下降时间为最大值外,其他参数只有最小值。这表明I2C总线的数据传送中,可以利用时间同步机制展宽低电平周期,迫使主机处于等待状态,使传送速率降低。图8-12典型信号的模拟时序(a)起始条件;(b)停止条件;(c)发送“0”;(d)发送“1”对于一个新的起始条件,要求起始前总线的空闲时间TBUF大于7.7μs,而对于一个重复的起始条件,要求建立时间TSU;STA也必须大于7.7μs。所以,图8-12中的起始条件信号适用于数据模拟传送中任何情况下的起始操作。起始条件到第一个时钟脉冲的时间间隔应大于7.0μs。

对于终止条件,要保证大于7.7μs的信号建立时间TSU;STO,则在终止条件结束时要释放总线,使SDA、SCL维持在高电平上,在大于7.7μs后才可以进行第一次起始操作。在单主系统中,为了防止非正常传送,终止条件后SCL可以设置为低电平。对于一个新的起始条件,要求起始前总线的空闲时间TBUF大于7.7μs,而对于一个重复的起始条件,要求建立时间TSU;STA也必须大于7.7μs。所以,图8-12中的起始条件信号适用于数据模拟传送中任何情况下的起始操作。起始条件到第一个时钟脉冲的时间间隔应大于7.0μs。

对于终止条件,要保证大于7.7μs的信号建立时间TSU;STO,则在终止条件结束时要释放总线,使SDA、SCL维持在高电平上,在大于7.7μs后才可以进行第一次起始操作。在单主系统中,为了防止非正常传送,终止条件后SCL可以设置为低电平。对于发送应答位、非应答位而言,与发送数据“0”和“1”的信号定时要求完全相同。只要满足在时钟高电平大于7.0μs期间,SDA线上有确定的电平状态即可。

2.典型信号的模拟子程序

设主机采用STC89C51,晶振频率为6MHz,则几个典型信号的模拟程序如下:

(1)起始子程序:

(2)终止信号:

STOP:

CLRP1.1

SETBP1.0

NOP

NOP

SETBP1.1

NOP

NOP

CLRP1.0

RET

(3)发送应答位:

ACK:

CLRP1.1

SETBP1.0

NOP

NOP

NOP

CLRP1.0

SETBP1.1

RET

(4)发送非应答信号:

NACK:

SETBP1.1

SETBP1.0

NOP

NOP

CLRP1.0

CLRP1.1

RET

【练习】

项目:起始条件信号模拟。

项目编号:EX8_3。

任务要求:用MCS-51单片机的P0.0、P0.1分别连接I2C器件的SDA和SCL,编程模拟起始条件信号。

分析步骤:

(1)熟悉I2C起始条件的时序。

(2)编程实现。参考代码如下:

SETBP0.0

SETBP0.1

NOP

NOP

CLRP0.0

NOP

NOP

CLRP0.18.2单片机与24C16接口的设计学习目标◆理解EEPROM的作用。◆理解24C16的读/写操作。

工作任务◆设计、制作与调试单片机与24C16接口电路。◆设计、调试单片机与24C16接口软件。◆撰写设计文档与测试报告。

在某些单片机应用系统中,常常希望能够保存一些历史数据以便以后查看,比如温度测量系统中保存某时刻温度,这种情况下通常需要为系统配置电可擦除可编程只读存储器(ElectricallyErasableProgrammableReadOnlyMemory,EEPROM)。EEPROM既具有ROM的非易失性的优点,又能像RAM一样随机地进行读/写,可多次重复改写,保留信息的时间长(FAIRCHILD公司的FM24C16可进行100万次改写,信息保留超过40年)。EEPROM芯片有两类接口:并行接口和串行接口。由于EEPROM的体积小,因此在使用中占用的系统资源少,可以减小用户电路板的面积和引线数目。在传输速率要求不太高的系统中常采用串行接口的EEPROM芯片。本节将介绍采用I2C总线的串行EEPROM的读/写操作。要求:将内部RAM中30H开始的10个存储单元初始化为0~9,并将这10个数据写入FM24C16中30H开始的10个存储单元,再将FM24C16中的10个数据读出,存入单片机的内部RAM中40H开始的10个存储单元。

1.硬件设计

采用STC89C51的P1.1口模拟I2C总线的SDA线,P1.0口模拟SCL线,连接电路如图8-13所示。图8-13连接电路图图8-13中,FM24C16为FAIRCHILD公司生产的16kb标准I2C总线接口串行EEPROM。其引脚分布如图8-14所示,各引脚功能见表8-3。

注意:FM24C16的SDA和SCL是漏极开路的,需加上拉电阻,典型值为4.7k。图8-14FM24C16的引脚图图8-13中,I2C为I2C协议分析器,它允许用户监视I2C总线并能与之进行交互。该分析器允许用户查看I2C总线上传送的数据,还允许用户作为主机或从机向总线发送数据。它的SCL脚连至I2C总线的时钟线,SDA脚连至数据线。

2.软件设计

1) FM24C16的读/写操作

I2C总线EEPROM在I2C总线上作为从机工作,主机通过从机地址访问某设备。I2C总图8-15从机地址格式线EEPROM的从机地址格式如图8-15所示。图中,设备特征码表征器件类型,对于EEPROM,其设备特征码为“1010”;设备/页选择位A2、A1、A0用于芯片选择或芯片内的页选择,对于FM24C16,这三位用于页选择;最低位(LSB)表征当前操作为读(为1)或写(为0)。主机将从机地址发送出去并得到响应(ACKNOWLEDGE)后,发送存储单元地址就可以访问具体存储单元。图8-15从机地址格式

(1)写操作。FM24C16支持两类写操作:字节写入(ByteWrite)和页写入(PageWrite)。字节写入帧格式如图8-16所示。图8-16字节写入帧格式页写入帧格式如图8-17所示。图8-17页写入格式

(2)读操作。读操作有三种:读当前地址存储单元的数据、读指定地址存储单元的数据、读连续存储单元的数据。

读当前地址存储单元的数据帧格式如图8-18所示。图8-18读当前地址存储单元的数据帧格式一旦含有被设置成R/

=1的EEPROM芯片地址输入,并由EEPROM发出应答信号,当前地址(上一次读或写操作时最后一个被访问存储单元的下一单元的地址值)所指向存储单元的数据就被串行输出。单片机在读完一帧数据后,发送非应答信号,接着发送一个“停止”信号。

读指定地址存储单元的数据帧格式如图8-19所示。单片机先发送EEPROM芯片地址(R/

=0)和EEPROM存储单元地址,得到EEPROM的应答后,再发送一个“启动”信号,在发送带有R/

=1的EEPROM芯片地址后,EEPROM产生相应的应答信号,并串行输出数据。在读完一帧数据后,发送非应答信号,接着发送一个“停止”信号。图8-19读指定地址存储单元的数据帧格式读连续存储单元的数据帧格式如图8-20所示。图8-20读连续存储单元的数据帧格式读连续地址存储单元的数据可以从当前地址开始,也可以从一个指定的地址开始。在单片机接收到一帧8位数据后,用应答信号做出响应。只要EEPROM接收到一个应答信号,它就继续对数据存储单元的地址自动增量调整一次,并顺序串行输出字节数据。当超过存储单元的最大地址溢出时,数据字节单元的地址将“滚动循环”,继续从第一页串行输出数据帧。当需要结束操作时,单片机在接收到一帧数据后,只要发送一非应答信号,接着发送一个“停止”信号即可。

2)流程图

本例中包含多个子程序,在此给出写单字节、读单字节、写多字节、读多字节的流程图,如图8-21和图8-22所示。图8-21单字节读/写流程图(a)写单字节;(b)读单字节图8-22多字节读/写流程图(a)写多字节;(b)读多字节

;发送数据缓存区初始化,将10个连续字节分别赋值为00H~09H

MOV A, #0

MOV R0, #30H

S1: MOV @R0, A

INC R0

INC A

CJNE R0, #3AH, S1

NOP

NOP

NOP ;起始条件的锁定时间大于7.7μs

CLR SDA ;发送起始信号

NOP

NOP

NOP

NOP ;起始条件的锁定时间大于7.7μs

CLR SCL ;钳住I2C总线,准备发送或接收数据

NOP

RET

;***************************************************

;子程序名:STOP

;描述:停止I2C总线子程序,即发送I2C总线的停止条件

;***************************************************

STOP: CLR SDA ;发送停止条件的数据信号

NOP

NOP

SETB SCL ;发送停止条件的时钟信号

NOP

NOP

NOP

NOP NOP ;起始条件的建立时间大于7.7μs

SETB SDA ;发送I2C总线的停止信号

NOP

NOP

NOP

NOP

NOP ;延迟时间大于7.7μs

RET

;*********************************************

;子程序名:MACK

;描述:发送应答信号子程序

;*********************************************

MACK:CLR SDA ;将SDA置0

NOP

NOP

SETB SCL

NOP

NOP

NOP

NOP

NOP ;保持数据时间,大于7.7μs CLR SCL

NOP

NOP

RET

;**********************************************

;子程序名:MNACK

;描述:发送非应答信号子程序

;***********************************************

MNACK:SETB SDA ;将SDA置1

NOP

NOP

SETB SCL NOP

NOP

NOP

NOP

NOP

CLR SCL ;保持数据时间,大于7.7μs

NOP

NOP

RET

;*************************************************

;子程序名:CACK

;描述:检查应答位子程序,返回值ACK=1时表示有应答

;************************************************

CACK: SETB SDA

NOP

NOP

SETB SCL

CLR ACK

NOP

NOP MOV C, SDA

JC CEND

SETB ACK ;判断应答位

CEND: NOP

CLR SCL

NOP

RET

;*********************************************

;子程序名:WRBYTE

;描述:发送字节子程序,字节数据放入ACC

;*********************************************

WRBYTE:

MOV R0, #08H

WRBYTE:

MOV R0, #08H

WLP: RLC A ;取数据位

JC WRI

SJMP WRO ;判断数据位

WLP1: DJNZ R0, WLP

NOP

RET

WRI: SETB SDA ;发送1

NOP

SETB SCL NOP

NOP

NOP

NOP

NOP

CLR SCL

SJMP WLP1

WRO: CLR SDA ;发送0

NOP

SETB SCL

NOP

NOP

NOP

NOP

NOP

CLR SCL

SJMP WLP1

;********************************************

;子程序名:RDBYTE

;描述:读取字节子程序,读出的数据存放在ACC中

;*********************************************

RDBYTE:

MOV R0, #08H

RLP: SETB SDA

NOP

SETB SCL ;时钟线为高,接收数据位

NOP

NOP MOV C, SDA ;读取数据位

MOV A, R2

CLR SCL ;将SCL拉低,时间大于7.7μs

RLC A ;进行数据位的处理

MOV R2, A

NOP

NOP

NOP

DJNZ R0, RLP ;未够8位,继续读入

RET

;****************************************

;子程序名:延时

;说明:选用工作寄存器组1

;****************************************

DELAY:

PUSH PSW

CLRRS1

SETB RS0

MOV R5, #20

D1: MOV R6, #248

D2: MOV R7, #248

DJNZ R7, $

DJNZ R6, D2

DJNZ R5, D1

POPPSW

RET

END

3.仿真调试

1) I2CDEBUGGER运行窗口介绍

将源程序生成.hex文件并将其加载至单片机便可进行调试,前面章节已介绍如何操作,此处不再赘述,仅介绍如何用I2CDEBUGGER调试I2C总线应用系统。

运行起来后,就能看到I2CDEBUGGER的运行时窗口,如图8-23所示。该窗口主要由五个部分组成。图8-23I2CDEBUGGER运行窗口①输入数据显示区:该区域为I2CDEBUGGER的主窗口,用于显示I2C总线上的活动情况。

②缓冲序列列表。该区域用于显示在下一可用时机将通过I2C终端传输的一队序列。可以通过从序列输入框添加缓冲序列。

③预定义序列列表:该区域显示预先编制的数据序列,该数据序列在SCL脚的控制下通过SDA脚的传输。可以通过从序列输入框添加预定义序列。④序列输入框:该输入框允许用户输入序列,可以放至预定义列表,也可以放至缓冲列表。该输入框支持的语法如表8-4所示。注意:十六进制数和二进

温馨提示

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

评论

0/150

提交评论