第7章MCS-51单片机常用接口.ppt

上传人:本田雅阁 文档编号:3130827 上传时间:2019-07-14 格式:PPT 页数:62 大小:558.53KB
返回 下载 相关 举报
第7章MCS-51单片机常用接口.ppt_第1页
第1页 / 共62页
第7章MCS-51单片机常用接口.ppt_第2页
第2页 / 共62页
第7章MCS-51单片机常用接口.ppt_第3页
第3页 / 共62页
第7章MCS-51单片机常用接口.ppt_第4页
第4页 / 共62页
第7章MCS-51单片机常用接口.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《第7章MCS-51单片机常用接口.ppt》由会员分享,可在线阅读,更多相关《第7章MCS-51单片机常用接口.ppt(62页珍藏版)》请在三一文库上搜索。

1、7.1 MCS-51单片机的最小系统,所谓最小系统,是指一个真正可用的单片机最小配置系统。对于单片机内部资源已能满足系统需要的,可直接采用最小系统。MCS-51单片机根据片内有无程序存储器最小系统分两种情况。,7.1.1 8051/8751的最小系统,8051/8751片内有4K的ROM/EPROM,因此,只需要外接晶体振荡器和复位电路就可构成最小系统。如图所示。,第7章 MCS-51单片机常用接口,该最小系统的特点如下: (1)由于片外没有扩展存储器和外设,P0、P1、P2、P3都可以作为用户I/O口使用。 (2)片内数据存储器有128字节,地址空间00H7FH,没有片外数据存储器。 (3)

2、内部有4KB程序存储器,地址空间0000H0FFFH,没有片外程序存储器,EA应接高电平。 (4)可以使用两个定时/计数器T0和T1,一个全双工的串行通信接口,5个中断源。,7.1.1 8031最小应用系统,8031片内无程序存储器片,因此,在构成最小应用系统不仅要外接晶体振荡器和复位电路,还应外扩展程序存储器。,该最小系统特点如下: (1)由于P0、P2在扩展程序存储器时作为地址线和数据线,不能作为I/O线,因此,只有P1、P3作为用户I/O口使用。 (2)片内数据存储器同样有128字节,地址空间00H7FH,没有片外数据存储器。 (3)内部有无程序存储器,但片外扩展了程序存储器,其地址空间

3、随芯片容量不同而不一样。图6.2中使用的是2764芯片,容量为8K字节,地址空间为0000H1FFFH。由于片内没有程序存储器,只能使用片外程序存储器,EA只能接低电平。 (4)同样可以使用两个定时/计数器T0和T1,一个全双工的串行通信接口,5个中断源。,7.2 存储器扩展,7.2.1 存储器扩展概述,一、MCS-51单片机的存储器扩展能力,可扩展片外程序存储器64KB,地址为0000HFFFFH。 可扩展片外数据存储器64KB,地址为0000HFFFFH。,二、存储器扩展的一般方法,不论何种存储器芯片,其引脚都呈三总线结构,与单片机连接都是三总线对接。另外,电源线接电源线,地线接地线。,控

4、制线: 程序存储器:ROM芯片输出允许控制线 OE与单片机的PSEN信号线相连 。 数据存储器:RAM芯片输出允许控制线OE和写控制线 WE分别与单片机的读信号线RD和写信号线WR相连。,程序存储器用ROM芯片扩展,数据存储器用RAM芯片扩展,2、数据线:存储器芯片的数据线与单片机的数据总线(P0.0P0.7)按由低位到高位的顺序顺次相接。,3、地址线: 存储器芯片的地址线的数目由芯片的容量决定。容量(Q)与地址线数目(N)满足关系式:Q=2N。一般来说,存储器芯片的地址线数目总是少于单片机地址总线的数目,连接时存储器芯片的地址线与单片机的地址总线(A0A15)按由低位到高位的顺序顺次相接。连

5、接后,单片机的高位地址线总有剩余。剩余地址线一般作为译码线,译码输出与存储器芯片的片选信号线CS相接。片选信号线与单片机系统的译码输出相接后,就决定了存储器芯片的地址范围。,译码有两种方法:部分译码法和全译码法。,部分译码:所谓部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间的浪费。,如下图,存储器芯片容量为2K,地址线为11根,与地址总线的低11位A0A10相连,用于选中芯片内的单元。地址总线的A11、A12、A13、A14根地址线参加译码的选中芯片,设这四根地址总线的状态为0100时选

6、中该芯片。地址总线A15不参加译码,当地址总线A15为0、1两种状态都可以选中该存储器芯片。,当A15=0时,芯片占用的地址是00010000000000000001011111111111,即1000H17FFH。 当A15=1时,芯片占用的地址是10010000000000001001011111111111,即9000H97FFH。,部分译码法的一个特例是线译码。所谓线译码就是直接用一根剩余的高位地址线与一块存储器芯片的片选信号CS相连。,全译码:所谓全译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线全部参加译码。这种译码方法存储器芯片的地址空间是唯一确定的,但

7、译码电路相对复杂。,3扩展存储器所需芯片数目的确定,若所选存储器芯片字长与单片机字长一致,则只需扩展容量。所需芯片数目按下式确定:,若所选存储器芯片字长与单片机字长不一致,则不仅需扩展容量,还需字扩展。所需芯片数目按下式确定:,7.2.2 程序存储器扩展,一单片程序存储器的扩展,2764,二多片程序存储器的扩展,其8个重叠的地址范围为如下: 00000000000000000001111111111111,即0000H1FFFH; 00100000000000000011111111111111,即2000H3FFFH; 01000000000000000101111111111111,即40

8、00H5FFFH; 01100000000000000111111111111111,即6000H7FFFH; 10000000000000001001111111111111,即8000H9FFFH; 10100000000000001011111111111111,即A000HBFFFH; 11000000000000001101111111111111,即C000HDFFFH; 11100000000000001111111111111111,即E000HFFFFH。,其两片的地址空间分别为: 第一片: 000000000000000000001111111111111,即0000H1F

9、FFH; 001000000000000000011111111111111,即2000H3FFFH; 010000000000000000101111111111111,即4000H5FFFH; 011000000000000000111111111111111,即6000H7FFFH; 第二片: 100000000000000001001111111111111,即8000H9FFFH; 101000000000000001011111111111111,即A000HBFFFH; 110000000000000001101111111111111,即C000HDFFFH; 11100000

10、0000000001111111111111111,即E000HFFFFH。,由于采用全译码,每片2764的地址空间都是唯一的。它们分别是: 000000000000000000001111111111111,即0000H1FFFH; 001000000000000000011111111111111,即2000H3FFFH; 010000000000000000101111111111111,即4000H5FFFH; 011000000000000000111111111111111,即6000H7FFFH。,P2.7为低电平0,两片6264芯片的地址空间为: 第一片:01000000000

11、0000000101111111111111,即4000H5FFFH; 第二片:001000000000000000011111111111111,即2000H3FFFH; P2.7为高电平1,两片6264芯片的地址空间为: 第一片:110000000000000001101111111111111,即C000HDFFFH; 第二片:101000000000000001011111111111111,即A000HBFFFH;,7.2.3 数据存储器扩展,7.3 输入/输出口扩展,7.3.1 简单I/O口扩展,通常通过数据缓冲器、锁存器来扩展简单I/O接口。例如:74LS373 74LS244、

12、74LS273、74LS245等芯片都可以作简单I/O扩展。,图中,扩展的输入口接了K0K7 8个开关,扩展的输出口接了L0L7 8个发光二极管,如果要实现K0K7开关的状态通过L0L7发光二极管显示,则相应的汇编程序为: LOOP:MOV DPTR,#0FEFFH MOVX A,DPTR MOVX DPTR,A SJMP LOOP 如果用C语言编程,相应程序段为: #include /定义绝对地址访问 #define uchar unsigned char uchar i; i=XBYTE0xfeff; XBYTE0xfeff= i; ,7.3.2 可编程I/O扩展(8255A),一8255

13、A的结构与功能,二8255A的引脚信号,8255A共40引脚,采用双列直插式封装,如下图所示,各引脚信号功能如下:,D7D0:三态双向数据线,与单片机的数据总线相连,用来传送数据信息。,CS:片选信号线,低电平有效,用于选中8255A芯片。,RD:读信号线,低电平有效,用于控制从8255A端口寄存器读出信息。,WR:写信号线,低电平有效,用于控制向8255A端口寄存器写入信息。,PA7PA0:A口的8根输入/输出信号线,用于与外部设备连接。 PB7PB0:B口的8根输入/输出信号线,用于与外部设备连接。 PC7PC0:C口的8根输入/输出信号线,用于与外部设备连接。 RESET:复位信号线。

14、VCC:+5V电源线。 GND:地信号线。,三8255A的控制字,8255A有两个控制字:工作方式控制字和C口按位置位/复位控制字。,1工作方式控制字,D7位为特征位。D7=1表示为工作方式控制字。 D6、D5用于设定A组的工作方式。 D4、D3用于设定A口和C口的高4位是输入还是输出。 D2用于设定B组的工作方式。 D1、D0用于设定B口和C口的低4位是输入还是输出。,2C口按位置位/复位控制字,D7位为特征位。D7=0表示为C口按位置位/复位控制字。 D6、D5、D4这三位不用 D3、D2、D1这三位用于选择C口当中的某一位。 D0用于置位/复位设置,D0=0则复位,D0=1则置位。,四8

15、255A的工作方式,1方式0,方式0是一种基本的输入/输出方式。在这种方式下,三个端口都可以由程序设置为输入或输出,没有固定的应答信号。方式0特点如下: (1)具有两个8位端口(A、B)和两个4位端口(C口的高4位和C口的低4位)。 (2)任何一个端口都可以设定为输入或者输出。 (3)每一个端口输出时是锁存的,输入是不锁存的。,方式0输入/输出时没有专门的应答信号,通常用于无条件传送。例如:下图是8255A工作于方式0的例子,其中A口输入,B口输出。,2方式1,方式1是一种选通输入/输出方式。在这种工作方式下,端口A和B作为数据输入输出口,端口C用作输入/输出的应答信号。A口和B口既可以作输入

16、,也可作输出,输入和输出都具有锁存能力。,方式1输入:,无论是A口输入还是B口输入,都用C口的三位作应答信号,一位作中断允许控制位。,各应答信号含义如下:,STB:外设送给8255A的“输入选通”信号,低电平有效。,IBF:8255A送给外设的“输入缓冲器满”信号,高电平有效。,INTR:8255A送给CPU的“中断请求”信号,高电平有效。,INTE:8255A内部为控制中断而设置的“中断允许”信号。INTE由软件通过对PC4(A口)和PC2(B口)的置位/复位来允许或禁止。,方式1输出:,无论是A口输出还是B口输出,也都用C口的三位作应答信号,一位作中断允许控制位。,应答信号含义如下:,OB

17、F:8255A送给外设的“输出缓冲器满”信号,低电平有效。,ACK:外设送给8255A的“应答”信号,低电平有效。,INTR:8255A送给CPU的“中断请求”信号,高电平有效。,INTE:8255A内部为控制中断而设置的“中断允许”信号,含义与输入相同,只是对应C口的位数与输入不同,它是通过对PC4(A口)和PC2(B口)的置位/复位来允许或禁止。,3方式2,方式2是一种双向选通输入/输出方式。只适合于端口A。这种方式能实现外设与8255A的A口双向数据传送,并且输入和输出都是锁存的。它使用C口的5位作应答信号,两位作中断允许控制位。,五8255A与MCS-51单片机的接口,1硬件接口,82

18、55A与MCS-51单片机的连接包含数据线、地址线、控制线的连接.,图中,8255A的数据线与8051单片机的数据总线相连,读、写信号线对应相连,地址线A0、A1与单片机的地址总线的A0和A1相连,片选信号CS与8051的P2.0相连。则8255A的A口、B口、C口和控制口的地址分别是:FEFCH,FEFDH,FEFEH,FEFFH。,2软件编程,如果设定8255A的A口为方式0输入,B口为方式0输出,则初始化程序为: 汇编程序段: MOV A,#90H MOV DPTR,#0FEFFH MOVX DPTR,A C语言程序段: #include #include /定义绝对地址访问 XBYTE

19、0xfeff=0x90; ,7.4 MCS-51单片机与键盘接口,7.4.1 键盘的工作原理,键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。它的结构和产生的波形如图所示。,键盘的处理主要涉及三个方面:,1按键的识别,2抖动的消除,消除按键盘抖动通常有两种方法:硬件消抖和软件消抖。,软件消抖是利用延时来跳过抖动过程,3键位的编码,通常有两种方法编码。,(1)用连接键盘的I/O线的二进制组合进行编码。如(a)图,(2)顺序排列编码。如(b)图,处理方法如下:编码值=行首编码值X+列号Y。,7.4.2 独立式键盘与单片机的接口,键盘的结构形式一般有两种:独立式键盘

20、与矩阵式键盘。,独立式键盘就是各按键相互独立,每个按键各接一根I/O口线,每根I/O口线上的按键都不会影响其它的I/O口线。,图(a)为中断方式工作的独立式键盘的结构形式,(b)为查询方式工作的独立式键盘的结构形式,下面是针对图7.4(b)图查询方式的汇编语言形式的键盘程序。总共有8个键位,KEY0KEY7为8个键的功能程序。 START:MOV A,#0FFH; MOV P1,A ;置P1口为输入状态 MOV A,P1 ;键状态输入 CPL A JZ START ;没有键按下,则转开始 JB ACC.0,K0 ;检测0号键是否按下,按下转 JB ACC.1,K1 ;检测1号键是否按下,按下转

21、 JB ACC.2,K2 ;检测2号键是否按下,按下转 JB ACC.3,K3 ;检测3号键是否按下,按下转 JB ACC.4,K4 ;检测4号键是否按下,按下转 JB ACC.5,K5 ;检测5号键是否按下,按下转 JB ACC.6,K6 ;检测6号键是否按下,按下转 JB ACC.7,K7 ;检测7号键是否按下,按下转 JMP START ;无键按下返回,再顺次检测,K0:AJMP KEY0 K1:AJMP KEY1 K7:AJIMP KEY7 KEY0: ;0号键功能程序 JMP START ;0号键功能程序执行完返回 KEY1: ;0号键功能程序 JMP START ;1号键功能程序执

22、行完返回 KEY7: ;7号键功能程序 JMP START ;7号键功能程序执行完返回,7.4.3 矩阵键盘与单片机的接口,矩阵式键盘又叫行列式键盘。用I/O口线组成行、列结构,键位设置在行列的交点上。例如44的行、列结构可组成16个键的键盘,比一个键位用一根I/O口线的独立式键盘少了一半的I/O口线。,一矩阵键盘的工作过程,对矩阵键盘的工作过程可分两步: 第一步是CPU首先检测键盘上是否有键按下; 第二步是再识别是哪一个键按下。,二矩阵键盘的工作方式,1查询工作方式,2定时扫描工作方式,3中断处理方式,对于检测键盘上有无键按下通常采用3种方式,键盘扫描子程序流程如图 。,键盘扫描子程序如下:

23、(硬件线路前图,8255A的A口、B口、C口和控制口地址分别为7F00H、7F01H、7F02H、7F03H,设8255A已在主程序中初始化。已设定为A口方式0输出,C口的低4位方式0输入。),KEY1:ACALL KS1 ;调用判断有无键按下子程序 JNZ LK1 ;有键按下时,(A)0转消抖延时 KEY2:ACALL TM6ms AJMP KEY1 ;无键按下返回 LK1:ACALL TM12ms ;调12 ms延时子程序 ACALL KS1 ;查有无键按下,若有则真有键按下 JNZ LK2 ;键(A) 0逐列扫描 AJMP KEY2 ;不是真有键按下,返回 LK2:MOV R2,#0FE

24、H ;初始列扫描字(0列)送入R2 MOV R4,#00H ;初始列(0列)号送入R4 LK4:MOV DPTR,#7F00H ;DPTR指向8255的A口 MOV A,R2 ;列扫描字送至8255的A口 MOVX DPTR,A INC DPTR ;DPTR指向8255的C口 INC DPTR,MOVX A,DPTR ;从8255 的C口读入行状态 JB ACC.0,LONE ;查第0行无键按下,转查第1行 MOV A,#00H ;第0行有键按下,行首键码#00HA AJMP LKP ;转求键码 LONE:JB ACC.1,LTWO ;查第1行无键按下,转查第2行 MOV A,#08H ;第1

25、行有键按下,行首键码#08HA AJMP LKP ;转求键码 LTWO:JB ACC.2,LTHR ;查第2行无键按下,转查第3行 MOV A,#10H ;第2行有键按下,行首键码#10HA AJMP LKP ;转求键码 LTHR:JB ACC.3,NEXT ;查第3行无键按下,转该查下一列 MOV A,#18H ;第3行有键按下,行首键码#18HA LKP:ADD A,R4 ;求键码,键码=行首键码+列号 PUSH ACC ;键码进栈保护 LK3:ACALL KS1 ;等待键释放 JNZ LK3 ;键未释放,等待 POP ACC ;键释放,键码A RET ;键扫描结束,出口状态(A)=键码,

26、NEXT:INC R4 ;准备扫描下一列,列号加1 MOV A,R2 ;取列扫描字送累加器A JNB ACC.7,KEND ;判断8列扫描否?扫描完返回 RL A ;扫描字左移一位,变为下一列扫描字 MOV R2,A ;扫描字送入R2保存 AJMP LK4 ;转下一列扫描 KEND:AJMP KEY1 KS1:MOV DPTR,#7F00H ;DPTR指向8255的A口 MOV A,#00H ;全扫描字A MOVX DPTR,A ;全扫描字送往8255的A口 INC DPTR ;DPTR指向8255的C口 INC DPTR MOVX A,DPTR ;读入PC口行状态 CPL A ;变正逻辑,以

27、高电平表示有键按下 ANL A,#0FH ;屏蔽高4位,只保留低4位行线值 RET ;出口状态:(A)0时有键按下,TM12ms:MOV R7,#18H ;延时12 ms子程序 TM:MOV R6,#0FFH TM6:DJNZ R6,TM6 DJNZ R7,TM RET TM6ms:MOV R7,#0CH ;延时6 ms子程序 TM2:MOV R6,#0FFH TM62:DJNZ R6,TM6 DJNZ R7,TM RET,C语言键盘扫描子程序:,#include #include /定义绝对地址访问 #define uchar unsigned char #define uint unsig

28、ned int void delay(uint); uchar scankey(void); uchar keyscan(void); void main(void) uchar key; while(1) key=keyscan(); delay(2000); ,/*延时函数* void delay(uint i) /延时函数 uint j; for (j=0;ji;j+) /*检测有无键按下函数* uchar checkkey() /检测有无键按下函数,有返回0xff,无返回0 uchar i; XBYTE0x7f00=0x00; i=XBYTE0x7f02; i=i ,/*键盘扫描函数*

29、 uchar keyscan() /键盘扫描函数,如果有键按下,则返回该键的编码,如果无键按下,则返回0xff uchar scancode; /定义列扫描码变量 uchar codevalue; /定义返回的编码变量 uchar m; /定义行首编码变量 uchar k; /定义行检测码 uchar i,j; if (checkkey()= =0) return(0xff); /检测有无键按下,无返回0xff else delay(200); /延时 if(checkkey()= =0) return(0xff); /检测有无键按下,无返回0xff else scancode=0xfe;m=

30、0x00; /列扫描码,行首码赋初值 for (i=0;i8;i+) k=0x01; XBYTE0x7f00=scancode; /送列扫描码,for (j=0;j4;j+) if (XBYTE0x7f02 /列扫描码左移一位,扫描下一列 ,7.5 MCS-51单片机与LED显示器接口,7.5.1 LED显示器的结构与原理,在单片机应用系统中通常使用的是8段式LED数码管显示器,它有共阴极和共阳极两种,如图所示。,7.5.2 LED数码管显示器的译码方式,一硬件译码方式,译码方式是指由显示字符转换得到对应的字段码的方式,硬件译码方式是指利用专门的硬件电路来实现显示字符到字段码的转换,如MOTO

31、TOLA公司生产的MC14495芯片,MC14495是共阴极一位十六进制数字段码转换芯片,能够输出用四位二进制表示形式的一位十六进制数的七位字段码,不带小数点。,二软件译码方式,7.5.3 LED数码管的显示方式,一LED静态显示,LED静态显示时,其公共端直接接地(共阴极)或接电源(共阳极),各段选线分别与I/O口线相连。要显示字符,直接在I/O线送相应的字段码。,二LED动态显示方式,LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O口控制,公共端不是直接接地(共阴极)或电源(共阳极),而是通过相应的I/O口线控制。,一硬件译码静态显示,下图是一个两位数码管硬件译码静态显示的接

32、口电路图。,7.5.4 LED显示器与单片机的接口,LED显示器从译码方式上有硬件译码方式和软件译码方式。从显示方式上有静态显示方式和动态显示方式。在使用时可以把它们组合起来。在实际应用时,如果数码管个数较少,通常用硬件译码静态显示,在数码管个数较多时,则通常用软件译码动态显示。,二软件译码动态显示,下图是一个8位软件译码动态显示的接口电路图,数码管为共阴极 。8255A的A口和B口都工作于方式0输出。A口、B口、C口和控制口的地址分别为7F00H、7F01H、7F02H和7F03H。,软件译码动态显示汇编语言程序为:(设8个数码管的显示缓冲区为片内RAM的57H50H单元) DISPLAY:

33、MOV A,#10000000B ;8255初始化 MOV DPTR,#7F03H ;使DPTR指向8255控制寄存器端口 MOVX DPTR,A MOV R0,#57H ;动态显示初始化,使R0指向缓冲区首址 MOV R3,#7FH ;首位位选字送R3 MOV A,R3 LD0:MOV DPTR,#7F01H ;使DPTR指向PB口 MOVX DPTR,A ;从PB口送出位选字 MOV DPTR,#7F00H ;使DPTR指向PA口 MOV A,R0 ;读要显示数 ADD A,#0DH ;调整距段码表首的偏移量 MOVC A,A+PC ;查表取得段码 MOVX DPTR,A ;段码从PA口输

34、出 ACALL DL1 ;调用1 ms延时子程序 DEC R0 ;指向缓冲区下一单元 MOV A,R3 ;位选码送累加器A,JNB ACC.0,LD1 ;判断8位是否显示完毕,显示完返回 RR A ;未显示完,把位选字变为下一位选字 MOV R3,A ;修改后的位选字送R3 AJMP LD0 ;循环实现按位序依次显示 LD1:RET TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;字段码表 DL1:MOV R7,#02H ;延时子程序 DL: MOV R6,#0FFH DL0:DJNZ R6,D

35、L0 DJNZ R7,DL RET,软件译码动态显示C语言程序为: #include #include /定义绝对地址访问 #define uchar unsigned char #define uint unsigned int void delay(uint); /声明延时函数 void display(void); /声明显示函数 uchar disbuffer8=0,1,2,3,4,5,6,7; /定义显示缓冲区 void main(void) XBYTE0x7f03=0x80; /8255A初始化 while(1) display(); /设显示函数 /*延时函数* void del

36、ay(uint i) /延时函数 uint j; for (j=0;ji;j+) ,/*显示函数 void display(void) /定义显示函数 uchar codevalue16=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /0F的字段码表 uchar chocode8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /位选码表 uchar i,p,temp; for (i=0;i8;i+) p=disbufferi; /取当前显示的字符 temp=codevaluep; /查得显示字符的字段码 XBYTE0x7f00=temp; /送出字段码 temp=chocodei; /取当前的位选码 XBYTE0x7f01=temp; /送出位选码 delay(20); /延时1ms ,7.6 MCS-51单片机与行程开关、晶闸管、继电器的接口,7.6.1 行程开关、继电器与MCS-51单片机接口,行程开关和继电器常开触点与单片机的接口如图所示。,7.6.2 晶闸管与MCS-51单片机接口,7.6.3 继电器与MCS-51单片机接口,7.6.4 蜂鸣器与1单片机接口,作业 习题 1、3、8、10、12、17、18、21、22,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1