《单片机应用技术》项目2-软件延时流水灯控制_第1页
《单片机应用技术》项目2-软件延时流水灯控制_第2页
《单片机应用技术》项目2-软件延时流水灯控制_第3页
《单片机应用技术》项目2-软件延时流水灯控制_第4页
《单片机应用技术》项目2-软件延时流水灯控制_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、子情境子情境1-21-2:软件延时流水灯控制:软件延时流水灯控制任务任务1-2-2 1-2-2 任务任务1-2-11-2-1软件延时实现灯的闪烁及流动软件延时实现灯的闪烁及流动 1s1s软件延时程序的设计及调试软件延时程序的设计及调试 任务1-2-1:1s软件延时程序的设计及调试 任务要求任务要求:设计延时设计延时1s1s的软件延时程序的软件延时程序多重循环软件多重循环软件延时延时1s程序设计程序设计单循环软件延单循环软件延时时1ms程序设计程序设计 认识认识单片机时序单片机时序Step 1Step 2Step 3任务实施步骤任务实施步骤知识点小结知识点小结如何实现灯的流动及显示如何实现灯的流

2、动及显示 灯的闪烁灯的闪烁 即灯亮会即灯亮会灭会灭会再亮再亮再灭再灭,所以要实现灯的闪烁,首先,所以要实现灯的闪烁,首先应能控制灯的亮灭,上一章的学习可以知道,应能控制灯的亮灭,上一章的学习可以知道,P1.0P1.0引脚置引脚置00灯亮,置灯亮,置11灯灭。其次,闪烁的快慢可以通过控制亮灭的间隔时间实现,便涉及时间控灯灭。其次,闪烁的快慢可以通过控制亮灭的间隔时间实现,便涉及时间控制的问题。制的问题。 灯的流动显示灯的流动显示 先假设一只灯向左流动显示,即灯亮的顺序为先假设一只灯向左流动显示,即灯亮的顺序为D1D2D7DD1D2D7D1D2 1D2 ,其实现方法是先将,其实现方法是先将P1.0

3、P1.0置置00,其它口置,其它口置11,点亮,点亮D1D1,间隔时间到后,将间隔时间到后,将P1.1P1.1置置00,其它口置,其它口置11,点亮,点亮D2D2依次循环下去。依次循环下去。 因此,不管是闪烁还是流动控制,都需要因此,不管是闪烁还是流动控制,都需要延时延时,首先学习延时程序的设,首先学习延时程序的设计。计。1 1如何进行时间控制如何进行时间控制软件延时软件延时 利用单片机的利用单片机的空操作指令空操作指令(即(即NOPNOP指令,指令,CPUCPU执行该指令时,单片机不做执行该指令时,单片机不做任何事,仅仅占用任何事,仅仅占用CPUCPU时间。)来实现,当点亮某只灯后就让时间。

4、)来实现,当点亮某只灯后就让CPUCPU执行该指令执行该指令,控制该指令的执行次数便可以控制延时时间。,控制该指令的执行次数便可以控制延时时间。定时器延时定时器延时 利用单片机内部定时器实现硬件定时。利用单片机内部定时器实现硬件定时。Step 1 Step 1 认识单片机时序认识单片机时序 软件延时的前提是单片机软件延时的前提是单片机CPUCPU执行指令要花时间,而执行指令要花时间,而NOPNOP指令更是专门为软件延时设指令更是专门为软件延时设计的指令之一,要控制延时时间,首先应弄清楚计的指令之一,要控制延时时间,首先应弄清楚执行一次该指令要花多长时间执行一次该指令要花多长时间。 Step 1

5、 Step 1 认识单片机时序认识单片机时序 2.2.单片机的时序单片机的时序 时钟周期时钟周期 时钟电路所提供给单片机的时钟信号的周期时钟电路所提供给单片机的时钟信号的周期,单片机内部所有电路的工作,单片机内部所有电路的工作时钟都来自于此,当时钟电路晶振频率为时钟都来自于此,当时钟电路晶振频率为l2MHz,它的时钟周期就是,它的时钟周期就是 。机器周期机器周期 单片机访问一次存储器的时间单片机访问一次存储器的时间,称之为一个机器周期。一个机器周期包括,称之为一个机器周期。一个机器周期包括12个时钟周期,如果一个单片机选择的时钟频率为个时钟周期,如果一个单片机选择的时钟频率为l2MHz,机器周

6、期则为,机器周期则为 。 指令周期指令周期 所谓指令周期就是所谓指令周期就是CPU指执行一条指令所花的时间指执行一条指令所花的时间。51单片机的所有指令中单片机的所有指令中,按执行时间可分为单机器周期、双机器周期和,按执行时间可分为单机器周期、双机器周期和4机器周期指令。机器周期指令。 NOP指令属单机器周期指令,即,当时钟频率为指令属单机器周期指令,即,当时钟频率为l2MHz时,时,CPU执行一次执行一次NOP指令,将耗时指令,将耗时 。 1 s1 s1/12 sStep 1 Step 1 认识单片机时序认识单片机时序 Step 2 Step 2 单循环软件延时单循环软件延时1ms1ms程序

7、设计程序设计610610s1 s610 根据上面的分析知道,执行一次根据上面的分析知道,执行一次NOPNOP指令耗时指令耗时 ,假设延时,假设延时1s(即(即 ),则需要),则需要执行执行NOP指令次指令次 ,我们不可能在程序中写,我们不可能在程序中写 条条NOP指令,利用指令,利用循环结构循环结构可以很好的可以很好的解决这个问题。解决这个问题。 循环程序是一种常用的程序结构,其流程图如图,可知:循环程序是一种常用的程序结构,其流程图如图,可知: 循环程序包括设置循环程序包括设置循环次数循环次数、设置、设置循环初值循环初值、循环体循环体、 次数修改次数修改及及循环条件判断循环条件判断等,其中,

8、循环体为需要多次等,其中,循环体为需要多次 重复执行的程序块。重复执行的程序块。 执行整个循环程序的耗时为:执行整个循环程序的耗时为:1ttt循环次数及条件判断赋初值及循环次数时间循环次数()1.1.汇编循环程序结构及执行时间汇编循环程序结构及执行时间32 21ms1ms延时程序设计延时程序设计 程序功能分析程序功能分析 单片机采用单片机采用12Mhz12Mhz晶振,机器周期为晶振,机器周期为1us1us,要实现,要实现1ms1ms软件延时,即需单片机执行软件延时,即需单片机执行1 1000000个机器周期。个机器周期。算法确定算法确定 采用循环程序,循环执行指令采用循环程序,循环执行指令10

9、001000个机器周期。个机器周期。 程序流程图程序流程图 假设循环次数为假设循环次数为200次,则循环程序执次,则循环程序执 行时间包括:行时间包括: (1)循环体)循环体+循环次数修改判断两部分循环次数修改判断两部分 程序要执行程序要执行200次的耗时;次的耗时; (2)赋循环初值、循环次数等指令耗时)赋循环初值、循环次数等指令耗时 用用R0寄存器存放循环次数,赋值寄存器存放循环次数,赋值200, 循环次数修改判断指令循环次数修改判断指令DJNZ执行执行1次耗时次耗时 2us,则循环体应安排三个,则循环体应安排三个NOP指令,执指令,执 行一次循环耗时行一次循环耗时3us,则,则每次循环耗

10、时每次循环耗时2+ 3=5us,5200=1000us,实现了实现了1ms的的 延时。延时。 汇编语言源程序汇编语言源程序DELAY1msDELAY1ms:MOV MOV R0,#200R0,#200 ; ;设置循环次数及初值(设置循环次数及初值(1us1us) LP1:LP1: NOP NOP ; ;循环体,执行三次循环体,执行三次NOPNOP(3us3us) NOPNOP NOP NOP DJNZ R0,LP1 DJNZ R0,LP1 ; ;循环次数减循环次数减1 1,不为,不为0 0循环,为循环,为0 0退出循环退出循环2us2us循环体执行循环体执行200次次循环次数修改及循环次数修改

11、及判断,执行判断,执行200次次耗时耗时1ms 关键指令说明关键指令说明 DJNZDJNZ R0,LP1 R0,LP1 该指令为一条件跳转指令,双机器周期指令,执行时间为该指令为一条件跳转指令,双机器周期指令,执行时间为2us2us,CPUCPU执行该指令将完执行该指令将完成以下操作:成以下操作:(1 1)R0=R0-1R0=R0-1,即将,即将R0R0的内容减的内容减1 1(2 2)减)减1 1后判断后判断R0R0是否为是否为0 0,不为,不为0 0则跳到标号则跳到标号LP1LP1处执行循环程序,否则执行处执行循环程序,否则执行DJNZDJNZ下下一条指令(退出循环)。一条指令(退出循环)。

12、 从而我们看出,利用这一条指令便实现了循环次数修改、条件判断的功能,以后的从而我们看出,利用这一条指令便实现了循环次数修改、条件判断的功能,以后的循环程序中会经常使用这条指令。循环程序中会经常使用这条指令。各指令的执行时间可查阅指令表。各指令的执行时间可查阅指令表。寄存器寻址寄存器寻址 将操作数存放在寄存器中,寄将操作数存放在寄存器中,寄存器包括存器包括R0R7、A、B等。等。 立即数寻址立即数寻址 十进制数十进制数200送入送入R0直接寻址直接寻址 LP1代表代表ROM的单元地址的单元地址R0不为不为0精确执行时间为多少?精确执行时间为多少?33.3.程序调试仿真程序调试仿真(1)单步调试)

13、单步调试 利用利用keil软件建立项目,编译后进入调试界面,单步执行程序,可以观察软件建立项目,编译后进入调试界面,单步执行程序,可以观察R0和和sec的变的变化情况化情况 。演示链接演示链接(2)断点调试)断点调试 使用单步调试工具可以逐条执行程序语句并观察运行结果,而使用单步调试工具可以逐条执行程序语句并观察运行结果,而利用断点调试工具可以利用断点调试工具可以调试某个程序块调试某个程序块。按下列步骤调试按下列步骤调试 :演示链接演示链接 a. 断点设置断点设置,双击,双击LJMP $语句前的程序执行箭头处,显示一红色圆点即表语句前的程序执行箭头处,显示一红色圆点即表示在该语句处设置了一个断

14、点,再双击则取消断点;示在该语句处设置了一个断点,再双击则取消断点; b.运行程序运行程序,断点设好后,点击全速运行按钮,程序将被执行到断点处,并,断点设好后,点击全速运行按钮,程序将被执行到断点处,并在个窗口显示相关信息;在个窗口显示相关信息; c.查看运行结果查看运行结果,sec显示为显示为0.00100100s,表示该程序段执行了,表示该程序段执行了0.00100100秒秒(即(即1001us)满足延时要求。否则修改源程序,直到调试通过。)满足延时要求。否则修改源程序,直到调试通过。Step 3 Step 3 多重循环软件延时多重循环软件延时1s1s程序设计程序设计 1.1.算法确定及流

15、程图算法确定及流程图 前面的程序中使用了寄存器前面的程序中使用了寄存器R0存放循环次数,存放循环次数,赋值赋值200,延时,延时1ms,以此类推,如果给,以此类推,如果给R0赋值赋值200000就可以实现就可以实现1s的延时。但由于的延时。但由于AT89S51为为8位单片位单片机,除机,除PC和和DPTR外,其余都是外,其余都是8位存储器位存储器单元,单元,最最大存储数据为大存储数据为255,因此,要实现更长时间的软件延,因此,要实现更长时间的软件延迟,考虑采用多重循环。迟,考虑采用多重循环。 延时延时1s1s需循环执行需循环执行1ms1ms软件延时软件延时10001000次,由于次,由于寄存

16、器位数受限,寄存器位数受限,将将10001000拆分为拆分为1001001010,即先设,即先设计计10ms10ms延时程序,再循环调用延时程序,再循环调用10ms10ms延时程序延时程序100100次次即可,分别采用即可,分别采用R0R0R2R2存放循环次数,流程图如图存放循环次数,流程图如图所示。所示。2.2.汇编语言源程序汇编语言源程序DELAY1s:DELAY1s:MOVMOVR2,#100 R2,#100 ;1us;1usDELAY10ms:DELAY10ms:MOVMOVR1,#10 R1,#10 ;1us;1usDELAY1mDELAY1ms:s:MOVMOVR0,#200R0,

17、#200 ;1us;1usLP1:LP1:NOPNOP ;1us;1usNOPNOP ;1us;1usNOPNOP ;1us;1usDJNZDJNZR0,LP1R0,LP1 ;2us;2usDJNZDJNZR1,DELAY1ms R1,DELAY1ms ;2us;2usDJNZDJNZR2,DELAY10ms R2,DELAY10ms ;2us;2usSJMPSJMP$ $ ; ;死循环,防止程序跑飞死循环,防止程序跑飞ENDEND ; ;程序结束程序结束1ms1ms内循环内循环10ms10ms二重循环二重循环1s1s外循环外循环100 (10 (200 (32) 1 2) 1 2) 1 10

18、03301ts 3. 3. 软件仿真调试软件仿真调试 1s程序仿真结果程序仿真结果 保存源文件,建立项目,添加源文件,编译后进入仿真调试状态,设置断点并运行,保存源文件,建立项目,添加源文件,编译后进入仿真调试状态,设置断点并运行,显示结果如图显示结果如图3-5所示,结果符合设计预期。所示,结果符合设计预期。演示链接。演示链接。任务1-2-2:软件延时实现灯的闪烁及流动软件延时实现灯的闪烁及流动 任务要求任务要求:利用利用1s1s软件延时程序实现灯的闪烁及流动显示软件延时程序实现灯的闪烁及流动显示延时子程序延时子程序实现实现灯的流动灯的流动带参数带参数延时子程序延时子程序实现闪烁实现闪烁速度控

19、制速度控制延时子程序延时子程序实现灯实现灯的闪烁的闪烁 软件延时软件延时实现实现LEDLED闪烁闪烁 Step 1Step 2Step 3任务实施步骤任务实施步骤知识点小结知识点小结Step 4Step 1 Step 1 软件延时实现灯的闪烁软件延时实现灯的闪烁 1. 1. 系统功能分析及流程图系统功能分析及流程图 此系统的主要功能是利用软件延时实现灯的闪烁,即控制某只灯亮此系统的主要功能是利用软件延时实现灯的闪烁,即控制某只灯亮延时延时灯灯灭灭延时延时再亮再亮延时延时再灭再灭延时延时。因此,主程序实际是一个循环程序,流。因此,主程序实际是一个循环程序,流程图如图。程图如图。2.2.汇编语言源

20、程序汇编语言源程序 ORG0000HLJMPSTARTORG0030HSTART: CLRP1.0;P1.0=0,灯亮,灯亮; 延时延时1s;DELAY1s:MOVR2,#100 DELAY10ms:MOVR1,#10 DELAY1ms:MOVR0,#200LP1:NOPNOPNOPDJNZR0,LP1DJNZR1,DELAY1msDJNZR2,DELAY10msSETBP1.0;P1.0=1,灯灭,灯灭; 延时延时1s;DELAY1s1:MOVR2,#100 DELAY10ms1:MOVR1,#10 DELAY1ms1:MOVR0,#200LP11:NOPNOPNOPDJNZR0,LP11D

21、JNZR1,DELAY1ms1DJNZR2,DELAY10ms1LJMPSTART;跳转到跳转到START处,灯亮处,灯亮ENDCLR(位置(位置0)指令格式:指令格式:CLR bit,(,(bit表某个位寻址单元,如表某个位寻址单元,如P1.0)指令功能:指令功能:将某位置将某位置0,CLR P1.0将将P1.0引脚置引脚置0, 灯亮。灯亮。SETB(位置(位置1)指令格式:指令格式:SETB bit,(,(bit表某个位寻址单元,如表某个位寻址单元,如P1.0)指令功能:指令功能:将某位置将某位置1,SETB P1.0将将P1.0引脚置引脚置1, 灯灭。灯灭。位寻址位寻址 仅对某位进行操作

22、仅对某位进行操作,如程序中的如程序中的CLR P1.0指令,仅将指令,仅将P1寄存器中的寄存器中的P1.0位清位清0,其它位不变。,其它位不变。3.3.仿真调试仿真调试 建立项目并编译完成后,进入调试状态,调出建立项目并编译完成后,进入调试状态,调出P1P1窗口,全速执行程序,可以发窗口,全速执行程序,可以发现现P1.0P1.0的内容在不停地变化。如果利用的内容在不停地变化。如果利用ProteusProteus软件仿真也可以看到软件仿真也可以看到D1D1闪烁的效果。闪烁的效果。达到设计要求。达到设计要求。演示链接演示链接Step 1 Step 1 软件延时实现灯的闪烁软件延时实现灯的闪烁 St

23、ep 2 Step 2 延时子程序实现灯的闪烁延时子程序实现灯的闪烁1. 1. 子程序概念子程序概念 在解决实际问题时,经常会遇到一个程序中在解决实际问题时,经常会遇到一个程序中多次使用同一个程序段多次使用同一个程序段,为了节约内存,为了节约内存,我们把这种具有一定功能的独立程序段编成子程序,例如上面的延时子程序。,我们把这种具有一定功能的独立程序段编成子程序,例如上面的延时子程序。当需要当需要时,可以去调用这些独立的子程序时,可以去调用这些独立的子程序,调用程序称为主程序。,调用程序称为主程序。 如图为灯闪烁控制程序,由如图为灯闪烁控制程序,由主程序和延时子程序两部分构成,主程序和延时子程序

24、两部分构成,主程序主程序需要延时需要延时时才时才转去转去执行延执行延时子程序,但,为完成系统功能,时子程序,但,为完成系统功能,延时延时子程序执行完后还得子程序执行完后还得返回返回主主程序程序控制灯的亮灭。控制灯的亮灭。2.2.子程序调用及返回子程序调用及返回 CPU执行哪段程序取决于执行哪段程序取决于指令指针寄存器指令指针寄存器PC的值,如图所示,延时子程序定位在的值,如图所示,延时子程序定位在ROM的的0100H单元,当单元,当PC=0100H时,时,CPU将执行延时子程序。再以将执行延时子程序。再以1次调用为例,延次调用为例,延时子程序执行完后,使时子程序执行完后,使PC=0035H,C

25、PU将执行将执行 SETB P1.0语句,使灯灭。语句,使灯灭。 LCALL为子程序调用指令,可完成为子程序调用指令,可完成PC=0100H的功能,同时进行断点地址保护;的功能,同时进行断点地址保护;RET为子程序返回指令,可将之前保护的为子程序返回指令,可将之前保护的断点地址断点地址送给送给PC(即(即PC=0035H)。)。 断点地址断点地址即即LCALL指令下一条指令所在指令下一条指令所在ROM地址地址,断点地址保护在,断点地址保护在堆栈堆栈中。中。 堆栈堆栈,存放临时数据(如断点地址)的内存区域(,存放临时数据(如断点地址)的内存区域(RAM中)。中)。 LCALL(子程序调用指令)(

26、子程序调用指令)指令格式:指令格式:LCALL 标号,标号即子程序入口地址(如标号,标号即子程序入口地址(如DELAY1s)指令功能:指令功能:CPU执行执行LCALL指令时,依次完成以下操作:指令时,依次完成以下操作:a.PC自动加自动加1,使,使PC指向指向SETB P1.0所在地址单元(即所在地址单元(即PC=0035H),),注注意,意,LCALL为三字节指令为三字节指令;b.保护保护PC中的断点地址中的断点地址0035H到到堆栈堆栈(RAM中);中);c.将子程序将子程序DELAY1s的入口地址的入口地址0100H赋给赋给PC(即(即PC=0100H);d.CPU转向转向DELAY1

27、Sz子程序运行。子程序运行。RET(子程序返回指令)(子程序返回指令) 子程序必须以子程序必须以RET指令结尾,指令结尾,CPU执行执行RET指令将顺序完成以下操指令将顺序完成以下操作:作:a.取出先前保护在取出先前保护在堆栈堆栈中的断点地址中的断点地址0035H赋给赋给PC;b.CPU转向断点处继续执行后续程序。转向断点处继续执行后续程序。如何调用又如何返回?如何调用又如何返回?首先明确首先明确Step 2 Step 2 延时子程序实现灯的闪烁延时子程序实现灯的闪烁3. 3. 延时子程序实现灯的闪烁程序设计延时子程序实现灯的闪烁程序设计演示链接演示链接 ;主程序主程序;ORG0000HLJM

28、PSTARTORG0030H;定位主程序起始地址为定位主程序起始地址为0030HSTART: CLRP1.0;灯亮灯亮LCALLDELAY1s;调用调用1s延时子程序延时子程序SETBP1.0;灯灭灯灭LCALLDELAY1s;调用调用1s延时子程序延时子程序LJMPSTART;跳到跳到START处,灯亮处,灯亮; 延时延时1s子程序子程序;ORG0100H;定位延时子程序起始地址为定位延时子程序起始地址为0100HDELAY1s:MOVR2,#100 DELAY10ms:MOV R1,#10 DELAY1ms:MOVR0,#200LP1:NOPNOPNOPDJNZ R0,LP1DJNZ R1

29、,DELAY1msDJNZ R2,DELAY10ms RET;子程序返回子程序返回END子程序调用子程序调用子程序返回子程序返回如何灵活调整闪烁时间?如何灵活调整闪烁时间?Step 3 Step 3 带参数延时子程序实现闪烁速度的控制带参数延时子程序实现闪烁速度的控制带参数延时子程序实现闪烁速度的控制程序设计带参数延时子程序实现闪烁速度的控制程序设计演示链接演示链接 ; 带参数延时子程序,可灵活改变演示时间,便于控制闪烁速度带参数延时子程序,可灵活改变演示时间,便于控制闪烁速度;ORG0000HLJMPSTARTORG0030H ;定位主程序起始地址为定位主程序起始地址为0030HSTART:

30、 CLRP1.0 ;灯亮灯亮MOVR2,#200 ;给入口参数赋值,延时给入口参数赋值,延时2sLCALLDELAY10ms ;调用延时子程序调用延时子程序SETBP1.0 ;灯灭灯灭MOVR2,#50 ;给入口参数赋值,延时给入口参数赋值,延时0.5sLCALLDELAY10ms ;调用延时子程序调用延时子程序LJMPSTART ;跳到跳到START处,灯亮处,灯亮; 带参数延时子程序,入口参数为带参数延时子程序,入口参数为R2;ORG0100H ;定位延时子程序起始地址为定位延时子程序起始地址为0100HDELAY10ms:MOV R1,#10 DELAY1ms:MOVR0,#200LP1

31、:NOPNOPNOPDJNZ R0,LP1DJNZ R1,DELAY1msDJNZ R2,DELAY10ms ;修改循环次数并进行循环条件判断修改循环次数并进行循环条件判断 RET ;子程序返回子程序返回END利用利用R2传递参数,传递参数, 主程序中赋值,表示主程序中赋值,表示10ms延时程序循环次数延时程序循环次数利用利用R2传递参数,传递参数, 子程序中访问子程序中访问R2,并,并作为循环次数使用作为循环次数使用Step 3 Step 3 灯的闪烁及流动程序设计灯的闪烁及流动程序设计 5.5.延时子程序实现灯的流动显示延时子程序实现灯的流动显示功能分析功能分析 先假设一只灯向左流动显示,即灯亮的顺序为先假设一只灯向左流动显示,即灯亮的顺序为D1D2D7D1D2D1D2D7D1D2 ,其实现方法是先将,其实现方法是先将P1.0P1.0置置00,其它口置,其它口置11,点亮,点亮D1D1,间隔时间到后,将,间隔时间到后,将P1.P1.1 1置置00,其它口置,其它口置11,点亮,点亮D2D2依次循环下去。依次循环下去。 由此,只要依次给由此,只要依次给P1P1口送口送11111110B11111101B11111011B11110111B11111110B

温馨提示

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

最新文档

评论

0/150

提交评论