《微机接口技术》汇编语言课程设计报告-秒表设计.doc

上传人:来看看 文档编号:5016966 上传时间:2020-01-28 格式:DOC 页数:25 大小:559.50KB
返回 下载 相关 举报
《微机接口技术》汇编语言课程设计报告-秒表设计.doc_第1页
第1页 / 共25页
《微机接口技术》汇编语言课程设计报告-秒表设计.doc_第2页
第2页 / 共25页
《微机接口技术》汇编语言课程设计报告-秒表设计.doc_第3页
第3页 / 共25页
《微机接口技术》汇编语言课程设计报告-秒表设计.doc_第4页
第4页 / 共25页
《微机接口技术》汇编语言课程设计报告-秒表设计.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《《微机接口技术》汇编语言课程设计报告-秒表设计.doc》由会员分享,可在线阅读,更多相关《《微机接口技术》汇编语言课程设计报告-秒表设计.doc(25页珍藏版)》请在三一文库上搜索。

1、微机接口技术课程设计报告 设计题目: 秒表设计 _ 班级:电子 0801 姓名: 计算机科学与技术 学院 电子信息科学与技术 专业 时间:2010-12-25 前 言 微机接口技术是计算机和电子类专业重要的专业基础课之一,它不仅要求有较好 的理论基础,而且还要求有较强的实际动手能力。本课程设计的主要目的是通过课程 设计的综合训练,培养学生实际分析问题、编程和动手能力,最终使学生系统掌握接 口技术课程的内容,能把学到的知识应用到实际中去,学习解决实际生活和工作中的 问题,提高实践能力,包括对计算机接口技术的理解和计算机应用系统的分析、设计 能力。课程设计较课程实验复杂,课程设计涉及理论尝试更广,

2、更接近实际应用,要 求同学们重视实际动手能力的训练,提前做好预习,学习查找、运用设计资料,完成 工程设计所必备的基本训练。 一、主要内容 本次课程设计的题目为秒表设计。设计的具体要求为: 1、利用 8253A,用实验箱上的数码管模拟一个秒表,要求具有一般秒表的功能; 2、能显示实时时间,时间值的变化可采用查询 8253A 的计数器值来进行计算; 按“1”键时,进入秒表准备状态,再按“1”键开始秒表计时(计时单位为 1/100 秒) ,再按“1”键时停止秒表计时。秒表计时的时间在数码管上显示; 3、按“2”键退出秒表计时状态,显示实时时间。 二、资料收集 本论文参考了 2008 年 2 月清华大

3、学出版社由戴梅萼和史嘉权编写的第四版微 机计算机技术及应用 ,以及西安电子科技大学出版社出版的唐祎玲和毛月东于 2003 年 8 月编写的32 位微机原理与接口技术实验教程 。 三、工作过程 在老师的要求下全班进行了自行分组,我们组三名成员,在经过初期选择题目, 确定思路后着手写的程序,期间遇到了一些问题,最后在老师的指导、同学的帮助以 及自己组内成员的努力下克服了这些困难。 由于笔者水平有限,设计报告中难免有错误和不足之处,敬请老师提出宝贵意见。 目 录 一、系统概述 .1 1.1 设计要求1 1.2 系统流程论述及工作原理1 1.3 系统可行性分析4 二、单元电路设计与分析 .6 2.1

4、硬件电路设计6 2.2 器件选择与简介7 2.2.1 可编程计数器/定时器芯片 8254A .7 2.2.2 可编程并行通信接口芯片 8255A 9 三、软件编程与调试 12 3.1 技术问题.12 3.2 调试结果.12 四、结束语 13 4.1改进分析 .13 4.2实验总结 .13 附录 14 参考文献 21 1 一、系统概述 1.1 设计要求 利用 8253A,用实验箱上的数码管模拟一个秒表,要求具有一般秒表的功能; 能显示实时时间,时间值的变化可采用查询 8253A 的计数器值来进行计算;按 “1”键时,进入秒表准备状态,再按“2”键开始秒表计时(计时单位为 1/100 秒) ,再按

5、“3”键时停止秒表计时。秒表计时的时间在数码管上显示;按“4”键退出 秒表计时状态,显示实时时间(从 0 分 0 秒开始) 。下图为各模块的组合框图: 8254 时间 控制模块 键盘模块 主 控 制 器 模 块 并行通信模 块-8255 LED 显 示模块 电源模块 图 1.1 秒表各模块的组合框图 1.2 系统流程论述及工作原理 本系统主要利用对计数器/定时器多功能接口芯片 8254 装不同的初值,产生 1/100 秒信号和 1 秒信号,并送给可编程并行通信接口芯片 8255 作为加 1 信号,再 通过按键和 8255 控制 LED 模块显示。工作流程图及子程序流程图如下所示: 2 图 1.

6、2 总程序流程图 N 开始 8255 初始化 秒表计时,AA:1/100s,BB: 秒 8254 重装初值 时钟计时,AA:秒,BB:分 设置显示次数 调用显示 1 调用清屏 调用 BREAK 退出程序 显示次数=0 ? 是否有“1”键按 下按下 N Y 8254 初始化,装计数初值 是否有“2”键按 下 N Y 是否有“3”按 下 调用显示 1 N Y 是否有“4”按 下 存储单元清零 N Y 3 显示 1: 图 1.3 显示模块 获得 TAB 的偏移地址 AA 除 10 取余 控制 LED 最低位亮 调用显示 2 延时 控制 LED 次低位亮 调用显示 2,显示商 延时 BB 除 10 取

7、余 控制 LED 次高位 亮 调用显示 2 延时 控制 LED 最高位亮 调用显示 2,显示商 延时 返回 4 BREAK: 图 1.4 退出程序流程图 图 1.5 延时子程序 清屏:实现向 8255_A 输送 00H,清除以前显示的数字,使其黑屏。 从总流程图可以看出,当操作者按下“1”键时,秒表进入准备状态,等待“2” 键的按下,当“2”键按下时,8254 初始化,开始产生 1/100 秒信号,并将该信号送 给 8255 的 C 口的 PC0 位,8255 不断对 PC0 位进行检测,检测到上升沿时,8255 计数 器 0 加 1,同时 8255 检测键盘是否有“3”键按下,若有键按下,8

8、255A 口就将秒表 计时的数据送给 LED 显示,以此来实现秒表的计时及显示功能。 显示完后,等待“4”键的按下进入后面的程序,当“4”键按下时,8254 重装初值, 产生 1 秒信号,8255 不断对 PC0 位进行检测,检测的方式,是检测上升沿,当检测 到上升沿时,8255 计数器 0(已清 0)加 1,同时将时间送给 LED 显示。这样完成了 时钟的功能。 1.3 系统可行性分析 本实验的操作都在实验箱上完成,在实验箱完好的前提下,各芯片都能正常工作。 根据设计要求,本系统设计为以下几个基本模块,即:主控制器模块,电源模块, LED 显示模块,键盘模块,信号产生模块和计时器模块。 其中

9、各模块的主要功能和相互之间的关系如下: (1)控制器模块 是电子交警的核心,它连接其它各个模块,完成计算、控制、存储、接口等功能。 6 号功能调 用 键盘是否有键按下 返回 N Y 程序结束 5 (2)电源模块 是独立的直流电源系统,为整个系统供电。 (3)LED 显示模块 完成显示功能,由 8255 的 A 口将数据送给其显示。 (4)信号产生模块 利用 8254,根据宋的初值不同,产生 1/100 秒信号和 1 秒信号。 (5)计时器模块 利用 8255,通过对 PC0 位的检测产生秒表计时和时钟的功能。 以上功能的各个模块相互连接,相互配合,完成秒表计时和时钟的功能。是一个 结构清晰,思

10、路分明,模块化设计完整的秒表设计方案。 6 二、单元电路设计与分析 2.1 硬件电路设计 Y1 dp a X1X2X3X4 Y2 XA0 XIOW XIOR IOY2 XA1 XD0 D7 PB7 8255 D0 PB0 A1 A0 PA0 WR RD CS PA7 PC7 PC0 XD7 仿仿 真真 总总 线线 接接 口口 键盘 L E D L E D L E D L E D 10kHz XA0 XIOW XIOR IOY2 XA1 XD7 D0 8254 D7 A1 OUT0 A0 CLK0 WR RD GATE0 CS XD0 PC0 仿仿 真真 总总 线线 接接 口口 +5V 图 2.

11、1 硬件电路设计图 7 2.2 器件选择与简介 2.2.1 可编程计数器/定时器芯片 8254A 1. 8254A 变成结构和外部信号 图 2.2 8254 编程结构 8 图 2.3 8254 外部信号 2. 编程命令和工作模式 编程原则:(1)设置初值钱必须先写控制字;(2) 初值设置要符合控制字中 的格式规定;(3)要读取计数器的当前值和状态字,必须用控制字先锁定,才能读 取。 编程命令有两类: (1)读出命令; 读计数器计数值; 读状态寄存器值(只对 8254) ; (2)写入命令; 模式设置控制字命令; 读出控制字(锁存命令); 设置计数初始值。 工作模式(六种) (1) 模式 0计数

12、结束产生中断 性质:写入控制字,OUT 端为低电平,计数初值装入该计数器后,等待到 GATE 输入高电平时,计数器开始递减计数。在整个计数过程中,OUT 保持低电平,当计数 器减为 0 时,OUT 输出高电平,并且一直保持高电平,除非写入新的计数值。 (2) 模式 1 可编程的单稳态触发器 性质:写入控制字,OUT 端为高电平,计数初值装入该计数器后,在 GATE 信号 的上升沿后的下一个 CLK 脉冲的下降沿开始计数,OUT 变为低电平。在整个计数过程 中,OUT 保持低电平,当计数器减为 0 时,OUT 变为高电平,输出一个单脉冲,若 D7D0 A1 A0 WR# RD# CLK0 GAT

13、E0 OUT0 CLK1 GATE1 OUT1 CLK2 GATE2 OUT2 通道 0 DB 通道 1 CS# 通道 2 A2 A1 IOW# IOR# 片选信号 9 GATE 信号再由低变高,可再产生一个单脉冲,相当一个单稳态。 (3) 模式 2分频器 性质: 写入控制字,OUT 端为高电平,计数初值写入计数器后,等待到触发信 号时,计数器开始递减计数。减到 1,OUT 端变成低电平,经过一个时钟脉冲 OUT 端 又变为高电平,然后开始一个新的计数过程,重复进行。 (4) 模式 3方波发生器 性质:CPU 写入控制字后 OUT 变高,写完计数初值并受触发后,开始减 1 计数, 输出保持高电

14、平。当计到一半计数值时,输出变低,直到计数到 0,输出又变为高, 重新开始计数。 (5) 模式 4软件触发的选通信号发生器 性质: 写入控制字,OUT 端为高电平,写入计数初值,GATE 为高电平,开始计 数,计数器计到 0 时,OUT 变为低电平,经过一个 CLK 脉冲周期,OUT 又变高,计数 器停止计数,只有写入新计数值才能开始新的计数。 (6) 模式 5硬件触发的选通信号发生器 性质:写入控制字,OUT 变高,写入计数初值后,由 GATE 信号的上升沿触发开 始计数。计到 0 后,OUT 变为低电平。经一个 CLK 周期后,OUT 又变为高电平,并停 止计数,等下次 GATE 触发才能

15、再计数。 2.2.2 可编程并行接口芯片 8255A 1.8255A 内部结构和引脚信号 图 2.4 8255 内部结构 10 图 2.5 8255A 引脚信号 2. 8255A 的控制字 控制字分为两类: (1)各端口的方式选择控制字; 图 2.6 8255A 的方式选择控制字 11 (2)C 端口按位置 1/置 0 控制字。 图 2.7 端口 C 置 1/置 0 控制字 12 三、软件编程与调试 3.1 技术问题 软件编程中一开始我们实时时钟显示模块不对,它到了 60 秒的时候没有清零, 而是继续加直到 100 才清的的零,而且秒表记录的时间也不对。经过反复检查和请教 老师,最终找到寄存器

16、不清零的错误原因是寄存器重复利用,在很多子程序都被反复 用到了,导致计数值混乱,没有在记到 60 秒或 60 分的时候清零;而秒表记录时间误 差大的原因是计数器 8254 芯片的初值送错了,我们直接送的是 100,但是 PC 机上把 100 当做的是十六进制的数,所以导致秒表计时发生偏差。 3.2 调试结果 经过多次试验,我们在数据段上定义一个存储单元,把用来计数的存储器改成了 存储单元。这样就使得计数时数据不会混乱,清零问题得到解决。对于秒表计数出现 偏差的问题,我们把 100 改成 0100H,这样秒表计数也正确了。 DATA SEGMENT TAB DB 0FCH,60H,0DAH,0F

17、2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H AA DB 00H BB DB 00H LL DB 00H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ;定义存储单元 A1: ;A1,A2 合起来检测上升沿 MOV DX,MY8255_C IN AL,DX ;读取 8255C 口的值 TEST AL,01H ;检测第 0 位的值 JNZ A1 ;不为 0,返回 A1 A2: IN AL,DX ;读取 8255C 口的值 TEST AL,01H ;检测第 0 位的值 JZ A2 ;为 0,返回 A1 INC AA ;有上升沿(即 1

18、/100s 信号) ,存储单元加 1 CMP AA,100 ;比较,判断是否加到了 100 JNZ TING ;没加到 100,跳到 TING MOV AA,0 ;加到 100,1/100s 计数置 0 INC BB ;秒存储单元加 1 CMP BB,100 ;判断秒是否加到 100 JNZ TING ;没加到 100,跳到 TING MOV BB,0 ;秒存储单元置 0 13 JMP A1 ;跳转到 A1 继续检测 1/100s 信号 四、结束语 4.1 改进分析 我们的程序仍有可以改进的地方,比如:实时时钟的显示模块,我们的程序是让 时钟从 00:00:00 开始计时的。在这方面我们可以把

19、 PC 机上的时间下载到箱试验上, 让七段数码管上显示的是当时的准确时间。 4.2 实验总结 开始做设计时总是会犯一些错误,只有经过不停的改错不停的编译得到正确的程 序说明了作为软件编程人员是不能粗心大意的,一个程序的质量的高低与你细心与否 有着一定的联系。在编程时,我充分使用了结构化的思想,这样程序检查起来也比较 方便,调试时也给了我很大方便,只要一个模块一个模块的进行调就可以了,充分体 现了结构化编程的优势。在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一 个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过 这次设计和设计中遇到的问题,也积累了一定的经验,对以后

20、从事集成电路设计工作 会有一定的帮助。 在应用汇编语言的过程中让我真正领会到了其并行运行与其他软件顺序执行的差 别及其在电路设计上的优越性。用汇编描述语言的形式来进行秒表系统的设计方便灵 活,利用实验箱仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本, 这种设计方法在秒表系统设计中发挥越来越重要的作用。 14 附 录 元器件明细表 符号名称型号 参数数量备注 8255 并行接口 D8255AC-2 1 个并行传输 8254 计数器/定时器 D8254C-2 1 个计数功能 电路原理图 Y1 dp a X1X2X3X4 Y2 XA0 XIOW XIOR IOY2 XA1 XD0 D7

21、 PB7 8255 D0 PB0 A1 A0 PA0 WR RD CS PA7 PC7 PC0 XD7 仿仿 真真 总总 线线 接接 口口 键盘 L E D L E D L E D L E D 15 10kHz XA0 XIOW XIOR IOY2 XA1 XD7 D0 8254 D7 A1 OUT0 A0 CLK0 WR RD GATE0 CS XD0 PC0 仿仿 真真 总总 线线 接接 口口 +5V 源程序清单 MY8254_COUNT0 EQU 9840H MY8254_COUNT1 EQU 9841H MY8254_COUNT2 EQU 9842H MY8254_MODE EQU 9

22、843H MY8255_A EQU 9860H MY8255_B EQU 9861H MY8255_C EQU 9862H MY8255_MODE EQU 9863H DATA SEGMENT TAB DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H AA DB 00H BB DB 00H LL DB 00H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA 16 MOV DS,AX MOV DX,MY8255_MODE MOV AL,89H ;8255 初始化,

23、A 口输出,工作在方式 0 下;B 口输出, 工作在方式 0 下;C 口输入 OUT DX,AL JIANCE1: CALL BREAK ;按任意键退出,防止程序在以下的程序进入死循 环没法退出 MOV DX,MY8255_B MOV AL,0EH OUT DX,AL ;开放 X1 那一列开关 CALL DALLY ;等待 Y1Y2 的检测 MOV DX,MY8255_C IN AL,DX ;C 口高四位的低两位读取 Y1,Y2 的按键情况 AND AL,30H ;取 C 口高四位的低两位 CMP AL,20H ;检测 Y1 行按键情况 JNZ JIANCE1 ;X1Y1(即“1”键)没有按下

24、返回 JIANCE1 JIANCE2: MOV DX,MY8255_B MOV AL,0DH OUT DX,AL ;开放 X2 那一列开关 CALL DALLY ;等待 Y1Y2 的检测 MOV DX,MY8255_C IN AL,DX ;C 口高四位的低两位读取 Y1,Y2 的按键情况 AND AL,30H ;取 C 口高四位的低两位 CMP AL,20H ;检测 Y1 行按键情况 JNZ JIANCE2 ;X2Y1(即“2”键)没有按下返回 JIANCE2 CHUZHI: MOV AL, 35H MOV DX, MY8254_MODE OUT DX, AL ;8254 初始化,选择计数器

25、0;先读/写高 8 位,再读 /写低 8 位;工作在模式 2 下;计数初值为 BCD 码格式 MOV AX, 0100H ;存计数初值 100,产生 1/100s 信号 MOV DX, MY8254_COUNT0 OUT DX, AL ; 送低字节到计数器 0 MOV AL, AH OUT DX, AL ; 送高字节到计数器 0 A1: ;A1,A2 合起来检测上升沿 MOV DX,MY8255_C IN AL,DX ;读取 8255C 口的值 TEST AL,01H ;检测第 0 位的值 17 JNZ A1 ;不为 0,返回 A1 A2: IN AL,DX ;读取 8255C 口的值 TES

26、T AL,01H ;检测第 0 位的值 JZ A2 ;为 0,返回 A1 INC AA ;有上升沿(即 1/100s 信号) ,存储单元加 1 CMP AA,100 ;比较,判断是否加到了 100 JNZ TING ;没加到 100,跳到 TING MOV AA,0 ;加到 100,1/100s 计数置 0 INC BB ;秒存储单元加 1 CMP BB,100 ;判断秒是否加到 100 JNZ TING ;没加到 100,跳到 TING MOV BB,0 ;秒存储单元置 0 JMP A1 ;跳转到 A1 继续检测 1/100s 信号 TING: CALL BREAK MOV DX,MY825

27、5_B MOV AL,0BH OUT DX,AL ;开放 X3 那一列开关 CALL DALLY MOV DX,MY8255_C IN AL,DX ;读 C 口的值 AND AL,30H CMP AL,20H ;检测 Y1 行的按键情况 JNZ A1 ;X3Y1(即“3”)键没按下,返回 TING 继续检测 CALL BREAK M1: CALL XIANSHI1 ;调用显示子程序显示秒表的计数值 JIANCE3: MOV DX,MY8255_B MOV AL,07H OUT DX,AL ;开放 X4 那一列开关 CALL DALLY MOV DX,MY8255_C IN AL,DX ;读 C

28、 口的值 AND AL,30H CMP AL,20H ;检测 Y1 行的按键情况 JNZ M1 ;X4Y1(即“4”)键没按下,返回 JIANCE3 继续检测 MOV AA,0 ;清 0 MOV BB,0 ;清 0 CALL CLEAR ;清除 LED 的显示情况 18 CHUZHI1: MOV AL, 35H MOV DX, MY8254_MODE OUT DX, AL ;8254 初始化,选择计数器 0;先读/写高 8 位,再 读/写低 8 位;工作在模式 2 下;计数初值为 BCD 码格式 MOV AX, 0 ;重装计数初值 100000,产生 1s 信号 MOV DX, MY8254_

29、COUNT0 OUT DX, AL ; 低字节送计数器 0 MOV AL, AH OUT DX, AL ; 高字节送计数器 0 B1: ;B1 和 B2 合起来检测 1s 信号 MOV LL,0 ;存储单元清 0,存显示次数,用于稳定显示 MOV DX,MY8255_C IN AL,DX ;读 8255 的 C 口的值 TEST AL,01H ;检测第 0 位 JNZ B1 ;不为 0,返回 B1 继续检测 B2: MOV DX,MY8255_C IN AL,DX ;再读 8255 的 C 口的值 TEST AL,01H ;检测第 0 位 JZ B2 ;为 0,返回 B2 继续检测 INC A

30、A ;有上升沿,秒存储单元 AA 加 1 CMP AA,60 ;是否加到 60s JNZ C1 ;没有加到 60s,跳到 C1 MOV AA,0 ;有 60s,秒存储单元 AA 置 0 INC BB ;分存储单元 BB 加 1 CMP BB,60 ;分是否加到 60 JNZ C1 ;没加到 60,跳到 C1 MOV BB,0 ;到 60,分置 0 C1: INC LL ;显示次数加 1 CALL XIANSHI1 CALL BREAK ;显示完后按任意键退出 CMP LL,9FH ;是否达到显示的次数 JNZ C1 JMP B1 ;一个数显示完毕,返回 C1 继续计时 XIANSHI1: ;取

31、出 AA 和 BB 中的每一位 MOV DI,OFFSET TAB ;获得数字表的偏移地址 MOV AL,AA 19 MOV AH,0 MOV CH,10 DIV CH ;除 10,分离 AA 的两位数 MOV CH,AL ;保存商(即 AA 的高四位) MOV DX,MY8255_B MOV AL,0F7H OUT DX,AL ;8255_B 控制 LED 的最低位亮 CALL XIANSHI2 ;调用显示 2,显示 AA 低 4 位数字 CALL DALLY MOV AH,CH ;取出商 MOV DX,MY8255_B MOV AL,0FBH OUT DX,AL ;8255_B 控制 LE

32、D 的次低位亮 CALL XIANSHI2 ;调用显示 2,显示 AA 高 4 位数字 CALL DALLY MOV AL,BB MOV AH,0 MOV CH,10 DIV CH ;除 10,分离 BB 的两位数 MOV CH,AL ;保存商, (即 BB 的高四位) MOV DX,MY8255_B MOV AL,0FDH OUT DX,AL ;8255_B 控制 LED 的次高位亮 CALL XIANSHI2 ;调用显示 2,显示 BB 低 4 位数字 CALL DALLY MOV AH,CH ;取出商 MOV DX,MY8255_B MOV AL,0FEH OUT DX,AL ;8255

33、_B 控制 LED 的最高位亮 CALL XIANSHI2 ;调用显示 2,显示 BB 高 4 位数字 CALL DALLY RET CLEAR: MOV DX,MY8255_A MOV AL,00H OUT DX,AL ;清屏,清除 LED 的显示 RET XIANSHI2: ;显示 TAB 表中对应的数 20 PUSH DX PUSH BX MOV BL,AH MOV BH,0 ;把分离后的数存入 BX MOV AL,BX+DI ;取出 TAB 中的对应数,送给 AL MOV DX,MY8255_A OUT DX,AL ;把 AL 的值送给 8255_A 显示 POP BX POP DX

34、RET DALLY: ;延时 PUSH CX PUSH AX MOV CX,0FFFH ;设置循环次数 D1: MOV AX,00FFH ;设置二重循环 D2: DEC AX JNZ D2 LOOP D1 POP AX POP CX RET BREAK: ;按任意键退出 MOV AH,06H MOV DL,0FFH INT 21H ;6 号功能号调用,扫描键盘,看是否有键按下 JE RETURN ;没有键按下,返回继续执行 MOV AX,4C00H INT 21H ;有键按下,整个程序结束 RETURN:RET CODE ENDS END START 21 参考文献 1戴梅萼 史嘉权微型计算机技术及应用清华大学出版社2008 年 2 月第四版 2荆淑霞微机原理与汇编语言程序设计中国水利水电出版社2005 年 6 月第一 版 3唐祎玲、毛月东32 位微机原理与接口技术实验教程西安电子科技大学出版 社2003 年 8 月

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

当前位置:首页 > 研究报告 > 商业贸易


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