基于51单片机的车辆智能雨刷控制系统proteus仿真原理图PCB

基于51单片机智能汽车雨刷控制系统方案原理图程序设计 总体设计 设计的总体思路是:运用雨滴传感器感应雨量的大小,把感应信号输给单片机系统,然后通过软件控制雨刷电机根据相应的环境做出不同的转动。例如,当检测为小雨量的时候,电机工作在小雨模式(电机旋转一个来回要停留10秒再继续进行旋转);当检测为中大雨的时候则,启动中大雨运转模式(电机旋转一个来回停止5秒后再继续工作);当检测为大雨的时候,则启动大雨运转模式(电机连续进行来回旋转)。设计中运用STC89C51单片机,步进电机采用ULN2003AN驱动芯片进行驱动。 2.1.2 总体设计框架图 自动雨刷控制系统总体 阅读详情

功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示当前的雨刷状态/雨滴信息/车速/工作模式
2.自动模式下,雨刷可根据当前检测的雨滴状态和车速自动切换档位
3.手动模式下,可通过按键人工调节雨刷的档位,且有LED指示
4.手动模式下,具有自动推荐档位功能,当档位与检测雨滴值推荐档位不一致时,蜂鸣器报警,且对应档位LED闪烁。(该功能可选择开启或关闭)
5.按键可设定雨滴档位阈值
6.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
在这里插入图片描述

PCB:
在这里插入图片描述

主程序:

#include "main.h"

/*******************变量定义*********************/
enum _MODE_DF_ dispMode;
bit modeFlag = AUTO; //模式标记
uchar setIndex = 0;

bit dispFlag = 0;

bit buzzerFlag1 = OFF;

char dis[16];

uchar waterValue = 0; //雨滴值检测
float speed = 0; //车速单位km/h
uchar THRH = 0; //定时器值
uchar THRL = 0; //定时器值
uchar ctrlLevel = 0; //雨刷档位
uchar nowCtrlLevel = 0; //当前雨刷档位

bit startFlag = 0; //点火熄火标志

bit motorSwitch = OFF; //电机开关
uchar motorSpeed = 8; //电机速度等级

bit YSSwitch = OFF; //雨刷开关
bit switchFlag2 = 0; //最佳档位提示标志

bit refreshFlag = 0;

unsigned long pulseCnt = 0;
/********************************************************
函数名称:void mian()
函数作用:主函数
参数说明:
********************************************************/
void main()
{
    modeFlag = MANUAL;
    MOTOR = 0; 
    MOTOR_N = 0; //电机关闭

    Timer0_Init(); //初始化定时器0
    Timer1_Init(); //初始化定时器1
    EXT0_Init();

    LCD_Init();   //初始化液晶
    DelayMs(200); //延时有助于稳定
    LCD_DispStr(4, 0, "Welcome!");


    while (1) //死循环
    {
        if (startFlag == 1)
        {
            if (refreshFlag == 1) //刷新速度
            {
                speed = 3.6 * DIAMETER * 2 * 3.14 * (float)pulseCnt / 1000; //单位km/h
                pulseCnt = 0;
                EX0 = 1;
                refreshFlag = 0;
            }

            if (dispFlag == 1)
            {
                dispFlag = 0;

                if (dispMode == NORMAL) //正常显示模式
                {
                    DispNormal();

                    if (AUTO_PIN == 1)
                    {
                        modeFlag = AUTO;
                    }
                    else
                    {
                        modeFlag = MANUAL;
                    }

                    if (modeFlag == AUTO) //自动模式
                    {
                        if (waterValue < waterLevel1) //第一段,低于最小阈值
                        {
                            YSSwitch = OFF; //雨刷关闭
                            ctrlLevel = 0;
                        }
                        else if (waterValue >= waterLevel1 && waterValue < waterLevel2) //第二段
                        {
                            YSSwitch = ON;
                            if (speed < 30)
                            {
                                ctrlLevel = 1;
                            }
                            else if (speed >= 30 && speed < 80)
                            {
                                ctrlLevel = 2;
                            }
                            else if (speed >= 80)
                            {
                                ctrlLevel = 3;
                            }
                        }
                        else if (waterValue >= waterLevel2 && waterValue < waterLevel3) //第三段
                        {
                            YSSwitch = ON;
                            if (speed >= 0 && speed < 80)
                            {
                                ctrlLevel = 2;
                            }
                            else if (speed >= 80)
                            {
                                ctrlLevel = 3;
                            }
                        }
                        else if (waterValue >= waterLevel3) //第四段
                        {
                            YSSwitch = ON;
                            ctrlLevel = 3;
                        }
                        nowCtrlLevel = ctrlLevel;
                        BUZZER = OFF;
                    }
                    else //手动模式
                    {
                        if (switchFlag2 == 1) //最佳档位提示开关开启
                        {
                            if (waterValue < waterLevel1) //第一段,低于最小阈值
                            {
                                ctrlLevel = 0;
                            }
                            else if (waterValue >= waterLevel1 && waterValue < waterLevel2) //第二段
                            {
                                if (speed < 30)
                                {
                                    ctrlLevel = 1;
                                }
                                else if (speed >= 30 && speed < 80)
                                {
                                    ctrlLevel = 2;
                                }
                                else if (speed >= 80)
                                {
                                    ctrlLevel = 3;
                                }
                            }
                            else if (waterValue >= waterLevel2 && waterValue < waterLevel3) //第三段
                            {
                                if (speed >= 0 && speed < 80)
                                {
                                    ctrlLevel = 2;
                                }
                                else if (speed >= 80)
                                {
                                    ctrlLevel = 3;
                                }
                            }
                            else if (waterValue >= waterLevel3) //第四段
                            {
                                ctrlLevel = 3;
                            }

                            if (nowCtrlLevel != ctrlLevel && ctrlLevel != 0) //如果当前档位不等于
                            {

                                if (ctrlLevel == 1)
                                {
                                    LED_LEVEL1 = ON;
                                }
                                else if (ctrlLevel == 2)
                                {
                                    LED_LEVEL2 = ON;
                                }
                                else if (ctrlLevel == 3)
                                {
                                    LED_LEVEL3 = ON;
                                }
                                BUZZER = ~BUZZER;
                                DelayMs(200);
                            }
                            else
                            {
                                BUZZER = OFF;
                            }
                        }
                        else
                        {
                            BUZZER = OFF;
                        }
                    }

                    if (nowCtrlLevel == 0)
                    {
                        LED_LEVEL1 = OFF;
                        LED_LEVEL2 = OFF;
                        LED_LEVEL3 = OFF;
                    }
                    else if (nowCtrlLevel == 1)
                    {
                        LED_LEVEL1 = ON;
                        LED_LEVEL2 = OFF;
                        LED_LEVEL3 = OFF;
                        THRH = 0xFA;
                        THRL = 0x9A; // 1.5ms
                    }
                    else if (nowCtrlLevel == 2)
                    {
                        LED_LEVEL1 = OFF;
                        LED_LEVEL2 = ON;
                        LED_LEVEL3 = OFF;
                        THRH = 0xFB;
                        THRL = 0xAE; // 1.2ms
                    }
                    else if (nowCtrlLevel == 3)
                    {
                        LED_LEVEL1 = OFF;
                        LED_LEVEL2 = OFF;
                        LED_LEVEL3 = ON;
                        THRH = 0xFC;
                        THRL = 0x66; // 1ms
                    }
                }
            }
        }

        KeyProcess();
    }   
}


/************************* 正常显示模式 *************************/
void DispNormal(void)
{

    /************************* 雨滴检测 *************************/
    waterValue = 100 - 100 * (ReadADC(AIN0_GND)) / 255; //读取雨滴信息

    sprintf(dis, "W:%2d%% Level:%2d", (int)waterValue, (int)nowCtrlLevel);
    LCD_DispStr(0, 0, dis);

    /************************* 车辆速度显示 *************************/
    sprintf(dis, "S:%5.1fkm/h ", speed);
    LCD_DispStr(0, 1, dis);

    /************************* 工作模式显示 *************************/
    if (modeFlag == AUTO)
    {
        LCD_DispStr(12, 1, "Md:A");
    }
    else
    {
        LCD_DispStr(12, 1, "Md:M");
    }



}

/************************* 雨量阈值设置显示 *************************/
void DispSetWater(unsigned char setIndex)
{
    
    LCD_DispStr(0, 0, "  L1   L2   L3  ");
    sprintf(dis, "  %2d%%  %2d%%  %2d%%", waterLevel1, waterLevel2, waterLevel3);
    LCD_DispStr(0, 1, dis);
    
    switch (setIndex)
    {
        case 1: LCD_SetCursor(3, 1, 1); break;
        case 2: LCD_SetCursor(8, 1, 1); break;
        case 3: LCD_SetCursor(13, 1, 1); break;
        default:;
    }
}

void EXT0_Init()
{
    IT0 = 1; //下降沿触发
    EX0 = 1; //使能外部中断0
    EA = 1; //打开总中断
}

void EXT0_Interrupt() interrupt 0
{
    pulseCnt++;
}


/************************* 定时器0初始化 *************************/
void Timer0_Init(void)
{
    TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    TH0 = (65536 - 9216) / 256; //重新赋值 10ms
    TL0 = (65536 - 9216) % 256;
    EA = 1;  //总中断打开
    ET0 = 1; //定时器中断打开
    TR0 = 1; //定时器开关打开
}

/************************* 定时器0中断 *************************/
void Timer0_Interrupt(void) interrupt 1
{
    static unsigned int time10ms  = 0;
    TH0 = (65536 - 9216) / 256; //重新赋值 10ms
    TL0 = (65536 - 9216) % 256;

    time10ms++;

    if (time10ms % 50 == 0)
    {
        dispFlag = 1; //显示标志
    }

    if (time10ms > 100)
    {
        time10ms = 0;
        EX0 = 0;
        refreshFlag = 1; //刷新速度标志
    }
}

/************************* 定时器1初始化 *************************/
void Timer1_Init(void)
{
    TMOD &= 0x0F; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    THRH = 0xFA;
    THRL = 0x9A; // 1.5ms
    TH1 = THRH; //重新赋值
    TL1 = THRL;
    EA = 1;  //总中断打开
    ET1 = 1; //定时器中断打开
    TR1 = 1; //定时器开关打开
    PT1 = 1;
}

/************************* 定时器1中断 *************************/
void Timer1_Interrupt(void) interrupt 3
{
    static uchar motorDir = 1;
    static uint motorCnt = 0;
    static unsigned char IN1Count = 0;

    TH1 = THRH; //重新赋值
    TL1 = THRL;

    if (YSSwitch == ON)
    {
        if (motorDir == 1)
        {
            motorCnt++;
            BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据
            ULN_DQ3 = BIT3;
            ULN_DQ2 = BIT2;
            ULN_DQ1 = BIT1;
            ULN_DQ0 = BIT0;
            if (motorCnt >= MAXCNT)
            {
                motorDir = 0; //转换方向
            }
        }

        if (motorDir == 0)
        {
            motorCnt--;
            BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据
            ULN_DQ3 = BIT3;
            ULN_DQ2 = BIT2;
            ULN_DQ1 = BIT1;
            ULN_DQ0 = BIT0;
            if (motorCnt <= MINCNT)
            {
                motorDir = 1; //转换方向
            }
        }
    }
    else
    {
        if (motorDir == 1)
        {
            if (motorCnt > 0)
            {
                motorCnt++;
            }
            BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据
            ULN_DQ3 = BIT3;
            ULN_DQ2 = BIT2;
            ULN_DQ1 = BIT1;
            ULN_DQ0 = BIT0;
            if (motorCnt >= MAXCNT)
            {
                motorDir = 0; //转换方向
            }
        }

        if (motorDir == 0)
        {
            if (motorCnt >= MINCNT)
            {
                motorCnt--; //回到最初的位置
            }
            else
            {
                motorDir = 1;
            }
            BYJ48 = ((BYJ48 & 0xF0) | REV[motorCnt % 8]); //取数据
            ULN_DQ3 = BIT3;
            ULN_DQ2 = BIT2;
            ULN_DQ1 = BIT1;
            ULN_DQ0 = BIT0;
        }
    }

    if (motorSwitch == ON) //控制直流电机
    {
        IN1Count++;

        if (IN1Count < motorSpeed) //占空比调节
        {
            MOTOR = 1; //启动
        }
        else if ((IN1Count >= motorSpeed) && (IN1Count <= 11)) //关闭时间段
        {
            MOTOR = 0;
        }
        else
        {
            IN1Count = 0; //一个周期结束
        }
    }
    else
    {
        MOTOR = 0;
    }
}

仿真演示视频:
https://www.bilibili.com/video/BV16Z4y1t7ww/

实物演示视频:
https://www.bilibili.com/video/BV1RY411F7km/

Proteus仿真】直流电机方向和速度按键控制 阅读详情

相关推荐

模型下载并发预算恢复演练工具|原创源码+测试+离线报告

原创 Model Download Concurrency Budget Planner Recovery Drill 工具,围绕“根据分片大小、带宽、磁盘写入、重试和服务限速计算安全下载并发”的基础结果,记录故障触发、检测、处置、恢复和验证事件,评估恢复可执行性。压缩包包含完整源码、3 项自动化测试、可复现合成示例、离线 HTML/JSON/SVG 报告、1080×720 真实运行效果图、README、运行说明、功能清单、MIT License 及原创与授权声明。运行时零第三方依赖,不包含热点产品或开源项目源码、Logo、官方截图、论文、生产日志或其他受限素材。

基于STM32汽车自动智能雨刷检测雨滴系统设计

*单片机设计介绍,基于STM32汽车自动智能雨刷检测雨滴系统设计

2201_75940997的博客 1555

单片机学习芯片资料单放机

单片机学习芯片资料单放机

Proteus仿真】【51单片机智能雨刷设计

当按下K2键切换为自动模式,此时自动模式指示灯亮,若检测雨滴量值在阈值范围内,根据对应值匹配到速度档位运行,若超过最大值,则以最高速运行,若低于最低值,则关闭雨刷。专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶模块、按键模块、雨滴传感器、ADC、LED模块等。显示控制:LCD1602显示雨量、档位、阈值、雨刷状态等;3、雨滴传感器、ADC模块。

Hello_Muyi的博客 5078

基于51单片机智能窗户烟雾浓度雨滴检测无线wifi控制系统proteus仿真原理图PCB

1.LCD1602实时显示当前环境温湿度,烟雾浓度,室外是否下雨。4.当室内烟雾浓度超过设定阈值时,无论如何都将打开窗户。2.按键可设定烟雾浓度,环境温湿度阈值,雨滴检测阈值。3.当环境适宜时,打开窗户,当外面下雨时,关闭窗户。0.本系统采用STC89C52作为单片机。6.可通过WIFI控制窗户开关状态。WIFI控制窗户后,进入手动模式。*1A# 表示可恢复自动模式。*1M# 表示可进入手动模式。5.可手动控制窗户开关状态。*1O# 表示打开窗户。*1C# 表示关闭窗户。

1563

基于51单片机智能红外遥控防雨晾衣架 雨滴光强检测系统proteus仿真原理图PCB

3.自动模式下,当雨滴

1366

1611基于51单片机雨刷控制系统proteus仿真

【前言】 hello 大家好,今天给大家讲一讲基于51单片机雨刷控制系统。 该项目的功能如下: 1.LCD1602液晶实时显示当前的雨刷状态/雨水信息/设定阈值 2.雨刷可根据当前检测的水滴状态自动切换档位 总共4挡,不转动,每隔10秒转动一次,每隔5秒转动一次,一直转动 【仿真设计】 下面是该项目的仿真图,模块化设计并配有功能说明,实现良好的易读性和移植性。(仿真文件为V8.11版本的,大家可以在此下载安装该版本:http://www.jh-tec.cn/arch

m0_47432290的博客 818

基于51单片机智能检测雨滴报警器

下雨关窗报警器

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1万+

基于51单片机智能雨刷设计

51单片机智能雨刷主要运用雨滴传感器感应雨量的大小,把感应信号输给单片机系统,然后通过软件控制雨刷电机根据相应的环境做出不同的转动。其中硬件电路主要有51单片机最小系统,步进电机驱动电路,LCD1602显示电路,湿度传感器及ADC0832转换电路,按键电路组成;

eletronicfish的博客 3248

Proteus仿真】【51单片机】汽车车窗除霜系统设计

本项目使用Proteus8仿真51单片机控制器,使用LCD1602显示模块、光线传感器、DS18B20温度传感器、PCF8691 ADC模块、继电器加热模块等。主要功能:系统运行后,LCD1602显示温度和光线强度值;当车窗光线强度低于一定值,且车窗温度低于一定值,车窗开启加热;当光线强度达到要求或者温度达到要求,关闭加热。主要功能如下:1、温度/光线检测2、LCD1602显示3、自动加热除霜。

Hello_Muyi的博客 896

基于51单片机智能汽车雨刮器的程序设计proteus仿真

硬件设计 (末尾附文件) 代码设计 #include<reg51.h> #include<stdio.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //********正转********** unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //********反转*****

weixin_46018613的博客 3119

51单片机数码管逐位显示1-8余位不亮】2024-10-23

数码管乱序显示问题解决方案 摘要:针对数码管显示乱序问题,本文提供了基于C51单片机的解决方案。通过分析电路图,重新编写了控制代码,实现了8位数码管从左到右依次显示数字1-8的功能。代码采用动态扫描方式,配合延时控制和位选信号处理,确保显示顺序正确。关键点在于正确设置位选信号(d变量)和段选信号(SmZiFu数组)的配合,以及通过条件判断实现循环显示。该方法有效解决了数码管乱序显示的问题。

浤济的专栏 135

proteus交通灯故障检测的完善方案】2025-4-29

电路存在严重问题,门电路输出端并联一起有烧毁芯片的危险,图中U2A、U2B输出端并联,而且,该电路只能检测供电是否正常。 另外,通过检测电压的方式不可靠,假若灯故障是开路,则电压不能证明灯是可以正常工作的。 而且逻辑表达式可以优化,假设通常交通灯状态每次只有一个灯亮,因此,100、010、001都是正常状态,而000则表示有故障,假如其中有1个灯有故障,则会表现出000状态,这样分析来设计,因此,在数字逻辑芯片中,不用设计那么复杂组合逻辑,用27芯片即可实现只要有000就是故障的显示。

浤济的专栏 186

插班生专用名牌模版(圆形挂牌3张+长方形挂牌横1张竖1张)

插班生专用名牌模版(圆形挂牌3张+长方形挂牌横1张竖1张)

Linux运维职业学习路线

打开链接下载源码: https://pan.quark.cn/s/e23b4cd62d42 Linux运维工程师在IT行业扮演着核心的角色,他们承担着对基于Linux操作系统的服务器进行维护和管理的职责,以保障系统的稳定性和运行效率。Linux运维职业的学习和发展路径是结构化且周密的,它包含了从入门到精通的多个层次。以下是对这一主题的深入解析: 一、入门知识阶段 在Linux运维的学习初期,首要任务是掌握Linux操作系统的基本理念和常用指令。这涉及到对Linux不同发行版(例如Ubuntu、CentOS、Red Hat等)的认识,熟悉文件系统的构造,熟练运用文件和目录操作(诸如ls、cd、mkdir、rm等),以及掌握vi/vim等文本编辑器的使用方法。除此之外,学习Linux中的用户和权限管理、进程管理、网络设置和监控也是这一阶段需要重点关注的内容。 二、高级技术阶段 在基础知识的积累之后,需要进一步深入理解Linux内核、Shell脚本编程、系统服务和守护进程的管理。这一阶段应该熟练运用grep、awk、sed等数据处理工具,以及crontab定时任务的设定。同时,要学会通过系统日志进行故障排查,比如查看/var/log目录下的各种日志文件。对于网络服务的配置与管理,如HTTP(Apache或Nginx)、FTP、DNS、DHCP等,也具有非常重要的意义。 三、自动化与编程脚本 在当代运维工作中,自动化是提升工作效率的关键要素。学习Python或Perl等编程语言,编写自动化脚本来处理日常任务,例如系统备份、监控告警、数据整理等。了解Ansible、Puppet、Chef等配置管理工具,能够帮助实现更大范围的系统部署和管理。 四、性能调优与监控 掌握系统性能参...

CVaR虚拟电厂-电动汽车主从博弈+CVaR研究(Matlab代码实现)

内容概要:本文围绕虚拟电厂与电动汽车之间的主从博弈关系,结合条件风险价值(CVaR)理论,构建了一个考虑不确定环境下的优化决策模型。研究通过建立上层虚拟电厂调度优化与下层电动汽车用户充放电响应的双层博弈框架,利用CVaR量化参与主体的风险偏好,提升系统在电价波动、负荷不确定性等风险因素下的鲁棒性与经济性。采用Matlab进行仿真建模与求解,验证了该方法在降低运行风险、提高收益水平及促进可再生能源消纳方面的有效性。文档还提供了丰富的相关研究主题和技术资源,涵盖电力系统优化、智能算法、深度学习、路径规划等多个前沿领域,展现了广泛的技术支持与科研应用潜力。; 适合人群:具备电力系统基础知识、优化理论背景及Matlab编程能力的科研人员,特别适用于从事能源互联网、电动汽车调度、虚拟电厂运营、风险管理与低碳电力系统研究的研究生与高校研究人员。; 使用场景及目标:① 掌握主从博弈在综合能源系统中的建模方法;② 学习CVaR在电力市场风险决策中的集成应用;③ 实践基于Matlab的双层优化模型实现与仿真分析;④ 借助配套资源拓展科研视野,支撑高水平论文撰写与课题申报。; 阅读建议:建议读者结合文中提供的百度网盘资料与公众号资源,获取完整代码、参考文献及复现案例,按照文档目录体系循序渐进地学习,并动手调试仿真程序,深入理解博弈结构设计与风险规避机制的实现细节。

单片机学习芯片资料TDA系列

单片机学习芯片资料TDA系列

基于递进事件触发框架的孤岛微电网 DoS 攻击容错二次协同控制方法(Simulink仿真实现)

内容概要:本文提出了一种基于递进事件触发框架的孤岛微电网DoS攻击容错二次协同控制方法,旨在解决分布式系统中因通信资源受限及遭受拒绝服务(DoS)攻击所引发的稳定性与安全性问题。通过设计递进式事件触发机制,有效降低控制器间的通信频率,减轻通信负担,同时增强系统对DoS攻击的鲁棒性。该方法融合分布式协同控制策略,在实现电压与频率恢复的同时,保障有功功率的精确均分,并提升电能质量。结合Simulink仿真实验验证,结果表明该控制方案在遭遇DoS攻击时仍能维持微电网的稳定运行,具备良好的实用性与工程应用前景。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉微电网控制、网络安全及仿真工具(如Simulink)的研究人员和工程技术人员,尤其适合从事智能电网安全控制、分布式能源系统设计等方向的研究生与科研工作者。; 使用场景及目标:①解决孤岛微电网在面临DoS攻击时的稳定性与安全性问题;②优化通信资源利用,减少不必要的数据传输;③实现电压频率恢复、功率均分与电能质量提升的多目标协同控制; 阅读建议:读者应结合文中提供的Simulink仿真模型深入理解控制策略的设计逻辑与实现细节,重点关注事件触发条件的设计、攻击场景的建模以及系统性能的对比分析,以便将其应用于类似的安全控制研究中。

上一篇: 基于STM32单片机的24柜门智能存储柜原理图PCB
下一篇: 基于51单片机的智能护眼台灯带闹钟功能proteus仿真原理图PCB
极寒钛科技
博客等级 码龄6年 826粉丝 · 161原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值