单片机及C语言入门

本篇文章是给单片机纯小白制作的,为了让刚接触单片机的小伙伴不至于一头雾水,如果有不理解的章节,可以在评论区留言,我会在文章中继续补充。

一、什么是单片机?
  1. CPU芯片、存储器芯片、I/O接口芯片和简单的I/O设备(小键盘、LED显示器)等装配在一块印刷电路板上,再配上监控程序(固化在ROM中),就构成了一台单片微型计算机(简称单片机)。 由于单片机在使用时,通常处于测控系统的核心地位并嵌入其中,因而,国际上通常把单片机称为嵌入式控制器( Embedded MicroController Unit, EMCU )或微控制器( MicroContoller Unit,MCU)。而在我国,大部分工程技术人员则习惯使用“单片机”这一名称。
  2. 单片机是一块可编程的控制芯片,通过给单片机设计不同的程序,让单片机执行不同的功能。
  3. 种类:4位、8位、16位和32位单片机,位数越高,数据处理能力更强。
    8051单片机、AVR单片机、PIC单片机、MSP430/432单片机、基于ARM技术的单片机。
  4. 用途:
    工业自动化: 数据采集、测控技术。
    智能仪器仪表: 数字示波器、数字信号源、数字万用表、感应电流表等。
    消费类电子产品: 洗衣机、电冰箱、空调机、电视机、微波炉、手机、IC 卡、汽车电子设备等 。
    通讯方面: 调制解调器、程控交换技术、手机、小灵通等。
    武器装备: 飞机、军舰、坦克、导弹、航天飞机、鱼雷制导、智能武器等。
  5. 单片机最小系统板

需要添加复位电路,电源电路、晶振电路,单片机才能正常工作。

二、单片机结构
  1. 单片机的结构
    单片机内部各种部件:CPU,RAM,ROM,计时器/计数器、串行口,IO口中断系统、特殊功能寄存器、看门狗定时器。

举例:AT89S51

片内结构图
在这里插入图片描述
图片来源网络

封装图
在这里插入图片描述

图片来源网络

实物图
在这里插入图片描述
图片来源网络

下面是该51单片机的引脚的介绍:
VCC为电源引脚,用于给单片机供电,VSS为接地。
1~40的数字为不同引脚的编号,数字旁边的英文+数字是引脚的名称,如P1.0、P1.1、P1.2,VCC等。
2. IO口(input,output)
以P开头的引脚是IO口引脚(P0.0–P0.7、P1.0–P1.7、P2.0–P2.7,P3.0–P3.7),IO有两种状态,高电平和低电平,也叫1和0。
高电平简单来说就是相对高的电压,一般为单片机的VCC的电压,5V或3.3V,AT89S51为5V。
低电平为0V。
单片机上电后IO口的默认状态为悬空。
可以用程序来控制单片机,让单片机的IO口输出不同的电平,若再给IO口引脚连接到电子元件,可以完成不同的目的如led亮灭等。
也可以给单片机的IO引脚连接外部电源或者接地,此时可以编写程序,让单片机检测自己引脚电平状态,实现计算、逻辑运算等不同的功能。
3. 其他功能
复位:能让单片机内部程序从头开始运行,单片机RST引脚接高电平
RX/TX : 在单片机和其他设备通信时候用。
ADC: 采集外部信号时用

三、单片机工作过程
  1. 如果使用实物
    设计电路:设计搭建好硬件电路。【最简单电路直接用导线连接,较简单电路可以用面包板连接,当然有焊接条件的可以用洞洞板,PCB板(需要学习画PCB的软件)】。
    编程:用软件编写C语言程序(keil4、keil5等)。注:51单片机和一些其他单片机都用C语言进行编程,当然也有可以用Python等语言编写程序的单片机,如ESP32。
    编译:把C语言程序编译成 .hex文件
    烧录:用下载线连接单片机和电脑 ,把hex文件“输入”到单片机内部,即把程序写入单片机。(这个烧录过程可以理解为光盘的刻录的写入数据,但是它们的原理是不同的)
    上电运行:单片机根据烧录的程序,开始执行对于的操作。

:如果使用实物,只有孤零零的一块MCU芯片是不行的,还需要外围电路(晶振、复位电路、烧录电路等),并且需要焊接。初学者可以用仿真或购买一块该芯片的最小系统板(包含了外围电路和MCU芯片,且较便宜),如果预算充足,可以购买相应芯片的开发板(开发板还焊接了各类外设:LED、数码管、按键等)

  1. 如果使用仿真
    设计电路:打开proteus软件,选择对应单片机型号,放置单片机,设计需要的电路
    编程:用软件编写C语言程序(keil4、keil5等)
    编译:把C语言程序编译成 .hex文件
    烧录:双击单片机芯片,选择编译好的hex文件,确定。
    运行:点击运行按钮,运行proteus仿真

如果需要修改程序,可以重新烧录运行。

四、单片机编程–C语言入门

编程可以让电脑代替人完成一些工作,如果应用到单片机领域,就可以让单片机完成一些功能
1. 位和进制
(1) 介绍进制转化
在此之前,介绍字节和位数的概念:由于内部结构,计算机只能识别0和1两种状态,位是最基本单位,它只能取值0和1
1个字节 = 8位
请添加图片描述
1位二进制只能是0和1,2位二进制的组合方式有00、01、10、11 ,换算成十进制后,分别可以表示 0、1、2、3 。4位二进制的组合方式有16种,可以表示十进制0~15,总共16个数字,如下图所示。
依次类推 n位可以表示2^n个数字。
所以一个字节的大小为0~255。
所以任意一个数字可以被0和1来表示,0和1组成的数叫二进制数
同样的,也有16进制数,十进制的0-15分别用十六进制的0-9、A~F(不区分大小写)表示,一般会在十六进制前加0x用以区分不同进制
举个例子: 十进制的15用0xF表示,16用0x10表示(F+1会向第二位进位),255用0xff表示
在单片机中会经常用到十六进制数和二进制的转换
请添加图片描述
图片来源网络

根据数学规律,二进制每4个一组 转化为对应的十六进制字母 即可得到十六进制数

| 二进制数: 1001 0001 1111 1100    转化为十六进制数 |        |      |      ||---------------------------------------|--------|------|------|------|------|--|--|--|
| 每4位转化为十六进制数                           |        | 1001 | 0001 | 1111 | 1100 ||                                       |        | 9    | 1    | f    | c    |
| 结果                                    | 0x91fc |

即1001000111111100=0x91fc,反之也成立
只有二进制和十六进制转化时可以每一位分开转化,二进制和十进制之间不可以,也就是说 0001 1001 不能等于 十进制19,十进制15也不能等于001101
(2) 介绍位运算
位运算为二进制数的运算,所以其他进制数进行位运算时需要转化为二进制数

运算名称  运算符号  :  运算举例,解释
与   &:0&0=0,0&1=0,1&0=0,1&1=1,0和任意数相与(&)得0。
或    | :0|0=0,0|1=1,1|0=1,1|1=1,     1和任意数相或(|)得1。
异或^:  0^0=0,0^1=1,1^0=1,1^1=0    相同为0,相异为1 
取反~:~0=1,~1=0
左移:0<<1=10表示0左移1位,结果为10B(二进制),
右移:0>>1=0表示0右移一位,还是0

多位二进制数也可以进行位运算 0001&1111=0001 运算方法为逐位相与 0&0 0&0 0&0 1&1
多位二进制数也可以进行移位运算 0101<<1=01010,右侧补0
0101>>1=0010 ,左侧补0,低位1直接舍弃
2. 语法
下面是一些所要用到的C语言知识。单看一篇文章是无法掌握一门语言的,建议看完本文并有点感觉的同学去阅读相关书籍和视频。 下文仅作入门知识讲解。

(1) 就像学习英语等其他语言一样,掌握语法是基础,C语言也有自己的语法。
电脑执行C语言程序时,会一行执行完,再执行下一行,即顺序执行
请添加图片描述

如图中执行完第24行后,才会到25行,然后26行,27,28…
(2) C语言每一条语句末尾都需要添加分号,如果不添加分号,就会和下一条语句视为同一行。
(3) 一条语句分为几部分内容,内容之间需要用空格隔开,如定义变量中int和a之间要用空格隔开。
(4) C语言大括号用于区分不同的代码块,相当于给代码分组,几个语句可以分为一组
(5) 注释
单行注释用 两个斜杠+注释内容 表示。如上图的绿色字体。
多行注释用 /* 注释内容 */表示,注释内容两边加斜杠和星号。
注释不算语句,对语句的运行没有影响,主要用于解释自己的语句内容。
勤加注释可以帮助自己理清程序思路,让别人读懂自己的程序,在程序出现bug时更好排查
(6) C语言所有语句都用英文输入法来写,包括逗号,分号,引号,如果语句内容出现中文汉字或中文标点,程序会出错
3. 变量
变量可以存储一些数据,能执行逻辑运算等操作。
操作变量分为三步:定义,赋值、运算
(1) 定义 : 定义变量的取值范围,后面的赋值操作不能超出这个范围 ,定义只需定义一次。语法结构为 : 数据类型+空格+变量名字+分号

int a; 
float a1;//a和a1是不同变量的名字
unsigned int car;
char car_value1;//变量名字可以为字母数字下划线,但名字开头不能用数字,如1a,1b是错误的命名方式。

数据类型包括char , int,unsigned int,float,short int,unsigned short int,long int,unsigned long int,char,float 等。(数据类型的作用:让数字、浮点数、字符这些内容分开,因为它们各自的所占存储空间是不同的)
这些类型的区别为定义的范围不同: int定义的变量范围为4个字节,范围为
在这里插入图片描述

char定义的为8个字节,范围为-128~127,
unsigned char定义的范围和char一样,unsigned意思是没有符号,不能为负数,即unsigned char的变量只能取0~255
![[Pasted image 20220917171711.png]]

(2) 逻辑运算和算术运算
运算的语法结构为: 变量名字 + 运算符 + 运算的内容(可以为数字、字母、另外一个变量名等)+ 分号
举例

a = 1;   //把1赋值给a,    注意:赋值前一定要先定义

还可以把其他变量的值赋值给这个变量

int b;  //定义b为int类型
int a; //定义a为int类型
b=1;  //给b赋值给1
b=2; //多次赋值会覆盖之前的值,值以最近的一次为准,所以此时b的值为2
a=b;  //把b的值赋值给a ,  此时a的值为2
b=b-1;//把b-1的值赋值给b,因为b-1等于1,所以b的值此时变成了1
b=b<<1; //也可以结合位运算,b左移一位,b变成10,即十进制的2

对于C语言初学者,可以先在C语言编译器中练习编程,为了能够看到每个变量存储的值,可以用printf函数。
![[Pasted image 20220918211946.png|500]]
![[Pasted image 20220918212110.png|600]]
数组的作用:如果要处理大量的数字,如1-100内的所有数字,为每个数字都取一个变量名并赋值的话非常繁琐也不变操作,因此便可以把这写数字放在一个数组(列表)中,要操作数组中的数字,可以通过循环访问的方式(下文要讲的循环语句)

4.三大基本结构:顺序,选择,循环
![[Pasted image 20220917171630.png]]

顺序就是前面所讲的按行的顺序,向下执行
选择:使用if语句或用switch语句

if(判断语句)
{
	判断语句的结果为true执行
}
else
{
	判断语句的结果为false执行
}

判断语句:如
a>1: 如果a的值大于1,a>1的结果为true(真或1)。如果a为2,那么结果为真。
a<1 如果a的值小于1,a<1的结果为true
还有>= , <=表示大于或等于、小于或等于
判断值是否相等用双等号==,例如 a==1判断a是否等于1,等于则结果为true,否则为false
判断值是否不相等用英文感叹号和等号!=,例如 a!=1判断a是否不等于1,不等于则结果为true,否则为false
两个判断语句合并为一个: 语句1 && 语句2 语句1成立且语句2成立
两个判断语句合并为一个: 语句1 || 语句2 语句1成立或语句2成立
if语句的嵌套用法

if(判断语句)
{
	判断语句的结果为true执行
}
if else(判断句2)
{
	判断语句2的结果为true执行
}
if else(判断句3)
{
	判断语句3的结果为true执行
}
...
else
{
	所有判断语句的结果为false执行
}

举例

int a;
int b;
a=0;
b=1;
if(a==0  && b>0)  //判断是否 a等于0且b大于0
{
b=2
}
else
{
b=1
}

//if内条件成立,执行语句b=2,给b赋值

除了if,还有switch case语句。

循环的作用: 执行多条重复或有规律的语句
有两种 while语句 for语句
while:

while(判断语句)
{
	//判断语句成立时执行大括号内的代码
	/*如果执行完一次,会进入判断语句,再次判断条件是否成立(true),如果成立,就会再执行代码,如果不成立,不会执行代码,直接执行while后面的其他代码*/
	/*执行次数取决于判断语句*/
}
/*其他代码(在大括号外边,不在while的作用域内)*/*

举例

int a=1;//定义和赋值写一起也可以
int b;
while(a<3)
{
	a=a+1;//或写成 a++
}
b=1
/*解释: a<3成立,执行语句a=a+1,a变成2,再执行语句a<3,也成立,再次执行a=a+1,再次判断,3<3不成立,跳出循环,执行b=1,然后顺序执行...*/

其他用法

int a;
while(1)
{
	a=a+1;
}
/*这里的1也可以看成一条语句,这条语句的结果始终为1,即为true,因此while里面的内容会无限执行下去*/

for语句C for 循环 | 菜鸟教程 (runoob.com)
C 语言中 for 循环的语法:

for ( init; condition; increment )
{ 
	statement(s); 
}

解释

  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
    举例
int a;
int b;
for(a=0;a<10;a++)
{
	//写需要执行的语句
	if(a==5)
	{
		b=1;
	}
}

函数相关知识

函数的定义C 函数 | 菜鸟教程 (runoob.com)
return_type function_name( parameter list )
{
body of the function
}

在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:

  • **返回类型:**一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
  • **函数名称:**这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • **参数:**参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • **函数主体:**函数主体包含一组定义函数执行任务的语句。
    举例
    ![[Pasted image 20220918212421.png]]

宏定义
![[Pasted image 20220918212515.png|350]]

C语言编程的基本框架
在这里插入图片描述

单片机中用第一种,并且main中一般要有且只有一个while(1){}语句,让单片机能够持续运行、

程序示例

C程序

#include <stdio.h>

void main()
{
    int a;     //定义变量
    a = 0;     //变量赋值
    a = a + 1; //变量运算
    a = a << 1;
    
    while(a<3)
	{
		a = a+1;
	}
	b =1 ;
	
	for(a=0;a<10;a++)
	{
		if(a==5)
		{
			b=1;
		}
	}
	printf("a=%d",a);//打印出a的值
}

单片机程序

#include "reg51.h"  //这是51单片机标准头文件
void main()
{


}

编程软件

测试一些的C语言程序可以安装 Dev C++Dev-C++ download | SourceForge.net,能编译成exe文件
如果需要给单片机写程序,需要用keil软件。C51用keil uvision4,编译成单片机能用的hex文件

附录

软件安装教程可以找点赞、阅读数高的:

Keil安装的各类教程
Proteus各版本安装教程

DevC++软件下载
DevC++的配置教程

视频教程选择入门难度。有耐心有时间的同学可以选择更长时长的课程,更加详细。
C语言编程教程(尽量选10~20小时左右的课程学习)
51单片机入门教程

  • 31
    点赞
  • 227
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
从零开始 单片机 语言 刘建清 出版社: 国防工业出版社 发行时间: 2007 年01月 内容简介: 本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍了单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,并给出了大量实例。书中大多数实例和全部实验都经过了实验板的验证。 本书可供具有一定单片机基础的初学者,以及广大从事单片机应用系统开发研制的工技术人员阅读,也可以作为有关院校相关专业的教学参考用书。 目录: 第一章 单片基础知识  第一节 51系列单片机概述  第二节 80C51单片机的内部结构和外部引脚  第三节 80C51单片机的内部结构和外部引脚  第四节 51系列单片机的并行输入/输出接口  第五节 80C51单片机的时钟电路和复位电路 第二章 单片机C语言入门  第一节 认识C语言  第二节 简单C语言  第三节 单片机C语言开发步骤 第三章 单片机实验硬件环境的建立  第一节 单片机实验板  第二节 单片机仿真器  第三节 单片机编程器 第四章 Keli Cx51软件的使用  第一节 Keil Cx51简介  第二节  Keil Cx51软件的安装   第三节 uVision2集成开发环境  第四节 常用窗口介绍 第五章 Cx51数据与运算  第一节 标识符和关键字  第二节 数据类型  第三节 常量  第四节 变量   第五节 运算符和表达式 第六章  Cx51的基本语句  第一节 表达式语句和复合语句   第二节 条件选择语句   第三节 循环语句 第七章 Cx51函数  第一节 函数的分类和定义   第二节 函数的参数和返回值  第三节 函数的调用  第四节 函数变量的存储方式和种类 第八章 Cx51构造数据类型  第一节 数组  第二节 指针  第三节 结构  第四节 共用体  第五节 枚举 第九章 单片机中断、定时器串行口的C语言编程  第一节 单片机中断系统C语言编程   第二节 定时/计数器及实验  第三节 串行数据通信技术及实验  第十章 单片机实用接口C语言编程技术  第一节 LED显示器接口   第二节 链盘接口   第三节 LCD显示器接口   第四节 I2C总线接口  第五节 A/D和D/A转换接口   第六节 单片机应用技术综合实例 附录一 运算符的优先级和结合性 附录二 Keil Cx51编译器常见警告与错误信息的解决方法
单片机c语言编程100个实例目录1 函数的使用和熟悉 实例3:用单片机控制第一个灯亮 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 实例6:使用P3口流水点亮8位LED 实例7:通过对P3口地址的操作流水点亮8位LED 实例8:用不同数据类型控制灯闪烁时间 实例9:用P0口、P1 口分别显示加法和减法运算结果 实例10:用P0、P1口显示乘法运算结果 实例11:用P1、P0口显示除法运算结果 实例12:用自增运算控制P0口8位LED流水花样 实例13:用P0口显示逻辑"与"运算结果 实例14:用P0口显示条件运算结果 实例15:用P0口显示按位"异或"运算结果 实例16:用P0显示左移运算结果 实例17:"万能逻辑电路"实验 实例18:用右移运算流水点亮P1口8位LED 实例19:用if语句控制P0口8位LED的流水方向 实例20:用swtich语句的控制P0口8位LED的点亮状态 实例21:用for语句控制蜂鸣器鸣笛次数 实例22:用while语句控制LED 实例23:用do-while语句控制P0口8位LED流水点亮 实例24:用字符型数组控制P0口8位LED流水点亮 实例25: 用P0口显示字符串常量 实例26:用P0 口显示指针运算结果 实例27:用指针数组控制P0口8位LED流水点亮 实例28:用数组的指针控制P0 口8 位LED流水点亮 实例29:用P0 、P1口显示整型函数返回值 实例30:用有参函数控制P0口8位LED流水速度 实例31:用数组作函数参数控制流水花样 实例32:用指针作函数参数控制P0口8位LED流水点亮 实例33:用函数型指针控制P1口灯花样 实例34:用指针数组作为函数的参数显示多个字符串 单片机c语言编程100个实例目录2 实例35:字符函数ctype.h应用举例 实例36:内部函数intrins.h应用举例 实例37:标准函数stdlib.h应用举例 实例38:字符串函数string.h应用举例 实例39:宏定义应用举例2 实例40:宏定义应用举例2 实例41:宏定义应用举例3 * 中断、定时器中断、定时器 *中断、定时器*中断、定时器 / 实例42:用定时器T0查询方式P2口8位控制LED闪烁 实例43:用定时器T1查询方式控制单片机发出1KHz音频 实例44:将计数器T0计数的结果送P1口8位LED显示 实例45:用定时器T0的中断控制1位LED闪烁 实例46:用定时器T0的中断实现长时间定时 实例47:用定时器T1中断控制两个LED以不同周期闪烁 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 实例49:用定时器T0的中断实现"渴望"主题曲的播放 实例50-1:输出50个矩形脉冲 实例50-2:计数器T0统计外部脉冲数 实例51-2:定时器T0的模式2测量正脉冲宽度 实例52:用定时器T0控制输出高低宽度不同的矩形波 实例53:用外中断0的中断方式进行数据采集 实例54-1:输出负脉宽为200微秒的方波 实例54-2:测量负脉冲宽度 实例55:方式0控制流水灯循环点亮 实例56-1:数据发送程序 实例56-2:数据接收程序 实例57-1:数据发送程序 实例57-2:数据接收程序 实例58:单片机向PC发送数据 实例59:单片机接收PC发出的数据 *数码管显示*数码管显示 数码管显示数码管显示*/ 实例60:用LED数码显示数字5 实例61:用LED数码显示器循环显示数字0~9 实例62:用数码管慢速动态扫描显示数字"1234" 实例63:用LED数码显示器伪静态显示数字1234 实例64:用数码管显示动态检测结果 实例65:数码秒表设计 实例66:数码时钟设计 实例67:用LED数码管显示计数器T0的计数值 实例68:静态显示数字“59” 单片机c语言编程100个实例目录3 键盘控制*键盘控制* *键盘控制 *键盘控制 */ 实例69:无软件消抖的独立式键盘输入实验 实例70:软件消抖的独立式键盘输入实验 实例71:CPU控制的独立式键盘扫描实验 实例72:定时器中断控制的独立式键盘扫描实验 实例73:独立式键盘控制的4级变速流水灯 实例74:独立式键盘的按键功能扩展:"以一当四" 实例75:独立式键盘调时的数码时钟实验 实例76:独立式键盘控制步进电机实验 实例77:矩阵式键盘按键值的数码管显示实验 //实例78:矩阵式键盘按键音 实例79:简易电子琴 实例80:矩阵式键盘实现的电子密码锁 液晶显示LCD*液晶显示LCD *液晶显示LCD * *液晶显示LCD*液晶显示LCD *液晶显示LCD */ 实例81:用LCD显示字符'A' 实例82:用LCD循环右移显示"Welcome to China" 实例83:用LCD显示适时检测结果 实例84:液晶时钟设计 *一些芯片的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控/ 实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 实例87:对I2C总线上挂接多个AT24C02的读写操作 实例88:基于AT24C02的多机通信 读取程序 实例89:基于AT24C02的多机通信 写入程序 实例90:DS18B20温度检测及其液晶显示 实例91:将数据"0xaa"写入X5045再读出送P1口显示 实例92:将流水灯控制码写入X5045并读出送P1口显示 实例93:对SPI总线上挂接多个X5045的读写操作 实例94:基于ADC0832的数字电压表 实例95:用DAC0832产生锯齿波电压 实例96:用P1口显示红外遥控器的按键值 实例97:用红外遥控器控制继电器 实例98:基于DS1302的日历时钟 实例99:单片机数据发送程序 实例100:电机转速表设计 模拟霍尔脉冲
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值