Proteus仿真环境下51单片机串口通信实战

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本课程将深入指导学员如何在Proteus软件中模拟51单片机的串口通信过程,并结合keil源程序进行调试。首先,详细介绍了51单片机的串口通信基础,包括串口配置和波特率设置。然后,讲解在keil C51环境下编写串口初始化、数据发送和接收函数,并在Proteus中搭建电路和加载程序,实现数据传输的仿真。最后,通过分析串口通信中可能遇到的问题,并进行仿真修正,以提高通信协议的准确性和调试效率。 proteus 仿真51单片机串口通讯

1. 51单片机串口通信基础

1.1 单片机串口通信概述

单片机的串口通信是一种基本的数据交换方式,广泛用于设备之间的信息交互。理解其基本原理和编程方法对于IT及电子行业的专业人士至关重要。

1.2 51单片机的串口特性

51单片机,也称为8051微控制器,具备内置的串行通信接口,通过串口编程,可以让单片机与计算机或其他单片机进行数据交换。本章将简述串口通信的基础知识,包括串口的工作模式、如何配置和初始化串口等。

1.3 串口通信的数据格式

为了确保数据能够被正确发送和接收,我们必须了解数据帧的格式,包括起始位、数据位、停止位以及可选的校验位。此部分将详细介绍这些参数的配置以及在数据传输中的作用。

2. Proteus软件介绍及应用

2.1 Proteus软件概述

2.1.1 Proteus的发展与特点

Proteus是一款在电子设计自动化(EDA)领域内广泛使用的仿真软件,由英国Labcenter Electronics公司开发。它最初是作为印刷电路板(PCB)设计工具而开发的,但随着版本的更新,Proteus逐渐整合了电路仿真功能,并在这一领域取得了显著的地位。Proteus的特点主要在于其能够提供从原理图设计到PCB布局的完整解决方案,同时还包括了对微处理器的仿真实验功能。

Proteus的仿真功能尤为突出,用户可以在不制作实际硬件的情况下,测试和验证电路设计的正确性。它支持众多的微控制器,包括流行的51单片机、AVR、PIC等,通过软件内的模拟器实现这些控制器的运行环境。此外,Proteus还提供了丰富的组件库,方便用户在设计电路时可以快速选择和使用各种电子元件。

2.1.2 Proteus的主要功能与组件

Proteus软件主要功能包括原理图设计、PCB布局设计以及电路仿真。在原理图设计方面,Proteus提供了直观的界面和拖放式操作,用户能够轻松创建和修改电路设计。而PCB布局设计则支持多种规则设置,保证设计的电路板能够满足生产和应用的实际需要。

软件中的仿真功能是其最为强大的特色之一,用户能够利用Proteus进行电子电路的动态仿真,并观察电路的实时工作状态。Proteus提供了虚拟仪器,例如示波器、逻辑分析仪等,这些都是在电路设计和测试中不可或缺的工具。

为了方便用户使用,Proteus软件还包含了一个庞大的组件库。组件库中不仅包括了基本的电子元件如电阻、电容、二极管等,还包括了复杂的集成电路(ICs)、微控制器、功率器件等。用户在设计电路时,可以从库中选取所需的组件进行拖拽添加到设计中,并进行相应的配置和连接。

2.2 Proteus在单片机教学中的应用

2.2.1 教学场景下的Proteus优势

在单片机教学领域,Proteus的应用具有明显的优势。首先,它提供了可视化的设计界面,可以直观地展示电路的工作过程,有助于学生更好地理解理论知识。此外,由于Proteus支持电路仿真,学生可以在没有实际硬件的情况下进行实验,这降低了学习成本,并提高了实验效率。

利用Proteus进行教学还可以大大增强学生的实践操作能力。在软件中,学生可以自由地修改电路设计,并立即查看到修改后的效果,从而加深了对电路设计和单片机编程的理解。此外,Proteus还支持创建自定义的测试项目,教师可以设计特定的任务或者问题,让学生在仿真环境中探索解决方案。

2.2.2 实例展示:Proteus在教学中的具体应用

在单片机教学中,Proteus的使用可以从简单的LED闪烁程序开始,逐步过渡到更复杂的项目。例如,教授51单片机的初学者可以从设计一个点亮LED灯的电路开始,然后逐步引导学生学习如何使用按键控制LED灯的开关,以及如何编写代码来实现定时器控制LED灯的闪烁。

在进行教学时,可以首先利用Proteus设计一个包含51单片机和LED灯的电路原理图,然后将编写的代码加载到Proteus软件中的单片机模型中进行仿真测试。在仿真过程中,教师可以展示如何使用软件内的虚拟示波器来观察单片机的I/O端口波形,以及如何使用逻辑分析仪来分析程序的运行情况。这种实践操作让学生对单片机编程和电路设计有了直观的认识,并为他们今后深入学习和探索单片机技术打下了坚实的基础。

2.3 Proteus与硬件仿真结合

2.3.1 硬件仿真在教学和设计中的重要性

硬件仿真作为一种无实际硬件风险的测试手段,在教学和电路设计中扮演着非常重要的角色。通过仿真,设计者能够验证设计的正确性,发现潜在的问题并及时修改,从而避免了反复制作和测试硬件板子的高成本和时间损耗。

在教学方面,硬件仿真有助于学生理解抽象的理论概念。例如,学生可以在仿真环境中观察电容充电和放电的动态过程,而不需要搭建复杂的实验电路。此外,仿真环境的使用也可以让学生有机会在更安全和可控的条件下进行测试,降低了实验过程中可能产生的安全风险。

2.3.2 Proteus软件的硬件仿真能力

Proteus软件在硬件仿真方面具有强大的功能。它不仅提供基本的电路仿真,还集成了多个功能强大的仿真工具,如信号发生器、数字逻辑分析仪、虚拟示波器等,使得用户能够进行深入的电路分析和测试。

使用Proteus进行硬件仿真时,用户可以从软件提供的众多微控制器模型中选择需要的单片机进行仿真。用户需要做的是,将写好的程序代码加载到软件中的微控制器模型里,然后运行仿真,软件将会模拟微控制器的行为以及电路的响应。

为了便于用户分析仿真结果,Proteus提供了多种数据输出和分析的视图。用户可以查看波形图、参数列表和数据表格等多种形式的输出数据。通过这些数据,用户可以分析电路的工作状态,检查程序的运行是否符合预期,从而进行必要的调整和优化。

Proteus软件的硬件仿真功能极大地简化了电路设计和验证的过程,让复杂的电路设计变得更加容易和高效。通过硬件仿真,用户不仅可以减少设计失误,还可以在产品上市前确保电路的可靠性和性能,这对于减少实际生产成本和缩短产品开发周期都具有重大意义。

3. Keil C51编程环境构建与使用

3.1 Keil C51环境搭建

3.1.1 Keil C51的安装和配置步骤

Keil C51是专门用于8051微控制器家族的集成开发环境(IDE)。它支持C语言和汇编语言的编写,编译和调试,是开发单片机项目的强大工具。以下是Keil C51环境搭建的详细步骤:

  1. 从Keil官网下载最新版本的Keil C51安装包。
  2. 运行安装程序,按照安装向导的指示完成安装过程。
  3. 安装完成后,启动Keil uVision IDE。
  4. 在软件启动时,可能会提示你选择产品安装路径,确认或修改后点击"OK"继续。
  5. 选择"Project"菜单下的"New uVision Project"创建新项目。
  6. 在弹出的对话框中选择合适的位置保存项目,并给项目命名。
  7. 接下来,在Device Database中选择对应的51系列单片机型号,点击"OK"完成。
  8. 创建项目后,用户需要配置项目选项,例如选择晶振频率、设置调试器等。

3.1.2 Keil C51的项目管理与创建

创建项目后,Keil C51允许用户高效地管理他们的代码文件,源文件和库文件。项目的管理是通过项目窗口进行的,所有添加到项目的文件都在这里显示。下面是创建和管理Keil C51项目的基本步骤:

  1. 在项目窗口中,右键点击项目名,选择"Add New Item to Group 'Source Group 1'"。
  2. 在弹出的对话框中,选择添加的文件类型,如C File、Assembly File等。
  3. 命名新文件并点击"Add",之后,新文件就会添加到项目中。
  4. 可以通过双击文件名在代码编辑器中打开文件进行编辑。
  5. 编写代码后,使用"Save"按钮或按Ctrl+S快捷键保存文件。
  6. 点击工具栏上的"Build"按钮开始编译项目,如果编译无误,会显示"0 Error(s), 0 Warning(s)"。
  7. 如果需要,可以通过"Debug"或"Download"按钮将程序下载到单片机或进行仿真。

3.2 Keil C51的基本编程技巧

3.2.1 C语言基础在51单片机编程中的应用

C语言作为一种结构化编程语言,在51单片机编程中十分常见,因其具有高度的可移植性、可读性和可维护性。在51单片机中使用C语言编程时,可以利用其丰富的库函数和模块化编程特点,简化开发过程。以下是一些基础的应用:

  1. 数据类型和变量的定义 :51单片机使用C语言时,数据类型与标准C语言略有不同,如使用bit类型定义位变量,使用sbit定义特殊功能位。
  2. 控制结构 :使用if-else、switch-case、for、while、do-while等控制结构进行流程控制。
  3. 函数的定义与调用 :将常用的代码块编写为函数,实现代码的重用。

一个简单的例子:

#include <reg51.h> // 包含51单片机寄存器定义的头文件

sbit LED = P1^0; // 将P1.0定义为LED控制位

void delay(unsigned int ms) {
    unsigned int i, j;
    for(i=ms; i>0; i--)
        for(j=120; j>0; j--); // 简单的延时函数
}

void main() {
    while(1) {
        LED = 0; // 点亮LED
        delay(1000); // 延时大约1秒
        LED = 1; // 熄灭LED
        delay(1000); // 延时大约1秒
    }
}

3.2.2 常用单片机编程指令和编程范例

在51单片机编程中,除了标准C语言指令外,还需要了解一些特定于单片机的指令,这些指令可以直接操作硬件。例如:

  1. 位操作指令 :SETB、CLR用于位变量的置位和清零操作。
  2. 寄存器操作 :使用直接地址、间接地址和寄存器间接寻址模式访问和操作特殊功能寄存器(SFR)。
  3. 定时器/计数器指令 :使用SETB、CLR等指令控制定时器/计数器的启动和停止。

一个简单的编程范例:

#include <reg51.h>

void timer0_init() {
    TMOD |= 0x01; // 设置定时器0为模式1
    TH0 = 0xFC;   // 设置定时器初值
    TL0 = 0x18;
    TR0 = 1;      // 启动定时器0
}

void main() {
    timer0_init(); // 初始化定时器0

    while(1) {
        if (TF0) { // 检查定时器溢出标志位
            TF0 = 0; // 清除溢出标志位
            // 定时器溢出时执行的代码
            // 比如翻转一个LED的状态等
        }
    }
}

3.3 Keil C51的高级编程技巧

3.3.1 中断服务程序的编写与调试

中断服务程序是响应单片机内部或外部中断信号的代码段。编写中断服务程序需要掌握中断系统的初始化、中断向量的配置以及中断服务例程的编写方法。以下是编写中断服务程序的基本步骤:

  1. 中断系统初始化 :设置IE(中断使能寄存器)和IP(中断优先级寄存器),配置中断源和中断优先级。
  2. 中断向量配置 :配置中断向量地址,确保中断服务程序能被正确调用。
  3. 编写中断服务例程 :在中断服务例程中编写中断响应代码。

一个简单的中断服务程序示例:

#include <reg51.h>

void External0_ISR(void) interrupt 0 { // 外部中断0的中断服务程序
    // 中断处理代码
}

void main() {
    IT0 = 1; // 设置INT0为边沿触发模式
    EX0 = 1; // 允许外部中断0中断
    EA = 1;  // 允许全局中断

    while(1) {
        // 主循环代码
    }
}

3.3.2 代码优化和性能分析方法

编写代码不仅要完成任务,还要考虑其效率和资源使用。在Keil C51中编写高效代码需要进行性能分析和优化:

  1. 资源使用优化 :合理使用内存,避免不必要的数据存储。
  2. 循环优化 :尽量减少循环内的计算量,减少循环嵌套层数。
  3. 代码重用 :通过编写通用函数,减少重复代码,使程序结构清晰。

性能分析工具可以帮助开发者了解程序的运行情况,并找出瓶颈,例如Keil MDK-ARM提供了性能分析工具(如 Execution Profiler)可以分析代码的执行时间。

一个性能优化的例子:

// 优化前的代码可能在主循环中重复执行某些计算

void main() {
    while(1) {
        // 复杂的计算过程
        compute_expensive();
    }
}

// 优化后的代码将计算结果存储起来,避免重复计算

unsigned char computed_value = 0;

void main() {
    while(1) {
        if (computed_value == 0) {
            computed_value = compute_expensive();
        }
        // 使用computed_value进行操作
    }
}

代码优化是一个持续的过程,需要不断地分析和改进,以达到最佳性能。

4. 单片机串口配置与编程实践

4.1 串口通信原理与配置

4.1.1 串口通信的基本概念

串口通信是指计算机或微控制器与其它设备之间通过串行通讯线路,按位顺序传输数据的一种通信方式。在单片机领域,串口通信是最常见的通信方式之一,它允许单片机与PC、其他单片机或外围设备进行数据交换。

串口通信分为同步和异步两种模式。异步模式不需要额外的时钟信号来同步数据传输,因此在单片机应用中更为普遍。在异步模式下,数据通常以帧(frame)的形式发送,每个帧包含起始位、数据位、可选的奇偶校验位和停止位。

4.1.2 51单片机串口工作模式与配置方法

51单片机的串口工作模式共有四种,由串口控制寄存器SCON和串口控制位SM0、SM1决定。以下是对这四种模式的简要说明:

  • 模式0:同步移位寄存器方式,8位数据,波特率固定。
  • 模式1:8位UART可变波特率。
  • 模式2:9位UART可变波特率,固定波特率。
  • 模式3:9位UART可变波特率。

配置串口时,需要设置SCON寄存器和定时器(通常使用定时器1)来确定波特率。例如,模式1下,可以通过以下代码配置51单片机的串口:

void SerialInit() {
    SCON = 0x50; // 设置为模式1,8位数据,可变波特率
    TMOD |= 0x20; // 设置定时器1为模式2(8位自动重装载)
    TH1 = 0xFD; // 设置波特率9600,假设晶振为11.0592MHz
    TL1 = 0xFD;
    TR1 = 1; // 启动定时器1
    ES = 1; // 开启串口中断
    EA = 1; // 开启全局中断
}

在该段代码中,SCON寄存器被设置为0x50,其中SM0和SM1为01,表示进入模式1。定时器1被配置为8位自动重装载模式,波特率由定时器1决定。TH1和TL1寄存器的值根据晶振频率计算得出,以产生所需的波特率9600。最后,开启串口中断和全局中断,确保能够响应串口中断。

4.2 波特率的设置与调试

4.2.1 波特率的计算和设置要点

波特率是指每秒传输的符号数,对于串口通信而言,通常表示每秒传输的位数(bps)。正确的波特率设置对于串口通信至关重要,错误的波特率会导致数据无法正确解析。

波特率的计算公式依赖于使用的定时器模式以及晶振频率。对于模式1的异步通信,若使用定时器1作为波特率发生器,其计算公式大致为:

波特率 = (2^SMOD / (32 * (256 - TH1))) * 定时器频率

其中,SMOD是PCON寄存器中的位,可以加倍波特率。TH1是定时器1的重装值,定时器频率是晶振频率除以12。

例如,当晶振频率为11.0592MHz时,若想要设定波特率为9600,则SMOD为0,TH1应当设置为0xFD(253):

TH1 = 256 - (FOSC / (12 * 32 * 波特率)) - SMOD;
TH1 = 256 - (11059200 / (12 * 32 * 9600)) - 0;
TH1 = 0xFD;

4.2.2 波特率设置错误的调试方法

当波特率设置错误时,通常表现为接收方无法正确解析发送方发送的数据,这可能造成乱码、数据丢失或接收中断无法触发等问题。调试波特率错误时,可以采取以下步骤:

  1. 检查晶振频率是否正确,因为它是计算波特率的基础。
  2. 验证定时器的配置是否正确,特别注意定时器模式是否与波特率计算公式匹配。
  3. 使用示波器或逻辑分析仪监测串口通信线路上的信号,以观察实际传输的波特率是否与预期一致。
  4. 若使用串口调试助手或终端,尝试调整其波特率设置,以便与设备的实际波特率匹配,从而观察是否能够正确接收数据。

一旦确定了错误点,就可以按照波特率的设置要点重新进行配置,并通过程序发送测试数据,检查是否能正确接收来验证波特率设置。

4.3 串口通信函数编程

4.3.1 发送函数的设计与实现

发送函数的设计需要保证数据按顺序、正确地通过串口发送出去。在51单片机中,发送过程依赖于TI位,即发送中断标志位。当TI位被硬件置为1时,表示上次发送的数据已经完成,可以发送新的数据。

以下是一个简单的发送函数实现:

void UART_SendByte(unsigned char data) {
    SBUF = data; // 将数据写入到串口缓冲寄存器
    while (!TI); // 等待发送完成
    TI = 0; // 清除发送完成标志
}

void UART_SendString(char *str) {
    while (*str) { // 检查字符串是否结束
        UART_SendByte(*str++); // 发送当前字符,并递增指针
    }
}

在此代码中, UART_SendByte 函数负责发送一个字节的数据,它首先将数据写入SBUF寄存器,然后等待直到TI置为1,表示发送完成,最后清除TI标志位,以便于下次发送。 UART_SendString 函数则是用来发送整个字符串的,通过循环调用 UART_SendByte 来逐字节发送字符串直到遇到字符串结束符 \0

4.3.2 接收函数的设计与实现

接收函数需要确保在数据到达时能够及时捕获,并进行处理。在51单片机中,接收过程依赖于RI位,即接收中断标志位。当RI被硬件置为1时,表示SBUF寄存器中已经接收到新的数据。

下面是一个简单的接收函数实现:

unsigned char UART_ReceiveByte() {
    unsigned char received_data;
    while (!RI); // 等待接收到数据
    received_data = SBUF; // 读取数据
    RI = 0; // 清除接收完成标志
    return received_data;
}

void UART_ReceiveString(char *str, unsigned int length) {
    unsigned int i = 0;
    while (i < length) {
        str[i] = UART_ReceiveByte(); // 接收一个字节并存储到字符串中
        if (str[i] == '\r' || str[i] == '\n') { // 检查是否达到字符串末尾
            str[i] = '\0';
            break;
        }
        i++;
    }
}

在此代码中, UART_ReceiveByte 函数负责接收一个字节的数据,它首先等待RI标志位被置为1,然后从SBUF寄存器读取数据,并清除RI标志位。 UART_ReceiveString 函数则用来接收字符串,它在接收数据时检查是否达到指定的长度,或者是否读取到了换行符,这通常表示字符串结束。

以上内容展示了51单片机串口通信配置与编程实践的要点,包括了串口通信原理、波特率的计算与调试以及串口编程函数的设计实现。通过理论分析与代码实践,读者应能更好地理解和运用51单片机串口通信的基础知识。

5. Proteus仿真环境下的串口通信

在学习了51单片机的串口通信原理及配置之后,我们将进一步深入探讨如何在Proteus仿真环境下实现串口通信。Proteus作为一个强大的电路设计与仿真软件,能够让我们在没有硬件的情况下模拟单片机的各种操作,这对于我们学习和测试串口通信程序来说,无疑是一种高效的手段。

5.1 Proteus仿真环境下的电路搭建

5.1.1 Proteus电路设计基础

在Proteus中进行电路设计,首先需要熟悉其界面布局与基本操作。Proteus界面通常包含设计区域、元件库浏览器、属性设置窗口和仿真控制台。通过拖拽元件库中的元件至设计区域,并使用连线工具连接各元件的端口,可以构建出整个电路。在设计串口通信电路时,特别需要注意以下几点:

  • 元件选择: 选择合适的51单片机型号以及串口通信所需的外围设备,例如MAX232电平转换芯片。
  • 电路连接: 准确连接单片机的串口(如P3.0和P3.1对应RXD和TXD)到MAX232,并确保电平转换后的信号能够被仿真软件中的虚拟串口接收器接收。
  • 电源与地线: 为单片机和外围设备提供合适的电源和地线连接。

5.1.2 实例演示:51单片机仿真电路搭建

假设我们正在构建一个基于AT89C51单片机的仿真电路。以下是具体的搭建步骤:

  1. 打开Proteus软件,创建一个新项目。
  2. 从元件库中选择并放置AT89C51单片机元件。
  3. 接着放置两个LED灯、电阻和一个MAX232电平转换芯片。
  4. 将LED灯的正极通过电阻连接到单片机的I/O口(如P1.0和P1.1),负极连接到地。
  5. 将MAX232的T1IN和T1OUT引脚分别连接到单片机的TXD(P3.1)和RXD(P3.0)引脚。
  6. 连接MAX232的电源和地线引脚。
  7. 完成所有连接后,双击AT89C51单片机,打开属性设置窗口,为单片机配置好晶振频率和其他必要的参数。

通过这些步骤,我们已经搭建好了基础的仿真电路。接下来,我们需要在Keil C51中编写程序并加载到Proteus中进行仿真测试。

5.2 程序加载与仿真运行

5.2.1 Keil与Proteus的联合仿真设置

在Keil C51中编写好串口通信程序后,我们需要设置联合仿真环境,以便将程序加载到Proteus中并进行调试。具体步骤如下:

  1. 在Keil中创建新项目,并将编写好的源代码文件加入项目。
  2. 配置工程设置,确保编译器和链接器参数正确无误。
  3. 生成HEX文件,这是程序烧录到单片机时所需的格式。
  4. 打开Proteus,双击单片机元件,浏览并选择刚才生成的HEX文件。
  5. 关闭属性窗口,点击仿真开始按钮运行电路。

5.2.2 程序的加载和仿真运行过程

加载程序到Proteus后,单击仿真运行按钮,电路将开始工作。此时,Keil中的程序也会同步运行。如果一切正常,我们将会看到仿真控制台中显示程序的输出信息,并观察到LED灯的状态变化。

5.3 数据传输过程的观察与分析

5.3.1 仿真中数据传输过程的监视

为了监视数据传输过程,可以在Proteus中设置虚拟串口终端。单击仿真界面中的View菜单,选择Terminal菜单项,然后在弹出的窗口中设置好串口号,并启用该终端。这样,当单片机通过串口发送数据时,我们可以在虚拟终端中看到数据的实时传输情况。

5.3.2 虚拟终端的设置与应用

虚拟终端设置完成后,其应用主要体现在两方面:

  • 数据接收: 通过虚拟终端能够接收并展示单片机发送的数据,便于开发者验证数据内容及传输的正确性。
  • 数据发送: 也可以通过虚拟终端向单片机发送数据,这在测试单片机的接收功能时非常有用。

5.4 串口通信问题的仿真调试

5.4.1 常见串口通信问题及其调试方法

在Proteus的仿真环境中,我们可能会遇到一些常见的串口通信问题,比如数据不传输、传输错误等。解决这些问题时,可以按照以下步骤进行调试:

  1. 检查电路连接: 确保所有的连线正确无误,特别是串口的TX和RX线路。
  2. 检查程序代码: 确认程序中的串口初始化及通信函数代码没有错误。
  3. 设置正确的波特率: 参考第4章内容,确保仿真环境中的波特率设置与程序中配置的波特率一致。
  4. 使用调试工具: 利用Keil C51的调试工具进行单步执行和变量检查。

5.4.2 实际案例:串口通信问题的解决实例分析

假设在仿真测试中,发现LED灯没有按照预期闪烁,我们进行如下调试:

  1. 检查电路: 确认LED灯的电路连接及单片机的相应I/O口配置是否正确。
  2. 检查程序: 通过Keil的仿真器,逐行运行程序,观察变量和寄存器的状态,确保程序逻辑的正确性。
  3. 分析数据: 使用Proteus中的虚拟串口终端,监视数据传输情况,检查发送和接收的数据是否一致。
  4. 逐步调试: 结合以上步骤,逐步排查问题所在,直到找到问题并解决。

通过这样的实例分析,我们不仅可以解决实际的串口通信问题,还能深入理解整个通信过程的机制。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本课程将深入指导学员如何在Proteus软件中模拟51单片机的串口通信过程,并结合keil源程序进行调试。首先,详细介绍了51单片机的串口通信基础,包括串口配置和波特率设置。然后,讲解在keil C51环境下编写串口初始化、数据发送和接收函数,并在Proteus中搭建电路和加载程序,实现数据传输的仿真。最后,通过分析串口通信中可能遇到的问题,并进行仿真修正,以提高通信协议的准确性和调试效率。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值