找回密码
 立即注册

QQ登录

只需一步,快速开始

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

89c51单片机利用定时器实现万年历源码

[复制链接]
ID:302754 发表于 2018-4-8 19:00 | 显示全部楼层 |阅读模式
利用定时器的定时功能实现了秒、分、时的计数以24小时为1天,天累计满一个月相应的天数时为1个月,12个月为1年。
该万年历系统包含了多项功能,整个应用上来看由三大功能组成,分别是:时钟功能、秒表功能、闹钟功。

单片机源程序如下:
  1. //==================================================================
  2. //文件名称: 应用
  3. //功能说明:                        
  4. //硬件描述:                                                                                                                                                                  
  5. //资源说明: 11.0592M晶体                                                                                                                            
  6. //创建日期:                                                
  7. //软件版本: v 1.0     
  8. //==================================================================
  9. //===========================包含头文件==============================
  10. #include <reg51.h>
  11. #include "timer.h"
  12. #include "app.h"

  13. //=============================宏定义===============================
  14. sbit        buzzer = P0^4;

  15. //============================变量定义==============================
  16. uchar data        event_FIFO[8];                                                                               //事件缓冲区
  17. uchar        data        *event_WrIp = event_FIFO;                                                   //写指针
  18. uchar        data        *event_RdIp = event_FIFO;                                                   //读指针

  19. uchar        data        display[4];
  20. uchar        data        sys_State = 0x14;                                              //界面状态(初始状态显示时分)
  21. uchar data  current_Event = 0;                                            //按键状态

  22. uchar        data  month_Day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};         //每个月最大天数数组(二月是由于年份初值给的2015,非闰年,即二月初值为28天。)

  23. uchar        data        second        = 50;                                                         //秒初值
  24. char        data        minute        = 59;                                                         //分初值
  25. char        data        hour        = 23;                                                           //时初值
  26. uchar        data        day                = 28;                                                           //月初值
  27. uchar        data        month        = 2;                                                           //日初值
  28. uint        data        year        = 2016;                                                         //年初值
  29. uint        data        week        = 7;                                                           //周初值

  30. char        data        alarm_Minute = 0;                                               //闹钟时初值
  31. char        data        alarm_Hour         = 0;                                               //闹钟分初值

  32. bit   swatch_Start_Flag = 0;                                                     //秒表计时开始标致位

  33. bit   alarm_Flag = 0;

  34. uchar alarm_State = 0;                                                     //0-free 1-louding 2-handstop 3-stop

  35. //=================================================
  36. //函 数 名: void        write_Event(uchar cmd)
  37. //功能描述: 向事件缓冲区写入值
  38. //输入参数: 写入的事件值
  39. //输出参数:        无
  40. //设 计 者:
  41. //创建日期:
  42. //==================================================
  43. void        write_Event(uchar cmd)
  44. {
  45.            *event_WrIp=cmd;
  46.            if(event_WrIp==(event_FIFO+7))  event_WrIp=event_FIFO;
  47.            else event_WrIp++;
  48. }

  49. //=================================================
  50. //函 数 名: void        write_Event(uchar cmd)
  51. //功能描述: 从事件缓冲区读入值
  52. //输入参数:
  53. //输出参数:        读出的数据值
  54. //设 计 者:
  55. //创建日期:
  56. //==================================================
  57. uchar        read_Event(void)
  58. {
  59.         uchar temp;
  60.         if(event_RdIp!=event_WrIp)                               
  61.         {
  62.                 temp=*event_RdIp;
  63.                 if(event_RdIp==(event_FIFO+7))  event_RdIp=event_FIFO;
  64.                 else event_RdIp++;
  65.         return        temp;
  66.         }
  67.         else        return(0);
  68. }

  69. //==================================================================
  70. //函 数 名: void clock_update(void)
  71. //功能描述: 时间自动更新函数
  72. //输入参数: NULL
  73. //输出参数:        second、minute、hour、week、day、month、year
  74. //设 计 者:
  75. //创建日期:
  76. //==================================================================
  77. void clock_update(void)
  78. {
  79.         if( !f_systick_1s ) return;
  80.         f_systick_1s = 0;               
  81.         if(++second != 60) return;
  82.         second = 0;
  83.         if(++minute != 60) return;
  84.         minute = 0;
  85.         if(++hour != 24) return;
  86.         hour = 0;
  87.         if(++week == 8) week = 1;
  88.         if(++day <= month_Day[month - 1]) return;
  89.         day = 1;
  90.         if(++month != 13) return;
  91.         month = 1;
  92.         year++;
  93.         month_Day[1] = ( (year%400 == 0) || ( (year%4 == 0)&&(year%100 != 0) ) ) ? 29 : 28;         //利用三目运算判断闰年               
  94. }

  95. //==================================================================
  96. //函 数 名: meau1_Display()
  97. //功能描述: 菜单P-1函数
  98. //输入参数: NULL
  99. //输出参数: 显示缓冲区
  100. //设 计 者:
  101. //创建日期:
  102. //==================================================================
  103. void meau1_Display(void)
  104. {
  105.         switch(current_Event)
  106.         {
  107.                 case 0:break;
  108.                 case 1:sys_State = 0x11;break;                                                 //显示年
  109.                 case 2:sys_State = 0x20;break;                                                 //显示菜单P-2
  110.                 case 4:sys_State = 0x30;break;                                                 //显示菜单P-3
  111.                 case 8:break;
  112.                 default:break;
  113.         }
  114.         //显示菜单P-1
  115.         display[0] = 10;
  116.         display[1] = 17;
  117.         display[2] = 21;
  118.         display[3] = 1;
  119. }
  120. //==================================================================
  121. //函 数 名: meau2_Display(void)
  122. //功能描述: 菜单P-2函数
  123. //输入参数: NULL
  124. //输出参数: 显示缓冲区
  125. //设 计 者:
  126. //创建日期:
  127. //==================================================================
  128. void meau2_Display(void)
  129. {
  130.         switch(current_Event)
  131.         {
  132.                 case 0:break;
  133.                 case 1:sys_State = 0x21;break;                                                      //秒表
  134.                 case 2:sys_State = 0x30;break;                                                      //显示菜单P-3
  135.                 case 4:sys_State = 0x10;break;                                                      //显示菜单P-1
  136.                 case 8:break;
  137.                 default:break;
  138.         }
  139.         //显示菜单P-2
  140.         display[0] = 10;
  141.         display[1] = 17;
  142.         display[2] = 21;
  143.         display[3] = 2;
  144. }

  145. //==================================================================
  146. //函 数 名: meau3_Display()
  147. //功能描述: 菜单P-3函数
  148. //输入参数: NULL
  149. //输出参数:       
  150. //设 计 者:
  151. //创建日期:
  152. //==================================================================
  153. void meau3_Display(void)
  154. {
  155.         switch(current_Event)
  156.         {
  157.                 case 0:break;
  158.                 case 1:sys_State = 0x31;break;                                                             //闹钟
  159.                 case 2:sys_State = 0x10;break;                                                             //显示菜单P-1
  160.                 case 4:sys_State = 0x20;break;                                                             //显示菜单P-2
  161.                 case 8:break;
  162.                 default:break;
  163.         }
  164.         //显示菜单P-3
  165.         display[0] = 10;
  166.         display[1] = 17;
  167.         display[2] = 21;
  168.         display[3] = 3;
  169. }

  170. //==================================================================
  171. //                          设置函数
  172. //==================================================================

  173. //==================================================================
  174. //函 数 名: year_Set()
  175. //功能描述: 年设置函数
  176. //输入参数: NULL
  177. //输出参数:       
  178. //设 计 者:
  179. //创建日期:
  180. //==================================================================
  181. void year_Set(void)
  182. {
  183.         switch(current_Event)
  184.         {
  185.                 case 0:break;
  186.                 case 1:sys_State = 0x11;break;                                                //显示年
  187.                 case 2:year--;break;                               
  188.                 case 4:year++;break;                               
  189.                 case 8:sys_State = 0x10;break;                                                //显示菜单P-1
  190.                 default:break;
  191.         }
  192.         month_Day[1] = ( (year%400 == 0) || ( (year%4 == 0)&&(year%100 != 0) ) ) ? 29 : 28;         

  193.         if(day > month_Day[month - 1])
  194.         day = 1;

  195.         tube(0x00);                                                                                                         //数码管闪烁
  196.         display[0] = year / 1000;
  197.         display[1] = year / 100 % 10;
  198.         display[2] = year / 10 % 10;
  199.         display[3] = year % 10;               
  200. }
  201. //==================================================================
  202. //函 数 名: week_Set()
  203. //功能描述: 周设置函数
  204. //输入参数: NULL
  205. //输出参数:       
  206. //设 计 者:
  207. //创建日期:
  208. //==================================================================
  209. void week_Set(void)
  210. {
  211.         switch(current_Event)
  212.         {
  213.                 case 0:break;
  214.                 case 1:sys_State = 0x13;break;                                                //显示周
  215.                 case 2:week--;if(week == 0) week = 7;break;                                    //周--
  216.                 case 4:week++;if(week == 8) week = 1;break;                                    //周++
  217.                 case 8:sys_State = 0x10;break;                                          //显示菜单P-1
  218.                 default:break;
  219.         }
  220.         tube(0x07);
  221.         display[0] = 20;
  222.         display[1] = 12;
  223.         display[2] = 21;
  224.         display[3] = week;       
  225. }
  226. //==================================================================
  227. //函 数 名: month_Set(void)
  228. //功能描述: 月设置函数
  229. //输入参数: NULL
  230. //输出参数:       
  231. //设 计 者:
  232. //创建日期:
  233. //==================================================================
  234. void  month_Set(void)
  235. {
  236.         switch(current_Event)
  237.         {
  238.                 case 0:break;
  239.                 case 1:sys_State = 0x18;break;                                                       //设置日
  240.                 case 2:month--; if(month == 0)month = 12; break;                              //月--
  241.                 case 4:month++; if(month == 13)month = 1; break;                              //月++                          
  242.                 case 8:sys_State = 0x10;break;                                                 //显示菜单P-1
  243.                 default:break;
  244.         }
  245.         if(day > month_Day[month - 1]) day = 1;
  246.         tube(0x0c);               
  247.         decimal_Point_On(0x02);
  248.         display[0] = month / 10;
  249.         display[1] = month % 10;
  250.         display[2] = day / 10;
  251.         display[3] = day % 10;
  252. }

  253. //==================================================================
  254. //函 数 名: void  day_Set(void)
  255. //功能描述: 日设置函数
  256. //输入参数: NULL
  257. //输出参数:       
  258. //设 计 者:
  259. //创建日期:
  260. //==================================================================
  261. void  day_Set(void)
  262. {
  263.         switch(current_Event)
  264.         {
  265.                 case 0:break;
  266.                 case 1:sys_State = 0x12;break;                                                //显示月日
  267.                 case 2:
  268.                 {
  269.                         day--;                                                                       
  270.                         if(day == 0)
  271.                                 day = month_Day[month - 1];                                                      //使得每个月的最大天数与对应月份实际天数相等
  272.                         break;
  273.                 }         
  274.                 case 4:        
  275.                 {
  276.                         day++;                                                                     
  277.                         if(day > month_Day[month - 1])                                                     //当其超过每月最大天数时,天数置一
  278.                         {
  279.                                 day = 1;
  280.                         }
  281.                         break;
  282.                 }
  283.                 case 8:sys_State = 0x10;break;                                                      //显示菜单P-1
  284.                 default:break;
  285.         }       
  286.         tube(0x03);               
  287.         decimal_Point_On(0x02);
  288.         display[0] = month / 10;
  289.         display[1] = month % 10;
  290.         display[2] = day / 10;
  291.         display[3] = day % 10;;
  292. }
  293. //==================================================================
  294. //函 数 名: void  hour_Set(void)
  295. //功能描述: 小时设置函数
  296. //输入参数: NULL
  297. //输出参数:       
  298. //设 计 者:
  299. //创建日期:
  300. //==================================================================
  301. void  hour_Set(void)
  302. {
  303.         switch(current_Event)
  304.         {
  305.                 case 0:break;
  306.                 case 1:sys_State = 0x1b;break;                                                //设置分钟
  307.                 case 2:hour--;if(hour < 0) hour = 23;break;                              //小时--
  308.                 case 4:hour++;if(hour == 24) hour = 0;break;                      //小时++
  309.                 case 8:sys_State = 0x10;break;                                                      //显示菜单P-1
  310.                 default:break;
  311.         }       
  312.         tube(0x0c);               
  313.         decimal_Point(0x02);
  314.         display[0] = hour / 10;
  315.         display[1] = hour % 10;
  316.         display[2] = minute / 10;
  317.         display[3] = minute % 10;
  318. }

  319. //==================================================================
  320. //函 数 名: void  minute_Set(void)
  321. //功能描述: 分钟设置函数
  322. //输入参数: NULL
  323. //输出参数:       
  324. //设 计 者:
  325. //创建日期:
  326. //==================================================================
  327. void  minute_Set(void)
  328. {
  329.         switch(current_Event)
  330.         {
  331.                 case 0:break;
  332.                 case 1:sys_State = 0x14;break;                                                 //显示时分
  333.                 case 2:minute--;if(minute < 0) minute = 59;break;                         //分钟--
  334.                 case 4:minute++;if(minute == 60) minute = 0;break;                       //分钟++
  335.                 case 8:sys_State = 0x10;break;                                                       //显示菜单P-1
  336.                 default:break;
  337.         }       
  338.         tube(0x03);               
  339.         decimal_Point(0x02);
  340.         display[0] = hour / 10;
  341.         display[1] = hour % 10;
  342.         display[2] = minute / 10;
  343.         display[3] = minute % 10;
  344. }
  345. //==================================================================
  346. //函 数 名: void  alarm_Hour_Set(void)
  347. //功能描述: 闹钟--小时设置
  348. //输入参数: NULL
  349. //输出参数:       
  350. //设 计 者:
  351. //创建日期:
  352. //==================================================================
  353. void  alarm_Hour_Set(void)
  354. {
  355.         switch(current_Event)
  356.         {
  357.                 case 0:break;
  358.                 case 1:sys_State = 0x33;break;                                                //设置闹钟分钟
  359.                 case 2:alarm_Hour--;if(alarm_Hour < 0) alarm_Hour = 23;break;                  //闹钟小时--
  360.                 case 4:alarm_Hour++;if(alarm_Hour == 24) alarm_Hour = 0;break;                //闹钟小时++
  361.                 case 8:sys_State = 0x30;break;                                                                                                //显示菜单P-3
  362.                 default:break;
  363.         }       
  364.         tube(0x0c);               
  365.         decimal_Point(0x02);
  366.         display[0] = alarm_Hour / 10;
  367.         display[1] = alarm_Hour % 10;
  368.         display[2] = alarm_Minute / 10;
  369.         display[3] = alarm_Minute % 10;
  370. }
  371. //==================================================================
  372. //函 数 名: void  alarm_Minute_Set(void)
  373. //功能描述: 闹钟--分钟设置
  374. //输入参数:
  375. //输出参数:       
  376. //设 计 者:
  377. //创建日期:
  378. //==================================================================
  379. void  alarm_Minute_Set(void)
  380. {
  381.         switch(current_Event)
  382.         {
  383.                 case 0:break;
  384.                 case 1:sys_State = 0x32;break;                                                                          //设置闹钟小时
  385.                 case 2:alarm_Minute--;if(alarm_Minute < 0) alarm_Minute = 59;break;        //闹钟分钟--
  386.                 case 4:alarm_Minute++;if(alarm_Minute == 60) alarm_Minute = 0;break;//闹钟分钟++
  387.                 case 8:sys_State = 0x30;break;                                                                                                  //显示菜单P-3
  388.                 default:break;
  389.         }       
  390.         tube(0x03);               
  391.         decimal_Point(0x02);
  392.         display[0] = alarm_Hour / 10;
  393.         display[1] = alarm_Hour % 10;
  394.         display[2] = alarm_Minute / 10;
  395.         display[3] = alarm_Minute % 10;
  396. }
  397. //==================================================================
  398. //                        显示程序
  399. //==================================================================

  400. //==================================================================
  401. //函 数 名: year_Display()
  402. //功能描述: 年显示函数
  403. //输入参数: NULL
  404. //输出参数:       
  405. //设 计 者:
  406. //创建日期:
  407. //==================================================================
  408. void year_Display(void)
  409. {               
  410.         switch(current_Event)
  411.         {
  412.                 case 0:break;
  413.                 case 1:sys_State = 0x16;break;                                                 //设置年
  414.                 case 2:sys_State = 0x12;break;                                                 //显示月日
  415.                 case 4:sys_State = 0x15;break;                                                 //显示秒
  416.                 case 8:sys_State = 0x10;break;                                                 //显示菜单P-1
  417.                 default:break;
  418.         }         
  419.         display[0] = year / 1000;
  420.         display[1] = year / 100 % 10;
  421.         display[2] = year / 10 % 10;
  422.         display[3] = year % 10;
  423. }

  424. //==================================================================
  425. //函 数 名: void  month_Day_Display(void)
  426. //功能描述: 月-日显示函数
  427. //输入参数: NULL
  428. //输出参数:       
  429. //设 计 者:
  430. //创建日期:
  431. //==================================================================
  432. void  month_Day_Display(void)
  433. {
  434.         switch(current_Event)
  435.         {
  436.                 case 0:break;
  437.                 case 1:sys_State = 0x17;break;                                          //设置月
  438.                 case 2:sys_State = 0x13;break;                                          //显示周
  439.                 case 4:sys_State = 0x11;break;                                          //显示年
  440.                 case 8:sys_State = 0x10;break;                                          //显示菜单P-1
  441.                 default:break;
  442.         }               
  443.         display[0] = month / 10;
  444.         display[1] = month % 10;
  445.         display[2] = day / 10;
  446.         display[3] = day % 10;;
  447.         decimal_Point_On(0x02);       
  448. }
  449. //==================================================================
  450. //函 数 名: void  week_Display(void)
  451. //功能描述: 星期显示函数
  452. //输入参数: NULL
  453. //输出参数:       
  454. //设 计 者:
  455. //创建日期:
  456. //==================================================================
  457. void  week_Display(void)
  458. {
  459.         switch(current_Event)
  460.         {
  461.                 case 0:break;
  462.                 case 1:sys_State = 0x19;break;                                                //设置周
  463.                 case 2:sys_State = 0x14;break;                                                //显示时分
  464.                 case 4:sys_State = 0x12;break;                                                //显示月日
  465.                 case 8:sys_State = 0x10;break;                                                //显示菜单P-1
  466.                 default:break;
  467.         }
  468.         display[0] = 20;
  469.         display[1] = 12;
  470.         display[2] = 21;
  471.         display[3] = week;
  472. }
  473. //==================================================================
  474. //函 数 名: void  hour_Minute_Display(void)
  475. //功能描述: 时-分显示函数
  476. //输入参数: NULL
  477. //输出参数:       
  478. //设 计 者:
  479. //创建日期:
  480. //==================================================================
  481. void  hour_Minute_Display(void)
  482. {
  483.         switch(current_Event)
  484.         {
  485.                 case 0:break;
  486.           case 1:sys_State = 0x1a;break;                                                //设置时
  487.                 case 2:sys_State = 0x15;break;                                                //显示秒
  488.                 case 4:sys_State = 0x13;break;                                                //显示周
  489.                 case 8:sys_State = 0x10;break;                                                //显示菜单P-1
  490.                 default:break;
  491.         }
  492.         display[0] = hour / 10;
  493.         display[1] = hour % 10;
  494.         display[2] = minute / 10;
  495.         display[3] = minute % 10;
  496.   decimal_Point(0x02);                                               //点亮小数点
  497. }
  498. //==================================================================
  499. //函 数 名: void  second_Display(void)
  500. //功能描述: 秒显示函数
  501. //输入参数: NULL
  502. //输出参数:       
  503. //设 计 者:
  504. //创建日期:
  505. //==================================================================
  506. void  second_Display(void)
  507. {
  508.         switch(current_Event)
  509.         {
  510.                 case 0:break;
  511.                 case 1:break;
  512.                 case 2:sys_State = 0x11;break;                                           //显示年
  513.                 case 4:sys_State = 0x14;break;                                           //显示时分
  514.                 case 8:sys_State = 0x10;break;                                           //显示菜单P-1
  515.                 default:break;
  516.         }
  517.         display[0] = 10;
  518.         display[1] = 10;
  519.         display[2] = second / 10;
  520.         display[3] = second % 10;
  521. }

  522. //==================================================================
  523. //函 数 名: void  swatch(void)
  524. //功能描述: 秒表函数
  525. //输入参数:
  526. //输出参数:       
  527. //设 计 者:
  528. //创建日期:
  529. //==================================================================
  530. void  swatch(void)
  531. {
  532.   static         uint data count;                  
  533.         if(swatch_Start_Flag ==1)
  534.         {
  535.                 if(f_systick_10ms == 1)                                         //产生跑秒
  536.                 {       
  537.                         f_systick_10ms = 0;               
  538.                   count++;
  539.                         if(count==9999)        count = 0;
  540.                 }
  541.         }                                  
  542.         switch(current_Event)
  543.         {
  544.                 case 0:break;
  545.                 case 1:break;                                                                  //秒表暂停
  546.                 case 2:count = 0; swatch_Start_Flag = 0; break;                                                  //秒表清零
  547.                 case 4:swatch_Start_Flag = !swatch_Start_Flag; break;                          //秒表计数开始
  548.                 case 8:sys_State = 0x20;break;                                                      //显示菜单P-2
  549.                 default:break;
  550.         }
  551.         display[0] = count/1000;
  552.         display[1] = count/100%10;
  553.         display[2] = count/10%10;
  554.   display[3] = count%10;
  555. }                                                  
  556. //==================================================================
  557. //函 数 名: void  alarm_Clock(void)
  558. //功能描述:  闹钟函数
  559. //输入参数:
  560. //输出参数:       
  561. //设 计 者:
  562. //创建日期:
  563. //==================================================================
  564. void  alarm_Clock(void)
  565. {                  
  566.         switch(current_Event)
  567.         {
  568.                 case 0:break;
  569.                 case 1:                                                                                                                 //设置闹钟小时
  570.                 {
  571.                    if(alarm_Flag==1)
  572.                    {sys_State = 0x32;}                                                       
  573.                    else
  574.                    {sys_State = 0x30;}                                               
  575.                     break;
  576.                 }         
  577.                 case 2:        alarm_Flag = 1;break;                                                      //显示ON,开闹钟。
  578.                                                                                                                
  579.                 case 4:alarm_Flag = 0;break;                                                      //显示OFF,关闭闹钟。
  580.                 case 8:sys_State = 0x30;break;                                                    //显示菜单P-3          
  581.                 default:break;
  582.         }
  583.         if(alarm_Flag==1)
  584.         {               
  585.                 display[0] = 10;
  586.                 display[1] = 10;
  587.                 display[2] = 0;
  588.                 display[3] = 31;
  589.         }
  590.         else
  591.         {               
  592.                 display[0] = 10;
  593.                 display[1] = 0;
  594.                 display[2] = 16;
  595.                 display[3] = 16;
  596.         }
  597. }

  598. //==================================================================
  599. //函 数 名: void  alarm_Clock_Loud(void)
  600. //功能描述:
  601. //输入参数:
  602. //输出参数:       
  603. //设 计 者:
  604. //创建日期:
  605. //==================================================================
  606. void  alarm_Clock_Loud(void)
  607. {
  608.         if(alarm_Flag==1)
  609.         {
  610.                 if(alarm_Hour == hour && alarm_Minute == minute)                              //闹钟定时时间到
  611.                 {
  612.                         if(alarm_State == 0)
  613.                         {
  614.                                 alarm_State = 1;
  615.                         }
  616.                 }
  617.                 else                                                   
  618.                 {
  619.                         if(alarm_State == 1)                                           //闹钟响铃时间内没有手动停止闹钟则一分钟后闹钟自动停止
  620.                         {
  621.                                  buzzer = 1;
  622.                         }
  623.                         alarm_State = 0;                                                                 //闹钟定时时间未到开始标致位清零
  624. ……………………

  625. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
万年历实验.rar (104.16 KB, 下载次数: 60)
回复

使用道具 举报

ID:1 发表于 2018-4-9 00:12 | 显示全部楼层
有原理图吗?
回复

使用道具 举报

ID:707742 发表于 2020-3-13 16:39 | 显示全部楼层
您好  这个有原理图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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