多加热炉炉温检测系统设计

多加热炉炉温检测系统设计



任务及要求

  • 加热炉的炉温可以在 50℃~420℃之间任意调节

  • 系统每隔 5 秒钟检测一遍炉温(共2路)

  • 利用6位七段码显示器实时显示给定炉温实际炉温,显示值为10进制数值。左三位显示给定值右三位显示实际值。系统开始运行时以循环显示 2 路炉温。每路显示时间为 3 秒钟

  • 分别记录各加热炉的实际炉温数据,每一加热炉的数据保存 256 字节。 每检测一次即保存一次,循环刷新

  • 对应各加热炉扩展功能按键,功能键按下后不影响检测功能,仅影响显示功能。具体要求如下:

    • 循环显示模式下,按下某一功能键之后,七段码显示器即显示对应加热炉的给定温度实际温度。如果此时按下另一个功能键,则会改变当前显示,即应显示与后一次按下的功能键对应的加热炉的给定温度和实际温度。只有连续按下同一个功能键两次才能回到循环显示方式状态
  • 扩展发光二极管担任报警功能,当温度低于给定值 20℃报警或超过给定值 20℃即点亮发光二极管报警。2 路分别设置高低报警指示灯



硬件设计

在这里插入图片描述


软件设计

程序说明:

  • 一共两个炉温通道,用通道0通道1标记
  • 用的是ADC的通道4和通道5进行采样,故ADC通道4对应炉温通道0ADC通道5对应炉温通道1


数据段

DATA segment
	; 中断向量
	VECTOR		equ		20H
	OPORT		equ		3A0H
	JPORT		equ		3A8H
	
	; 8253 定时器端口
	CTRL_8253	equ		30CH
	TIMER_0		equ		300H
	TIMER_1		equ		304H
	TIMER_2		equ		308H

	; 0809 ADC端口
	ADC_0		equ		3C0H
	ADC_1		equ		3C4H
	ADC_2		equ		3C8H
	ADC_3		equ		3CCH
	ADC_4		equ		3D0H
	ADC_5		equ		3D4H
	ADC_6		equ		3D8H
	ADC_7		equ		3DCH

	; 8255 并行端口
	CTRL_8255	equ		20FH
	PORTA		equ		203H
	PORTB		equ		207H
	PORTC		equ		20BH

	; 273 数码管端口
	SEG_SEL		equ     360H

	; 显示缓存区
	org 6000H
	disp_buff	db	6	dup(0)

	; ADC通道4数据保存
	org 6100H
	adc_val_0	db	256	dup(0)
	
	; ADC通道5数据保存
	org 6400H
	adc_val_1	db	256	dup(0)
DATA ends


代码段初始化与变量定义

CODE segment USE16
	assume CS:CODE,DS:DATA,ES:DATA
	org  2000H

; 程序入口
Begin:
	CLI						; 关中断
	JMP  Main

; 变量定义
timer_count	db	0			; 定时器计数值
given_val_0	dw	12CH		; 炉温通道0给定值
given_val_1	dw	10FH		; 炉温通道1给定值
							; 通道0的段码
SEG_CODE_0 	db	3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H
							; 通道1的段码 所有数字加上小数点
SEG_CODE_1 	db	0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0E7H
adc_save_0	db	0			; 通道0保存数据个数
adc_save_1	db	0			; 通道1保存数据个数
adc_current_ch  db  0		; ADC当前是哪个通道
display_ch	db	0			; 显示哪一路数据
disp_mod	db	2			; 0 通道0显示模式   1 通道1显示模式  2 循环显示模式 		 


主函数

初始化程序

; 主函数
Main:
	; 段初始化
	MOV  AX,DATA
	MOV  DS,AX				; 数据段
	MOV  ES,AX
	MOV  AX,0
	MOV  SS,AX				; 堆栈段
	MOV  SP,1000H			; 堆栈段指针

; 并行接口初始化
GPIO_Init_8255:
	; 控制字
	MOV  DX,CTRL_8255
	MOV  AL,10001001B		; AB输出 C输入
	OUT  DX,AL
	; 关灯
	MOV  DX,PORTA
	MOV  AL,0FH
	OUT  DX,AL
	
; 定时器初始化
TIM2_Init_8253:
	; 控制字
	MOV  DX,CTRL_8253
	MOV  AL,01110110B
	OUT  DX,AL	
	; 预装载值 				; 3M / 60000 -> 50Hz 
	MOV  DX,TIMER_1
	MOV  AL,60H				; 低字节
	OUT  DX,AL
	MOV  AL,0EAH			; 高字节
	OUT  DX,AL

; 定时器中断初始化
TIM2_Int_Init_8253:
	MOV  DI,0				; 中断向量20H
	MOV  DX,offset Timer2_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

; ADC中断初始化
ADC_Int_Init_0809:
	MOV  DI,04H				; 中断向量24H
	MOV  DX,offset EOC_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

; EXTI中断初始化
EXTI0_INT_Init:
	MOV  DI,08H				; 中断向量28H
	MOV  DX,offset EXTI0_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

EXTI1_INT_Init:
	MOV  DI,0CH				; 中断向量2CH
	MOV  DX,offset EXTI1_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

EXTI2_INT_Init:
	MOV  DI,10H				; 中断向量30H
	MOV  DX,offset EXTI2_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

EXTI3_INT_Init:
	MOV  DI,14H				; 中断向量34H
	MOV  DX,offset EXTI3_IRQHandler
	MOV  VECTOR[DI],DX		; 低位偏移地址IP
	MOV  DX,CS
	MOV  VECTOR[DI+2],DX	; 高位段基址CS

; 中断控制器初始化
NVIC_Init_8259:
	MOV  AL,00010011B		; ICW1
	MOV  DX,OPORT
	OUT  DX,AL

	MOV  AL,00001000B		; ICW2
	MOV  DX,JPORT
	OUT  DX,AL

	MOV  AL,00001101B		; ICW4
	MOV  DX,JPORT
	OUT  DX,AL

	MOV  AL,11000000B		; OCW1
	MOV  DX,JPORT
	OUT  DX,AL

	MOV  AL,20H				; 中断复位
	MOV  DX,OPORT
	OUT  DX,AL


主循环

包含模式判断

; ---- while(1) ----

Cycle_Main:
	; 开中断
	STI
	
	; 显示模式
	LEA  DI,disp_mod
	MOV  AL,[DI]
	
	; 通道0单独显示
	CMP  AL,0
	JZ   Ch_0_Disp
	
	; 通道1单独显示
	CMP  AL,1
	JZ   Ch_1_Disp

	; 循环显示模式
	CMP  AL,2
	JZ   Cycle_Disp

; 模式0 - 循环显示
Cycle_Disp:
	LEA  SI,display_ch
	MOV  AL,[SI]
	TEST AL,AL
	JZ   display_0   
	JNZ  display_1   
	
    ; 通道1  
display_1:    
	CALL DataPrepare_1
	JMP  Next  
	
    ; 通道0
display_0:
	CALL DataPrepare_0
	JMP  Next
	
; 模式1 - 通道0单独显示
Ch_0_Disp:
	LEA  SI,display_ch
	MOV  AL,0
	MOV  [SI],AL
	CALL  DataPrepare_0
	JMP  Next

; 模式2 - 通道1单独显示
Ch_1_Disp:
	LEA  SI,display_ch
	MOV  AL,1
	MOV  [SI],AL
	CALL DataPrepare_1
	JMP  Next

Next:	
	CALL Dynamic_Scan
	CALL Alert_LED
	JMP  Cycle_Main


定时器中断

开启ADC通道4

; 定时器中断
Timer2_IRQHandler proc
	; 关中断
	CLI

	; 构造局部变量
	PUSH SI
	PUSH DI
	PUSH AX
	PUSH DX

	; 计数值++
	LEA  SI,timer_count
	MOV  AL,[SI]
	INC  AL
	; 如果加到150  3s
	; CMP  AL,96H
	
	; 调试阶段切换时间改为1s = > 50 1s
	CMP  AL,32H

	; 3s到了  开启ADC4  
	JAE ADC4_StartConvert
	
	; 更新计数变量
	MOV  [SI],AL
	JMP  Exit

ADC4_StartConvert:
	; 启动ADC
	MOV  DX,ADC_4
 	OUT  DX,AL
 	
	; 更新计数值	
	MOV  AL,0
	MOV  [SI],AL

; 循环显示下切换显示通道
	; 显示模式
	LEA  DI,disp_mod
	MOV  AL,[DI]
	
	; 不是循环显示模式
	CMP  AL,2
	JNZ   Exit

	; 否则换通道
	LEA  DI,display_ch
	MOV  AL,[DI]
	TEST AL,AL
	; 0 -> 1
	JZ   Zero
	; 1 -> 0
	MOV  AH,00H
	MOV  [DI],AH
	JMP  Exit
; 通道01
Zero:
	MOV  AH,01H
	MOV  [DI],AH

Exit:
	; 中断复位
	MOV  AL,20H
	MOV  DX,OPORT
	OUT  DX,AL

	; 局部变量析构
	POP  DX
	POP  AX
	POP  DI
	POP  SI
	
	; 退出中断
	iret
	
Timer2_IRQHandler endp


ADC中断

包括一个通道判断,ADC通道4是在定时器内开启的,判断本次是否是ADC4,如果是则读完数据之后开启ADC通道5

; ADC中断服务
EOC_IRQHandler proc
	; 关中断
	CLI
	; 构造局部变量
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	PUSH SI
	PUSH DI

	; 判断当前通道
	LEA  SI,adc_current_ch
	MOV  AL,[SI]
	TEST AL,AL
	; 跳转通道0
	JZ   CH_0
	; 否则通道1
	
CH_1:
	; 基地址
	LEA  DI,adc_val_1

	; 偏移地址  保存第几个数据
	LEA  SI,adc_save_1
	
	; 数据后移
	; 保存几个数据循环几次
	MOV  CH,00H
	MOV  CL,[SI]
	INC  CL
	
Save_1:	  
	; 移动的数据的地址
	ADD  DI,CX
	MOV  AL,[DI]
	; 下一地址
	INC  DI
	; 数据后移一位
	MOV  [DI],AL

	; 循环CXLOOP Save_1

	; 保存新数据  在第一位
	LEA  DI,adc_val_1
	; 读取AD5转换数据
	MOV  DX,ADC_5
	IN   AL,DX
	MOV  [DI],AL

	; 通道变成0
	LEA  SI,adc_current_ch
	MOV  AL,00H
	MOV  [SI],AL

	; 跳转退出
	JMP ADC_End

CH_0:
	; 基地址
	LEA  DI,adc_val_0

	; 偏移地址  保存第几个数据
	LEA  SI,adc_save_0
	
	; 数据后移
	; 保存几个数据循环几次
	MOV  CH,00H
	MOV  CL,[SI]
	INC  CL

Save_0:	  
	; 移动的数据的地址
	ADD  DI,CX
	MOV  AL,[DI]
	; 下一地址
	INC  DI
	; 数据后移一位
	MOV  [DI],AL

	; 循环CXLOOP Save_0

	; 保存新数据  在第一位
	LEA  DI,adc_val_0
	; 读取AD4转换数据
	MOV  DX,ADC_4
	IN   AL,DX
	MOV  [DI],AL

	; 通道变成1
	LEA  SI,adc_current_ch
	MOV  AL,01H
	MOV  [SI],AL

; 启动通道5
ADC5_StartConvert:
	; 启动ADC
	MOV  DX,ADC_5
 	OUT  DX,AL

ADC_End:
	; 中断复位
	MOV  AL,20H
	MOV  DX,OPORT
	OUT  DX,AL

	; 局部变量析构
	POP  DI
	POP  SI
	POP  DX
	POP  CX
	POP  BX
	POP  AX
	
	; 退出中断
	iret

EOC_IRQHandler endp


外部中断0

通道0独立显示,连续按两次进入循环显示

EXTI0_IRQHandler proc
	; 关中断
	CLI

	; 临时变量
	PUSH AX
	PUSH DX
	PUSH DI
	
	; 当前显示模式
	LEA  DI,disp_mod
	MOV  AL,[DI]  
	
	; 当前是循环显示 2
	CMP  AL,02H
	; 进入通道0独立
	JZ   Disp_0
	
	; 当前是通道1独立显示 1
	CMP  AL,01H
	; 进入通道0独立
	JZ   Disp_0
	
	; 当前是通道0独立显示 0
	; 退出到循环显示
	MOV  AL,02H
	MOV  [DI],AL
	JMP  Exch_Done_0

Disp_0:
	MOV  AL,00H
	MOV  [DI],AL	

Exch_Done_0:
	; 中断复位
	MOV  AL,20H
	MOV  DX,OPORT
	OUT  DX,AL

	; 临时变量析构
	POP  DI
	POP  DX
	POP  AX

	iret
EXTI0_IRQHandler endp


外部中断1

设置通道0给定值

; 通道0给定值
; 通道0给定值
EXTI1_IRQHandler proc
	; 关中断
	CLI

	; 临时变量
	PUSH AX
	PUSH BX
	PUSH DX
	PUSH SI
	
	; 读取键值
	MOV  DX,PORTC
	IN   AL,DX
	
	; 数据处理  00H - FFH  => 50 - 420
	;185
	MOV  BL,0B9H
	MUL  BL
	; 128 => 右移7SHR  AX,07H
	;50
	ADD  AX,32H

	; [50,420] 存到 given_val_0
	LEA  SI,given_val_0
	MOV  [SI],AX
	; 中断复位
	MOV  AL,20H
	MOV  DX,OPORT
	OUT  DX,AL

	; 临时变量析构
	POP  SI
	POP  DX
	POP  BX
	POP  AX

	iret
EXTI1_IRQHandler endp


外部中断2

通道1独立显示,连续按两次进入循环显示

EXTI2_IRQHandler proc
	; 关中断
	CLI
	; 临时变量
	PUSH AX
	PUSH DX
	PUSH DI

	; 当前显示模式
	LEA  DI,disp_mod
	MOV  AL,[DI]  
	
	; 当前是循环显示 2
	CMP  AL,02H
	; 进入通道1独立
	JZ   Disp_1
	
	; 当前是通道0独立显示 0
	CMP  AL,00H
	; 进入通道1独立
	JZ   Disp_1

	; 当前是通道1独立显示 1
	CMP  AL,01H
	; 退出到循环显示
	MOV  AL,02H
	MOV  [DI],AL
	JMP  Exch_Done_1

Disp_1:
	MOV  AL,01H
	MOV  [DI],AL	

Exch_Done_1:
	; 中断复位
	MOV  AL,20H
	MOV  DX,OPORT
	OUT  DX,AL

	; 临时变量析构
	POP  DI
	POP  DX
	POP  AX
	
	iret
EXTI2_IRQHandler endp


外部中断3

设置通道1给定值

EXTI3_IRQHandler proc
	; 关中断
	CLI
	; 临时变量
	PUSH AX
	PUSH BX
	PUSH DX
	PUSH SI

	; 读取键值
	MOV  DX,PORTC
	IN   AL,DX

	; 数据处理  00H - FFH  => 50 - 420
	;185
	MOV  BL,0B9H
	MUL  BL
	; 128 => 右移7SHR  AX,07H
	;50
	ADD  AX,32H

	; [50,420] 存到 given_val_1
	LEA  SI,given_val_1
	MOV  [SI],AX

	; 中断复位
	MOV  AL,20H
	MOV  DX,OPORT
	OUT  DX,AL

	; 临时变量析构
	POP  SI
	POP  DX
	POP  BX
	POP  AX

	iret
EXTI3_IRQHandler endp


子函数1 - 显示通道0显示数据准备

; 通道0显示数据准备 
DataPrepare_0 proc
	LEA  SI,given_val_0
	LEA  DI,disp_buff

	; 给定值百位
	; 被除数
	MOV  AX,[SI]
	; 除数  
	MOV  DL,64H
	;100
	DIV  DL
	; 商在AL  保存百位
	MOV  [DI],AL

	; 余数在AH 几十几
	MOV  AL,AH
	MOV  AH,00H
	MOV  DL,0AH
	; 除以10
	DIV  DL
	; 商在AL  保存十位
	MOV  [DI+1],AL
	; 余数在AH  保存个位
	MOV  [DI+2],AH

	; 采样值
	LEA  SI,adc_val_0
	; 数据处理  00H - FFH  => 50 - 420
	MOV  AL,[SI]
	;185
	MOV  BL,0B9H
	MUL  BL
	; 128 => 右移7SHR  AX,07H
	;50
	ADD  AX,32H
	; [50,420] 暂存到BX
	MOV  BX,AX

	; 采样值百位
	; 被除数
	MOV  AX,BX
	; 除数
	MOV  DL,64H
	;100
	DIV  DL
	; 商在AL  保存百位
	MOV  [DI+3],AL

	; 余数在AH 几十几
	MOV  AL,AH
	MOV  AH,00H
	MOV  DL,0AH
	; 除以10
	DIV  DL
	; 商在AL  保存十位
	MOV  [DI+4],AL
	; 余数在AH  保存个位
	MOV  [DI+5],AH
	
	ret
DataPrepare_0 endp


子函数2 - 显示通道1显示数据准备

; 通道1显示数据准备 
DataPrepare_1 proc
	LEA  SI,given_val_1
	LEA  DI,disp_buff

	; 给定值百位
	; 被除数
	MOV  AX,[SI]
	; 除数  
	MOV  DL,64H
	;100
	DIV  DL
	; 商在AL  保存百位
	MOV  [DI],AL

	; 余数在AH 几十几
	MOV  AL,AH
	MOV  AH,00H
	MOV  DL,0AH
	; 除以10
	DIV  DL
	; 商在AL  保存十位
	MOV  [DI+1],AL
	; 余数在AH  保存个位
	MOV  [DI+2],AH

	; 采样值
	LEA  SI,adc_val_0
	; 数据处理  00H - FFH  => 50 - 420
	MOV  AL,[SI]
	;185
	MOV  BL,0B9H
	MUL  BL
	; 128 => 右移7SHR  AX,07H
	;50
	ADD  AX,32H
	; [50,420] 暂存到BX
	MOV  BX,AX

	; 采样值百位
	; 被除数
	MOV  AX,BX
	; 除数
	MOV  DL,64H
	;100
	DIV  DL
	; 商在AL  保存百位
	MOV  [DI+3],AL

	; 余数在AH 几十几
	MOV  AL,AH
	MOV  AH,00H
	MOV  DL,0AH
	; 除以10
	DIV  DL
	; 商在AL  保存十位
	MOV  [DI+4],AL
	; 余数在AH  保存个位
	MOV  [DI+5],AH
	
	ret
DataPrepare_1 endp 


子函数3 - 动态扫描

; 动态扫描
Dynamic_Scan proc

	; 构造局部变量	
	PUSH CX
	PUSH DX

	LEA  SI,disp_buff
	MOV  AH,01H

Scan:
	; 位选 PORTB
	MOV  DX,PORTB
	MOV  AL,AH
	OUT  DX,AL


	; 显示通道
	LEA  DI,display_ch
	MOV  AL,[DI]
	TEST AL,AL

	; 通道0 段码
	JZ   Seg_0

	; 通道1 段码
	LEA  BX,SEG_CODE_1
	MOV  AL,[SI]
	XLAT
	
	JMP  Seg_Done

Seg_0:
	
	; 通道0段选
	LEA  BX,SEG_CODE_0
	MOV  AL,[SI]
	XLAT

Seg_Done:
	; 输出段码
	MOV  DX,SEG_SEL
	OUT  DX,AL

	; 延时
	MOV  CX,0200H
	LOOP $

	; 下一数据
	INC  SI
	; 左移一位
	SAL  AH,1
	; 6位显示
	CMP  AH,40H
	JNZ  Scan

	; 局部变量析构
	POP  DX
	POP  CX

	ret
Dynamic_Scan endp


子函数4 - 亮灯警告

LED采用并口输出高低电平,并口输出的时候是用寄存器8位同时输出的,判断完前几个位置的输出数据之后,需要暂存状态数据,最后将4位数据拼接起来输出

; 亮灯警告
Alert_LED proc

; 通道0
LED_Channel_0:

	PUSH CX
	MOV  CX,0000H

	LEA  SI,adc_val_0
	LEA  DI,given_val_0

	; 采样值数据处理  00H - FFH  => 50 - 420(32H - 01A4H)
	MOV  AL,[SI]
	;185
	MOV  BL,0B9H
	MUL  BL
	; 128 => 右移7SHR  AX,07H
	;50
	ADD  AX,32H
	; [50,420] (32H,01A4H)
	MOV  BX,AX
	; 采样值暂存到BX

	; 采样0 > 给定0 + 20
	MOV  DX,[DI]
	ADD  DX,14H	
	CMP  BX,DX		
	JNB  LED_1

	; 采样0 < 给定0 - 20
	MOV  DX,[DI]
	SUB  DX,14H
	CMP  BX,DX
	JB   LED_0

	; 通道0安全
	MOV  DX,PORTA
	MOV  AL,1111B
	OUT  DX,AL
	; 通道0 LED暂存到CL
	AND  AL,0011B
	MOV  CL,AL

	JMP  LED_Channel_1

LED_0:
	MOV  DX,PORTA
	MOV  AL,1110B
	OUT  DX,AL

	; 通道0 LED暂存到CL
	AND  AL,0011B
	MOV  CL,AL

	JMP  LED_Channel_1

LED_1:
	MOV  DX,PORTA
	MOV  AL,1101B
	OUT  DX,AL	

	; 通道0 LED暂存到CL
	AND  AL,0011B
	MOV  CL,AL

	JMP  LED_Channel_1

; 通道1
LED_Channel_1:
	LEA  SI,adc_val_1
	LEA  DI,given_val_1

	; 采样值数据处理  00H - FFH  => 50 - 420(32H - 01A4H)
	MOV  AL,[SI]
	;185
	MOV  BL,0B9H
	MUL  BL
	; 128 => 右移7SHR  AX,07H
	;50
	ADD  AX,32H
	; [50,420] (32H,01A4H)
	MOV  BX,AX
	; 采样值暂存到BX

	; 采样1 > 给定1 + 20
	MOV  DX,[DI]
	ADD  DX,14H	
	CMP  BX,DX		
	JNB  LED_3

	; 采样1 < 给定1 - 20
	MOV  DX,[DI]
	SUB  DX,14H
	CMP  BX,DX
	JB   LED_2

	; 通道1安全
	MOV  DX,PORTA
	MOV  AL,1100B
	ADD  AL,CL
	OUT  DX,AL
	JMP  Exti

LED_2:
	MOV  DX,PORTA
	MOV  AL,1000B
	ADD  AL,CL
	OUT  DX,AL
	JMP  Exti

LED_3:
	MOV  DX,PORTA
	MOV  AL,0100B
	ADD  AL,CL
	OUT  DX,AL	
	JMP  Exti

; 全部安全
Secure:
	MOV  DX,PORTA
	MOV  AL,1111B
	OUT  DX,AL

Exti:
	POP  CX
	ret
Alert_LED endp


CODE ends
END  Begin
  • 25
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chorgy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值