智能电子产品综合项目实践设计报告自动浇灌系统设计报告.doc_第1页
智能电子产品综合项目实践设计报告自动浇灌系统设计报告.doc_第2页
智能电子产品综合项目实践设计报告自动浇灌系统设计报告.doc_第3页
智能电子产品综合项目实践设计报告自动浇灌系统设计报告.doc_第4页
智能电子产品综合项目实践设计报告自动浇灌系统设计报告.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

常州信息职业技术学院智能电子产品综合项目实践设计报告2011 2012 学年 第 二 学期项目: 自动浇灌系统的设计与实现 班级: 计应102 学号: 1008143239姓名: 戴霞授课教师: 聂章龙制定日期: 2012 年 05 月 10 日目 录第一章总体设计3第二章 硬件电路设计42.1 系统原理图42.2 本章小结6第三章 软件设计83.1主程序设计83.2 简单单片机应用系统结构93.3 ds18b20数字温度测量93.4语音报警模块93.5 lcd液晶显示部分软件设计103.6 定时模块设计103.7按键控制模块103.8 运行环境113.9本章小结11第四章 系统测试124.1硬件测试124.1.1 实验板连接测试124.1.2 显示模块测试124.1.3 按键模块测试124.1.4 报警模块测试124.2软件测试124.2.1 显示模块测试124.2.2 按键模块测试124.2.3 报警模块测试12第五章 结束语135.1总结135.1.1 问题135.1.2 心得13附录14附录1 程序代码14附录2 实物图片24智能电子产品综合项目实践设计报告第一章 总体设计本文以51单片机p89v51rb2fn为主控芯片,然后利用dalas一线式温度传感器ds18b20来实现对周围温度环境的采集操作,单片机再根据采集的温度值来控制电磁阀的开关及持续时间等等操作,从而实现在不同的温度对周围浇灌对象实施间隔性的灌溉,浇灌持续的时间与不同的温度范围有关,同时相关的状态信息要在点阵汉字液晶屏上实时显示的浇灌系统。本系统以最低限度的用水量获得最大的产量或收益,也就是最大限度地提高单位灌溉水量的农作物产量和产值的灌溉措施,灌溉可有效保持土壤中水、肥、气、热等各相的良好状态,具有省水、省工、节能、节肥、增产增收等诸多优点。系统总体结构图如图1-1所示。tg12864bi液晶屏显示单片机电磁阀ds18b20温度采集报警图1-1 自动浇灌系统组合框图 系统采用51单片机p89v51rb2fn为主控芯片,包括ds18b20温度采集模块、汉字液晶屏显示状态信息模块、定时器模块及主程序模块。系统的主要功能模块如下: 系统模块: 模块功能:ds18b20温度采集模块:通过该温度传感器获取当前的温度值。汉字液晶屏显示状态信息模块:根据温度,在该屏上逐行显示:温度、水龙头开关状态、浇灌时间和次数等信息。定时器模块:实现记录不同温度段的浇灌时间及浇灌间隔时间等信息主程序模块:对相关模块的初始化及相关模块的控制流程。自动浇灌系统的设计 计算机软件学院 计应102 戴霞 第 26 页 第二章 硬件电路设计2.1 系统原理图主要实现自动浇灌系统的温度采集、状态信息显示、时间记录和电磁阀开关控制等。(1)汉字液晶屏上实时显示的信息有:1)第一行显示:低温:*.*,或常温:*.*,或高温:*.* 。注:假设24以下为低温,2530为常温,30以上为高温。2)第二行显示:电磁阀状态:开,或关。3)第三行显示:浇灌时间:*m*s,或*h*m。(2)浇灌时间及浇灌次数间隔要求:在低温时,电磁阀始终关,浇灌时间为0分0秒;在常温时,浇灌时间为30分钟,浇灌次数间隔为8小时;在高温时,浇灌时间为50分钟,浇灌次数间隔为4小时。液晶模块与单片同的连接采用模拟i/o方式。只要用程序控制i/o口线产生如图2-1所示的时序信号。与总路线方式相比,对液晶屏初始化、充填液晶屏、显示字符、显示字符串函数完全相同。 图2-1 模拟i/o口方式接口电路vccj4 4321vccdqgndhsoutr384.7kvccvccq6r37vd9q5r33b1r39dsqspkr364.7kds1820图2-2 蜂鸣器、温度传感器电路温度传感器ds18b20的数据线与单片机的p1.0相连。根据ds18b20的读写时序及操作指令,单片机测温时,首先对其复位操作,然后发skip rom指令,再用convert t指令启动传感器开始温度转换。将温度放入内部暂存器,然后单片机重复操作一,开始读温度值。电磁阀里有密闭的腔,在不同位置开有通孔,每个孔都通向不同的油管,腔中间是阀,两面是两块电磁铁,哪面的磁铁线圈通电阀体就会被吸引到哪边,通过控制阀体的移动来挡住或漏出不同的排油的孔,而进油孔是常开的,液压油就会进入不同的排油管,然后通过油的压力来推动油缸的活塞,活塞又带动活塞杆,活塞杆带动机械装置动。这样通过控制电磁铁的电流通断就控制了机械运动。图2-3 电磁阀控制电路定时器/计数器概述在51系列单片机中有两个16位的加法计数器,分别叫做t0和t1。它们在计数脉冲的作用下,其计数值不断加1,在此过程中,计数器可能产生溢出(溢出是指计数器的计数值全为“1”时,在计数脉冲的作用下,全部归0的动作),产生溢出后,可以向cpu发出中断请求。计数脉冲可以来源于系统时钟或外部电路(通过p3.4/t0、p3.5/t1引脚输入)。如果计数脉冲来自系统时钟,称之为“定时器”,每个机器周期(一个机器周期由12个时钟周期组成)计数器加1;如果计数脉冲来自外部电路,称之为“计数器”,此时单片机在每个机器周期对t0引脚进行检测,如果在两个连续的机器周期内,前一次检测为高电平,而后一次检测到了低电平,即在t0脚检测到了一个下降沿,则计数器加1,因此计数脉冲的频率不能高于振荡频率fosc的1/24。定时器的内部结构如图3-1所示:当控制开关c/=0时,多路开关选择系统时钟的12分频作为计数源,c/=1,多路开关选择来自t0脚的外部脉冲作为计数源,控制位控制着计数源的脉冲是否能够送到加法计数器tl0、th0的输入端,一旦计数器产生溢出,tf0变为1。系统时钟12分频t0引脚tl0 th0tf0控制位图3-1 定时器内部结构图c/=0c/=12.2 本章小结定时器/计数器的本质是对脉冲的计数,无论是定时还是计数,当计数器溢出回零时,tfx自动置1,cpu可以通过查询方式对其检测(查询后必须用软件将tfx清0),也可以采用中断方式,在ea1,etx=1时,一旦tfx置1,cpu会自动进入中断,中断后会自动清除tfx。设计串行通信程序时,如果是方式1和方式3,必须在初始化程序中对定时器/计数器t1进行设置以选择波特率。对于发送程序应先发送,再检测ti的状态,再发送。或都先将ti的状态用程序置1,在中断服务程序中执行发送操作;接收程序只有ri状态有效后才能接收数据。无论是查询方式还是中断方式,发送或接收后都必须用程序将ti或ri清0.数字温度传感器提供了一系列的操作指令,单片机通过这些指令控制传感器实现 温度的测量。首先对传感器执行初始化操作,然后发skip rom指令,接着用convert t指令启动温度转换,转换完成后,再次对传感器执行初始化操作,并跳过rom 识别,然后发读暂存器指令read scrtchpad,再连续读出两个字节的温度值。液晶模块内含标准字库,可显示两行、每行16个点阵字符;单片机与液晶模块的连接可选总线方式或模拟i/o口方式;单片机通过操作指令实现 对液晶模块的编程控制;屏幕上的每个字符位置与内部数据存储器之间有着一一对应关系,要将字符显示到屏幕指定位置,必须设置液晶模块的数据存储器地址,然后将字符的ascii码写入液晶屏的数据端口。第三章 软件设计3.1主程序设计yn电磁阀打开,开始浇灌,打开定时器开始计时,浇灌15秒进入常温不浇灌,再间隔10秒if 24t30开始初始化获取温度和t判断温度值tif t30n电磁阀打开,开始浇灌,打开定时器开始计时,浇灌25秒进入高温不浇灌,再间隔5秒yn图3-1主程序流程图void lcd_shi(uchar dat)void lcd_feng(ucahr dat)void lcd_miao(uchar dat)void disptime(void)void dispjiben(void)void timer0(void) interrupt 1int gettemp(uchar temp4)void whileswitch()cpu时钟定时器/计数器i/o接口romram图3-2 单片图机的结构框3.2 简单单片机应用系统结构单片机全称单片微型计算机,就是将cpu、系统时钟、ram、rom、定时器/计数器和多种i/o接口电路集成在一块芯片上的微型计算机。典型的单片机结构图如图3-2所示。3.3 ds18b20数字温度测量开始发ds18b20复位命令发跳过rom指令发启动温度转换指令发ds18b20复位命令发跳过rom指令发读暂存器指令读取两字节的温度值将温度值转换为bcd码送显示缓存调用显示程序3-2 温度测量流程图根据ds18b20的读/写时序及操作指令,单片机测量温度时,首先对ds18b20进行复位操作,由于总线上只有一只ds18b20,无需根据序列号来识别传感器。单片机对其复位后可发skip rom指令,再用convert t指令启动传感器开始温度转换。转换完成后,ds18b20已将当前温度值放入了内部的暂存器中,为了读以温度值,单片机仍需对传感器进行复位操作,并跳过rom操作别,然后发读暂存器指令read scrtchpad,接着连续读出两个字节的温度值,将其转换为十进制数在数码管上显示出来,相应的流程图如图3-2所示。int readt(void) uchar h,l;bit err;err=reset( );wrbyte(0xcc);wrbyte(0xbe);l=rdbyte( );h=rdbyte( );return(h*256+l);3.4语音报警模块void beep(void)uint i;for(i=0;i1000;i+)delay15(10); spk=spk;/蜂鸣器的值取反3.5 lcd液晶显示部分软件设计extern void lcd_dispini(void);extern void lcd_dispfill(uchar filldata);extern void lcd_dispchar(uchar cy,uchar cx,char dispdata);extern void lcd_dispstr(uchar cy,uchar cx,char*disp_str);extern void lcd_disphz(uchar cy,uchar cx,uchar dispdata);extern void lcd_disphzstr(uchar cy,uchar cx,uchar*disp_str);3.6 定时模块设计在使用定时器/计数器时,首先应根据要求对工作方式进行初始化,然后计算出初始值。通常要向tmod寄存器写入工作方式控制字,再将计数器的初值写入th0、tl0。然后启动定时器/计数器,将tr0置1,如果采用中断优雅,还应将et0、ea置1.void inittimer0(void) tmod = 0x02; /定时器工作在方式2 th0 = -250;/定时时间为 250us tl0 = -250; ea = 1; /单片机中断 et0 = 1; /允许t0中断 tr0=1 ;3.7按键控制模块键盘是计算机系统中不可缺少的输入设备,矩阵式键盘也称为行列式键盘,其结构如图3-3所示。图中有4根行线和4根列线,按键跨接在行线和列线上。4*4的行列结构可以构成16个按键的键盘,与独立式键盘相比,按键数量相同时占用i/o口线少,因此适用于按键数量较多的场合。如图3-3中4根行线接到p2.0p2.3,作为输出口,4根列线接到p2.4p2.7,作为输入口,通常采用扫描法检测键盘有无键按下,并检测所按键(闭合键)的键号。扫描法的步骤如下。(1) 判断有无键闭合使行线p2.0p2.3都输出0,检测列线p2.4p2.7是否全为1。如果有键被按下,就会有某一根列线变为0,从而使p2.4p2.7不为全1;如果p2.4p2.7为全1,说明无键闭合。(2) 消除键抖动在检测到有键闭合后,需延时节020ms避开抖动阶段,然后检测p2.4p2.7是否为全1。如果为全1,作无键闭合处理,否则,则进一步检测闭合键键号。(3) 确定闭合键键号如果有键按下,再逐行逐列地扫描,以检测出所按键盘的键号。先使行线p2.0p2.3=0111,分别检测p2.4p2.7。如果p2.4为0,则为0号键按下;如果p2.5为0,则为1号键按下。如果p2.4p2.7都为1,说明p2.0这一行上没有键被按下,再使p2.0p2.3=1011,并逐列检查。这样依次地逐行逐列地扫描,直到找到闭合键为止。扫描程序的流程图如图3-4所示。uchar getkey(void)uchar key; uchar t; if(key=p2&0xf0)=0xf0) return 0xff; for(t=0;t5;t+) delay(5); if(key=p2&0xf0)=0xf0) return 0xff; while(p2&0xf0)!=0xf0) delay(5); if(t100)&(key=0xe0) return 0xe1; return key;3.8 运行环境u keilu isis 6 professionalu 信息学院仿真板3.9本章小结 在软件测试时,首先要确保液晶正常显示,如果程序运行时液晶没有显示,就应仔细检查液晶控制线的连接是否与程序中的定义一致,pcf8563每隔一秒就会产生一次中断,如果时钟不走,应检查pcf8563能否产生中断、单片机能否响应该中断,按键能否响应,到了报警状态时,蜂鸣器是否响。虽然程序较长,但只要按要求一步步进行检查,正确理解程序结构、函数的功能、各语句的作用,通过仔细地检查、分析,最终一定能够找出问题的原因。 第四章 系统测试4.1硬件测试4.1.1 实验板连接测试 用万用表测量,检查各个焊点之间是否短路。4.1.2 显示模块测试把显示代码下载到实验板上,看液晶显示屏是否能正常显示。4.1.3 按键模块测试把代码下载到实验板上,按键,看显示屏上数据的变化。4.1.4 报警模块测试 把代码下载到实验板上,看蜂鸣器是否鸣叫。4.2软件测试4.2.1 显示模块测试1、 首先要确保液晶屏的正常显示,如果程序运行时液晶屏没有显示,就仔细检查液晶屏控制线的连接是否与程序中的下义一致。2、 检查液晶屏的第三行显示能否正常走时,pcf8563每隔一秒就会产生一次中断。如果时钟不走,应检查pcf8563能否产生中数据、单片机能否响应中数据,此外还需检查pcf8563的连接与程序中的定义是否一致。4.2.2 按键模块测试3、 仔细检查硬件电路,确认硬件连接无误后,开始软件调试。4、 在keil下新建项目,选择硬件仿真,设置好串口号及波特率,输入源程序,编译成功后进入调试状态。5、 按下k13键,进入设置状态,如果按键后无反应,应重点检查键盘电路和连接以及键盘程序getkey(),直到按下各键时,能得到对应的键值返回。6、 如果按下k13键后,程序能够进入设置状态,应仔细检查k14,k15,k16键的功能是否与设计要求一致,最后长按k13键能否退出设置方式。如果有问题,应进入edittime()仔细调试。4.2.3 报警模块测试当电磁阀状态开,进行浇灌时,蜂鸣器报警。当电磁阀状态关,不进行浇灌时,蜂鸣器不叫。第五章 结束语5.1总结5.1.1 问题在做这个项目的过程中我发现自己存在很多的问题,当完成这个项目时,其实也没让我写太多的程序,很大一部分都是从前面copy过来的, 之前做的项目都是书上有的,虽然我做完也有很多的收获,但怎么做还是不如自己去思考去从头做到尾效果好!在此次的测试过程中,出到了很多问题: 1调试的时候将手放在传感器上,液晶屏上的温度值与实际温度不一致。解决方法:程序中定义错误,液晶屏控制线的连接与程序中的定义不一样,把对dq脚的定义与实验板上的接口连接一致,再调试温度与当前温度就基本一样了。2. 汉字显示低温、常温、高温时,不随温度传感器ds18b20的温度变化而变化。解决方法:没有使用定时器模块,添加定时器模块实现该功能。3. 液晶屏没有显示。解决方法:液晶屏控制线的连接与程序中的定义不一致,经检查程序和原理图发现,在proteus原理图中,p0是作为数据口的,而在lcd12864io.c程序中定义的是p2口,当改成lcd0x80后,现调试发现屏幕上的信息显示下确。4、仿真时,液晶屏上显示的浇灌时间与程序中定义的浇灌时间不一样长。解决方法:程序中定义的常温、高温的浇灌时间和用定时器控制时的定义名称混淆了。5、对常温、高温浇灌次数进行计数时,加到10就会出现乱码。解决方法:在程序中定义一个数组。5.1.2 心得以后无论做什么样的项目,都要认真、仔细。做这个项目之前,最首先的任务就是要做一个这个项目的基本方法和完成它的具体流程,要先熟练的学习这个项目所运用到的基本知识,在项目完成过程中能更加顺利的去完成它。学习一样东西,不是硬记一些基础知识,而是通过这些学习得到方法。在做这个项目的基本流程后,要知道该在哪个模块做什么,注意些什么,在出现问题时,我们可以通过断点调试来发现程序的问题所在,然后修改调试反复进行,这样我们才能更好的了解计算机的解决方法和处理模式,对我们调试程序非常的有帮助。团队的力量是伟大的,做任何项目都要谨记这一点,当遇到棘手的问题时,不要盲目的去死想,往误区里面钻,也不要不好意思去向同学请教,要知道只有互相的交流,互相的思考才能解决问题提高自己。附录附录1 程序代码/*函数功能:温度转换*/bit reset(void) /初始化ds18b20 bit err; dq=0; delay15(40);/在数据线上产生600us的低电平 dq=1;/数据线拉高 delay15(6);/延时60us err=dq;/读取数据线状态,err=0:复合成功;err=1:复合失败 delay15(18); return(err); void wrbyte(uchar d)/向ds18b20写入一个字节 uchar i; dat=d; for(i=8;i0;i-)/循环写8位(先低位,后高位) dq=0;/产生15us的负脉冲 delay15(1); dq=dat0;/将当前数据位送数据线 dat=dat1;/将下一位要写入的数据移到最低位 delay15(1);/延时15us dq=1;/数据线拉高,为写入下一位做准备 uchar rdbyte(void) /从ds18b20读取一个字节 uchar i; dat=0;/读出数据初值为0 for(i=8;i0;i-)/循环读8位(先低位,后高位) dat=dat1;/读出数据先右移一位dq=0;_nop_();/产生1us的负脉冲 dq=1;/数据总线拉高 delay15(1);/延时15us dat7=dq;/读取数据 delay15(4);/延时,为读下一位做准备 return(dat); void convert(void) /启动ds18b20开始温度转换 bit err; err=reset(); /复位传感器 wrbyte(0xcc); /跳过多传感器识别 wrbyte(0x44); /启动温度转换 int readt(void)/读取ds18b20暂存器中的温度值 uchar h,l; bit err; err=reset(); /复位传感器 wrbyte(0xcc); /跳过多传感器识别 wrbyte(0xbe); /读暂存器指令 l=rdbyte(); /读温度低位 h=rdbyte(); /读温度高位 return(h*256+l); /*函数功能:定时器中断*/void time0(void) interrupt 1 th0 = -250;/定时时间为 50ms tl0 = -250; count+; if(count=4000) count=0; time2+; if(time2=60) time2=0; time1+; if(time1=60) time1=0; time0+; if(time0=24) time0=0; /*功能:以filldata充填液晶屏*/void lcd_dispfill(uchar filldata) uchar x, y; lcd_wrcmd(cs1,lcd_startrow); lcd_wrcmd(cs2,lcd_startrow); for(y=0; y8; y+) lcd_wrcmd(cs1,lcd_addrstry+y); lcd_wrcmd(cs1,lcd_addrstrx); lcd_wrcmd(cs2,lcd_addrstry+y); lcd_wrcmd(cs2,lcd_addrstrx); for(x=0; x64; x+) lcd_wrdat(cs1,filldata); lcd_wrdat(cs2,filldata); /*功能:液晶模块初始化*/void lcd_dispini(void) uint i; lcd_rst = 0; for(i=0; i500; i+); lcd_rst = 1; lcd_wrcmd(cs1,lcd_dispon); lcd_wrcmd(cs1,lcd_startrow); lcd_wrcmd(cs2,lcd_dispon); lcd_wrcmd(cs2,lcd_startrow); lcd_dispfill(00); lcd_wrcmd(cs1,lcd_addrstry+0); lcd_wrcmd(cs1,lcd_addrstrx+0); lcd_wrcmd(cs2,lcd_addrstry+0); lcd_wrcmd(cs2,lcd_addrstrx+0);/*功能:/在液晶屏的cy(0-7)行、cx(0-15)列显示字符dispdata*/void lcd_dispchar(uchar cy, uchar cx, char dispdata) uchar code *pch; uchar i; bit port; cy = cy&0x07; cx = cx&0x0f; pch = &ascii_tab(dispdata-0x20)*5; if( (cx&0x08) = 0 ) port=cs1; i=cx3; else port=cs2; i = (cx&0x07)3; lcd_wrcmd(port,lcd_addrstrx+i); lcd_wrcmd(port,lcd_addrstry+cy); for(i=0; i5; i+); lcd_wrdat(port,0x00); for(i=0; i5; i+) lcd_wrdat(port,*pch); pch+; lcd_wrdat(port,0x00); for(i=0; i15) cy+; /*功能:在液晶屏cy,cx位置显示汉字字符*/void lcd_disphz(uchar cy, uchar cx, uchar dispdata) /显示 uchar code *pdat; uchar i,s,page; bit port; cy = cy&0x03; cx = cx&0x07; pdat = &hztabdispdata*32; if( (cx&0x04) = 0 ) port=0; s=cx4; else port=1; s = (cx4)-64; for(page=0;page2;page+) lcd_wrcmd(port,lcd_addrstrx+s); lcd_wrcmd(port,lcd_addrstry+(cy1)+page); for(i=0; i5; i+); for(i=0; i16; i+) lcd_wrdat(port,*pdat); pdat+; for(i=0; i7) cy+; cx=0; /*功能:读取键值*/uchar getkey(void)uchar key; uchar t; if(key=p2&0xf0)=0xf0) return 0xff; for(t=0;t5;t+) delay(5); if(key=p2&0xf0)=0xf0) return 0xff; while(p2&0xf0)!=0xf0) delay(5); if(t100)&(key=0xe0) return 0xe1; return key;/*功能:时间处理,浇灌次数及在液晶屏上显示程序*/void shows(void) if(time0=0) /如果时为0,则显示:分、秒lcd_dispdat(3,9,time1);lcd_dispstr(3,11,m); /字符:m(分)lcd_dispdat(3,12,time2);lcd_dispstr(3,14,s ); /字符: s(秒)elselcd_dispdat(3,9,time0);lcd_dispstr(3,11,h); /字符:h(时)lcd_dispdat(3,12,time1);lcd_dispstr(3,14,m );/字符: m(分)/*功能:修改浇灌时间和间隔时间*/void edittime(void)uchar no=0; uchar col=0; uchar key; lcd_dispdat(2*no+3,4*col+6,dbufnocol); while(1) key=getkey(); if(key=kinc) /+ dbufnocol+; lcd_dispdat(2*no+3,4*col+6,dbufnocol); else if(key=kdec) /- dbufnocol-; lcd_dispdat(2*no+3,4*col+6,dbufnocol); else if(key=kset) lcd_dispdat(2*no+3,4*col+6,dbufnocol); col=(col+1)&0x01; lcd_dispdat(2*no+3,4*col+6,dbufnocol); else if(key=kdown) lcd_dispdat(2*no+3,4*col+6,dbufnocol); no=(no+1)&0x01; col=0; lcd_dispdat(2*no+3,6,dbufnocol); else if(key=kset_long) chang=dbuf00; chang_jg=dbuf10; high=dbuf01; high_jg=dbuf11; lcd_dispini(); break; /*功能:主函数*/void main(void)

温馨提示

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

评论

0/150

提交评论