找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6790|回复: 2
收起左侧

基于单片机的8路抢答器设计论文 Word格式 可编辑

[复制链接]
ID:209984 发表于 2017-6-10 23:39 | 显示全部楼层 |阅读模式
抢答器设计
第一章:绪论,主要介绍设计背景。
1.数字抢答器的概述
2. 设计要求及目的
第二章:硬件电路设计
1.总体原理图
2.时钟频率电路的设计
3.复位电路的设计
4.显示电路的设计
5.键盘扫描电路的设计
6.发声
7.系统复位
三.系统软件设计
1.系统原理图
2.程序流程图
3.程序
第四章:焊接调试过程与问题分析。
4.1 焊接
1.检测各元件
2.对PCB板进行排版及连线
3.  焊接的问题及解决
4.焊接的技巧和注意事项
4.2调试
4.21系统的调试
4.22具体调试
4.23调试实物图
第五章:总结
参考文献
第一章:绪论,主要介绍设计背景
1.数字抢答器的概述
单片机把我们带入了智能化的电子领域,许多繁琐的系统若由单片机进行设计,便能收到电路更简单、功能更齐全的良好效果。若把经典的电子系统当作一个僵死的电子系统,那么智能化的现代电子系统则是一个具有“生命”的电子系统。
而随着技术的进步,单片机与串口通信的结合更多地应用到各个电子系统中已成一种趋势。本设计就是基于单片机设计抢答系统,通过串口通信动态传输数据,使抢答系统有了更多更完善的功能。单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器面前具有电路简单、成本低、运行可靠等特色。对于抢答器我们大家都知道那是用于选手做抢答题时用的,选手进行抢答,抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。选手们都站在同一个起跑线上,体现了公平公正的原则。

2. 设计要求及目的

(1)设计一个可供8人进行的抢答器。

(2)系统设置复位按钮,按动后,重新开始抢答。

(3)抢答器开始时数码管显示序号0,选手抢答实行优先显示,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,同时发出音响。,并且不出现其他抢答者的序号。

(4)抢答器具有定时抢答功能,且一次抢答的时间有主持人设定,本抢答器的时间设定为60秒,当主持人启动“开始”开关后,定时器开始减计时,同时蜂鸣器有短暂的声响。

(5)设定的抢答时间内,选手可以抢答,这时定时器停止工作,显示器上显示选手的号码和抢答时间。并保持到主持人按复位键。

(6)当设定的时间到,而无人抢答时,本次抢答无效,扬声器报警发出声音,并禁止抢答。定时器上显示00。

第二章:硬件电路设计
一.系统硬件设计
为使硬件电路设计尽可能合理,应注意以下几方面:
(1) 尽可能采用功能强的芯片,以简化电路,功能强的芯片可以代替若干普通芯片,随着生产工艺的提高,新型芯片的的价格不断下降,并不一定比若干普通芯片价格的总和高。
(2) 留有设计余地。在设计硬件电路时,要考虑到将来修改扩展的方便。因为很少有一锤定音的电路设计,如果现在不留余地,将来可能要为一点小小的修改或扩展而被迫进行全面返工。
(3) 程序空间,选用片内程序空间足够大的单片机,本设计采用AT89C51单片机。
(4)  I/O端口,在样机研制出来后进行现场试用时,往往会发现一些被忽视的问题,而这些问题不是靠单纯的软件措施来解决的。如有些新的信号需要采集,就必须增加输入检测端;有些物理量需要控制,就必须增加输出端。如果在硬件电路设计就预留出一些I/O端口,虽然当时空着没用,那么用的时候就派上用场了。
1.总体原理图
1.001.jpg
2.时钟频率电路的设计
单片机必须在时钟的驱动下才能工作.在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
1.002.jpg
外部振荡源电路
1.003.jpg 一般选用石英晶体振荡器。此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。电路中两个电容 C1,C2的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。C1,C2的典型值为30PF。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数,常用fosc表示。如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µs。
3.复位电路的设计
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图所示:
1.004.jpg
复位电路
值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值,而前面的功能介绍中提到了倒计时时间的记忆功能,该功能的实现的前提条件就是不能对单片机进行硬件复位,所以设定了软复位功能。软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。
4.显示电路的设计
显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。
1.005.jpg
5.键盘扫描电路的设计
键盘是人与微机系统打交道的主要设备。关于键盘硬件电路的设计方法也可以在文献和书籍中找到,配合各种不同的硬件电路,这些书籍中一般也提供了相应的键盘扫描程序。站在系统监控软件设计的立场上来看,仅仅完成键盘扫描,读取当前时刻的键盘状态是不够的,还有不少问题需要妥善解决,否则,人们在操作键盘就容易引起误操作和操作失控现象。在单片机应用中键盘用得最多的形式是独立键盘及矩阵键盘。
1.006.jpg
独立键盘
1.007.jpg 它们各有自己的特点,其中独立键盘硬件电路简单,而且在程序设计上也不复杂,一般用在对硬件电路要求不高的简单电路中;矩阵键盘与独立键盘有很大区别,首先在硬件电路上它要比独立键盘复杂得多,而且在程序算法上比它要烦琐,但它在节省端口资源上有优势得多,因此它更适合于多按键电路。其次就是消除在按键过程中产生的“毛刺”现象。这里采用最常用的方法,即延时重复扫描法,延时法的原理为:因为“毛刺”脉冲一般持续时间短,约为几ms,而我们按键的时间一般远远大于这个时间,所以当单片机检测到有按键动静后再延时一段时间(这里我们取10ms)后再判断此电平是否保持原状态,如果是则为有效按键,否则无效。
1.010.jpg 6.发声
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。
1.011.jpg
7.系统复位
使CPU进入初始状态,从0000H地址开始执行程序的过程叫系统复位。从实现系统复位的方法来看,系统复位可分为硬件复位和软件复位。硬件复位必须通过CPU外部的硬件电路给CPU的RESET端加上足够时间的高电位才能实现。上电复位,人工按钮复位和硬件看门狗复位均为硬件复位。硬件复位后,各专用寄存器的状态均被初始化,且对片内通用寄存器的内容没有影响。但是,硬件复位还能自动清除中断激活标志,使中断系统能够正常工作,这样一个事实却容易为不少编码人员所忽视。软件复位就是用一系列指令来模拟硬件复位功能,最后通过转移指令使程序从0000H地址开始执行。对各专用寄存器的复位操作是容易的,也没有必要完全模拟,可根据实际需要去主程序初始化过程中完成。而对中断激活标志的清除工作常被遗忘,因为它没有明确的位地址可供编程。有的编程人员用020000(LJMP  0000H)作为软件陷阱,认为直接转向0000H地址就完成了软件复位,就是这类错误的典型代表。软件复位是使用软件陷阱和软件看门狗后必须进行的工作,这时程序出错完全有可能发生在中断子程序中,中断激活标志已置位,它将阻止同级中断响应。由于软件看门是高级中断,它将阻止说要中断响应,由此可见清除中断激活标志的重要性。
三.系统软件设计
软件任务分析和硬件电路设计结合进行,哪些功能由硬件完成,哪些任务由软件完成,在硬件电路设计基本定型后,也就基本上决定下来了。
1.系统原理图
1.012.jpg
2.程序流程图
在本设计中包括了以下八个主要的程序:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。主流程图如图所示:
      1.013.jpg
1.014.jpg
1.015.jpg

第四章:焊接调试过程与问题分析。
4.1 焊接
主要步骤:1.检测各元件
2. 对PCB板进行排版及              布线
3.焊接
分步骤完成:
1.检测各元件
用万用表检查、了解元件;
(1)一般电阻
电阻的阻值是可以根据电阻上的色环判断:
1)、四环电阻阻值等于前两位对应的数值乘上第三位对应的倍率,第四位为误差范围;
2)、五环电阻阻值等于前三位对应的数值乘上第四位对应的倍率,第五位为误差范围。
1.016.jpg      电阻R0为五环型
色环颜色:棕 黑 黑 棕 棕
阻值=100×10² =1000Ω
误差为±1%
实测阻值为992Ω
本实验R1用两个R0的电阻并联成;               图1  电阻R0
1.017.jpg     电阻R2为四环型
色环颜色 :绿 棕 红 金
阻值=51×10² =5100Ω=5.1kΩ
误差为±5%
实测阻值为5.02kΩ                                图2 电阻R2                              
    光敏电阻
A、在光照情况下,测量光敏电阻的阻值,即为光敏电阻的亮阻;
B、在遮光情况下,测量光敏电阻的阻值,即为光敏电阻的暗阻;
(2)发光二极管
发光二极管有两个接线柱,一个长的一个短的,长端为正极,短端为负极。可以利用万用表测量两种接法时的电阻值,可知道当正极接到长端,负极接到短端的时候,发光二极管的阻值比较小,此即是二极管的单向导通特性。
  • 可变电阻
可变电阻有三个引脚,它的接法和滑动变阻器的接法一样,有三端接入式和两端接入式,本实验采用两端接入式比较简单。采用两端接入时,其中一端必须接在中间的那个引脚上,另外一个在剩余的两个引脚中,可以任选一个(两者的区别是,滑动头的转动方向不一样)。选择好引脚后,可以将其接在万用表上,测其阻值的大小,转动滑动头,看顺时针转动时阻值是增加还是减小,这样做对调试电路时有好处,可以知道自己旋转的方向是增加电阻还是减小电阻。
  • 蜂鸣器
本实验所用的蜂鸣器和平时看到的扬声器、耳机等发声器件有微小的差别,它里边多了一个振荡器,输入电流时振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。可以尝试的将其正负极接上电源,可看到只有正负极接入正确时,蜂鸣器才会发声。也可根据蜂鸣器上的引线长度按来判断正负极(长正短负)。所以在实验室中要把蜂鸣器的正负极接正确。
  • 三极管
三极管有两种,一种是PNP管,一种是NPN管,本实验用的是PNP管。
三极管有三个引脚,分别是基极(b),发射极(e),集电极(c)。本实验所用的三极管判断极点的方法是,面对有型号标记的一面,然后看着三个引脚,从左到右依次是,发射极(e),基极(b),集电极(c)。接线时三个极端不能接错,否则三极管就没有起到作用。                        
1.018.jpg
图3三极管符号、管脚排列
集电极和基极之间形成集电结,发射极和基极之间形成发射结,三极管起放大作用的条件,发射结正向偏置,集电结反向偏置。正向偏置时必须达到正向偏置电压,即为导通,否则,为截止状态。
2.对PCB板进行排版及连线            
       本实验所用的面包板的内部链接在破坏背面的绝缘胶带的情况下,可以揭开胶带看其内部线路的构造,以防不知道内部线路差错电路。当然最好的办法是:用测试电路在插孔上来回实验,猜想验证其内部构造。                                                        
1)、首先了解面包板在连线和焊接的注意事项。
2)、了解实验原件及器材后,按照原理图在面包板上连接电路;
3)、焊接要注意,电子电路在焊接时,应遵循的规则。
3.  焊接的问题及解决
一般来说,造成硬件问题的首要问题就是焊接了,也就是说焊接的好与坏直接响产品的正常运行。造成焊接质量不高的常见原因是:①焊锡用量过多,形成焊点的锡堆积;焊锡过少,不足以包裹焊点。②冷焊。焊接时烙铁温度过低或加热时间不足,焊锡未完全熔化、浸润、焊锡表面不光亮(不光滑),有细小裂纹(如同豆腐渣一样!)。③夹松香焊接,焊锡与元器件或印刷板之间夹杂着一层松香,造成电连接不良。若夹杂加热不足的松香,则焊点下有一层黄褐色松香膜;若加热温度太高,则焊点下有一层碳化松香的黑色膜。对于有加热不足的松香膜的情况,可以用烙铁进行补焊。对于已形成黑膜的,则要"吃"净焊锡,清洁被焊元器件或印刷板表面,重新进行焊接才行。④焊锡连桥。指焊锡量过多,造成元器件的焊点之间短路。这在对超小元器件及细小印刷电路板进行焊接时要尤为注意。⑤焊剂过量,焊点明围松香残渣很多。当少量松香残留时,可以用电烙铁再轻轻加热一下,让松香挥发掉,也可以用蘸有无水酒精的棉球,擦去多余的松香或焊剂。⑥焊点表面的焊锡形成尖锐的突尖。这多是由于加热温度不足或焊剂过少,以及烙铁离开焊点时角度不当浩成的内。
  最小系统的电路不工作,首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否符合电源电压,常用的是5V左右。接下来就是检测复位引脚的电压是否正常,EA引脚的电压要正常为5V左右。
4.焊接的技巧和注意事项
1、焊锡之前应该先插上电烙铁的插头,给电烙铁加热。  
2、焊接时,焊锡与电路板、电烙铁与电路板的夹角最好成45度,这样焊锡与电烙铁夹角成90度。
3、焊接时,焊锡与电烙铁接触时间不要太长,以免焊锡过多或是造成漏锡;也不要过短,以免造成虚焊。
4、元件的腿尽量要直,而且不要伸出太长,以1毫米为好,多余的可以剪掉。
5、焊完时,焊锡最好呈圆滑的圆锥状,而且还要有金属光泽。
4.2调试4.21系统的调试
系统调试包括硬件调试和软件调试,而且两者是密不可分的。我们设计好的硬件电路和软件程序,只有经过联合调试,才能验证其正确性;软硬件的配人情况以及是否达到设计任务的要求,也只有经过调试,才能发现问题并加以解决、完善,最终开发成实用产品。
  硬件调试分单元电路调试和联机调试,单元电路试验在硬件电路设计时已经进行,这里的调试只是将其制成印刷电路板后试验电路是否正确,并排除一些加工工艺性错误(如错线、开路、短路等)。这种调试可单独模拟进行,也可通过开发装置由软件配合进行,硬件联机调试则必须在系统软件的配合下进行。
  软件调试一般包括分块调试和联机调试两个阶段。程序的分块调试一般在单片机开发装置上进行,可根据所调程序功能块的入口参量初值编制一个特殊的程序段,并连同被调程序功能块一起在开发装置上运行;也可配合对应硬件电路单独运行某程序功能块,然后检查是否正确,如果执行结果与预想的不一致,可以通过单步运行或设置断点的方法,查出原因并加以改正,直到运行结果正确为止。这时该 程序功能块已调试完毕,可去掉附加程序段。其它程序功能块可按此法进行调试。程序联机调试就是将已调试好的各程序功能块按总体结构联成一个完整程序,在所研制的硬件电路上运行。从而试验程序整体运行的完整性、正确性和与硬件电路的配合情况。在联调中可能会有某些支路上的程序、功能块因受条件制约而得不到相应的输入参数,这时,调试人员应创造条件进行模拟调试。在联调中如发现硬件问题也应及时修正,直到单片机系统的软件、硬件全部调试成功为止。系统调试完成后,还要进行一段时间的试运行,从而检验系统的稳定性和抗干扰能力,验证系统功能是否达到设计要求,是否达到预期的效果。
4.22具体调试
1、具有清零装置和抢答控制,可由主持人操纵避免有人在主持人说
“开始”前提前抢答违反规则。
2、具有定时功能,在60秒内无人抢答表示所有参赛选手获参赛队对本题弃权。
3、60秒时仍无人抢答其报警电路工作表示抢答时间耗尽并禁止抢答。
4、 显示抢答时间, 按一下减一秒,按一下"-1s"键,时间LED上会显示改变后的时间,调整范围为0s~60s。                        
5、主持人按"抢答开始"键,会有提示音,并立刻进入抢答倒计时(预设60s抢答时间),如有选手抢答,会有提示音,并会显示其号数,只有第一个按抢答的选手有效。                                                                                             
6、如倒计时期间,主持人想停止倒计时可以随时按"停止"按键,系统会自动进入准备状态,等待主持人按"抢答开始"进入下次抢答计时。                                                                                                      
我遇到的问题:有时候在自己创建的元器件的管脚上无法实现连线。
 分析回答:应该是管脚的间距太小了。因为在ISIS中,每个元器件的管脚都要占据一块区域(就像自己的保护区一样,不容别人随意侵犯),该区域会排斥外部的走线。解决问题的方法是在走线的同时按住 “CTRL”键,直到走线绕过狭窄的保护区。当然最根本的办法是重新编辑元器件,把其管脚间距调大一些。
  主持人按键来控制总开关,主持人按下开关那么选手开始抢答,此时数码管开始0-60计数,并且选手们必须在规定的时间内进行抢答,若过了60秒还没抢答那么抢答失效,选手们若有一个在规定的时间内抢答成功则其余的选手不可以再抢答,即该选手抢答成功。
4.23调试实物图
1.开始计时
1.019.jpg
2.选手抢答
1.020.jpg
第五章:总结
     经过近两个星期的努力,在老师和同学的讨论和帮助下,我成功地完成了八路抢答器的设计,通过此次课程设计,我重新认识到了对书本上的知识要独立运用的道理。在抢答器设计过程中,发现了很多细节性的问题,也出现了很多错误,经过和同学们研究、商讨最后都解决,感觉团队协作能力是非常有必要的!通过此次的抢答器的设计,让我重新拾起了以前所学习的电子知识和C语言的编程,也使我加深了对单片机及接口技术的理解和应用,由于知识水平的局限,设中可能会存在着一些不足,我真诚的接受老师和同学的批评和指正。

参考文献
1.C程序设计 ,谭浩强,清华大学出版社,2005
2.单片机原理及接口技术(第3版),李朝青,北京航空航天大学出版社,2002
3. 单片机系统设计与实例指导,冯育长,西安电子科技大学出版社,2007
4. 单片机课程设计实例指导,李光飞,北京航天航空大学出版社,2004

单片机源程序:
  1. #include

  2. #include

  3. #define uchar unsigned char

  4. #define uint unsigned int

  5. sbit rst=P3^7;

  6. sbit speaker=P3^6;//报警

  7. sbit start=P3^4;

  8. uchar count=0;//用于产生1秒的时间

  9. uchar dsy_time=0x3c; //用于显示抢答时间

  10. uchar dsy_buffer[]={0,0,0};//显示缓冲

  11. uchar code leddata[]=  //共阴数码管的段码

  12.                                           {

  13.                 0x3F,  //"0"

  14.                 0x06,  //"1"

  15.                 0x5B,  //"2"

  16.                 0x4F,  //"3"

  17.                 0x66,  //"4"

  18.                 0x6D,  //"5"

  19.                 0x7D,  //"6"

  20.                 0x07,  //"7"

  21.                 0x7F,  //"8"

  22.                 0x6F,  //"9"

  23.                          };

  24. uchar code state[]=//抢答时的8种按键情况

  25. {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

  26. //

  27. //延时

  28. //

  29. void DelayMS(uint ms)

  30. {

  31.               uchar t;

  32.               while(ms--)

  33.               for(t=0;t<120;t++);

  34. }

  35. //

  36. //报警

  37. //

  38. void speak(void)

  39. {

  40.               uchar i=10;            

  41.               while(i--)            

  42.                             {

  43.                                           speaker=~speaker;

  44.                                           DelayMS(2);                                                      

  45. }                            }

  46. //

  47. //主程序

  48. //

  49. void main()

  50. {              //初始化

  51.               uchar i,m=0x04;

  52.               P0=0xff;

  53.               P1=0x00;

  54.               P2=0x00;

  55.               P3=0xb7;

  56.               TMOD=0x01;//选择工作方式

  57.               TH0=0x3c;//定时器T0初始值的高八位

  58.               TL0=0xaf;//定时器T0初始值的低八位

  59.               IE=0x83;//开总中断,定时器中断,外部中断0

  60.               while(1)

  61.               {            

  62.                            

  63.                             if(rst==0)//系统复位

  64.                             {

  65.                                           dsy_buffer[0]=0;

  66.                                           TR0=0;

  67.                                           dsy_time=0x3c;            

  68.                             }

  69.                             if(dsy_time==0x00)//在设定的时间到,而无人抢答时关闭定时器中断

  70.                             {

  71.                                           TR0=0;//关闭定时器中断

  72.                                           P1=0x00;//禁止抢答

  73.                             }            

  74.                             for(i=0;i<3;i++)//用数码管显示抢答序号和抢答时间

  75.                             {            

  76.                                          

  77.                                           P2=m;

  78.                                           m=_cror_(m,1);//循环移位实现数码管的动态显示                                         

  79.                                           dsy_buffer[2]=dsy_time%10;//抢答时间的个位

  80.                                 dsy_buffer[1]=dsy_time/10;//抢答时间的十位            

  81.                                           P0=leddata[dsy_buffer[i]];//数码管显示抢答者的序号和抢答时间

  82.                                           DelayMS(5);

  83.                            



  84.                             }

  85.                                           m=0x04;//实现下轮的循环显示

  86.                             for(i=0;i<8;i++)

  87.                             {

  88.                                           if(P1==state[i])//判断有按键按下

  89.                                           {

  90.                                                         DelayMS(10); //延时防止按键抖动引起的误操作

  91.                                                         if(P1<=state[i]) //再次判断有按键按下

  92.                                                         {

  93.                                                                       dsy_buffer[0]=i+1;

  94.                                                                       P1=0x00;//通过硬件实现优先抢答

  95.                                                                       TR0=0;              //关闭定时器0

  96.                                                                       speak();                                                                     

  97.                                                         }

  98.                                                       

  99.                                           }                           

  100.                             }

  101.                            

  102.               }            



  103. }

  104. //

  105. //实现定时时间1S

  106. //

  107. void key_inter() interrupt 1

  108. {

  109.               TH0=0x3c;//50MS初始值

  110.               TL0=0xaf;//50MS初始值

  111.               if(++count==20)

  112.               {

  113.                             count=0;

  114.                            

  115.                             dsy_time--;//实现计数器的减法计数

  116.               }                           

  117. }



  118. //

  119. //抢答开始

  120. [color=rgb(0, 0, 0)]…………限于本文篇幅 余下代码请从51黑下载附件…………[/color]
复制代码

完整论文下载(word格式 可编辑):
基于单片机8路抢答器论文.doc (5.98 MB, 下载次数: 23)
回复

使用道具 举报

ID:210035 发表于 2017-6-11 11:09 | 显示全部楼层
课程设计么
回复

使用道具 举报

ID:210052 发表于 2017-6-11 11:58 | 显示全部楼层
这是毕业论文?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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