实现公交车自动报站系统的51单片机程序设计

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

简介:51单片机广泛用于嵌入式系统设计,本项目通过51单片机实现公交车自动报站和到站提醒功能。系统包含51单片机、GPS模块、LCD显示屏、语音合成模块及传感器等关键组件。软件部分包括初始化、GPS数据解析、站名匹配算法、显示控制、语音合成和中断处理程序。设计应考虑抗干扰、节能和可扩展性,为开发者提供了设计原理、硬件连接和核心程序代码等资源。 51单片机

1. 51单片机在公交车报站系统中的应用

1.1 项目背景与市场需求分析

随着城市公共交通系统的日益完善,如何提高乘车体验成为了公交系统改善的重要方向。在众多提升体验的方法中,51单片机因其成本低、性能稳定和开发简单等特点,在公交车报站系统中得到了广泛的应用。该系统能够根据车辆实时行驶位置,通过语音播报提醒乘客即将到达的站点,从而有效提升乘坐的便捷性与舒适度。

1.2 51单片机的优势与挑战

51单片机作为一种经典的微控制器,拥有丰富的硬件接口和灵活的编程能力,非常适合用于实现公交车报站这一功能。然而,在实际应用中,它也面临着诸如环境干扰、功耗限制和系统扩展性的挑战。这些挑战需要我们在设计时考虑周全,确保系统稳定可靠地运行。

1.3 系统实现的技术路线

为实现公交车报站系统,我们选择51单片机作为核心处理器,并配合GPS模块进行位置信息采集,结合音频模块实现语音播报。系统设计时将采用模块化的方法,确保各个功能模块既能独立工作又能够协同配合,最终形成一个结构清晰、易于维护的系统解决方案。

2. 系统硬件组成与关键组件

2.1 系统硬件架构概述

2.1.1 主控制器单元

主控制器单元是整个公交车报站系统的心脏,负责整个系统的核心处理任务。在公交车报站系统中,通常会采用51单片机作为主控制器,因为它具有丰富的指令集、简单的外围电路和较低的成本,非常适合用于控制和实时数据处理。

// 代码示例:51单片机初始化代码块
#include <reg51.h> // 包含51单片机寄存器定义的头文件

// 初始化单片机端口、定时器等
void System_Init() {
    // 初始化代码逻辑...
    TMOD = 0x01; // 设置定时器模式
    TH0 = 0xFC;  // 设置定时器初值
    TL0 = 0x66;
    ET0 = 1;     // 开启定时器0中断
    EA = 1;      // 开启全局中断
    TR0 = 1;     // 启动定时器0
}

// 主函数
void main() {
    System_Init(); // 系统初始化
    while(1) {
        // 主循环,处理报站等任务
    }
}

上述代码中初始化函数 System_Init() 设置了定时器模式、初值、中断等,而 main() 函数则在初始化后进入主循环。此代码逻辑的逐行解读分析显示了如何对51单片机进行基础配置以准备后续的报站逻辑处理。

2.1.2 传感器接口与数据采集

传感器接口用于连接各种传感器,如速度传感器、门控传感器等,实现对车辆运行状态和环境变化的实时监控。数据采集是通过传感器获取的原始信号,经过信号调理转换为单片机可读取的数字信号。

// 代码示例:读取来自传感器的数值
unsigned char Read_Sensor_Data() {
    unsigned char sensorValue;
    // 假设传感器数据连接到P1口
    sensorValue = P1; // 读取端口数据
    // 对数据进行必要的处理
    return sensorValue;
}

在此代码块中,函数 Read_Sensor_Data() 从P1口读取传感器的值,这是数据采集的一个简单实例。实际应用中,根据不同的传感器类型和接口,可能需要进行更复杂的数据处理。

2.2 关键硬件组件解析

2.2.1 GPS模块与地理信息获取

GPS模块是公交车报站系统中重要的硬件组件,它用于实时获取公交车所在的位置信息,以便系统根据预设的路线和站牌信息,准确地进行报站。

// 代码示例:GPS模块数据读取
#include "GPS.h" // 假设存在一个处理GPS数据的头文件

void Process_GPS_Data() {
    char gps_data[100];
    // 获取GPS模块发送的数据
    ReadFromGPS(gps_data, sizeof(gps_data));
    // 解析GPS数据并处理
    ParseGPSData(gps_data);
}

上述代码展示了如何从GPS模块读取数据,并处理这些数据以获取当前的地理位置。通过函数 ReadFromGPS() 读取数据和 ParseGPSData() 来解析数据,整个过程是系统实现定位功能的核心。

2.2.2 存储模块与数据备份

存储模块负责系统中数据的持久化存储,包括报站音频文件、系统日志、运行数据等。通常采用非易失性存储介质如Flash或者EEPROM等来保存关键数据,以防系统断电或其他异常情况下数据丢失。

// 代码示例:存储数据到非易失性存储器
#include <EEPROM.h> // 假设使用EEPROM存储模块

void SaveData(unsigned char *data, unsigned int size) {
    for(unsigned int i = 0; i < size; i++) {
        // 将数据写入EEPROM
        EEPROM.write(i, data[i]);
    }
}

在该代码中,函数 SaveData() 使用EEPROM类的 write() 方法将数据持久化存储到EEPROM中。需要注意的是,对于存储模块,应考虑写入次数限制和读写效率来优化数据存储策略。

2.2.3 音频处理单元与声音输出

音频处理单元负责音频信号的生成、处理和播放,是公交车报站系统中与乘客交互的关键部分。声音输出则通过扬声器播放语音提示,为乘客提供方便。

// 代码示例:播放音频文件
#include "Audio.h" // 假设存在一个控制音频输出的头文件

void PlayAudio(const char* filename) {
    // 加载音频文件
    if (LoadAudioFile(filename)) {
        // 初始化音频输出设备
        AudioDevice_Init();
        // 播放音频
        AudioDevice_Play();
    } else {
        // 加载失败处理
        HandleError("Audio file load failed.");
    }
}

在这段示例代码中,函数 PlayAudio() 执行了加载音频文件、初始化音频设备和播放音频的逻辑。音频处理单元通常会涉及解码、数字信号处理(DSP)以及D/A转换等过程,最终输出高质量的语音提示。

在接下来的章节中,将深入探讨系统软件部分的程序结构,以及如何通过编程实现硬件与软件的无缝交互,共同构建一个高效、稳定、易于维护的公交车报站系统。

3. 系统软件部分的程序结构

软件部分是公交车报站系统的核心灵魂,负责管理和控制整个系统的运行逻辑。在本章节中,将详细探讨程序设计原则、程序架构、主要功能模块的设计,以及软件的实现方式。

3.1 程序设计原则与架构

3.1.1 模块化编程思想

模块化编程是系统设计中一种极为重要的概念,它将一个复杂的系统划分为若干个更小、更易于管理和理解的模块。每个模块都有特定的功能,彼此之间通过明确定义的接口进行通信。在公交车报站系统中,模块化设计可以分为以下几个主要模块:

  • 初始化模块 :负责系统的初始化过程,包括硬件的配置与启动、变量的初始化等。
  • 主控循环模块 :负责整个程序的主循环,确保系统稳定运行。
  • 报站逻辑模块 :根据GPS模块提供的位置信息判断当前车辆是否到达预定站点,并发出报站信息。
  • 异常处理模块 :负责处理系统运行中可能出现的异常情况,如硬件故障、通信失败等。

在编程实现时,每个模块通常以函数或类的形式存在,而模块间的通信则通过参数传递或全局变量来实现。

3.1.2 实时操作系统的选择与应用

公交车报站系统作为实时系统,对于时间的要求极高,因此选用合适的实时操作系统(RTOS)至关重要。RTOS的选择标准包括但不限于:

  • 时间确定性 :必须保证在最坏的情况下也能在规定时间内完成任务。
  • 任务管理 :支持多任务的创建、调度、同步和通信。
  • 中断响应 :能够提供快速的中断响应机制,以满足即时处理的需要。

在51单片机这样的嵌入式系统中,常用的RTOS有FreeRTOS、RT-Thread等。选择合适的RTOS,然后根据任务的优先级和时间要求进行任务调度,是软件设计的关键。

3.2 主要功能模块设计

3.2.1 报站逻辑的实现

报站逻辑模块是本系统中最为关键的部分。以下是实现该模块的基本思路:

  1. 获取当前位置 :通过GPS模块获取当前的经纬度信息。
  2. 判断是否到达站点 :系统事先存储有所有站点的经纬度坐标,通过计算当前位置与最近站点的距离,判断是否到达站点。
  3. 发出报站信息 :根据判断结果,通过音频模块播放对应的报站信息。 一个简化版的伪代码如下:
if (GPS_GetCurrentLocation() == targetStationCoord) {
    Audio_Play("下一站,XXX");
}

其中 GPS_GetCurrentLocation() 函数负责获取当前位置, targetStationCoord 为下一个站点的坐标, Audio_Play() 函数则是播放报站音频。

3.2.2 异常处理机制的设计

异常处理机制能够增强系统的稳定性和可靠性。异常处理通常包括以下步骤:

  1. 异常检测 :系统需要持续监测,如GPS信号丢失、存储模块故障等。
  2. 异常记录 :一旦检测到异常,系统需要记录异常情况的发生时间、类型等详细信息。
  3. 异常处理 :系统需要有一套逻辑来决定当发生异常时的具体处理动作。例如,如果GPS信号丢失,则可以采用上一次成功定位的位置作为当前位置。

异常处理的实现示例代码:

try {
    // 正常的报站逻辑代码
} catch (GPSSignalLossException e) {
    // GPS信号丢失的处理逻辑
    ReportError(e);
} catch (StorageException e) {
    // 存储模块异常的处理逻辑
    ReportError(e);
}

以上代码展示了一个异常处理框架,其中 try 块中的代码是正常逻辑, catch 块则是对特定异常类型的处理代码。

本章节我们探讨了程序设计的原则和架构,以及主要功能模块的设计,下一章节我们将进入硬件与软件的交互过程进行深入分析。

4. 硬件与软件的交互过程

硬件和软件的交互是嵌入式系统设计中的关键环节。51单片机作为公交车报站系统的核心处理器,需要与各种硬件组件进行有效的交互,以确保数据的准确采集和报站信息的准确播报。本章将深入探讨硬件中断机制、数据通信同步以及软件响应过程,以展示硬件与软件之间如何协作来实现复杂功能。

4.1 硬件中断与软件响应

在嵌入式系统中,中断是一种允许硬件组件(如传感器或通信接口)在检测到特定事件(如按钮按下、数据到达等)时,打断处理器当前任务,执行特定任务的技术。51单片机具有独特的中断系统,它支持外部和内部中断源,这对于实现公交车报站系统的实时反应至关重要。

4.1.1 中断服务程序的编写

中断服务程序(ISR)是当中断触发时执行的一段代码,负责处理中断请求。编写ISR时,必须遵循一些原则:

  • 中断服务程序应尽可能短小精悍,避免执行复杂的任务。
  • 在ISR中应尽量避免使用延时或阻塞操作。
  • 需要确保中断的响应时间足够短,以满足实时性的要求。

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

void External0_ISR (void) interrupt 0  // 外部中断0服务程序
{
    // 中断处理代码
    // 清除中断标志(如必要)
    // 处理紧急任务
}

在上述代码中, interrupt 0 指示了这是一个外部中断0的处理程序。在实际应用中,你需要根据实际使用的中断源来编写相应的ISR。

4.1.2 中断优先级的分配与管理

在一个复杂的系统中,可能会有多个中断源同时请求服务。因此,合理分配中断优先级是至关重要的。51单片机支持设置中断优先级,以确保高优先级的中断能迅速得到处理。这可以通过设置IE和IP寄存器来实现。

例如,下面的代码演示了如何设置外部中断0的优先级:

EA = 1;    // 开启全局中断
EX0 = 1;   // 开启外部中断0
IP = 0x01; // 设置外部中断0的优先级高于其他中断

在上面的代码片段中, EA 允许全局中断, EX0 设置为1以开启外部中断0。 IP 寄存器中的值设置了外部中断0的优先级。

4.2 数据通信与同步机制

公交车报站系统依赖于硬件和软件之间的高效数据通信。数据通信涉及数据的发送和接收,而同步机制确保数据的准确性和及时性。

4.2.1 串口通信的实现与优化

串口通信是嵌入式系统中常用的数据通信方式之一。它允许处理器与各种串行设备(如GPS模块、音频输出设备等)进行通信。为了提高串口通信的效率,可以通过设置波特率、数据位、停止位和奇偶校验位来优化。

下面是一个配置串口通信的代码示例:

void Serial_Init(void)
{
    SCON = 0x50; // 设置串口为模式1,8位数据,可变波特率
    TMOD |= 0x20; // 使用定时器1作为波特率发生器
    TH1 = 0xFD;   // 设置波特率9600
    TR1 = 1;      // 启动定时器1
    TI = 1;       // 设置TI,准备发送第一个字符
}

4.2.2 软件状态机的应用

状态机是软件设计中用于管理程序状态的一种逻辑结构。在公交车报站系统中,状态机能够控制程序的行为,如待命、接收数据、处理报站逻辑等。通过明确的状态转换和事件处理,状态机可以提高代码的可读性和可维护性。

下面是一个简单的状态机实现的例子:

enum SystemState
{
    STATE_IDLE,
    STATE_DATA_RECEIVED,
    STATE_PROCESSING,
    STATE_REPORTING
};

SystemState currentState = STATE_IDLE;

void ProcessState(SystemState state)
{
    switch (state)
    {
        case STATE_IDLE:
            // 待命状态的处理
            break;
        case STATE_DATA_RECEIVED:
            // 数据接收状态的处理
            currentState = STATE_PROCESSING;
            break;
        case STATE_PROCESSING:
            // 数据处理状态的处理
            currentState = STATE_REPORTING;
            break;
        case STATE_REPORTING:
            // 报站状态的处理
            currentState = STATE_IDLE;
            break;
    }
}

通过以上的章节内容,我们了解了硬件中断和软件响应的机制,以及如何通过状态机来管理复杂的业务逻辑。在实际开发中,合理利用这些机制和结构将极大提升系统的性能和响应速度。

5. 抗干扰能力

随着电子设备的普及和电磁环境的日益复杂,公交车报站系统在运行过程中不可避免地会受到各种干扰。系统能否在多变的环境中稳定工作,是评价其可靠性的关键指标。本章将深入探讨公交报站系统的抗干扰设计原则,以及如何通过实际测试和策略优化,确保系统的稳定运行。

5.1 抗干扰设计原则

在设计公交报站系统时,抗干扰设计应作为重要考量因素。不仅要在硬件上采取防护措施,同时软件上也需要有应对干扰的滤波算法。

5.1.1 硬件防护措施

在硬件设计阶段,首先要考虑的是如何选择抗干扰能力强的元件,比如使用具有电磁兼容性的接口芯片、抗干扰能力强的电源模块等。接下来,需要在电路板设计时采取一些布局上的优化措施。例如,增加地平面、使用过孔堆叠来减小电磁干扰,以及合理布局高速信号线,避免长距离并行走线。

graph TD
    A[开始硬件抗干扰设计] --> B[选择抗干扰元件]
    B --> C[电路板布局优化]
    C --> D[增加地平面和过孔堆叠]
    D --> E[高速信号线布局]
    E --> F[实施硬件防护措施完成]

5.1.2 软件滤波算法的应用

在软件方面,通常需要设计专门的算法来过滤噪声数据,提取有效信号。常见的算法有平均滤波法、中值滤波法、卡尔曼滤波等。每种方法都有其适用场景和优缺点,选择合适的滤波算法需要根据系统特性和外部环境来决定。

graph TD
    A[开始软件抗干扰设计] --> B[选择合适的滤波算法]
    B --> C[平均滤波法]
    B --> D[中值滤波法]
    B --> E[卡尔曼滤波]
    C --> F[根据系统特性应用滤波算法]
    D --> F
    E --> F
    F --> G[抗干扰软件策略完成]

5.2 实际抗干扰测试与改进

为了验证设计的抗干扰能力,需要进行一系列的测试。这些测试包括但不限于实验室内的电磁干扰模拟测试、现场稳定性测试等。

5.2.1 系统稳定性的现场测试

实际部署报站系统后,需要在公交车上进行连续的稳定性和可靠性测试。测试中应该模拟各种可能的干扰情况,如强磁场、雷击、短路等极端条件。通过这些测试,可以发现系统的薄弱环节,并针对性地进行改进。

5.2.2 抗干扰策略的优化与实施

根据测试结果,可能需要对硬件设计或软件算法进行调整。比如,对敏感电路板增加屏蔽罩、修改电源滤波电路,或者对软件中的滤波算法进行参数调整和优化。之后,再次进行测试验证改进措施的有效性。这个过程可能会迭代进行,直至系统在各种干扰环境下均能可靠工作。

graph LR
    A[开始抗干扰测试与改进] --> B[进行现场稳定性测试]
    B --> C[分析测试结果]
    C --> D[制定改进措施]
    D --> E[实施硬件和软件改进]
    E --> F[再次进行测试]
    F --> G[验证改进效果]
    G --> H[完成抗干扰策略优化]

在公交报站系统中,抗干扰能力直接关系到乘客的使用体验和系统的可靠性。本章深入分析了抗干扰的设计原则,并提供了一套从测试到改进的完整流程,以确保系统能够在复杂的电磁环境中稳定运行。通过软硬件双管齐下的策略,可以有效提高系统的整体性能,保障公交出行的安全与高效。

6. 节能设计

6.1 节能技术的理论基础

6.1.1 低功耗硬件选择

在设计节能的公交车报站系统时,选用低功耗的硬件组件是至关重要的第一步。低功耗硬件不仅能够直接降低系统整体的能耗,还有助于延长系统组件的使用寿命,降低维护成本。例如,在选择微控制器时,可以考虑选用拥有多种低功耗模式的单片机。这些模式可以根据需要灵活切换,例如睡眠模式、深度睡眠模式等,从而在不同工作状态下进行有效节能。

6.1.2 软件层面的能效管理

除了硬件选择外,软件层面的能效管理同样重要。在系统软件设计时,应考虑执行效率和资源的合理利用。例如,可以设计一套智能的调度策略,使得CPU在空闲时能够迅速进入低功耗模式,并在需要时快速唤醒。此外,对任务的执行顺序进行优化,确保CPU在尽可能短的时间内完成必要的计算,然后迅速返回低功耗状态。

6.2 节能措施的实施与评估

6.2.1 休眠模式的应用场景

在公交车报站系统中,根据系统的工作特点,可以设计一套智能的休眠模式。系统大部分时间可能处于待命状态,仅在车辆接近站点时需要工作,这时可以将系统置于低功耗的休眠模式中。通过软件检测到接近站点的信号后,系统将被唤醒执行报站任务,完成任务后再返回休眠状态。这种方式可以大幅度减少能量消耗,提高系统的能效比。

6.2.2 功耗监控与智能调节策略

在节能设计中,对系统进行实时的功耗监控也是不可或缺的环节。通过设计一套功耗监控机制,可以实时了解系统的功耗状况,并据此调整系统的运行策略。例如,当监控到当前电量较低时,系统可以自动调整至更加节能的工作模式,或者关闭某些非关键功能以延长电池的使用寿命。智能调节策略可以基于实时数据进行动态优化,从而实现更加精细化的能耗管理。

// 示例代码:51单片机休眠模式的开启与唤醒
#include <REGX51.H>

// 开启休眠模式函数
void EnterSleepMode() {
    PCON |= 0x01; // 设置SMOD位,进入掉电模式
}

// 唤醒函数
void WakeUp() {
    // 唤醒过程中,硬件将自动重置PCON寄存器的SMOD位
}

void main() {
    // 执行必要的初始化设置...

    // 在适当的时候开启休眠模式
    EnterSleepMode();

    // 系统将在休眠模式中等待唤醒
    //...

    // 在需要执行任务时唤醒系统
    WakeUp();

    // 继续执行任务...

    while(1) {
        // 循环执行
    }
}

在上述代码示例中,我们使用51单片机的PCON寄存器来控制休眠模式。通过设置SMOD位,单片机将进入掉电模式,此时功耗大幅度降低。当需要执行报站等任务时,通过某种方式(如外部中断)唤醒单片机继续工作。

节能设计的其他考虑

除了上述提到的硬件选择、软件管理策略以及休眠模式的应用外,节能设计还可以通过优化电源管理模块来实现。例如,设计合适的电压调节器和电源转换电路,确保在不同的工作状态下,系统都能从电源模块中获得最优的电源供应。此外,合理规划电路板布局和元件放置,降低线路损耗,也有助于节能设计的实现。

通过结合硬件与软件的双向优化,公交报站系统的节能设计能够达到理想的能耗管理效果。进一步地,对系统的实际运行状况进行持续监测与评估,通过积累数据来不断优化节能策略,将使系统更加智能化、高效化。

7. 系统的可扩展性与未来展望

随着智能交通系统的不断发展和城市公交网络的日益庞大,对公交车报站系统提出了更高的要求。在设计阶段考虑系统的可扩展性,对于未来升级和与智能交通系统融合具有重要意义。本章节将深入探讨系统的可扩展性设计,并对未来的发展趋势进行预测和分析。

7.1 系统设计的可扩展性分析

在硬件和软件设计中,可扩展性是需要着重考虑的因素之一。良好的可扩展性设计不仅能够满足当前需求,还可以灵活应对未来可能出现的业务增长或技术迭代。

7.1.1 硬件接口的兼容性设计

硬件接口的设计要考虑到未来可能增加的设备和功能。在公交车报站系统中,可能需要增加额外的传感器、更新GPS模块、或是加入移动数据通信设备(如4G/5G模块)以实现更高级的功能。因此,硬件接口需要具备以下特性:

  • 模块化设计: 硬件应设计为可热插拔的模块,方便后期升级。
  • 通用协议: 采用广泛使用的通讯协议,如I2C、SPI等,确保与新设备的兼容性。
  • 电气隔离: 为防止设备间干扰,重要接口应具有电气隔离功能。

7.1.2 软件架构的模块化与解耦

软件架构的模块化和解耦是保证系统可扩展性的关键。模块化允许系统按功能分成多个独立的模块,每个模块负责一个具体的功能,如报站逻辑、人机界面、远程数据同步等。解耦则确保了模块间通信依赖的最小化,当一个模块发生变化时,不会影响到其他模块的正常运行。

7.2 系统的未来发展趋势

公交车报站系统作为智能交通系统中的一个小分支,随着技术的进步和需求的变更,将会有更多的创新和发展。

7.2.1 智能化升级的路径探索

智能化升级是未来发展的必然趋势。未来的公交车报站系统可能会具备如下特征:

  • AI驱动的个性化服务: 通过人工智能技术分析乘客的出行习惯,提供个性化的报站服务。
  • 无人车技术的融入: 随着无人车技术的成熟,未来的公交车将能够实现更精准的定位和更智能化的报站服务。
  • 增强现实(AR)交互: 在车辆内部署AR技术,乘客可以通过虚拟界面与报站系统进行交互。

7.2.2 与其他智能交通系统的融合前景

公交车报站系统与城市交通管理系统、智能导航系统等的融合将带来全新的用户体验。例如,当与智能导航系统集成时,报站系统能够提供实时的交通信息,帮助乘客规划更高效的出行路线。

结语

公交车报站系统作为智能交通系统中的一个重要组成部分,其可扩展性与未来发展趋势受到了广泛关注。通过精心设计的硬件接口和灵活的软件架构,公交车报站系统可以顺利地与未来的技术进步同步,为乘客提供更加智能化、个性化的服务。同时,随着城市交通的不断发展和自动驾驶技术的普及,公交车报站系统将在智能交通生态系统中扮演更加重要的角色。

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

简介:51单片机广泛用于嵌入式系统设计,本项目通过51单片机实现公交车自动报站和到站提醒功能。系统包含51单片机、GPS模块、LCD显示屏、语音合成模块及传感器等关键组件。软件部分包括初始化、GPS数据解析、站名匹配算法、显示控制、语音合成和中断处理程序。设计应考虑抗干扰、节能和可扩展性,为开发者提供了设计原理、硬件连接和核心程序代码等资源。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值