找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3721|回復(fù): 21
打印 上一主題 下一主題
收起左側(cè)

新手學(xué)習(xí)單片機(jī)進(jìn)度很慢,應(yīng)該如何學(xué)習(xí)?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:695930 發(fā)表于 2020-6-20 20:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 你速度發(fā)生的 于 2020-6-21 00:11 編輯

我想咨詢各位大佬,我是19級(jí)大一,我學(xué)習(xí)單片機(jī)有半年左右,對(duì)單片機(jī)的理解只到大概可以看懂,51普中的板子例程也都走了一遍。但是和我一師兄習(xí)單片機(jī)的師兄他就比我深入很多,我們那個(gè)時(shí)候制作一個(gè)小項(xiàng)目LCD1602液晶顯示溫度并設(shè)定溫度上下限,蜂鳴器報(bào)警提示超限。我?guī)熜炙谱鬟@個(gè)程序只有

這是不是說明我學(xué)習(xí)的進(jìn)度慢了他很多,我看單片機(jī)的書看到時(shí)序,串口什么的原理就頭疼,看久了就發(fā)呆去了,求各位大佬支招。主要是想問學(xué)習(xí)單片機(jī)是否要像我?guī)熜帜菢由钊氲膶W(xué)習(xí),我應(yīng)該怎么學(xué)
  1. #include <reg51.h>
  2. #include "temp.h"
  3. #include <stdio.h>
  4. void LcdDisplay(int);
  5. void UsartConfiguration(void);
  6. /*******************************************************************************
  7. * 函數(shù)名         : main
  8. * 函數(shù)功能     : 主函數(shù)
  9. * 輸入           : 無
  10. * 輸出           : 無
  11. *******************************************************************************/
  12. void main()
  13. {

  14. UsartConfiguration();//初始化
  15. EA=1;      //打開總中斷
  16. while(1)
  17. {
  18.    LcdDisplay(Ds18b20ReadTemp());  
  19.    Delay1ms(100);//0.1s鐘刷一次
  20.    
  21. }
  22. }
  23. /*******************************************************************************
  24. * 函數(shù)名         : LcdDisplay()
  25. * 函數(shù)功能     : LCD顯示讀取到的溫度
  26. * 輸入           : v
  27. * 輸出           : 無
  28. *******************************************************************************/
  29. void LcdDisplay(int temp)   //lcd顯示
  30. {
  31.   static int q=0;
  32. int i=0;
  33.   char  datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
  34. float tp;  

  35.   temp=temp-1;
  36.   
  37.   tp=temp;
  38. tp=tp*0.0625+0.5;
  39. //  temp=tp*0.0625*100+0.5;
  40. // tp=(float)temp/100;
  41.   printf("第%d次測(cè)量的溫度為:+%0.2f\n",q++,tp);
  42. }
  43. /*******************************************************************************
  44. * 函 數(shù) 名         :UsartConfiguration()
  45. * 函數(shù)功能     :設(shè)置串口
  46. * 輸    入         : 無
  47. * 輸    出         : 無
  48. *******************************************************************************/
  49. void UsartConfiguration(void)
  50. {

  51. TMOD=0x20;//即0010 0000,定時(shí)器/計(jì)數(shù)器1,工作方式2
  52. TH1=0xfd;//設(shè)置波特率為9600
  53. TL1=0xfd;
  54. TR1=1;//啟動(dòng)定時(shí)器/計(jì)數(shù)器1
  55. SCON=0x50; //0101 0000.串口工作方式1,允許串行控制
  56. PCON=0x00;//設(shè)置SMOD=0
  57. IE=0x90; //CPU允許中斷,串行允許中斷
  58. TI=1;//
  59. }


  60. 而我自己的
  61. /*******************************************************************************
  62. 注意事項(xiàng):
  63. 根據(jù)自己使用的LCD1602是否帶有轉(zhuǎn)接板,如果帶有轉(zhuǎn)接板的即為4位,需在LCD.H頭文件中
  64. 將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認(rèn)將該宏注釋。
  65. 接線說明:(開發(fā)攻略每個(gè)實(shí)驗(yàn)章節(jié)內(nèi)的實(shí)驗(yàn)現(xiàn)象都有對(duì)應(yīng)的接線圖說明)
  66. LCD1602接線參考LCD1602液晶顯示實(shí)驗(yàn)接線圖
  67. DS18B20傳感器接線參考DS18B20溫度傳感器實(shí)驗(yàn)接線圖

  68. 實(shí)驗(yàn)操作:
  69. LCD1602上顯示采集的溫度,同時(shí)
  70. 打開串口調(diào)試助手,將串口波特率選擇9600,打開串口,此時(shí)在串口上就會(huì)顯示采集的溫度,串口截圖參考文件夾下。
  71. *******************************************************************************/
  72. #include<reg51.h>
  73. #include"lcd.h"
  74. #include"temp.h"
  75. #include<intrins.h>  //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件
  76. typedef unsigned int u16;   //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  77. typedef unsigned char u8;
  78. sbit beep=P1^1;
  79. uchar i;
  80. int n=0;
  81. uchar CNCHAR[17] = "第1次測(cè)試溫度為:";
  82. uchar lx[1]="1";
  83. void LcdDisplay(int);
  84. void UsartConfiguration();
  85. sbit LSA=P0^7;
  86. sbit LSB=P2^3;
  87. sbit LSC=P2^4;
  88. /*******************************************************************************
  89. * 函 數(shù) 名         : delay
  90. * 函數(shù)功能     : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  91. *******************************************************************************/
  92. void delay(u16 i)
  93. {
  94. while(i--);
  95. }
  96. /*******************************************************************************
  97. * 函數(shù)名         : main
  98. * 函數(shù)功能     : 主函數(shù)
  99. * 輸入           : 無
  100. * 輸出           : 無
  101. *******************************************************************************/
  102. void main()
  103. {
  104. UsartConfiguration();
  105. LcdInit();    //初始化LCD1602
  106. LcdWriteCom(0x88); //寫地址 80表示初始地址
  107. LcdWriteData('C');
  108. while(1)
  109. {
  110.   LcdDisplay(Ds18b20ReadTemp());
  111.          if((Ds18b20ReadTemp()>480)||(Ds18b20ReadTemp()<400))
  112.   {
  113.       for(i=0;i<120;i++)
  114.    {
  115.    beep=~beep;
  116.     delay(100);   
  117.    };
  118.   }
  119.   else
  120.   {
  121.      ;
  122.   };
  123. //  Delay1ms(1000);//1s鐘刷一次
  124. }
  125. }

  126. /*******************************************************************************
  127. * 函數(shù)名         : LcdDisplay()
  128. * 函數(shù)功能     : LCD顯示讀取到的溫度
  129. * 輸入           : v
  130. * 輸出           : 無
  131. *******************************************************************************/
  132. void LcdDisplay(int temp)   //lcd顯示
  133. {
  134.    unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
  135. float tp;  
  136. if(temp< 0)    //當(dāng)溫度值為負(fù)數(shù)
  137.    {
  138.     LcdWriteCom(0x80);  //寫地址 80表示初始地址
  139.   SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  140.   while(!TI);            //等待發(fā)送數(shù)據(jù)完成
  141.   TI=0;       //清除發(fā)送完成標(biāo)志位
  142.      LcdWriteData('-');    //顯示負(fù)
  143.   //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
  144.   temp=temp-1;
  145.   temp=~temp;
  146.   tp=temp;
  147.   temp=tp*0.0625*100+0.5;
  148.   //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  149.   //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  150.   //算由?.5,還是在小數(shù)點(diǎn)后面。

  151.    }
  152.   else
  153.    {   
  154.     LcdWriteCom(0x80);  //寫地址 80表示初始地址
  155.      LcdWriteData('+');   //顯示正
  156.   SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  157.   while(!TI);            //等待發(fā)送數(shù)據(jù)完成
  158.   TI=0;       //清除發(fā)送完成標(biāo)志位
  159.   tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
  160.   //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  161.   temp=tp*0.0625*100+0.5;
  162.   //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  163.   //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  164.   //算加上0.5,還是在小數(shù)點(diǎn)后面。
  165. }
  166. datas[0] = temp / 10000;
  167. datas[1] = temp % 10000 / 1000;
  168. datas[2] = temp % 1000 / 100;
  169. datas[3] = temp % 100 / 10;
  170. datas[4] = temp % 10;
  171. LcdWriteCom(0x82);    //寫地址 80表示初始地址
  172. LcdWriteData('0'+datas[0]); //百位
  173. SBUF = '0'+datas[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  174. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  175. TI = 0;

  176. LcdWriteCom(0x83);   //寫地址 80表示初始地址
  177. LcdWriteData('0'+datas[1]); //十位
  178. SBUF = '0'+datas[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  179. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  180. TI = 0;
  181. LcdWriteCom(0x84);  //寫地址 80表示初始地址
  182. LcdWriteData('0'+datas[2]); //個(gè)位
  183. SBUF = '0'+datas[2];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  184. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  185. TI = 0;
  186. LcdWriteCom(0x85);  //寫地址 80表示初始地址
  187. LcdWriteData('.');   //顯示 ‘.’
  188. SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  189. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  190. TI = 0;
  191. LcdWriteCom(0x86);   //寫地址 80表示初始地址
  192. LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)  
  193. SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  194. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  195. TI = 0;
  196. LcdWriteCom(0x87);   //寫地址 80表示初始地址
  197. LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
  198. SBUF = '0'+datas[4];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  199. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  200. TI = 0;
  201. for(i=0; i<17; i++)
  202. {
  203.    SBUF = CNCHAR[i];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  204.   while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  205.   TI = 0;
  206. }
  207.   if((CNCHAR[2]='1')&&(n<9))我只在這里修改了一下
  208.   {
  209.     n++;
  210.        CNCHAR[2]=lx[0];
  211.        lx[0]=lx[0]+1;   
  212.   }
  213.   else
  214. {
  215.     CNCHAR[2]='1';
  216.    lx[0]='1';
  217.    n=0;
  218. }
  219. }
  220. /*******************************************************************************
  221. * 函 數(shù) 名         :UsartConfiguration()
  222. * 函數(shù)功能     :設(shè)置串口
  223. * 輸    入         : 無
  224. * 輸    出         : 無
  225. *******************************************************************************/
  226. void UsartConfiguration()
  227. {
  228.   SCON=0x50;//設(shè)置串口工作方式1
  229. TMOD=0x20;//設(shè)置計(jì)數(shù)器工作方式2
  230. PCON=0x00;//即SMOD=1,波特率不加倍
  231. TH1=0xFD;//計(jì)數(shù)器初值。波特率是9600,晶振為11.0592MHz
  232. TL1=0xFD;
  233. // ES=1;      //打開接收中斷
  234. // EA=1;      //打開總中斷
  235. TR1=1;//打開計(jì)數(shù)器
  236. }
復(fù)制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:748788 發(fā)表于 2020-6-21 10:53 | 只看該作者
你的師兄除了跟著課本走,還多動(dòng)了腦子,在原有程序的基礎(chǔ)上加了新的東西。這正是你缺少的。編程就要多動(dòng)腦子,而且是越用越好用
回復(fù)

使用道具 舉報(bào)

板凳
ID:235200 發(fā)表于 2020-6-21 11:36 | 只看該作者
說明與單片機(jī)相關(guān)的基礎(chǔ)知識(shí)薄弱,需要進(jìn)一步加深學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

地板
ID:785582 發(fā)表于 2020-6-21 12:47 | 只看該作者
先從理論知識(shí)開始,硬啃,然后結(jié)合編程實(shí)踐應(yīng)該會(huì)好很多
回復(fù)

使用道具 舉報(bào)

5#
ID:47286 發(fā)表于 2020-6-21 18:06 | 只看該作者
這事的關(guān)鍵不在技術(shù)本身 在你自己 你是特想學(xué)么 你是一定要學(xué)么 如果倆條件都滿足 時(shí)間其實(shí)不是問題 人的進(jìn)步又不是線性的 也許是對(duì)數(shù)曲線也許是指數(shù)曲線
回復(fù)

使用道具 舉報(bào)

6#
ID:420836 發(fā)表于 2020-6-21 23:18 | 只看該作者
要很好地學(xué)習(xí)單片機(jī),需要大量的實(shí)踐經(jīng)驗(yàn),例如編程和制作。
回復(fù)

使用道具 舉報(bào)

7#
ID:785561 發(fā)表于 2020-6-22 07:40 | 只看該作者
理論+實(shí)踐,從中深層次理解!。
回復(fù)

使用道具 舉報(bào)

8#
ID:162664 發(fā)表于 2020-6-22 09:48 | 只看該作者
我認(rèn)為基礎(chǔ)的硬件知識(shí)對(duì)理解mcu的深入程度有一定的輔助作用。一:基礎(chǔ)模塊的修煉。(第一個(gè)階段不要看匯編,用c語言。匯編門檻太高容易一下子把脆弱的積極性和興趣給打擊掉。)
1:建議找個(gè)單片機(jī)的教程,先把單片機(jī)的基礎(chǔ)模塊摸一遍,理解基礎(chǔ)的mcu模塊(通論本質(zhì)上就是串行和并行的區(qū)別。了解本質(zhì)之后就是規(guī)則的問題而已)
1.2:輸出輸出端口操作、定時(shí)器、pwm模塊、adc轉(zhuǎn)換、模擬iic、模擬spi、硬件uart、外部中斷、系統(tǒng)時(shí)鐘、看門狗(你可能用的stc的mcu,系統(tǒng)時(shí)鐘可以暫時(shí)不弄,iic、spi的先用模擬的方式來。)
2:寄存器的操作一定要自己寫,可以參考別人寫得來拓展一下思路,(對(duì)mcu寄存器基本的操作可以參考新唐n76e003的demo程序,官網(wǎng)有資料。)
2.1:這個(gè)過程中你買一個(gè)邏輯分析儀(30rmb)、串口接收的ch340(8rmb),如果有示波器更好、暫時(shí)不強(qiáng)求。
3:每一個(gè)模塊需要一些硬件知識(shí),一般的教程都會(huì)講解的;A(chǔ)的按鍵操作濾波、lcd的現(xiàn)實(shí)在這個(gè)過程中會(huì)學(xué)。
通訊部分優(yōu)先uart、后spi、iic。uart不要模擬實(shí)現(xiàn),用mcu模塊方式實(shí)現(xiàn)(模擬只是讓你對(duì)它了解更深刻,一般使用不模擬)。iic、spi先用模擬方式實(shí)現(xiàn)后用mcu模塊方式實(shí)現(xiàn)。
二:代碼編寫修煉
1:因?yàn)樯鲜龅牟僮魇莔cu的模塊操作,接下來是怎么優(yōu)化和讓你程序變得貼近應(yīng)用。需要對(duì)編寫代碼方式的修煉。
1.1:c51的語言的修煉暫時(shí)不需要做的太深刻。指針和結(jié)構(gòu)體慢慢來(先看懂,再慢慢會(huì)用),基礎(chǔ)的if else siwtch while break  for #define 差不多就夠了(可能有遺漏一時(shí)想不起來)
2:看看《單片機(jī)編程魔法師》。最基礎(chǔ)的兩個(gè)思想要掌握。( 一定要擺脫掉對(duì) delay這種延時(shí)超過1ms的用法 ,delay可以用,但是不能延時(shí)時(shí)間太長(zhǎng),影響程序的并行效率。)
2.1:驅(qū)動(dòng)的思想/程序分層。
2.2:定時(shí)器的多層復(fù)用。
2.3:多任務(wù)并行(偽并行)。
三:基礎(chǔ)的模塊會(huì)了之后,并行的思想吸收了一些,這樣可以應(yīng)用在項(xiàng)目上。再反推回來去深刻理解mcu的基本原理和硬件的知識(shí)。。
回復(fù)

使用道具 舉報(bào)

9#
ID:677449 發(fā)表于 2020-6-22 10:48 | 只看該作者
從簡(jiǎn)單的開始做起,從驅(qū)動(dòng)定時(shí)串口中斷等一步步學(xué)習(xí),代碼復(fù)雜的肯定比簡(jiǎn)單的費(fèi)腦子
回復(fù)

使用道具 舉報(bào)

10#
ID:786442 發(fā)表于 2020-6-22 11:00 | 只看該作者
先看單片機(jī)原理,再學(xué)編程。
回復(fù)

使用道具 舉報(bào)

11#
ID:786687 發(fā)表于 2020-6-22 15:13 | 只看該作者
找一塊單片機(jī)開發(fā)板進(jìn)行練習(xí)。可以自己花錢買一塊單片機(jī)的開發(fā)板,不需要功能太全,對(duì)于初學(xué)者來說功能非常多的板子,上面有很多東西你這輩子都用不著。建議有流水燈、數(shù)碼管、獨(dú)立鍵盤、矩陣鍵盤、AD或DA(原理一樣)、液晶、蜂鳴器,有這些就差不多了。如果上面提到的這些,你能熟練應(yīng)用,那可以說對(duì)于單片機(jī)方面的硬件你已經(jīng)入門了,剩下的就是自己練習(xí)設(shè)計(jì)電路,不斷的積累經(jīng)驗(yàn)。
回復(fù)

使用道具 舉報(bào)

12#
ID:355173 發(fā)表于 2020-6-22 17:17 | 只看該作者
多做實(shí)驗(yàn),自己動(dòng)手去做才會(huì)發(fā)現(xiàn)其中隱藏了許多自己沒注意到的各種坑,然后從中找到解決方法,多去看各個(gè)寄存器的作用以及單片機(jī)的datasheet
回復(fù)

使用道具 舉報(bào)

13#
ID:772467 發(fā)表于 2020-6-22 19:23 來自手機(jī) | 只看該作者
大概了解整體框架,后來的實(shí)驗(yàn)設(shè)計(jì),會(huì)逼著你學(xué)會(huì)很多
回復(fù)

使用道具 舉報(bào)

14#
ID:787349 發(fā)表于 2020-6-23 09:32 | 只看該作者
我覺得可以結(jié)合一些實(shí)際的需求或者是例子,這樣有了時(shí)間節(jié)點(diǎn)要求的話就會(huì)倒逼自己去學(xué)。再有串口什么的原理可以去b站看視頻學(xué)習(xí)很快就能學(xué)會(huì)
回復(fù)

使用道具 舉報(bào)

15#
ID:147017 發(fā)表于 2020-6-23 10:32 | 只看該作者
找一些自己感興趣的dome入手,這樣的話會(huì)更快的有成效
回復(fù)

使用道具 舉報(bào)

16#
ID:91521 發(fā)表于 2020-6-23 12:19 | 只看該作者
基礎(chǔ)一定要扎實(shí),以后多看一些別人編的程序就可以了
回復(fù)

使用道具 舉報(bào)

17#
ID:452950 發(fā)表于 2020-6-25 13:18 | 只看該作者
自己設(shè)計(jì)一個(gè)小項(xiàng)目,解決制作過程中實(shí)際遇到的問題,就能理解的更透徹。
回復(fù)

使用道具 舉報(bào)

18#
ID:363342 發(fā)表于 2020-6-25 20:41 | 只看該作者
還是得自己多動(dòng)腦思考,把例程跑幾遍后就開始自己試著改程序,后續(xù)慢慢自己寫
回復(fù)

使用道具 舉報(bào)

19#
ID:695930 發(fā)表于 2020-6-25 22:23 | 只看該作者
謝謝大家的回復(fù),我會(huì)繼續(xù)努力的,我發(fā)現(xiàn)應(yīng)該是我在做小項(xiàng)目思考的不夠發(fā)散,我每次都是做完項(xiàng)目之后就沒想了,而我的師兄他想的更深入
回復(fù)

使用道具 舉報(bào)

20#
ID:682197 發(fā)表于 2020-6-27 18:45 | 只看該作者
51單片機(jī)新手也就50多個(gè)程序去了解,點(diǎn)燈,鍵盤,蜂鳴器,中斷,串口,lcd,ds18b20...,半年能學(xué)完自己打一遍就不錯(cuò)了。
多看視頻,再去看書,視頻有些人已經(jīng)總結(jié)好了,現(xiàn)在跟以前不一樣了,要學(xué)會(huì)利用網(wǎng)絡(luò),看書只是復(fù)習(xí)或查缺,看數(shù)據(jù)手冊(cè)是做單片機(jī)必備的,越早學(xué)習(xí)怎么看越好。
多參加比賽,做項(xiàng)目是最鍛煉自己和提高最快的,學(xué)不下去就是沒有時(shí)限和動(dòng)力,一旦你做下去的時(shí)候,你會(huì)發(fā)現(xiàn)其實(shí)時(shí)間會(huì)越來越不夠
回復(fù)

使用道具 舉報(bào)

21#
ID:733205 發(fā)表于 2020-7-21 15:20 | 只看該作者
慢不要緊,只要每一次比上一次有進(jìn)步就行,快也并不一定好,基礎(chǔ)打牢點(diǎn)更好
回復(fù)

使用道具 舉報(bào)

22#
ID:981034 發(fā)表于 2022-1-21 14:25 | 只看該作者
欲速則不達(dá),慢慢來
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表