基于NRF24L01和HC-05在51单片机平台的无线控制插座.docx_第1页
基于NRF24L01和HC-05在51单片机平台的无线控制插座.docx_第2页
基于NRF24L01和HC-05在51单片机平台的无线控制插座.docx_第3页
基于NRF24L01和HC-05在51单片机平台的无线控制插座.docx_第4页
基于NRF24L01和HC-05在51单片机平台的无线控制插座.docx_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

福州大学单片机系统设计实践报告标题:基于NRF24L01和HC-05在51单片机平台的无线控制插座学院:物理与信息工程学院专业: 电子科学与技术 班级: XXXX 学号: XXXXXXXX 组员姓名: XXXXX 指导老师: XXXXXX 2016-2017年第一学期(2017-1-13)目录一、设计题目.1二、系统功能.2三、主要元件.3四、小组分工.0五、程序框图.8六、程序代码.11七、实物展示.11 八、主要难点.8九、完成情况.8十、心得体会.10附录:数字电子钟摘要:智能手机的普及使之成为一种非常合适的智能家居控制终端。提出并实现了一种基于智能手机的无线电源插座方案使用智能手机上的应用程序通过蓝牙来控制电源插座的开关、定时开关、获取插座运行数据并以图表展示等。方案包括无线电源插座的硬件电路设计和STM32控制NRF24L01发送、51单片机控制NRF24L01接收。关键词:Android,蓝牙,智能插座,应用程序,智能家居,STM32,NRF24L01Abstract:The popularity of smart mobile phone makes it become a kind of intelligent Home Furnishing very suitable control terminal. And proposes a method based on intelligent mobile phone wireless power socket scheme - use of intelligent mobile phone on the application via Bluetooth to control the power supply socket switch, timer switch, socket access operation data and to chart the hardware display and so on. The circuit design and STM32 including wireless power socket control nRF24L01 transmission control 51 single-chip nRF24L01 receiver. Keywords: Android, Bluetooth, smart outlet, app, smart home, stm32, nrf24l011、 设计要求1. 设计任务提出一种无线遥控智能插座的设计方案。该插座综合应用了单片机技术和无线电遥控技术,具有无线电指令接收和状态返回的功能。该插座已应用于智能住宅的远程监控系统中,用户在远离住宅的情况下,可以通过遥控器或手机操纵住宅中的智能电话终端,发送无线电指令控制插座,从而实现对家用电器设备的远程控制。2. 具体内容该无线插座是利用HC-05蓝牙模块连接手机以及使用NRF24L01无线模块连接STM32控制51单片机,51单片机控制继电器220V开关的插座。3. 应用方向无线插座是指利用控制板和电子元器件的组合及编程实现电路智能开关的控制。无线插座被广泛应用于家居智能化改造、办公室智能化改造、工业智能化改造、农林渔牧智能化改造等多个领域,提高生产效率,降低运营成本,真正做到远程控制。由于智能手机的普及,因此智能手机与无线插座有了完美的结合,通过手机控制家里的插座,就可以实现我们日常最常用的远程智能控制开关。2、 系统整体设计1. 系统总体框图及工作流程基于智能手机的无线电源插座主要分为两个部分,电源插座的硬件电路设计和STM32控制NRF24L01发送、51单片机控制NRF24L01接收。电源插座的硬件电路主要包括电源转换模块、单片机、STM32、继电器、按键和无线传输模块等部分;智能手机上的应用程序主要实现以下功能:与电源插座无线相连、发送数据、单片机接收数据、控制电源开关等。系统总体方案示意图如图所示。220V电源通过5V变压器模块给51单片机供电,51单片机与NRF24L01和HC-05模块连接用来接收数据,手机蓝牙发送数据,STM32通过NRF24L01发送数据,最后都通过51单凭机接受数据来控制继电器开关,最后实现远程电源开关。2. 系统设计中的重要原理a) 无线通信原理简述与有线传输相比,无线传输具有许多优点。或许最重要的是,它更灵活。无线信号可以从一个发射器发出到许多接收器而不需要电缆。所有无线信号都是随电磁波通过空气传输的,电磁波是由电子部分和能量部分组成的能量波。信号通过空气传播,直到它到达目标位置为止。在目标位置,另一个天线接收信号,一个接收器将它转换回电流。接收和发送信号都需要天线,天线分为全向天线和定向天线。在信号的传播中由于反射、衍射和散射的影响,无线信号会沿着许多不同的路径到达其目的地,形成多径信号。3. 无线通信方案选择由系统总体方案示意图可以看出, 智能手机与电源插座之间的无线通信是实现整个系统控制的关键。 常见的无线通信方案有红外、蓝牙、ZigBee、RFID、NFC、WiFi、GSM、等,这几种无线通信方案的技术参数对比如表 1 所示。目前,主流的智能手机中都具有蓝牙 、WiFi、NFC 和 GSM等通信功能,根据用户的易用度和智能插座的控制需求,我们采用了NRF24L01和蓝牙两种方案, 分别将 NRF24L01 型智能插座和蓝牙型智能插座集成在一起,适用于远程控制和家庭使用,适用于无网络条件下的近距离遥控。本文主要介绍蓝牙兼NRF24L01智能插座的设计和实施方案。蓝牙作为一种短距离无线通信技术,能够在移动电话、无线耳机、笔记本电脑、打印机等设备间方便进行信息交换。下面将详细介绍基于智能手机和STM32的无线电源插座软硬件设计和实施。 4. 主要模块a) 继电器i.电磁继电器的工作原理工作原理:电磁铁通电时,把衔铁吸下来使D和E接触,工作电路闭合。电磁铁断电时失去磁性,弹簧把衔铁拉起来,切断工作电路。结论:电磁继电器就是利用电磁铁控制工作电路通断的开关。用电磁继电器控制电路的好处:用低电压控制高电压;远距离控制;自动控制。b) 220V转5V如图,变压器次级输出9交流电,经4个1N4007整流后、滤波输入三端稳压7805,输出稳定的5伏直流电压,5伏电压再经3个串联的二极管降压后,得到3伏电。电路简单、可靠。注意,图上点3即可输出5伏直流电。5. 关键器件的原理、参数a) NRF24L01NRF24L01 是 NORDIC 公司最近生产的一款无线通信通信芯片,采用 FSK 调制,内部集成 NORDIC 自己的 Enhanced Short Burst 协议。可以实现点对点或是 1 对 6 的无线通信。无线通信速度可以达到 2M( bps)。 NORDIC 公司提供通信模块的 GERBER 文件,可以直接加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留 5 个 GPIO, 1 个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为 MCU 系统构建无线通信功能。 NRF24L01 的框图如 Fig.1 所示,从单片机控制的角度来看,我们只需要关注 Fig.1 右面的六个控制和数据信号,分别为 CSN、 SCK、 MISO、 MOSI、 IRQ、 CE。CSN:芯片的片选线, CSN 为低电平芯片工作。SCK:芯片控制的时钟线( SPI 时钟)MISO:芯片控制数据线( Master input slave output)MOSI:芯片控制数据线( Master output slave input)IRQ:中断信号。无线通信过程中 MCU 主要是通过 IRQ 与 NRF24L01 进行通信。CE: 芯片的模式控制线。 在 CSN 为低的情况下, CE 协同 NRF24L01 的 CONFIG 寄存器共同决定 NRF24L01 的状态(参照 NRF24L01 的状态机)。 NRF24L01 的状态机见 Fig.2 所示,对于 NRF24L01 的固件编程工作主要是参照NRF24L01 的状态机。主要有以下几个状态Power Down Mode:掉电模式Tx Mode:发射模式Rx Mode:接收模式Standby-1Mode:待机 1 模式Standby-2 Mode:待机 2 模式上面五种模式之间的相互切换方法以及切换所需要的时间参照 Fig.2。 对 24L01 的固件编程的基本思路如下:1) 置 CSN 为低,使能芯片,配置芯片各个参数。(过程见 3.Tx 与 Rx 的配置过程)配置参数在 Power Down 状态中完成。2) 如果是 Tx 模式,填充 Tx FIFO。3) 配置完成以后,通过 CE 与 CONFIG 中的 PWR_UP 与 PRIM_RX 参数确定 24L01要切换到的状态。Tx Mode: PWR_UP=1; PRIM_RX=0; CE=1 (保持超过 10us 就可以);Rx Mode: PWR_UP=1; PRIM_RX=1; CE=1;4) IRQ 引脚会在以下三种情况变低:Tx FIFO 发完并且收到 ACK(使能 ACK 情况下)Rx FIFO 收到数据达到最大重发次数将 IRQ 接到外部中断输入引脚,通过中断程序进行处理。 b) HC-05蓝牙模块BT-HC05模块是一款高性能的蓝牙串口模块。6. 系统独特性该系统实现了STM32与51单片机的相互通信,并且能和手机蓝牙交互控制,目前市场上都是用zeebig和Arduino实现WIFI通信,而我的模块可以使用两种方式控制,又是用简单的51单片机,价格便宜。与同学们相比有自主创作的优势,而无雷同,包装完好,系统的可执行性高,出错率低。并且我的系统实现了电磁波控制小电,小电控制大电,我想这是我的又一个独特性。3、 软硬件设计1. 硬件电路图2. 主要元件清单a) 插座b) 220V转5V模块c) 5V转3.3V稳压模块d) STC89LE52RC单片机e) 5V继电器f) NRF24L01无线模块g) HC-05蓝牙模块h) STM32单片机i) LED小灯3. 软件程序框图4、 调试及结果1. 调试条件方法a) 在插座上插上所需要控制的电器,打开手机蓝牙,发送事先准备好的信号,控制插座的开关,以至于控制插座上的电器。b) 在插座上插上所需要控制的电器,给STM32供电,按下按键,发送事先准备好的信号,控制插座的开关,以至于控制插座上的电器。2. 具体实现功能a) 手机控制220V电源开关b) STM32控制220V电源开关5、 系统存在问题分析1. 主要难点NRF24L01模块的理解与代码的编写。2. 问题分析与调试通道1调试:发送部分:通道1其实不只是把通道0程序里有关通道0的部分直接改成通道1的那么简单,别的通道更麻烦一点,这就是很多人调不通的原因。我刚开始也是直接改的,果然失败了,然后又去看原来的程序,看到发送的数据不论是哪个通道,都装给了通道0的地址,不知道为什么,但是实验证明,确实必须这样其中TX_ADDR地址要和发送的地址一样。1. /*装载数据*/2. SPI_Write_Buf(WRITE_REG + TX_ADDR, (uint8_t*)ADDRn, TX_ADR_WIDTH);/写TX节点地址 3.SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, (uint8_t*)ADDRn, RX_ADR_WIDTH); /设置TX节点地址,主要为了使能ACK 不论通道是几,其中要改动的只有(uint8_t*)ADDRn这个东西,其实就是对应的通道地址。不要动RX_ADDR_P0。然后是寄存器配置,注释有这么一行:“要配置第N个的通道,前N个通道也必须被配置,要不然配置不成功。瞬间恍然大悟,上回太心急,拿了程序就走了正如代码所示:1. SPI_Write_Reg(WRITE_REG + EN_AA, 0x3f); /使能通道所有的自动应答 2. SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3f);/使能通道所有的接收地址 这个是发送函数void NRF24L01_Init_TX(uint8_t*ADDRn)里的一段,作者把所有通道都打开了。其实经过试验,这里的通道必须把当前配置的通道和它前面的都配置。比如现在是通道1,就要至少使能为0x03,而不能是只打开通道1的0x02。下面的选择通道n有效数据宽度,实验证明没有用,我一次只发1个字节,宽度设置成32,发过来还是1个字节所以可以去掉。不过留着也不会出错。接收部分:首先经过试验,不设置TX_ADDR和RX_ADDR_P0没出错,所以可以去掉。但是然后发生了奇怪的问题,经过大量试验,我这里通道1地址设置完了以后还要重新设置低位地址,不然没法调通,不知道为什么。如代码所示:SPI_Write_Buf(WRITE_REG +RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); /设置RX节点地址,主要为了使能ACK SPI_Write_Buf(WRITE_REG +RX_ADDR_P1, RX_ADDRESS1, 1);/设置RX节点地址,主要为了使能ACK 后面的就是很正常的设置了,可以只开对应通道,比如通道1:0x02,对应数据宽度什么的不用管别的通道怎么样。如果想多对一通信,只需增加相应通道即可。3. 改进及加强后期可以增加WIFI模块,实现各种通信控制,建立智能家居网关。Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE802.11b.g.n协议栈以及TCP/IP协议栈。传统的硬件设备嵌入Wi-Fi模块可以直接利用Wi-Fi联入互联网,是实现无线智能家居、M2M等物联网应用的重要组成部分。6、 心得体会由于这个学期的课业学习任务重,不得不提前开始准备,而在大二的时候我的脑袋已经有了这个想法,而在每次考试完成好,我都一点一点地实践,可以说这个东西还占据了我国庆的时间,所谓煞费苦心,不过这个结果还是让我满意的,并且是我独立完成的,查找各种网络资料和书本一点一点地搭建起来的。附:硬件实物图,软件清单(作部分解释)a) 硬件实物图b) 软件清单#include #include typedef unsigned char uchar;typedef unsigned char uint;uchar num,a;/*IO端口定义*sbit CSN =P20; /SPI 片选使能,低电平使能sbit MOSI =P21; /SPI串行输入sbit IRQ =P22; /中断.低电平使能sbit MISO =P23; /SPI串行输出sbit SCK =P24; /SPI时钟sbit CE =P25; /芯片使能,高电平使能sbit SWICH =P26;uchar TxBuf32;/*按键*sbit KEY1=P32;sbit KEY2=P33;sbit KEY3=P36;/*LED*sbit led0=P10;sbit led1=P11;sbit led2=P12;sbit led3=P13;/*NRF24L01*nRF24L01 的基本思路就是通过固定的时序与命令,控制芯片进行发射与接收。 #define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX address width#define TX_PLOAD_WIDTH 32 / 20 uints TX payload#define RX_PLOAD_WIDTH 32 / 20 uints TX payloaduint const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /本地地址uint const RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /接收地址/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define MAX_TX 0x10 /达到最大发送次数中断#define TX_OK 0x20 /TX发送完成中断#define RX_OK 0x40 /接收到数据中断#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道1接收数据长度#define RX_PW_P2 0x13 / 接收频道2接收数据长度#define RX_PW_P3 0x14 / 接收频道3接收数据长度#define RX_PW_P4 0x15 / 接收频道4接收数据长度#define RX_PW_P5 0x16 / 接收频道5接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);uchar nRF24L01_TxPacket(unsigned char * tx_buf);uchar KEY_Scan(uchar mode); /按键扫描函数void delayms(unsigned int x);void delayms(unsigned int x) /延时 unsigned char i; while(x-) for(i = 0; i 113; i+);/*长延时*void Delay(unsigned int s) unsigned int i; for(i=0; is; i+); for(i=0; i0;n-) _nop_();/*/*NRF24L01初始化/*/void init_NRF24L01(void) /inerDelay_us(100); CE=0; / chip enable CSN=1; / Spi disable SCK=0; / Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频道0自动 ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 40); / 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); /设置发射速率为1MHZ,发射功率为最大值0dB SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送/*/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/*/uint SPI_RW(uint uchar) uint bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit MOSI = (uchar & 0x80); / output uchar, MSB to MOSI uchar = (uchar 1); / shift next bit into MSB. SCK = 1; / Set SCK high. uchar |= MISO; / capture current MISO bit SCK = 0; / .then set SCK low again return(uchar); / return read uchar最基本的函数,完成 GPIO 模拟 SPI 的功能。将输出字节( MOSI)从 MSB 循环输出,同时将输入字节( MISO)从 LSB 循环移入。上升沿读入,下降沿输出。(从 SCK 被初始化为低电平可以判断出)。 /*/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序/*/uchar SPI_Read(uchar reg) uchar reg_val; CSN = 0; / CSN low, initialize SPI communication. SPI_RW(reg); / Select register to read from. reg_val = SPI_RW(0); / .then read registervalue CSN = 1; / CSN high, terminate SPI communication return(reg_val); / return register value读取寄存器值的函数:基本思路就是通过 READ_REG 命令(也就是 0x00+寄存器地址),把寄存器中的值读出来。对于函数来说也就是把 reg 寄存器的值读到 reg_val 中去。 /*/*功能:NRF24L01读写寄存器函数/*/uint SPI_RW_Reg(uchar reg, uchar value) uint status; CSN = 0; / CSN low, init SPI transaction status = SPI_RW(reg); / select register SPI_RW(value); / .and write value to it. CSN = 1; / CSN high again return(status); / return nRF24L01 status uchar寄存器访问函数:用来设置 24L01 的寄存器的值。基本思路就是通过 WRITE_REG 命令(也就是 0x20+寄存器地址)把要设定的值写到相应的寄存器地址里面去,并读取返回值。对于函数来说也就是把 value 值写到 reg 寄存器中。需要注意的是,访问 NRF24L01 之前首先要 enable 芯片( CSN=0;),访问完了以后再 disable芯片( CSN=1;)。 /*/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0; / Set CSN low, init SPI tranaction status = SPI_RW(reg); / Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctruchars;uchar_ctr+) pBufuchar_ctr = SPI_RW(0); / CSN = 1; return(status); / return nRF24L01 status uchar接收缓冲区访问函数:主要用来在接收时读取 FIFO 缓冲区中的值。基本思路就是通过READ_REG 命令把数据从接收 FIFO( RD_RX_PLOAD)中读出并存到数组里面去。 /*/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr; CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctruchars; uchar_ctr+) / SPI_RW(*pBuf+); CSN = 1; /关闭SPI return(status); / 发射缓冲区访问函数:主要用来把数组里的数放到发射 FIFO 缓冲区中。基本思路就是通过WRITE_REG 命令把数据存到发射 FIFO( WR_TX_PLOAD)中去。 /*/*函数:void SetRX_Mode(void)/*功能:数据接收配置 /*/void SetRX_Mode(void) CE=0; SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CRC ,主接收 CE = 1; inerDelay_us(130);/*/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/*/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0; sta=SPI_Read(STATUS); / 读取状态寄存其来判断数据接收状况 if(

温馨提示

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

评论

0/150

提交评论