365句子网

好词好句

电子技术随笔

  电子技术随笔【第一篇】:电子技术创新随笔

  据当代学者考证,“创新”一词最早出现于北齐史学家魏收(公元505—572)撰写的《魏书》。《魏书》第六十二卷云:“开物成务者,先皇之贞也;观夫人文者,先皇之蕴也;革弊创新者,先皇之志也。”“创新”一词,代有使用,“革故鼎新”,“推陈出新”,但我国先前基本都仅用于政治制度的变革与改造。“创新”望文生义便是创造新的。“创新”一词于近年尤其流行,深入人心,北京已将“创新”列为“北京精神之一。但对于“创新”一词的概念笔者孤陋寡闻,未见标准解读,歧义甚多,众说纷纭。查《现代汉语词典》的解释最为简单:“创新”指创造性,抛开旧的,创造新的。笔者所见最新解释是2011年5月伦敦商学院(London Business School)举办的全球领导力峰会(Global Leadership Summit)上,当听众受邀选择对创新的定义时,58%的人选择了最短、最宽泛的答案——来自《经济学人》(The Economist)的“创造价值的新鲜想法”。

  百度上百科名片的解释就繁复多了:“创新是指人们为了发展的需要,运用已知的信息,不断突破常规,发现或产生某种新颖、独特的有社会价值或个人价值的新事物、新思想的活动。创新的本质是突破,即突破旧的思维定势,旧的常规戒律。创新活动的核心是“新”,它或者是产品的结构、性能和外部特征的变革,或者是造型设计、内容的表现形式和手段的创造,或者是内容的丰富和完善。”读来虽甚觉全面,又颇为生涩,即依笔见一孔之见,“创新”也许包括“突破”,也许更多的是“渐进”。

  英语中有“创造”(invention)和“创新”(innovation)之别,invention是无中生有,创造全新的东西,即所谓创造(发明);“innovation”是指以旧翻新,改造、更新现有的东西,即所谓革新。前者是所谓“突破性”或“破坏性”发明,如蒸汽机、汽车、飞机、电话、电视机、计算机等;后者是“渐进性”革新,如大型高炉、数控机床、核能发电等。2011年,泰勒•考恩(Tyler Cowen)发表了颇有人气的短篇小说《大停滞》(The Great Stagnation)指出,今日西方已经进入了一个科技高原期:我们已经吃光了长在低处的经济果实,因而经济增长受到阻碍,从现在起,要想取得进步会更加艰难。该作者的核心观点是创新突破比以前稀缺了很多,也有人在质疑“突破性创新已是过去时?”今天突破创新不能说没有,苹果公司的iPad、iPhone、iPod都算是,但的确十分少见,特别的难能可贵!

  电子技术随笔【第二篇】:十种精密全波整流电路

  图1的经典电路虽然匹配电阻多,但是完全可以用6个等值电阻R实现,其中电阻R3可以用两个R并联.可以通过R5调节增益,增益可以大于1,也可以小于1.最具有优势的是可以在R5上并电容滤波.

  图2的电路的优势是匹配电阻少,只要一对匹配电阻就可以了.

  图3的优势在于高输入阻抗.

  其它几种,有的在D2导通的半周内,通过A2的复合实现A1的负反馈,对有些运放会出现自激. 有的两个半波的输入阻抗不相等,对信号源要求较高.

  两个单运放型虽然可以实现整流的目的,但是输入输出特性都很差.需要输入输出都加跟随器或同相放大器隔离.

  各个电路都有其设计特色,希望我们能从其电路的巧妙设计中,吸取有用的.例如单电源全波电路的设计,复合反馈电路的设计,都是很有用的设计思想和方法,如果能把各个图的电路原理分析并且推导每个公式,会有受益的.

  电子技术随笔【第三篇】:蓄电池在线监测系统的设计与实现

  蓄电池在电力系统中是一种必备的后备电源且数量较多, 其使用寿命和安全可靠性倍受用户关注。但由于使用不当或者不能及时维护,经常会导致蓄电池组中个别蓄电池的过放电或者早期失效。过放电或者早期失效的个别 蓄电池在后备电源投入使用时,会严重影响整个电池组的放电容量,甚至会导致整个供电系统的崩溃。因此,为保证在市电被切断时用电设备能够安全可靠运行,避 免蓄电池在长期使用过程中因个别电池过放电或者失效而引发事故带来经济损失,对蓄电池进行实时在线监测和及时的故障诊断成为蓄电池维护工作的一个极为重要 方面。本文介绍的基于STC89C58RD+微控制器的蓄电池在线监测系统,能实现对蓄电池无论在闲置状态还是充、放电动态过程中的状态监测;对蓄电池内 部开路、短路、过压、欠压及过度放电等异常状态及时报警并存储数据以备查询;能对2V、6V和12V多种多节电池电压在线测量;提高了对蓄电池监测的准确 性、自动化和智能化程度。本文具体介绍了系统的硬件设计和软件实现。

  图1 系统硬件结构框图

  系统硬件设计

  蓄电池在线监测系统是以STC89系列的STC89C58RD+微控制器、XILINX的XC9572-84为核心,外围电路主要由电压采集电路、 A/D转换电路、显示驱动电路及键盘电路等几部分组成的,如图1所示。A/D转换芯片采用10位ADC TLC1549。显示驱动芯片采用MC14489B,它可以驱动5位共阴极数码管,微控制器的P1口的低5位作为键盘输入口,扩展的RS485接口用于多 机通信 。下面详细介绍系统中STC89C58RD+、XC9572-84器件和电压采集电路、A/D转换电路的设计与实现。


  微控制器STC89C58RD+简介

  STC89C58RD+是STC89系列的微控制器,它不但与80C51完全兼容,而且还有新的特点:片内含有Flash程序存储器32Kb, DataFlash数据存储器32Kb,RAM数据存储器1208B,同时内部还有看门狗(WDT);由于ALE信号开关状态可设置,从而降低了EMI; 具有可编程的8级中断源4种优先级,具有系统可编程(ISP)和应用可编程(IAP)等特点,片内资源丰富、集成度高、使用方便。STC89C58RD+ 对系统的工作进行实施调度,实现外部输入参数的设置、电池电压的测试和显示、电池工作状态的指示。

  逻辑编程器件XC9572-84(CPLD)

  由于监测的电池节数较多,所需要I/O口较多,用传统的设计方法,需要74HC273、74HC00、74HC138、CD4514等多种芯片来实 现,器件种类和数量多,使PCB的尺寸加大,也增加了系统的不稳定因素。本系统选用XILINX系列的CPLD器件XC9572-84,其共有72个宏单 元,69个I/O口,1600个门,72个寄存器,可以对上述多种芯片进行集成。该器件具有在系统可编程能力,含有先进的数据保密特性,它可以完全保护编 程数据不被非法读取和擦除,每个I/O口都有一个可编程输出摆率控制位从而可减小系统噪声,采用具有较低功耗的快速闪存技术,每个I/O口的驱动能力强, 负载电流可达24mA。XC9572-84接收单片机传来的数据和地址,控制各个固态继电器(G3VM-402C)的选通以及A/D转换的进行,达到采集 电压的功能。采用了CPLD器件后,减少了系统所需器件的数量和种类,简化了PCB的排版和布线,减小了系统体积和节约成本,方便了系统调试,有利于批量 化生产。

  电压采集电路

  电压采集电路直接影响到电压测试的精确程度,因而采集电路设计得是否适当对整个系统至关重要。对每节电池电压进行测量,有两种方法:①对每节电池电 压直接采集。②采集(n+1)节电池的总电压,减去n节电池的总电压得第n+1节电池电压。第一种电压采集精确而且安全。第二种虽然电路比较简单但是当电 池节数多时采集的电压太高,不安全而且会出现较大的误差。因此选用第一种方法。电压采集电路要求要安全,采集的电压要足够的稳定。本系统的蓄电池组采用串 接方式,BAT1+接第一节电池的正极,BAT2+接第二节的正极(第一节的负极),如此依次连接,最多可达41节。经过XC9572-84模拟开关选通 G3VM-402C后,将1~n节电池电压依次释放到电压总线BUS1+、BUS1-上,电路选用运算放大器LM358作为信号放大器件,它的前级为差分 式放大器,后级为电压跟随器,使TLC1549得到一个稳定的采样电压,如图2所示。1VD0和1VD1采用FR104高速开关管来保护运算放大器的内部 电路。差分式放大倍数为A=0.2,具体推导如下:

  (Ua-Up)/1R12=Up/1R14; ① (Ub-Un)/1R11=(Un-Vo)/1R13;②

  注意运放的“虚短”特点,有Up=Un;结合①、②两式得到Vo=((1R11+1R13)/1R11)·(1R14/(1R12+1R14))·Ua-1R13/1R11·Ub;选取电阻满足:1R13/1R11=1R14/1R12的关系,输出电压可简化为:Vo=1R13/1R11·(Ua-Ub),故电压放大倍数A=Vo/(Ua-Ub)=1R13/1R11=0.2。

  A/D转换电路

  本系统A/D转换采用片外串行总线10位高速高精度专用集成电路TLC1549,其功耗低、体积小、占用单片机的资源少,具有连接方便、编程简单的 特点。电压采集电路的输出电压与TLC1549的A/D转换通道相连接,在时钟脉冲信号作用下,TLC1549将电压转换成10位二进制数字信号,并把上 次A/D转换的结果以10位二进制数的形式依次输出,再通过光电隔离传送到单片机进行处理,如图3所示。

  硬件设计过程中的注意点

  1 系统用多路电源,要考虑系统的功耗选择适当的电源,电源电压应比较稳定。

  2 电压采集部分使用固态继电器(G3VM-402C),由于电池节数较多,电压比较高,故应注意对内部电路的保护,可以采用适当功率的电阻。对放大电路的电 阻精度要求较高,可选用精度为1%的金属膜电阻;电路设计应避免出现因多个固态继电器同时开通的直通现象,这样会使多节蓄电池短路,造成电压采集电路的损 坏。

  3 A/D转换芯片的基准电源要十分稳定,基准电源与芯片工作电源应采用不同的共地电源,以保证A/D转换芯片基准电源的稳定性。为了减少干扰,时钟和片选信号与单片机、CPLD之间进行光电隔离。

  4 器件的布局和PCB图的布线采用模块化,交流与直流分离,强电与弱电分离,数字地和模拟地分开,注意电源线和地线的布局。

  系统软件设计

  在单片机的软件编程上,以Keil C编译器的Windows集成开发环境 μvision2作为软件开发平台,采用C51高级语言编写。该语言是80C51系列单片机的专门的高性能的程序设计语言。它采用符合ANSI标准的C语 言编程,便于改进、扩充和移植,可以对硬件进行操作,能够产生极高速和极其简洁形式的目标代码,在代码的效率和执行速度上完全可以和汇编语言相媲美,并且 有十分丰富的库函数可以供用户直接调用,从而极大地提高了程序的编写效率,能提供给用户高质量的程序代码。采用硬件描述语言Verilog HDL对CPLD进行编程。

  单片机软件编程注意点

  1 键盘在定时中断服务程序中读取,用中断间隔时间实现键盘的去抖,不必编写另外的延时程序,提高了CPU的利用效率。键盘值存入数据缓冲区,在主程序中读数据缓冲区的内容,执行键盘功能散转子程序。

  2 电池电压的采集在中断程序中执行,因固态继电器的开通与关断时间均需1ms,故通道选通时要有一定的延时,使电池采集电压建立并稳定后再启动A/D转换。

  3 根据A/D转换芯片TLC1549的工作原理,当前输出的数据是上一次A/D转换的结果, 故对一节电池电压采样的首次A/D转换结果应丢弃,其余几次转换结果保留并加以处理。

  4 根据STC89C58RD+的DataFlash 的特点,数据写入时必须启动ISP/IAP命令,CPU等待IAP动作定时后,才继续执行程序,要先关断中断(EA)。要使数据写入DataFlash存 储器,不能跨越扇区,如果要对某个扇区进行擦除,而其中有些字节的内容需要保护,则需将其先读到单片机内部的RAM中保存,再将该扇区擦除,然后再将保存 的数据写回该扇区。

  CPLD的Verilog HDL编程

  用硬件描述语言Verilog HDL的程序设计硬件的好处在于易于理解、易于维护、调试电路速度快、有许多易于掌握的仿真、综合和布局布线的工具,还可以用C语言配合Verilog HDL来做逻辑设计的布线前和布线后仿真,验证功能是否正确。限于篇幅,下面给出部分模块的Verilog HDL程序

  module REG8 ( CLRB, D, CLK, Q ); //8位数据锁存

  input CLRB, CLK;

  input D;

  output Q;

  reg Q;

  always @( posedge CLK or negedge CLRB )

  Q <= ( !CLRB )? 0: D;

  endmodule

  module DECODE4_16( E1,A,Y ); //4-16译码

  input E1;

  input A;

  output Y;

  reg Y;

  always @( E1 or A )

  if(E1==0 )

  begin

  case(A)

  0:Y=16'b1111111111111110;

  1:Y=16'b1111111111111101;

  2:Y=16'b1111111111111011;

  3:Y=16'b1111111111110111;

  4:Y=16'b1111111111101111;

  5:Y=16'b1111111111011111;

  6:Y=16'b1111111110111111;

  7:Y=16'b1111111101111111;

  8:Y=16'b1111111011111111;

  9:Y=16'b1111110111111111;

  10:Y=16'b1111101111111111;

  11:Y=16'b1111011111111111;

  12:Y=16'b1110111111111111;

  13:Y=16'b1101111111111111;

  14:Y=16'b1011111111111111;

  15:Y=16'b0111111111111111;

  endcase

  end

  else

  Y=16'b1111111111111111;endmodule

  电子技术随笔【第四篇】:深入理解C语言指针的奥秘3

  从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。

  所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个"填充字节",这就导致各个成员之间可能会有若干个字节的空隙。

  所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。

  过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。

  指针和函数的关系

  可以把一个指针声明成为一个指向函数的指针。intfun1(char*,int);

  int(*pfun1)(char*,int);

  pfun1=fun1;

  ....

  ....

  inta=(*pfun1)("abcdefg",7);//通过函数指针调用函数。

  可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。

  例十三:

  intfun(char*);

  inta;

  charstr="abcdefghijklmn";

  a=fun(str);

  ...

  ...

  intfun(char*s)

  {

  intnum=0;

  for(inti=0;i{

  num+=*s;s++;

  }

  returnnum;

  }

  这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s后,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致,但是str和s各自占用各自的存储空间。在函数体内对s进行自加1运算,并不意味着同时对str进行了自加1运算。

  指针类型转换

  当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。

  例十四:

  1、floatf=12.3;

  2、float*fptr=&f;

  3、int*p;

  在上面的例子中,假如我们想让指针p指向实数f,应该怎么搞?是用下面的语句吗?


  p=&f;


  不对。因为指针p的类型是int*,它指向的类型是int。表达式&f的结果是一个指针,指针的类型是float*,它指向的类型是float。两者不一致,直接赋值的方法是不行的。至少在我的MSVC++6.0上,对指针的赋值语句要求赋值号两边的类型一致,所指向的类型也一致,其它的编译器上我没试过,大家可以试试。为了实现我们的目的,需要进行"强制类型转换":

  p=(int*)&f;

  如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*TYPE, 那么语法格式是:

  (TYPE*)p;

  这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。

  一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。

  例十五:

  voidfun(char*);

  inta=125,b;

  fun((char*)&a);

  ...

  ...

  voidfun(char*s)

  {

  charc;

  c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;

  c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;

  注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int*,它指向的类型是int。形参这个指针的类型是char*,它指向的类型是char。这样,在实参和形参的结合过程中,我们必须进行一次从int*类型到char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char*temp, 然后执行temp=(char*)&a,最后再把temp的值传递给s。所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。


  我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:

  unsignedinta;

  TYPE*ptr;//TYPE是int,char或结构类型等等类型。

  ...

  ...

  a=20345686;

  ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制

  )

  ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制)

  编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法:

  unsignedinta;

  TYPE*ptr;//TYPE是int,char或结构类型等等类型。

  ...

  ...

  a=某个数,这个数必须代表一个合法的地址;

  ptr=(TYPE*)a;//呵呵,这就可以了。

  严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。


  想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完 全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:

  例十六:

  inta=123,b;

  int*ptr=&a;

  char*str;

  b=(int)ptr;//把指针ptr的值当作一个整数取出来。

  str=(char*)b;//把这个整数的值当作一个地址赋给指针str。

  现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。

  指针的安全问题

  看下面的例子:

  例十七:

  chars='a';

  int*ptr;

  ptr=(int*)&s;

  *ptr=1298;

  指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的首地址。在32位程序中,s占一个字节,int类型占四个字节。最后一条语句不但改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。

  让我们再来看一例:

  例十八:

  1、chara;

  2、int*ptr=&a;

  ...

  ...

  3、ptr++;

  4、*ptr=115;

  该例子完全可以通过编译,并能执行。但是看到没有?第3句对指针ptr进行自加1运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代码。而第4句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误。

  在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的。至于为什么,读者结合例十七来想一想,应该会明白的。

  电子技术随笔【第五篇】:LIN简介

  LIN协会创建于1998年末,最初的发起人为五家汽车制造商,一家软件工具制造商以及一家半导体厂商。该协会将主要目的集中在定义一套开放的标准,该标准主要针对车辆中低成本的内部互联网络(LIN, local interconnect networks),这些地方无论是带宽还是复杂性都不必要用到CAN网络。LIN标准包括了传输协议的定义、传输媒质、开发工具间的接口、以及和软件应用程序间的接口。LIN提升了系统结构的灵活性,并且无论从硬件还是软件角度而言,都为网络中的节点提供了相互操作性,并可预见获得更好的EMC(电磁兼容)特性。

  LIN补充了当前的车辆内部多重网络,并且为实现车内网络的分级提供了条件,这可以有助于车辆获得更好的性能并降低成本。LIN协议致力于满足分布式系统中快速增长的对软件的复杂性、可实现性、可维护性所提出的要求,它将通过提供一系列高度自动化的工具链来满足这一要求。

  LIN总线的主要特性为:

  *单主站以及多从站概念;

  *基于常用的UART/SCI硬件接口,以及相应的软件,或作为纯粹的状态机,从而保证较低的成本;

  *从节点中无须石英或陶瓷振荡器就可以实现自同步;

  *信号传输实体确定,在增强系统中可以计算信号的传播(propagation)时间;

  *信号基于应用交互层。

  LIN网络由一个主节点以及一个或多个从节点组成,媒体访问由主节点控制--从节点中不必有仲裁或冲突管理。可以保证最差状态下的信号传输延迟时间。

  LIN物理层

  总线驱动/接收器的定义遵循ISO 9141单线标准,并带有一些增强性能。总线为单线传输,"与"总线通过终端电阻由电池正极节点(VBAT)提供。总线收发器采用增强型的ISO 9141实现标准。总线可以取两个互补的逻辑值:主控值其电压接近于接地端,代表逻辑值"0",退让值其电压与电池电压接近,代表逻辑值"1"。

  总线采用上拉电阻作为终端,主节点的上拉电阻为1kOhm,从节点的上拉电阻为30kOhm。电阻需串联一个二极管以防止由于本地电源泄漏对总线产生的干扰。从节点的终端电容通常值为 CSlave= 220pF,主节点的电容要更高以使整个总线的电容小于从节点的值。

  由于采用单线媒质传输,最大的传输波特率被限定在20kbit/s以内。该值为从满足信号同步而不产生冲突的最高值,到为满足电磁兼容性要求而要达到的传输最低值之间的实验中间值。最小的传输波特率为1kbit/s--这有助于避免在实际中产生超时冲突。

  LIN协议

  通过LIN总线传输的实体为帧。一个报文帧由帧头以及回应(数据)部分组成。在一个激活的LIN 网络中,通讯通常由主节点启动,主节点任务发送包含有同步间隙的报文头,同步字节以及报文标志符(ID)。一个从节点的任务通过接收并过滤标志符被激活,并启动回应报文的传送。回应中包含了1到8个字节的数据以及一个字节的校验码。

  传输一帧所花费的总的时间是发送每个字节所用的时间,加上从节点的回应间隙,再加上传输每个字节的间隙时间(inter-byte space)。字节间隙是指发送完前一个字节的停止位后到发送下一个字节的启动位之间的时间。

  帧内部间隔(inter-frame space)是从上一帧发送完毕后到下一帧启动发送间的时间间隔。

电子技术随笔相关文章

猜你喜欢