单片机内部结构.docx

上传人:b****4 文档编号:4671169 上传时间:2022-12-07 格式:DOCX 页数:14 大小:78.41KB
下载 相关 举报
单片机内部结构.docx_第1页
第1页 / 共14页
单片机内部结构.docx_第2页
第2页 / 共14页
单片机内部结构.docx_第3页
第3页 / 共14页
单片机内部结构.docx_第4页
第4页 / 共14页
单片机内部结构.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

单片机内部结构.docx

《单片机内部结构.docx》由会员分享,可在线阅读,更多相关《单片机内部结构.docx(14页珍藏版)》请在冰豆网上搜索。

单片机内部结构.docx

单片机内部结构

 单片机内部结构

(一)

单片机的内部究竟有哪些部分组成的,它们都有些什么作用呢?

让我们先来了解其中的ROM存储器:

一.半导体存储器ROM

1.几个基本概念

  上一课我们讲到了把编译后的指令下载到单片机后这条指令一定在单片机内的某个地方,那么它究竟在哪里呢?

原来它就放在一个叫程序存储器的地方,英文名称ROM(全称为ReadOnlyMemory),叫只读存储器。

它是一个什么东西呢?

在讨论这个问题之前,让我们先来看几个物理现象:

(1)数和物理现象的关系不知大家是否还记得,在学习数字电路时我们曾用一盏灯的亮和灭来表示电平的高和低,即用“1”来表示高电平,用“0”来表示低电平,如果现在有两盏灯那它会有几种状态呢?

00011011两盏灯的组合就是四种状态:

00,01,10,11。

如此看来灯的亮和灭这种物理现象同数字确实有着某种联系,如果我们把它们按一定的规律排列好,那么电平的高或低就可以用数字来表了,换句话说:

不同的数字可以代表不同数量灯的电平高或低。

比如:

0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111这十六种组合就可以代表四盏灯的状态,能理解吗?

(2)位及字节的含义

   在单片机中,一盏灯(实际上是一根线)我们称它为一位,它有两种状态(“0”或“1”),分别应电平的高或低,它是单片机最基本的数量单位,用BIT来表示。

8盏灯(八根线)有256种状态,这8盏灯(也就是8位)我们把它称为一个字节,用BYTE表示。

至于为什么要怎么规定,这就不需要你我操心了,我们只要记住就可以了。

那么单片机是如何来储存这些数字所代表的字节的状态的呢?

接着往下看:

2.半导体存储器的工作原理

   存储器就是用来存放数据的地方,它其实是利用电平的高或低来存放数据的,也就是说,它实际上存放的是电平的高或低的状态,而不是我们所习惯上认为的“1234”这样的数字。

那它是如何工作的呢?

一个存储器就象一个小抽屉,一个小抽屉里有8个小盒子每个小盒子用来存放1位“电荷”,电荷通过与它相连的电线传进来或释放掉,至于电荷在小盒子里是怎样存放的,这就不用我们操心了,您可以把电线想象成水管,小盒子里的电荷就象是水,那就好理解了存储器中的1个小抽屉我们把它称之为1个“单元”,相当于1个字节,而1个小盒子就相当于1位。

    有了这么一个构造,我们就可以开始存放数据了,比如我们要放进一个数据“00011010”,我们只要把第2号、第4号和第5号小盒子里存满电荷,而其它小盒子里的电荷给放掉就行了。

可是问题又出来了,一个存储器有好多相同的单元,线是并联着的(看D7-D0),在放入电荷的时候,会将电荷放入所有的字节单元中,而释放电荷的时候,会把每个单元中的电荷都放掉,这样的话,不管存储器有多少个字节单元,都只能放同一个数,这当然不是我们所希望的。

   因此,我们要在结构上稍作变化,看上面的图,在每个单元上有根线与译码器相连,我想要把数据放进哪个单元,就通过译码器给哪个单元发一个信号,由译码器的通过这根线把相应的开关打开,这样电荷就可以自由地进出了。

那么这样是不是就能随意地向存储器写入或者读出数据了呢?

其实还不能,当我们向存储器写入数据时,必须先把这个开关切换到写入端;而要读出数据时,就得先把开关切换到读出端;而片选端则是为了区分不同的存储器设置的。

3.半导体存储器的译码

简单介绍一下:

我们知道,1根线可以代表2种状态;2根线可以代表4种状态;3根线可以代表8种;256种状态又需要几根线代表?

8根线,所以一片6264存储器我们只需要16根线就可以了。

4.存储器的选片及总线的概念至此,译码的问题解决了,让我们再来关注另外一个问题:

送入每个字节的8根线又是从什么地方来的呢?

它就是从单片机的外部引脚上接过来的,一般这8根线除了接一个存储器之外,还要接其它的器件,这样问题又出来了,这8根线既然不是存储器和单片机之间专用的,如果总是将某个单元接在这8根线上,就不行了,比如这个存储器单元中的数值是“FFH”,另一个存储器的单元是“00H”,那么这根线到底是处于高电平,还是低电平?

岂不是要打架看谁历害了?

所以我们必须让它们分离。

   办法当然也简单,当外面的线接到集成电路的引脚上来后,不直接接到各单元去,中间再加一组开关就行了。

这组开关就是前面提到的控制器(看前面的图),平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关切换到相应的位置就行了。

这组开关由三根引线选择读控制端、写控制端和片选端,要将数据写入,先由控制器选中该片,然后发出相应的写信号,开关切换到相应的位置,并将传过来的数据(电荷)写入片中;如果要读信号,先选中该片,然后发出读信号,开关也切换到相应的位置上,数据就被送出去了;另外读和写信号还同时受到译码器的控制,由于选端的不同,所以虽有读或写信号,但没有片选信号,所以另一个存储器就不会“误会”而开门,造成冲突,那么会不会同时选中两个存储器呢?

只要是设计好的系统就不会,因为它是由计算机来控制的,如果真的出现同时选中两个存储器的话,那就是电路出故障了。

   如此看来,存储器要想写入或者读出数据还真是不简单,不过好在这些都是由计算机自动完成的,不需要我们去操心。

从上面的介绍中我们已经看到,用来传递数据的8根线(51单片机是8根)并不是专用的,而是很多器件大家共用的,所以我们把它们称之为数据总线(总线英文名为BUS),即公交道,谁都可以走;而16根地址线(51单片机共有16根地址线,这些以后会讲解,这里不必死记硬背)也是连在一起的,我们把它们称之为地址总线,

5.半导体存储器的分类

第一课中我们提到过,89C51是一种带FlashROM的单片机,什么是FlashROM?

它到底是一种什么东西呢?

ROM我们已经知道,是只读存储器,所谓只读,从字面上理解那就是只可以从里面读出数据,而不能写进去,它类似于我们的书本,发到我们手里之后,我们只能读里面的内容,不可以随意更改书本上的内容。

ROM就是单片机中用来存放程序的地方,前面我们下载到单片机的指令就放在这个地方。

讲到这里大家也许会感到困惑,既然ROM是只读存储器,那么指令又是如何进入其中的呢?

其实所谓的只读只是针对正常工作情况下而言,也就是在使用这块存储器的时候,而不是指制造这块芯片的时候,只要让存储器满足一定的条件就能把数据预先写进去,这个道理也很好理解,书本拿到我们手里是不能改了,但当它还是原材料--白纸的时候,我们完全可以由印刷厂把内容印上去嘛。

前面的编程就是这么回事!

   FlashROM是一种快速存储式只读存储器,这种程序存储器的特点就是既可以电擦写,而且掉电后程序还能保存,编程寿命可以达到几千至几万次,所以我们的实验系统是可以反复烧写的,您尽管使用。

目前新型的单片机都采用这种程序存储器;当然,除了这种程序存储器外,还有两种早期的程序存储器产品,简单介绍一下:

PROMEPROM和EEPROM,PROM称之为可编程只读存储器,就象我们的练习本,买来的时候是空白的,可以写东西上去,可一旦写上去,就擦不掉了,所以它只能写一次,要是写错了,就报废了,习惯上我们把带这种程序存储器的单片机称为OTP型单片机,如果您的产品批量生产,又要求价格比较低的话,带这种程序存储器的单片机是非常合适的;

EPROM,称之为紫外线擦除的可编程只读存储器,它里面的内容写上去之后,如果觉得不满意,可以用一种特殊的方法去掉后重写,就是用紫外线照射,紫外线就象“消字灵”,可以把字去掉,然后再重写,当然消的次数多了,也就不灵光了,所以这种芯片可以擦除的次数也是有限的——几百次吧,电脑上的BIOS芯片采用的就是这种结构的存储器;EEPROM,前一种存储器的擦写要用紫外线,而这种存储器可以直接用电擦写,比较方便数据的改写,它有点类似于FLASH存储器,但比FLASH存储器速度要慢,现在新型的外部扩展存储器都是都是这种结构。

  了解了ROM,让我们再来简单讲讲另一种存储器,叫随机存取存储器,也叫内存,英文缩写为RAM(RandomAccessMemory),它是一种既可以随时改写,也可以随时读出里面数据的存储器,类似于我们上课用的黑板,可以随时写东西上去,也可以用黑板擦随时擦掉重写,它也是单片机中重要的组成部分,单片机中有很多的功能寄存器都与它有关。

单片机内部结构

(二)

一.LED灯闪烁的实验程序

我们要让LED1不断的闪烁,就象大海中用的航标灯。

怎样才能让LED1不断的闪烁呢?

实际上就是让它亮几秒,再灭几秒,也就是让P1.0交替地输出高电平或低电平,按照前面所学的知识,我们写出下面的程序:

CLRP1.0;SETBP1.0;编译后下载到单片机?

这里有两个问题:

首先计算机执行指令的速度很快,执行完第1条指令后LED1是灭了,但在极短的时间内又去执行第2条指令,LED1又亮了,我们根本无法看到灯曾经灭过;第二个问题是当执行完第2条指令后,不会再去执行第1条指令了,因为单片机执行指令的过程是一条一条地顺序执行的。

如何解决这两个问题呢?

我们可以作如下的设想:

第一,执行完第1条指令后让单片机延时一段时间(几秒或零点几秒),然后再去执行第2条指令,这样就可以看到LED1曾经灭过了;

第二,让单片机执行完全部指令后再返回去执行第1条指令,如此不断的循环就可以达到我们的要求了。

实验程序如下:

主程序

MAIN:

SETBP1.0;(1)

LCALLDELAY;(2)

CLRP1.0;(3)

LCALLDELAY;(4)

LJMPMAIN;(5)

子程序

DELAY:

MOVR7,#250;(6)

D1:

MOVR6,#250;(7)

D2:

DJNZR6,D2;(8)

DJNZR7,D1;(9)

RET;(10)

END.(11)

还记得软件的使用方法吗?

调试,写入源代码,编译,下载到单片机,看看是不是我们想要的结果?

?

在分析这段程序之前,先来说明几个标点符号的意义:

1.分号在这里起一个分隔符的作用,表示这条指令到此为止;

2.括号内的数字在这里是为了解释程序用的,实际的编译过程中是没有意义的,也就是说没有也是一样的,只是为了程序的可读性更强,我们一般会在分号的后面加上程序的注释文字(后面我们会用到);

3.特别:

程序中的标点符号只能在英文状态下输入,当使用中文输入时,必须切换到半角状态,不然编译软件会出错。

接下来我们分析一下这段程序:

按照我们的要求,第1条,让灯灭,第2条应该是延时,第3条是让灯亮,第4条和第2条一样也应该是延时,第5条应当返回去执行第1条指令。

   看一下上面的程序,第1条我们已经懂了,是让LED1灭,第2条和第4条我们等一下讨论,第5条是LJMPMAIN,LJMP是一条指令,意思是转移,转移到什么地方去呢?

看一下LJMP后面跟着什,是MAIN,什么地方有MAIN,在第1条指令的开头就是MAIN,所以第5条指令的意思就是跳转到MAIN(即第1条指令处继续执行),如此一来,就不断地重复执行这些指令。

   那么MAIN又是什么意思呢?

它实际上是我们为这段程序起的一个名称,专业术语叫标号,既然是一个名称那可不可以用mcu,CHINA等等的其他名字呢?

当然可以,这完全取决于您的需要(?

不过也有一些是不能采用的,我们以后再讲)。

再来分析第2条和第4条指令,看看它们是如何实现延时的?

   LCALLDELAY,LCALL也是一条指令,这条指令叫做调用子程序指令,看看LCALL后面跟着的是什么--DELAY,哪里有DELAY,在第6条指令的开头,很显然这也是一个标号,这条指令的作用就是当执行到这条指令时就转去执行LCALL后面标号所在处的程序,如果在执行程序时遇到RET指令(RET叫返回指令),就返回到LCALL指令的下面一条(即第3条指令)处继续执行,在第9条指令后确实有RET指令,那么在执完第2条指令后就应该去执行第6.7.8.9条指令,之后遇到第10条指令:

RET,执行完这条指令后就回去执行第3条指令,将P1.0清零,也就是让LED1亮,然后再去执行第4条指令,执行完后又回到6.7.8.9.10

条指令,最后执行第5条指令:

LJMPMAIN,也就是我们刚才说的跳转到第1条,将P1.0置位,就是LED1

灭掉。

如此周而复始,LED1就不断的闪烁。

好好理解这段文字,务必把它搞清楚!

   从标号DELAY处(即第6条)开始到RET的这一段指令我们称之为子程序,它是一段延时程序,至于延时多长时间,我们会在以后的课程中学习。

程序的最后一条是END,它不是指令,它只是告诉编译软件整个程序到此结束了,它叫“伪指令”。

在大家以后的编程中,写完程序都要加上这一条。

    在上面的程序中我们知道了从标号DELAY开始的子程序是一段延时程序,那么它又是如何工作的呢?

在了解它的工作过程之前我们必须先知道其中的一些符号,就从R7开始吧,它是单片机内部的一个重要组成部分,叫工作寄存器,什么是工作寄存器?

下面我们就来讲解这个问题:

二.工作寄存器

上一课我们已经讲过,在单片机中有许多的功能寄存器和半导体存储器RAM有关,那么工作寄存器又属于哪一部分呢?

它是用来干什么的呢?

要搞清楚这个问题,让我们先从日常生活中的一个例子说起,如我们要做一道数学题123+456,您会马上得出答案:

579,接下来再看一道题:

123+456+789,要你马上得出答案就不那么容易了,通常我们会怎么做呢?

一般总是先把123+456的结果

579写在一张纸上,然后再算579+789=1368,这1368就是我们想要的最终结果,而579只是为了得到最终结果而暂时记下来的中间结果,单片机中做运算和我们生活中做运算一样,也需要把中间结果放在某个地方,那么计算机把它放在哪儿呢?

前面我们提到的ROM(只读存储器)中,不行!

因为ROM是用来存放程序的,它只能写进去,能读出来(再次提醒一下,这只是相对而已),所以只能放在单片机的另一个区域—RAM中(即随机存取存储器)中。

R7就是RAM区域中划出的一部分。

知道了R7,接下来让我们来分析一下这段子程序(延时程序)。

三.LED灯闪烁程序子程序的分析

首先看第6条,MOVR7,#250,这也是一条指令,意思是传递数据。

我们知道在日常生活中,要传递一件东西就必须要有一个传递者,一个接受者和被传递的东西,那么在单片机中是怎么区分它们的呢?

在这条指令中,R7是接受者,250就是要传递的东西(单片机中要传递的东西当然是数字了),这里传递者被省略了(顺便提一下,并不是每条指令都能省略的,事实上大部分的指令都要有传递者),这样一来,这条指令的意思也很清楚了:

就是把250这个数传递给R7这个工作寄存器(也就是把250个数送入R7中),这样执行完这条指令后R7中的值就应该是250,我们可以用DUBG8051这个软件来验证一下,看是不是符合。

讲到这里,不知大家注意没有,在250这个数的前面有个#,它是什么意思呢?

这个#就说明250是一个被传递的数的本身,而不是传递者。

看懂了MOVR7,#250,那么MOVR6,#250也应该很清楚了。

   接着看第8条DJNZR6,D2,这又是另一条指令,我们来看一下DJNZ后面跟着什么,一个是R6,一个是D2,R6我们已经知道了,再找一下D2,D2在本行的开头,我们已经学过,它是标号。

那么这条指令是怎么执行的呢?

它的执行过程是这样的:

它将后面的值(即工作寄存器R6中的值)减1,然后查一下这个值是否等于“0”,如果等于“0”就往下执行,如果不等于“0”就转移,转移到什么地方去呢?

大家应该明白了,实际上这条指令的执行结果就是在原地转250次;当R6中的值等于“0”之后,程序就去执行第9条指令,也就是DJNZR7,D1,大家自行分析一下这条指令的结果(是不是转去执行MOVR6,#250,同时R7中的值减1),这段子程序的最终执行结果就是DJNZR6,#250这条指令被16执行了250*250=62500次,执行这么多次干吗?

就是为了延时。

单片机内部结构(三)

1.时序的由来

已经知道单片机执行指令的过程就是顺序地从ROM(程序存储器)中取出指令一条一条的顺序执行,然后进行一系列的微操作控制,来完成各种指定的动作。

它在协调内部的各种动作时必须要有一定的顺序,换句话说,就是这一系列微操作控制信号在时间上要有一个严格的先后次序,这种次序就是单片机的时序。

就好比学校上课时用的电铃,为了保证课堂秩序,学校就必须在铃声的统一协调下安排各个课程和活动。

那么单片机的时序是如何规定的呢?

接着往下看:

  2.时序的周期 

计算机每访问一次存储器的时间,我们把它称为一个机器周期,它是一个时间基准,就象我们日常生活中使用的秒一样,计算机中一个机器周期包括12个振荡周期,什么是振荡周期?

一个振荡周期是多少时间?

振荡周期就是振荡源的周期,也就是我们使用的晶振的时间周期,一个12M的晶振,它的时间周期是多少,如果电子技术学得好的朋友应该不难算出(T=1/f),也就是1/12(微秒),那么使用12M晶振的单片机,它的一个机器周期就应该等于12*1/12(微秒),也就是1μS。

在MCS-51系列单片机中,有些指令只要一个机器周期,而有些指令则需要两个或三个机器周期,另外还有两条指令需要4个机器周期,这也不难理解,你在家擦地板的话总比擦桌子的时间要长,不过我可是大男子主义,从来不做家务的。

开句玩笑!

如何衡量指令执行时间的长短?

我们就要用到一个新的概念:

指令周期—即执行一条指令所需的机器周期,INTEL公司规定了每一条指令执行的机器周期,当然这不需要我们非把它记住,不过在这里DJNZ指令我们是要记住的,它是双周期指令,执行一次需要两个机器周期,即2μS。

(12M晶振的话),回到我们上一课的实验,延时的时间就应该算出来了吧,是62500*2μS=125000μS,也就是125mS。

这么大的数字也就0.125S,怪不得LED1闪烁的这么快。

二.单片机的时钟电路,单片机是在一定的时序控制下工作的,那么时序和时钟又有什么关系呢?

时钟是时序的基础,单片机本身就如同一个复杂的同步时序电路,为了保证同步工作方式的实现,电路就要在唯一的时钟信号控制下按时序进行工作。

那么单片机内的时钟是如何产生的呢?

1.内部时钟电路

在MCS-51单片机的内部有一个高增益的反相放大器,其输入端为引脚XTL1(19),输出端为XTL2

我们只要在外部接上两个电容和一个晶振,就能构成一个稳定的自激振荡器,它的内部电路的工作原理就不介绍了,这里主要讲一下电容和晶振的选择,看上面的图,晶振的大小与单片机的振荡频率有关,我们到串行接口时再详细讲解,电容的大小影响着振荡器振荡的稳定性和起振的快速性,通常选择10-30P的瓷片电容或校正电容;另外在设计电路时,晶振和电容应尽可能的靠近芯片,以减少PCB板的分布电容保证振荡器振荡工作的稳定性,提高系统的抗干扰能力

2.外部时钟电路

除了内部时钟方式外,单片机还可以采用外部引入时钟的振荡方式,什么时候需要采用外部时钟方式呢?

当我们的系统由多片单片机组成时,为了保证各单片机之间时钟信号的同步,就应当引入唯一的公用的外部脉冲信号作为各单片机的振荡脉冲,此时应将XTAL2悬空不用,外部脉冲信号由XTAL1引入,如上右图所示,外部信号的高低电平持续时间应大于20mS

单片机内部结构(四)

一.单片机I/O口的输出实验

 1.实验程序如下:

LOOP:

MOVP1,#0FFH;

LCALLDELAY;

MOVP1,#00H;

LCALLDELAY;

LJMPLOOP;

调试,写入源代码,编译,下载,看到了什么?

8只LED灯都在闪烁(注意:

前面的实验是让一个LED灯闪烁),分析一下程序:

2.程序分析

这段程序和前面的程序比较,有两处不同,第1条,原来是SETBP1.0,现在改为MOV P1,#0FFH,

第3条,原来是CLR P1,现在改为MOV P1,#00H。

为什么这样改了之后就变成了8只LED灯同时闪烁了?

原来P1代表了P1.7-P1.0的全部,我们把它当作一个存储器单元(即一个字节),不过对一个存储器单元送数就应该用MOV指令了;在这里P1(P1.7-P1.0)接的是LED灯(也就是负载),它起到了一个输出端的作用。

那如果把P1改为P2或P3或P4行不行呢?

答案是肯定的,为什么?

我们稍后再谈,接着看第2个实验。

由上面两个实验我们得出结论,凡是以P开头的管脚都可以用作输入输出口,在89C51中这32个管脚我们就称之为并行口。

它们实际上就是特殊功能存储器SFR(什么是特殊功能寄存器,我们后面再讲)中的四个,记作P0,P1,P2,P3,它们都是双向通道,即既可以作为输出口,也可以作为输入口,作输出时数据可以锁存,作输入时数据可以缓冲,那么它们是怎么实现输入输出功能的呢?

继续往下看。

三.单片机并行口的结构分析先来看看输入结构:

1.输入结构

I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。

读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。

比如取反,置位,清零等等指令;而读端口时才真正地把外部的数据读入到内部总线,图中的两个三角形表示的就是输入缓冲器,CPU将根据不同的指令,分别发出“读端口”或“读引脚”信号,以完成不同的操作,这是硬件自动完成的,不需要我们操心。

读引脚时,也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置“1”,然后再实行读引脚操作,否则就可能读入出错。

为什么?

看上面的图,如果不对端口置“1”,端口锁存器原来的状态有可能为“0”(Q端为0,Q^为1)加到场效应管栅极的信号为“1”,该场效应管就导通,对地呈现低阻抗,此时即使引脚上输入的信号为“1”,也会因端口的低阻抗而使信号变低,使得外加的“1”信号读入后不一定是“1”,若先执行置“1”操作,则可以使场效应管截止,引脚信号直接加到三态缓冲器中,实现正确的读入。

由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为“准双向”口,MCS-51的P0,P1,P2,P3口作为输入/输出口时都是“准双向”口。

接下来让我们再看另一个问题,从图中可以看出,这四个端口还有一个差别,除了P1口外,P0,P2,P3口都还有第二功能,这些第二功能又是作什么用的呢?

 2.端口的工作原理

(1)。

P0口

先来看P0口,从图中可以看到,P0口的内部有一个2选1的选择器,受内部信号的控制,如果在图中的位置则处在I/O口工作方式,此时相当于一个“准双向口”,输入时须先将口置“1”,每根口线可以独立定义为输入或输出,但是须在口线上加上拉电阻。

如果将开关往另一个方向,则就是另一个功能—作为地址/数据复用总线用,此时不能逐位定义为输入/输出,它有两种用法:

当作数据总线用时,输入8位数据;而当作地址总线用时,则输出8位地址。

再强调一点,当P0口作为地址/数据总线用之后,就再也不能作I/O口使用了。

讲到这里,也许大家会感到困惑,什么叫作地址/数据复用?

这其实是当单片机的并行口不够用时,需要扩展输入输出口时的一种用法,知道了P0口,再来看P1口。

 

(2)P1口

同P0不同,P1口只能作为I/O口使用,但它的内部有一个上拉电阻,所以连接外围负载时不需要外接上拉电阻,这一点P1,P2,P3都一样,务必请大家注意。

 

(3)P2口

P2口作为I/O口线用时,与P0口一样,当

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1