关闭

关闭

封号提示

内容

首页 51单片机C语言编程实例.doc

51单片机C语言编程实例.doc

51单片机C语言编程实例.doc

上传者: hli0305 2013-02-19 评分 5 0 139 19 631 暂无简介 简介 举报

简介:本文档为《51单片机C语言编程实例doc》,可适用于工程科技领域,主题内容包含http:wwwelecfanscom电子发烧友http:bbselecfanscom电子技术论坛基础知识:单片机编程基础单片机的外部结构:DIP双符等。

http:wwwelecfanscom电子发烧友http:bbselecfanscom电子技术论坛基础知识:单片机编程基础单片机的外部结构:DIP双列直插PPPP四个位准双向IO引脚(作为IO输入时要先输出高电平)电源VCC(PIN)和地线GND(PIN)高电平复位RESET(PIN)(uF电容接VCC与RESET即可实现上电复位)内置振荡电路外部只要接晶体至X(PIN)和X(PIN)(频率为主频的倍)程序配置EA(PIN)接高电平VCC(运行单片机内部ROM中的程序)P支持第二功能:RXD、TXD、INT、INT、T、T单片机内部IO部件:(所为学习单片机实际上就是编程控制以下IO部件完成指定任务)四个位通用IO端口对应引脚P、P、P和P两个位定时计数器(TMODTCONTLTHTLTH)一个串行通信接口(SCONSBUF)一个中断控制器(IEIP)针对ATC单片机头文件ATxh给出了SFR特殊功能寄存器所有端口的定义。C语言编程基础:十六进制表示字节xa:二进制为BxE为。如果将一个位二进数赋给一个位的字节变量则自动截断为低位而丢掉高位。var表示对变量var先增一var表示对变量后减一。x|=xf表示为x=x|xfTMOD=(TMODxf)|x表示给变量TMOD的低四位赋值x而不改变TMOD的高四位。While()表示无限执行该语句即死循环。语句后的分号表示空循环体也就是{}在某引脚输出高电平的编程方法:(比如P(PIN)引脚)代码#include <ATxh> 该头文档中有单片机内部资源的符号化定义其中包含P  void main( void )  void 表示没有输入参数也没有函数返值这入单片机运行的复位入口  {   P =    给P赋值引脚P就能输出高电平VCC   While(  )  死循环相当 LOOP: goto LOOP  }  注意:P的每个引脚要输出高电平时必须外接上拉电阻(如K)至VCC电源。在某引脚输出低电平的编程方法:(比如P引脚)代码#include <ATxh> 该头文档中有单片机内部资源的符号化定义其中包含P  void main( void )  void 表示没有输入参数也没有函数返值这入单片机运行的复位入口  {   P =    给P赋值引脚P就能输出低电平GND   While(  )  死循环相当 LOOP: goto LOOP  }  在某引脚输出方波编程方法:(比如P引脚)代码#include <ATxh> 该头文档中有单片机内部资源的符号化定义其中包含P  void main( void )  void 表示没有输入参数也没有函数返值这入单片机运行的复位入口  {   While(  )  非零表示真如果为真则执行下面循环体的语句   {  P =   给P赋值引脚P就能输出高电平VCC    P =   给P赋值引脚P就能输出低电平GND   }    由于一直为真所以不断输出高、低、高、低……从而形成方波  }  将某引脚的输入电平取反后从另一个引脚输出:(比如P=NOT(P))代码#include <ATxh> 该头文档中有单片机内部资源的符号化定义其中包含P和P  void main( void )  void 表示没有输入参数也没有函数返值这入单片机运行的复位入口  {   P =    初始化。P作为输入必须输出高电平  While(  )  非零表示真如果为真则执行下面循环体的语句   {  if( P ==  )  读取P就是认为P为输入如果P输入高电平VCC    { P =   } 给P赋值引脚P就能输出低电平GND    else     否则P输入为低电平GND    { P =   } 给P赋值引脚P就能输出低电平GND    { P =   } 给P赋值引脚P就能输出高电平VCC   }    由于一直为真所以不断根据P的输入情况改变P的输出电平  }  将某端口个引脚输入电平低四位取反后从另一个端口个引脚输出:(比如P=NOT(P))代码#include <ATxh> 该头文档中有单片机内部资源的符号化定义其中包含P和P  void main( void )  void 表示没有输入参数也没有函数返值这入单片机运行的复位入口  {   P = xff  初始化。P作为输入必须输出高电平同时给P口的个引脚输出高电平  While(  )  非零表示真如果为真则执行下面循环体的语句   {    取反的方法是异或而不取反的方法则是异或  P = P^xf 读取P就是认为P为输入低四位异或者即取反然后输出   }    由于一直为真所以不断将P取反输出到P  }  注意:一个字节的位D、D至D分别输出到P、P至P比如P=xf则P、P、P、P四个引脚都输出低电平而P、P、P、P四个引脚都输出高电平。同样输入一个端口P即是将P、P至P读入到一个字节的位D、D至D。第一节:单数码管按键显示单片机最小系统的硬件原理接线图: 接电源:VCC(PIN)、GND(PIN)。加接退耦电容uF 接晶体:X(PIN)、X(PIN)。注意标出晶体频率(选用MHz)还有辅助电容pF 接复位:RES(PIN)。接上电复位电路以及手动复位电路分析复位工作原理 接配置:EA(PIN)。说明原因。发光二极的控制:单片机IO输出将一发光二极管LED的正极(阳极)接PLED的负极(阴极)接地GND。只要P输出高电平VCCLED就正向导通(导通时LED上的压降大于V)有电流流过LED至发LED发亮。实际上由于P高电平输出电阻为K起到输出限流的作用所以流过LED的电流小于(VV)K=mA。只要P输出低电平GND实际小于VLED就不能导通结果LED不亮。开关双键的输入:输入先输出高一个按键KEYON接在P与GND之间另一个按键KEYOFF接P与GND之间按KEYON后LED亮按KEYOFF后LED灭。同时按下LED半亮LED保持后松开键的状态即ON亮OFF灭。代码#include <atxh>  #define LED  P^   用符号LED代替P  #define KEYON P^   用符号KEYON代替P  #define KEYOFF P^   用符号KEYOFF代替P  void main( void )    单片机复位后的执行入口void表示空无输入参数无返回值  {   KEYON =   作为输入首先输出高接下KEYONP则接地为否则输入为   KEYOFF =   作为输入首先输出高接下KEYOFFP则接地为否则输入为   While(  )  永远为真所以永远循环执行如下括号内所有语句   {    if( KEYON== ) LED= 是KEYON接下所示P输出高LED亮    if( KEYOFF== ) LED= 是KEYOFF接下所示P输出低LED灭   } 松开键后都不给LED赋值所以LED保持最后按键状态。  同时按下时LED不断亮灭各占一半时间交替频率很快由于人眼惯性看上去为半亮态  }  数码管的接法和驱动原理   一支七段数码管实际由个发光二极管构成其中个组形构成数字的七段笔画所以称为七段数码管而余下的个发光二极管作为小数点。作为习惯分别给个发光二极管标上记号:a,b,c,d,e,f,g,h。对应的顶上一画按顺时针方向排中间一画为g小数点为h。   我们通常又将各二极与一个字节的位对应a(D),b(D),c(D),d(D),e(D),f(D),g(D),h(D)相应个发光二极管正好与单片机一个端口Pn的个引脚连接这样单片机就可以通过引脚输出高低电平控制个发光二极的亮与灭从而显示各种数字和符号对应字节引脚接法为:a(Pn)b(Pn)c(Pn)d(Pn)e(Pn)f(Pn)g(Pn)h(Pn)。   如果将个发光二极管的负极(阴极)内接在一起作为数码管的一个引脚这种数码管则被称为共阴数码管共同的引脚则称为共阴极个正极则为段极。否则如果是将正极(阳极)内接在一起引出的则称为共阳数码管共同的引脚则称为共阳极个负极则为段极。   以单支共阴数码管为例可将段极接到某端口Pn共阴极接GND则可编写出对应十六进制码的七段码表字节数据如右图: 键码显示的程序我们在P端口接一支共阴数码管SLED在P、P端口接个按键分别编号为KEY、KEY到KEYF操作时只能按一个键按键后SLED显示对应键编号。代码#include <atxh>  #define SLED P  #define KEY P^  #define KEY P^  #define KEY P^  #define KEY P^  #define KEY P^  #define KEY P^  #define KEY P^  #define KEY P^  #define KEY P^  #define KEY P^  #define KEYA P^  #define KEYB P^  #define KEYC P^  #define KEYD P^  #define KEYE P^  #define KEYF P^  Code unsigned char SegCode= 用十六进数作为数组下标可直接取得对应的七段编码字节                                                  A     b     C     d    E    F  {xf, x, xb, xf, x, xd, xd, x, xf, xf, x, xc, x, xe, x, x}  void main( void )  {   unsigned char i= 作为数组下标  P = xff P作为输入初始化输出高   P = xff P作为输入初始化输出高   While(  )   {    if( KEY ==  ) i=  if( KEY ==  ) i=    if( KEY ==  ) i=  if( KEY ==  ) i=    if( KEY ==  ) i=  if( KEY ==  ) i=    if( KEY ==  ) i=  if( KEY ==  ) i=    if( KEY ==  ) i=  if( KEY ==  ) i=    if( KEYA ==  ) i=xA  if( KEYB ==  ) i=xB    if( KEYC ==  ) i=xC  if( KEYD ==  ) i=xD    if( KEYE ==  ) i=xE  if( KEYF ==  ) i=xF    SLED = SegCode i  开始时显示根据i取应七段编码  }  }  第二节:双数码管可调秒表解:只要满足题目要求方法越简单越好。由于单片机IO资源足够所以双数码管可接成静态显示方式两个共阴数码管分别接在P(秒十位)和P(秒个位)口它们的共阴极都接地安排两个按键接在P(十位数调整)和P(个位数调整)上为了方便计时选用MHz的晶体。为了达到精确计时选用定时器方式每计数重载一次即us定义一整数变量计数重载次数这样计数次即为一秒。定义两个字节变量S和S分别计算秒十位和秒个位。编得如下程序:代码#include <atxh>  Code unsigned char SegCode= 用十六进数作为数组下标可直接取得对应的七段编码字节                                                  A     b     C     d    E    F  {xf, x, xb, xf, x, xd, xd, x, xf, xf, x, xc, x, xe, x, x}  void main( void )  {   unsigned int us =    unsigned char s =    unsigned char s =    unsigned char key =  记忆按键状态为按下   unsigned char key =   记忆按键状态为按下   初始化定时器 Timer   TMOD = (TMOD  xF) | x   TH =  对于位二进数来说=也就是加次时为即为   TR =    while(){           循环    P = SegCode s  显示秒十位    P = SegCode s  显示秒个位    while(  ){         循环     计时处理  if( TF ==  ){      TF =       if( us >=  ){       us =        if( s >=  ){        s =         if( s >=  ) s =        }       break 结束“循环”修改显示      }     }     按十位键处理     P =   P作为输入先要输出高电平     if( key ==  ){ 等松键   if( P ==  ) key=     }  else{   未按键      if( P ==  ){       key =    if( s >=  ) s =        break 结束“循环”修改显示      }     }     按个位键处理     P =   P作为输入先要输出高电平     if( key ==  ) 等松键  { if( P ==  ) key= }     else {   未按键      if( P ==  ){ key =    if( s >=  ) s =        break 结束“循环”修改显示      }     }    } 循环’end    }循环’end  }main’end  第三节:十字路口交通灯如果一个单位时间为秒这里设定的十字路口交通灯按如下方式四个步骤循环工作: 个单位时间南北红东西绿( 个单位时间南北红东西黄( 个单位时间南北绿东西红( 个单位时间南北黄东西红(解:用P端口的个引脚控制交通灯高电平灯亮低电平灯灭。代码#include <atxh>  sbit用来定义一个符号位地址方便编程提高可读性和可移植性  sbit SNRed =P^  南北方向红灯  sbit SNYellow =P^  南北方向黄灯  sbit SNGreen =P^  南北方向绿灯  sbit EWRed =P^  东西方向红灯  sbit EWYellow =P^  东西方向黄灯  sbit EWGreen =P^  东西方向绿灯  * 用软件产生延时一个单位时间 *  void DelayUnit( void )     {   unsigned int i, j   for( i= i< i )     for( j< j< j ) 通过实测调整j循环次数,产生ms延时  还可以通过生成汇编程序来计算指令周期数结合晶体频率来调整j循环次数接近ms  }  * 延时n个单位时间 *  void Delay( unsigned int n ){ for(  n!= n ) DelayUnit() }  void main( void )  {   while(  )   {     SNRed= SNYellow= SNGreen= EWRed= EWYellow= EWGreen= Delay(  )    SNRed= SNYellow= SNGreen= EWRed= EWYellow= EWGreen= Delay(  )    SNRed= SNYellow= SNGreen= EWRed= EWYellow= EWGreen= Delay(  )    SNRed= SNYellow= SNGreen= EWRed= EWYellow= EWGreen= Delay(  )   }  }  第四节:数码管驱动显示“”P端口接联共阴数码管SLED的段极:P接段h,…P接段aP端口接联共阴数码管SLED的段极:P接左边的共阴极…P接右边的共阴极方案说明:晶振频率fosc=MHz数码管采用动态刷新方式显示在ms定时断服务程序中实现代码#include <atxh>  unsigned char DisBuf  全局显示缓冲区DisBuf对应右SLEDDisBuf对应左SLED  void DisplayBrush( void )  { code unsigned char cathode={xfe,xfd,xfb,xf,xef,xdf,xbf,xf} 阴极控制码  Code unsigned char SegCode= 用十六进数作为数组下标可直接取得对应的七段编码字节  {xf,x,xb,xf,x,xd,xd,x,xf,xf,x,xc,x,xe,x,x}  static unsigned char i=  (i) 循环刷新显示由于是静态变量此赋值只做一次。   P = xff  显示消隐以免下一段码值显示在前一支SLED   P = SegCode DisBufi  从显示缓冲区取出原始数据查表变为七段码后送出显示  P = cathode i    将对应阴极置低显示  if( i >=  ) i=  指向下一个数码管和相应数据  }  void TimerIntRoute( void ) interrupt   {   TL =   由于TL只有bits所以将()低位赋给TL   TH = ()>> 取()的高位赋给TH重新定时ms   DisplayBrush()  }  void TimerInit( void )  { TMOD=(TMOD  xf) | x 初始化定时器T工作方式   TL =  定时ms   TH = ()>>   TR =    允许T开始计数   ET =    允许T计数溢出时产生中断请求  }  void Display( unsigned char index, unsigned char dataValue ){ DisBuf index  = dataValue }  void main( void )  {  unsigned char i  for( i= i< i ){ Display(i, i) } DisBuf为右DisBuf为左  TimerInit()  EA =    允许CPU响应中断请求  While()  }  第五节:键盘驱动指提供一些函数给任务调用获取按键信息或读取按键值。定义一个头文档<KEYH>描述可用函数如下:代码#ifndef KEYH  防止重复引用该文档如果没有定义过符号 KEYH则编译下面语句  #define KEYH  只要引用过一次即 #include <keyh>则定义符号 KEYH  unsigned char keyHit( void ) 如果按键则返回非0否则返回0  unsigned char keyGet( void ) 读取按键值如果没有按键则等待到按键为止  void keyPut( unsigned char ucKeyVal ) 保存按键值ucKeyVal到按键缓冲队列末  void keyBack( unsigned char ucKeyVal ) 退回键值ucKeyVal到按键缓冲队列首  #endif  定义函数体文档KEYC如下:代码#include “keyh”  #define KeyBufSize  定义按键缓冲队列字节数  unsigned char KeyBuf KeyBufSize  定义一个无符号字符数组作为按键缓冲队列。该队列为先进          先出循环存取下标从0到 KeyBufSize  unsigned char KeyBufWp= 作为数组下标变量记录存入位置  unsigned char KeyBufRp= 作为数组下标变量记录读出位置  如果存入位置与读出位置相同则表明队列中无按键数据  unsigned char keyHit( void )  { if( KeyBufWp == KeyBufRp ) return(  ) else return(  ) }    unsigned char keyGet( void )  { unsigned char retVal 暂存读出键值  while( keyHit()== ) 等待按键因为函数keyHit()的返回值为  表示无按键  retVal = KeyBuf KeyBufRp  从数组中读出键值  if( KeyBufRp >= KeyBufSize ) KeyBufRp= 读位置加1超出队列则循环回初始位置   return( retVal )  }    void keyPut( unsigned char ucKeyVal )  { KeyBuf KeyBufWp  = ucKeyVal 键值存入数组   if( KeyBufWp >= KeyBufSize ) KeyBufWp=  存入位置加1超出队列则循环回初始位置  }  ***************************************************************************************** 由于某种原因读出的按键没有用但其它任务要用该按键但传送又不方便。此时可以退回按键队列。就如取错了信件有必要退回一样 ******************************************************************************************  void keyBack( unsigned char ucKeyVal )  {  * 如果KeyBufRp= 减后则为FFH大于KeyBufSize即从数组头退回到数组尾。或者由于干扰使得KeyBufRp超出队列位置也要调整回到正常位置 *   if( KeyBufRp >= KeyBufSize ) KeyBufRp=KeyBufSize   KeyBuf KeyBufRp  = ucKeyVal 回存键值  }  下面渐进讲解键盘物理层的驱动。电路共同点:P端口接一共阴数码管共阴极接GNDP接a段、P接b段、…、P接h段。软件共同点:codeunsignedcharSegCode是七段数码管共阴编码表。CodeunsignedcharSegCode=                                     A    b    C    d   E   F{xf,x,xb,xf,x,xd,xd,x,xf,xf,x,xc,x,xe,x,x}例一:P接一按键到GND键编号为‘6’显示按键。代码#include <atxh>  #include “KEYH”  void main( void )  { P =   作为输入引脚必须先输出高电平  while(  ) 永远为真即死循环   { if( P ==  ) 如果按键则为低电平  { keyPut(  ) 保存按键编号值为按键队列  while( P ==  ) 如果一直按着键则不停地执行该循环实际是等待松键    }  if( keyHit() !=  ) 如果队列中有按键  P=SegCode keyGet()  从队列中取出按键值并显示在数码管上   }  }  例二:在例一中考虑按键ms抖动问题。代码#include <atxh>  #include “KEYH”  void main( void )  { P =   作为输入引脚必须先输出高电平  while(  ) 永远为真即死循环   { if( P ==  ) 如果按键则为低电平  { delayms() 延时ms跳过接下抖动  keyPut(  ) 保存按键编号值为按键队列   while( P ==  ) 如果一直按着键则不停地执行该循环实际是等待松键  delayms() 延时ms跳过松开抖动    }  if( keyHit() !=  ) 如果队列中有按键  P=SegCode keyGet()  从队列中取出按键值并显示在数码管上   }  }  例三:在例二中考虑干扰问题。即小于ms的负脉冲干扰。代码#include <atxh>  #include “KEYH”  void main( void )  { P =   作为输入引脚必须先输出高电平  while(  ) 永远为真即死循环   { if( P ==  ) 如果按键则为低电平  { delayms() 延时ms跳过接下抖动   if( P ==  ) continue 假按键  keyPut(  ) 保存按键编号值为按键队列   while( P ==  ) 如果一直按着键则不停地执行该循环实际是等待松键  delayms() 延时ms跳过松开抖动    }  if( keyHit() !=  ) 如果队列中有按键  P=SegCode keyGet()  从队列中取出按键值并显示在数码管上   }  }  例四:状态图编程法。通过ms周期中断扫描按键。代码**************************************************************************************** 采用晶体为KHz时指令周期为ms(即主频为KHz)这样T工作在定时器方式位自动重载。计数值为即可产生ms的周期性中断在中断服务程序中实现按键扫描 *****************************************************************************************  #include <atxh>  #include “KEYH”  void main( void )  {   TMOD = (TMOD  xf ) | x 不改变T的工作方式T为定时器方式  TH =      计数周期为个主频脉即ms  TL=TH      先软加载一次计数值  TR=      允许T开始计数  ET=      允许T计数溢出时产生中断请求  EA=      允许CPU响应中断请求  while(  ) 永远为真即死循环   {  if( keyHit() !=  ) 如果队列中有按键  P=SegCode keyGet()  从队列中取出按键值并显示在数码管上   }  }  void timerint( void ) interrupt  msT的中断号为  { static unsigned char sts=   P =   作为输入引脚必须先输出高电平  switch( sts )   {    case : if( P== ) sts= break 按键则转入状态    case :  if( P== ) sts=  假按错或干扰回状态  else{ sts= keyPut(  ) } 确实按键键值入队列并转状态  break    case : if( P== ) sts= break 如果松键则转状态    case :     if( P== ) sts=  假松键回状态     else sts=    真松键回状态等待下一次按键过程    }  }   例五:状态图编程法。代码**************************************************************************************** 如果采用晶体为MHz时指令周期为us(即主频为MHz)要产生ms左右的计时则计数值达到T工作必须为定时器方式位非自动重载即可产生ms的周期性中断在中断服务程序中实现按键扫描 *****************************************************************************************  #include <atxh>  #include “KEYH”  void main( void )  {   TMOD = (TMOD  xf ) | x 不改变T的工作方式T为定时器方式  TL =      计数周期为个主频脉自动取低位  TH = ()>>    右移位实际上是取高位  TR=      允许T开始计数  ET=      允许T计数溢出时产生中断请求  EA=      允许CPU响应中断请求  while(  ) 永远为真即死循环   {  if( keyHit() !=  ) 如果队列中有按键  P=SegCode keyGet()  从队列中取出按键值并显示在数码管上   }  }  void timerint( void ) interrupt  msT的中断号为  { static unsigned char sts=  TL =      方式为软件重载  TH = ()>>    右移位实际上是取高位   P =   作为输入引脚必须先输出高电平  switch( sts )   {    case : if( P== ) sts= break 按键则转入状态    case :  if( P== ) sts=  假按错或干扰回状态  else{ sts= keyPut(  ) } 确实按键键值入队列并转状态  break    case : if( P== ) sts= break 如果松键则转状态    case :     if( P== ) sts=  假松键回状态     else sts=    真松键回状态等待下一次按键过程    }  }   例六:X按键。 代码**************************************************************************************** 由P端口的高位和低位构成X的矩阵键盘本程序只认为单键操作为合法同时按多键时无效。 这样下面的XY的合法值为x, xb, xd, xe, xf通过表keyCode影射变换可得按键值  *****************************************************************************************  #include <atxh>  #include “KEYH”  unsigned char keyScan( void ) 返回表示无按键或无效按键其它值为按键编码值  { code unsigned char keyCode=   x, x, x, x, x, x, x, x, x, x, xA, xB, xC, xD, xE, xF  { ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,    }   unsigned char x, y, retVal  P=xf    低四位输入高四位输出  x=Pxf   P输入后清高四位作为X值  P=xf    高四位输入低四位输出  y=(P >> )  xf P输入后移位到低四位并清高四位作为Y值  retVal = keyCodex*  keyCodey 根据本公式倒算按键编码  if( retVal== ) return() else return( retVal )    }  比如按键‘’得X=xY=x算得retVal= 所以返回函数值。  双如按键‘’得X=xbY=xd算得retVal=所以返回函数值。  void main( void )  {   TMOD = (TMOD  xf ) | x 不改变T的工作方式T为定时器方式  TL =      计数周期为个主频脉自动取低位  TH = ()>>    右移位实际上是取高位  TR=      允许T开始计数  ET=      允许T计数溢出时产生中断请求  EA=      允许CPU响应中断请求  while(  ) 永远为真即死循环   {  if( keyHit() !=  ) 如果队列中有按键  P=SegCode keyGet()  从队列中取出按键值并显示在数码管上   }  }  void timerint( void ) interrupt  msT的中断号为  { static unsigned char sts=  TL =      方式为软件重载  TH = ()>>    右移位实际上是取高位   P =   作为输入引脚必须先输出高电平  switch( sts )   {    case : if( key

类似资料

编辑推荐

袁立:english说文解字.pdf

哈佛大学—幸福课_英文字幕.pdf

中国古代史上敢拒绝皇帝召幸的嫔妃.pdf

Condensed matter and materials physics.pdf

宋朝军制初探(增订本)——王曾瑜.pdf

职业精品

精彩专题

上传我的资料

精选资料

热门资料排行换一换

  • 异类:不一样的成功启示录_格拉德…

  • 《说文解字》精读_殷寄明_复旦大…

  • [波浪理论新解(实战篇)].何造…

  • 一阳内部培训教材---利用周K线…

  • [中国谚语大全(辞海版)].温端…

  • 探寻古埃及文明+(英)罗莎莉·戴…

  • 太阳神的故乡——河姆渡文化探秘.…

  • 中国农史稿.pdf

  • 【柯亨】私有制、自由和平等.pdf

  • 资料评价:

    / 28
    所需积分:5 立即下载

    意见
    反馈

    返回
    顶部