收藏本站

开盘机音响技术网

 找回密码
 注册加入
查看: 13998|回复: 39
收起左侧

REVOX B710 MCU芯片MK3870替换方案(连载)

  [复制链接]

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

发表于 2018-10-9 12:05:49 | 显示全部楼层 |阅读模式

赶快注册并登录访问我们网站,呈现更多精彩内容!

您需要 登录 才可以下载或查看,没有帐号?注册加入

x
欢迎转载,但请注明出处.
3 }6 G, k2 F7 p& C+ X前不久在给一哥们在修一台B215时,发现三个mab8440都坏了,就想着能不能找到替代的方案,找到方案只是一方面,对未知的东西学习的过程也是一种享受。# Z0 c* b' n! Y; G; x
虽然是个码农,但之前没有接触过单片机编程。 所以决定从简单的开始,先找B710 MCU替换的方案。7 X9 j" `8 a( A7 u. U6 N) X
710的MCU型号是MK3870/20 , 是70年代仙童和mostek一起开发的,分别命名为F8和mk3870, 还有外置ERROM的 mk38p70,
) K, l2 {* B' a1 W2 `后来意法收购了mostek ,后期的就都是意法生产的,还有了管脚兼容的 MK41H80/MK97501 。
) T7 A( X( q* ~) u; G7 m但是问题来了:mk3870是定制生产的,无法再次写入程序,mk38p70早已停产了,而且没有找到详细的资料。
8 Q$ {. n2 Q. a2 B! N) `" ?5 P- H所以只能用其它芯片代替,看管脚3870是32个I/O口,因为710应用时的逻辑也算简单,所以什么位数、速度、RAM大小不用考虑,5 t4 |! _5 p& d8 n" \
现在生产的芯片肯定是够用的,决定暂时使用很常见51系列单片机来代替,学习什么的也简单。
, U+ K3 d) d/ f/ W: j只不过51单片机管脚和mk3870是不兼容的,可以做一个转换座来解决:转换座主要是保证电源、地、复位这些对应(晶振可以不用,用内置的振荡器),I/O线对I/O线就行,: {: `: ]2 s8 m9 K1 c7 T
因为不是直接用原来的程序,所以I/O口位数不用对应,比如P1.0不一定要对应P1.0 ,可以是任意I/O线(如果P0口做输出要加上拉电阻),所以转换座跳线会简单一点。
, A. J% P9 E  H( N(待续)
9 z. N& |# t& ^# S& ~& @
6 u4 x5 ?$ L1 H  t, ]$ _+ U% h
& F$ o. ?7 h( ~* k+ W, h

6 a4 B2 \8 C: T
* S- f" e/ j# _; B! A, r
51管脚.jpg
下载.jpg

评分

参与人数 3威望 +100 金币 +200 收起 理由
ly阿万 + 50 好文章!代换之精品帖。
yjwu + 50 感谢分享心得!
红灯记 + 200 解决了一个老大难的问题

查看全部评分

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-9 23:32:50 | 显示全部楼层
功能上看,MCU主要实现几个方面的" D+ t, D$ _. D
1.响应操作,控制继电器,卷带电机等。
! ~% ^6 R# ~" O( u2.接收转动的计数,两主轴的转带是否同步,磁带结束信号等。
, B$ a( J6 I# D( D9 }+ _; G3 ^; W3.计数器输出- }. e# H. }9 V8 V+ F
4.定时开机的相关功能。7 E% k, ^4 ~( [
那么先挑简单的,先考虑实现第1个功能,先做一个各状态下的输出表。
  i$ e/ \: c' r3 C6 A8 |, y 1539099076(1).png
* Z- M7 W8 X- ?6 _9 M9 Z
% [6 M$ g% K3 S, q# e) \3 h! E7 @# K  O$ v2 `/ P

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-9 23:04:09 | 显示全部楼层
本帖最后由 乡村猎手 于 2018-10-9 23:07 编辑
# @/ o; ?- M( U+ }, r( Z' f0 j+ j& v  \' d- _
因为接下来的逻辑分析和编程都会和转换座有关系 ,所以先画一下转换座的跳线。设想是两个插座水平错开一点,两种方案走线,一种是所有的大部分水平连接,少数几根长的飞线。另一种不追求水平走线,这样每根线都很短.最终用第二种。) p0 r' p7 n/ z1 X/ O# ~5 M: ]1 @4 J
6 U4 {# X0 s1 `' `; W2 q
但是,买的洞洞板到手时才发现,单面板这样水平错开不太好焊接,所以先垂真错开,这样飞线会很乱,但先实现功能再说,以后可以弄成上下两层的,这样就不会显得乱了。
- \; J8 n6 J) G
) K& k; G% w: k, ?) T) O 541933200785425565.jpg 122493189252407129.jpg
" f" B6 [% V- m2 ?# p
, U2 _% h& a, D6 ~% w5 d" f4 I5 Z7 W% Q1 r- j* q& {  Q
; U9 n0 M& X: y- k1 ]3 s/ d! R6 k/ _
474532925842325552.jpg
737681544325884151.jpg

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-10 22:08:53 | 显示全部楼层
前面输出的状态有了,现在来看一下按钮该如何处理。先看电路图和主要器件CD1542的真值表.CD1542的功能其实就是根据ABC脚的不同值Z输出x0...x7其中一个脚的电位。
+ Q% f  R) j. J9 q对应到电路就就是单片机不停的输出不同的值到ABC(图中的IC6的 11,12,13),
) N) n8 H4 q8 r& U/ N然后检测输出Z(IC6第14脚),当检测到是低电位了,这时对应刚才输出的地址就知道是按了哪个键了。
7 f6 l4 `% ^# S, W7 k: Q, p 按键示意图.png CD4512的真值表.png * f$ n1 K9 W9 S. W4 D
: _1 q; c9 h  u6 J
' N6 F! T" e6 m) E# d$ L9 X1 Z
' i* }, `; K. S( Z1 g0 h

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-10 22:17:03 | 显示全部楼层
本帖最后由 乡村猎手 于 2018-10-10 22:20 编辑
; {6 {' c% y# V% M9 C) V& M. W% X+ n' A  [2 j( M' `( I1 a3 e
输入和输出的逻辑弄清楚了,写代码就是分分钟的事了。下面是这些功能的C源码。实现的功能就是快进、进退、停止、播放、录音的功能。代码当然有很多种写法,status变量暂时还没用到,可以用在进入某个一功能时判断用,如果机器已经是某个状态再按哪个按钮以不用响应,不过实际试的时候不判断好象也没什么问题。是不是其实很简单呢?# n7 W9 a) ?5 G' E' B- Y7 _# S& H
#include <reg51.h>0 q% s- q" i; X/ m9 e0 {7 H$ s
% t; a: t4 I0 A2 f3 F6 \
sbit key1 = P0^7;
7 T0 N* c0 ]3 ]5 l6 O" h/ I. i8 ?/ z
char status=0; //1:play 0:stop  2:forw 3:rew 4:rec  9:off
5 w5 ]( Q& x! ?4 X) D% F) ~9 Q, g
char recflag = 0 ;
2 A3 d/ I) `$ D. ^/ l8 N; X- M( s- N. B! D" }8 Q5 D+ o3 x, w( E
void Play(void)/ i# C' r2 H4 n$ x4 [: s/ t
{/ H1 a* T6 Z1 Q; c' a: q
        P1=0X48;
$ S2 s1 @$ V2 T        P2=0XF1;' w- K6 p! ~% z! l0 O. m# X6 E# i
        P3=0X01;
* N% o; q! e; i" j        status=1;
9 N; z5 P/ c  N+ T* u+ S& M9 [}
7 I9 ^& b% R, B, y8 c' o1 Ovoid Rec(void)
5 X6 l3 }: b! P2 i; J9 |8 Z2 k{3 ?  n# e* @2 ~  g3 Z8 u9 T. ~
        P1=0X48;/ D. D% \9 }0 t
        P2=0XF5;% m. w$ B) ?, `7 m  z
        P3=0X01;
& G3 S* z/ U3 C4 m- [  t        status=1;
* k# e" D# k4 V: j( {, s}$ y. F# h9 N, B

3 j" [2 k, x8 @5 R5 a7 I  y
+ e! \9 ^& s# `) r4 w& Y( x7 L$ Jvoid Stop(void)0 f1 e8 z0 z# A3 c# |7 v% ?% G: R4 B+ ]
{: `: q# E, p3 E# S5 p, f/ B" W. Q
        P1=0X8E;+ \& ]* K; C! U/ [4 ~& q% t3 k- J3 d
        P2=0XF3;
) I7 b3 ]5 G5 ~9 {- Z* N8 `        P3=0X48;
1 i- @8 ^1 F  k& I        status=0;        
% Z/ s- x. C8 t7 n; g' w5 X4 S% K4 n}
* V6 n8 g( R/ g" `/ }# n3 X8 w( H" y# ~, @' q' G- `

8 c# v" ~4 J0 Z5 |8 e. K( `' n" U- c% [8 L+ _; Z7 v3 V' u: S
void Forw(void)4 @* |$ B4 c% n0 ?- o
{
6 T3 X0 w8 y/ C. q( ]# ~9 Y        P1=0X7C;1 p- [) I' v' ~% S. O( l: ]9 a
        P2=0XF3;. E4 S7 o6 C3 [3 x0 Z6 [
        P3=0X20;# c& Y' t4 W4 v) `& [  @" H
        status=0;        # i+ a' T3 U6 o! Q4 _. P
}$ y1 T) d* Z9 y1 P5 s
7 Y3 N$ k; x# ]* }9 [
void Rew(void)9 k$ V" N1 V' j, g2 _
{
, w6 h: v# V- A9 F4 p+ e        P1=0X0C;3 d0 {0 T5 q+ D1 H$ _- m
        P2=0XF3;
$ r, ]% c2 O2 D7 B+ E' t        P3=0X27;7 g, A) l9 o* L6 r$ e
        status=0;        
( S; ~' q( G1 g4 L4 [. E}
2 F( W7 z# r) [7 P6 a) L+ e: m, J! \) g
2 Q3 _- ?+ x& W: `
! e9 o$ Y. o& H
void main(void)$ \- K' W! e: ?# @& U
{
. `8 A. j% b1 Z' K
  F* M* c1 ?* }1 y        unsigned char i;
' @8 Q: x' I# q; M9 @1 M/ |/ k         unsigned int k;  c3 |7 q/ A! t% ~; [& \, V1 t2 E
//        unsigned char j;' e9 P0 O# i+ c5 l
        P1=0;
. r# O4 p, l3 j% i+ x. _        Stop();
4 V1 X; g% k- Q! B" I        key1=1;
8 p' @0 C. d$ _' `, W7 G        while(1)
/ J2 L! t$ c% G$ M% r3 m        {
- t7 r) G) t7 Y3 z9 Y3 q$ y- A# g- r
                recflag = 0 ;
* i" l' u9 U& d3 M$ f; b                for (i=0;i<8;i++)) R( ]8 ~& l7 E2 m7 I2 m  J
                {
  l- q1 {/ z% q2 V                         P0= i<<4 ;7 I) t- u# Q: c5 L" I
                        for (k=0;k<1000;k++)  6 z6 ]: q0 Q6 t9 x
                        {6 v& j$ E$ j8 f
                         //        for (j=0;j<10;j++);
: [9 m! g+ I4 C9 x5 f, o                        }/ z# B4 X' o. s& Y
                3 p! Z4 k& D7 Q% ~% C; S- J
                        key1=1;
* m. {+ w2 @# Z* t
5 ]# V$ E# d5 x" Y  T$ l2 f
% p! |# l6 ]- T                        if (i==0&&key1==0)//play
2 G/ s& O3 f/ d, P* i2 H5 ?                        {
) l, |0 s; v0 [! y- g8 D. i                                recflag=1;0 n+ K, [6 S- u+ `9 a8 S% H
                        }
- [8 Y2 Q1 T8 q1 y& B" G2 n+ K: _8 |6 _6 @' q
                        if (i==1&&key1==0) //stop
" \. k! B9 j' {6 v5 c' t8 r                        {- ^9 r5 j3 Z# y8 Y$ G& e
                                Stop();4 o$ r& I" n; W3 `* q
                        }5 x6 }" s3 S' f5 F- n

: a- H. N6 k9 S/ p                        if (i==2&&key1==0)//play3 c1 K9 z5 m& ~
                        {' j* K% Y- C/ {( [! R) @$ C6 L$ n; e
                                if (recflag==1), z. u( u- S  `" t( V  h$ c
                                {5 \' ]: w1 n1 H2 G8 p7 W' Y
                                        Rec();
2 x3 m6 r# J- }& R- x1 o                                }  U% \8 [5 p9 s$ |7 s& D" A7 W& G" P
                                else+ M% g0 i) n  m- N2 E
                                {- {+ F5 b, m! v) ?
                                        Play();
, z( h! s/ }/ R$ _* Z7 M% p                                }
$ M7 a  C. H, P" k( F; l                                9 P9 W! }+ A* X$ H9 `' k4 G9 B# s
                        }
9 Y8 C8 o* h$ _$ _, H
4 n, z3 U9 o; l! s                        if (i==3&&key1==0)//Forw) S* ]& u, ?7 G5 V" c0 x5 ^5 b
                        {. q9 I0 y$ g" T! p9 }) t* g1 p
                                Forw();
% D1 x- R7 m* o, M& m+ g# \0 r0 r( _                        }2 Y! }& {8 W' ~- y5 w
* {+ Y: V9 {. g9 P0 Z
                        if (i==4&&key1==0)//Rew
5 X( o+ C7 Q% k$ x5 W3 ~+ h! h: k                        {2 J  t  N2 A3 @
                                Rew();: g! C, G. \1 E7 Y
                        }! Z8 r' q- K& e5 Y% ~
                }4 _: P# h+ i$ L: O1 z6 f& f
        }
- i% _/ P7 m$ q8 T/ \5 y, f0 L3 D, i! h  X, H& g5 ]! Q' \
}
# Q4 a1 K% ]$ z9 I; f$ s+ n7 }  c3 k8 n) G1 Y# _
& @) k/ J' b  M1 ?! Y
7 w; ^0 b0 K' r/ T4 D2 s
. _4 @! Y0 {* h  e8 W
. D. c$ T# B. ]: G8 D8 e
- b$ X2 w) h& N) E
7 U. e4 b# Z+ A  _& j: F& U

/ P4 o+ z8 S0 s$ g. {4 ]  ~" S8 a# D+ L% L

; H; U6 b- j0 \2 s7 y

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-10 22:35:05 | 显示全部楼层
代码写好了,可以先使用proteus仿真一下,检查一下代码是否有问题。仿真的时候可以非常直观的看到各脚的电压,比装在机器上检查方便太多了。大家有兴趣的话可以对照我上面的那个表格,看这个图里的输出和表格里的状态是否是一致的(播放状态,单片机32,33,34,35的几个输入仿真的时候是不停跳动的,截图没法体现,其它的地方地固定的)。8 O: M! u3 |. C; e$ P* t2 i

: X9 w  a7 N) X: x; R, T 仿真图.png 5 H5 i. w0 ]6 Q8 r

/ H$ ?" |( m9 g5 D4 z* o6 t2 q+ D+ D/ n; }5 Y

7 X+ j% F7 ~( o6 ~: j! K: }- t, D: u+ ~/ [
. f4 O$ L! ], O8 O6 d9 V

1416 小时

在线时间

1061

帖子

4200

积分

四星开友 ★★★★

Rank: 4

积分
4200

开网十周年纪念奖章17年网站建设费用捐助纪念章

QQ
发表于 2018-10-11 00:52:53 | 显示全部楼层
原来是这方面的高手啊!佩服佩服!!!
上海国际货运代理

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-11 09:18:06 | 显示全部楼层
shhdq 发表于 2018-10-11 00:52
, j. a3 l% k: b( J( ~& G, X原来是这方面的高手啊!佩服佩服!!!
- t) y  x% ?7 o
见笑了,算不上高手。

3134 小时

在线时间

560

帖子

1万

积分

四星开友 ★★★★

Rank: 4

积分
10210

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章2021年度网站奉献奖

发表于 2018-10-11 09:32:48 | 显示全部楼层

7656 小时

在线时间

471

帖子

4502

积分

四星开友 ★★★★

Rank: 4

积分
4502
发表于 2018-10-12 21:42:21 | 显示全部楼层
这才是专家级的高手!支持!!

1571 小时

在线时间

143

帖子

1536

积分

二星开友 ★★

Rank: 2

积分
1536
发表于 2018-10-12 22:03:12 | 显示全部楼层
高手呀,,,,支持,

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-14 23:22:27 | 显示全部楼层
本帖最后由 乡村猎手 于 2018-10-14 23:31 编辑
+ c8 B* `5 Y2 H6 v* a1 s- m, Y& y+ o; i6 o- x3 L
程序弄好了,将程序下载到芯片里就可以装机测试了,先到网上买个开发版,很便宜,而且对初学者特别合适,做了demo立马试一下就能看到效果。; _2 e. W5 N( x8 Q
装机时要注意,原机的复位是低电位有效,但51芯片是高电平有效,一开始没注意这个,没法工作。所以暂去没接这个口,运行也没问题,下次得装个非门转一下。
# m2 l2 D2 A# i/ |! O因为目前 实现 的这些逻辑较简单,所以基本装上就可以用。
" F5 K$ \: K9 X; C( \" g$ l2 k但现在还只实现了基本的按钮响应,接下来要做计数器显示这部分,对于我这个第一次接触单片机来说,还是稍复杂了一点,时序总有点不对。等过几天再写一下详细的解决过程。所以这里有个维修小提示,如果那个计数器的数字显示很乱码的话,基本可以确定是MCU坏了。
7 R) \, l$ G* `6 Y, }( F+ D
/ I9 ]+ M0 k% N- {+ \ 1539530347(1).png
% p9 i7 q- V3 e2 F' {
6 _9 f9 \7 [; A! b$ P2 Z* N
& c* e0 @/ z; q& X: x" U9 x+ x; o1 `3 q5 @" w. e3 n( H

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-15 18:59:09 | 显示全部楼层
本帖最后由 乡村猎手 于 2018-10-15 19:02 编辑
! e6 b4 i( Q! \  G  {: |3 ^" F1 s8 y" q
下面我们看一下计数器是怎么显示的:是使用一片飞利浦的SAA1060芯片来驱动显示的,是将串行数据转成并行输出显示数据管,输出是是16位,每个数据码管需要8脚控制(数字7个,一个点),所以只能切换显示。也就是显示一、三个、然后再显示二四个(图上的AC1和AC2电压控制),来回切换。我们拍照的时候,如果快门速度较高时,就会看到这里显示的有两个是灭的,就是因为这个原因,实际是在闪烁而不是连续显示的。
5 I! `# J; E3 e* [这种芯片也是比较老的了,不象后来的显示芯片象B215机器就就是用I2C总线传输,因为不是标准的协议,就得看一下传输的时序是怎么样的。/ z7 M. {$ o2 o/ i# g( L( x
从图上看,传输一次要19次时钟周期(这里的时钟并不是指单片机时钟而是输入时钟线的频率),前导0,然后16个数据位,第18周是指存到A或B锁存器,最后一个周期保存数据 ,还有数据使能端(DLEN)要高电平。
, `; h& R! i0 x' e& c# }% m5 w 6 _% t. S. e6 d* ?3 _7 s! w. T  o
* @& }" i. z! Y( |0 t" C5 v

% q! `6 V( p9 [
8 M. E/ e! `- R6 V' ]% e% U 710显示.png 1060.png 1060时序图.png
: d/ x1 G1 F4 m0 t
4 u; U2 D5 H8 K3 u1 j. ?! B5 S' l: Z) q- D' ^7 u- @* T
8 E+ u' Y! v. I
6 r. O7 A% \9 T$ \7 o. K" \+ z
# m  H8 R" D1 }$ i

- w& S, f, X5 t3 p! u7 V2 C" b# L- A6 J8 D% ~3 c

1006 小时

在线时间

373

帖子

2993

积分

三星开友 ★★★

Rank: 3Rank: 3

积分
2993
发表于 2018-10-18 20:35:33 | 显示全部楼层
乡村猎手 发表于 2018-10-14 23:22
  n& y: ?0 ?6 }8 b/ d' C程序弄好了,将程序下载到芯片里就可以装机测试了,先到网上买个开发版,很便宜,而且对初学者特别合适,做 ...
/ i) T9 b8 ~: J9 c
猎手兄高手!。收、放带、带头尾、主导轴红外传感器,脉冲检测(走带保护),怎么实现的?
喜欢开盘&卡座的声音!

1006 小时

在线时间

373

帖子

2993

积分

三星开友 ★★★

Rank: 3Rank: 3

积分
2993
发表于 2018-10-18 20:42:47 | 显示全部楼层
建议猎手兄:把功能全部开发出来,出成品吧!俺也是码盲~!

4272 小时

在线时间

899

帖子

9535

积分

四星开友 ★★★★

Rank: 4

积分
9535

开网十周年纪念奖章2018年度网站奉献奖2020年度网站运行费用奉献奖章19年网站运行奉献奖17年网站建设费用捐助纪念章

 楼主| 发表于 2018-10-19 18:15:57 | 显示全部楼层
bg0abo 发表于 2018-10-18 20:35
: C" o& t" f# j! E' F猎手兄高手!。收、放带、带头尾、主导轴红外传感器,脉冲检测(走带保护),怎么实现的?{:4_47 ...
0 Y( J1 d3 m% M
兄弟过奖了。收、放带、带头尾检测是利用磁带的引带的是透明状态使用接收管电流变化转成电压给mcu.走带也是那类似的原理将脉冲信号给mcu,这样在程序里判断对应I/O口的电压来实现相应的功能。
您需要登录后才可以回帖 登录 | 注册加入

本版积分规则

手机版|开盘机音响技术网 ( 桂ICP备20003207号-1  公安部备 45010302002201 客服:18077773618

GMT+8, 2026-5-12 10:04 , Processed in 0.088311 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表