课程设计单片机基于单片机的数字时钟设计.doc

上传人:文库蛋蛋多 文档编号:4150573 上传时间:2023-04-07 格式:DOC 页数:29 大小:413.50KB
返回 下载 相关 举报
课程设计单片机基于单片机的数字时钟设计.doc_第1页
第1页 / 共29页
课程设计单片机基于单片机的数字时钟设计.doc_第2页
第2页 / 共29页
课程设计单片机基于单片机的数字时钟设计.doc_第3页
第3页 / 共29页
课程设计单片机基于单片机的数字时钟设计.doc_第4页
第4页 / 共29页
课程设计单片机基于单片机的数字时钟设计.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《课程设计单片机基于单片机的数字时钟设计.doc》由会员分享,可在线阅读,更多相关《课程设计单片机基于单片机的数字时钟设计.doc(29页珍藏版)》请在三一办公上搜索。

1、引 言数字电子时钟,自从它问世起,就是人们的好朋友,是人们日常生活中必不可少的电子产品,广泛用于生活的方方面面,给人们的学习、生活、工作带来了极大的方便。但随着时间的推移,科学技术的不断发展,生活节奏越来越快,竞争日益激烈,人们对时间计量的精度要求越来越高,应用越来越广。通常使用的晶振芯片设计的电子时钟,在生活中使用是一个很不错的选择,然而在工业现场,环境恶劣,势必会影响走时的进度,我们试想一下,大型的工业现场的走时如果因为环境的恶劣而不精确,导致的生产损失将有多大。而利用开关量控制的PLC来设计的时钟是不会因为环境的因素而发生走时误差,从而,在工业现场最好使用PLC设计的时钟。本文主要介绍在

2、工业现场应用的时钟用PLC的设计。通过PLC我们设计的这种走时精确的的时钟,终究会变成产品走进工业现场。1 设计的目的及意义本设计通过用对一个能实现定时,时钟显示功能的时间系统的设计学习,让我们了解到了51单片机应用中的数据转换显示,数码管显示原理,静态扫描显示原理,单片机的定时中断原理等,从而达到学习、了解单片机相关指令在各方面的应用,让我们学到更多关于单片机方面的知识。2 芯片简介2.1 STC80C52单片机芯片引脚功能介绍单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 电源: VCC - 芯片电源,接+5V; VSS - 接地端; 时钟:XTAL1、XTAL2 - 晶

3、体振荡电路反相输入端和输出端。 控制线:控制线共有4根, ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ALE功能:用来锁存P0口送出的低8位地址 PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 PSEN:外ROM读选通信号。 RST/VPD:复位/备用电源。 RST(Reset)功能:复位信号输入端。 VPD功能:在Vcc掉电情况下,接备用电源。 EA/Vpp:内外ROM选择/片内EPROM编程电源。 EA功能:内外ROM选择端。 Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。 I/O线80C51共有4个8位并行I/

4、O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。2.2 STC89C52单片机芯片封装图 STC89C52芯片的封装有PLCC、PQFP以及DIP40,本设计采用的是引脚双列直插式封装。其封装形式如图2.2.1。图2.2.1 STC89C52 DIP-40封装2.3 DS1302芯片功能的介绍DS1302 是美国Dallas 公司生产的一种高性能、低功耗、带RAM的实时时钟芯片。该芯片采用3 线串行接口方式,可提供年、月、日、星期、时、分、秒等时间信息,并可根据月份和闰年的情况自动调整月份的结束日期,同时可以根据用户需要决定是

5、采用24 小时或12 小时格式。DS 1302 内部带有31 个字节RAM ,用于存放临时性数据,同时具有可编程涓细电流充电能力,从而使外围硬件电路设计得到了大大简化。其中X1 、X2 为32. 768kHz 晶振端, GND 为地;RST 为复位端,高电平时允许I/ O 端进行数据传输,低电平则禁止数据传送且使I/ O 端呈高阻状态; I/ O 为串行数据输入、输出端,所有输入、输出数据的传送顺序均以最低位LSB 打头, 最高位MSB 结束;SCL K为同步时钟脉冲端,其上升沿将I/ O 端数据按位写入DS1302 ,下降沿使DS1302 按位输出数据至I/ O 端;VCC2 、VCC1 为

6、主电源和备份电源端,当主电源VCC2 大于备份电源VCC1 +0. 2V 时,由VCC2 对芯片供电,否则,由VCC1 对芯片电。工作电压范围为2. 55. 5 V ,工作电源和备份电源双引脚输入,功耗很低,当工作电压为2. 5 V时正常工作,所需电流不超过300 nA 。另外,如果选择了涓流充电功能,在正常情况下,主电源还可对备份电源进行慢速充电,有效延长了备份电源的使用寿命,保证了系统时间的连续可靠运行。该芯片引脚分配如图2.3.1图2.3.1 DS1302芯片引脚图DS1302芯片引脚功能说明如下表2.3.1。表2.3.1 DS1302芯片引脚功能说明引脚名称引脚说明X1,X232.76

7、8KHz晶振管引脚GND接地引脚RST复位引脚I/O数据输入/数据输出SCLK串行时钟Vcc1,Vcc2电源供电引脚3 电路原理图与功能说明3.1 晶振电路晶体振荡器在固定频率振荡器中能够提供较高的精度,绝大多数RTC采用32.768kHz的晶体,晶体振荡器输出经过分频后会产生1Hz的基准来刷新时间和日期。RTC的精度主要取决于晶振的精度,晶体振荡器在固定频率振荡器中能够提供较高的精度,绝大多数RTC采用32.768kHz的晶体,晶体振荡器输出经过分频后会产生1Hz的基准来刷新时间和日期。RTC的精度主要取决于晶振的精度,晶振一般在特定的电容负载下,其调谐振荡在正确的频点,而当晶振调谐于12.

8、5pF负载的RTC电路中时,使用6pF负载的晶振将会使时钟变快。Dallas Semiconductor提供的所有RTC均采用内部偏置网络,因而晶振可直接连接到RTC的X1、X2引脚,而不需要额外的元件。由于RTC的晶振输入电路具有很高的输入阻抗,因此,它与晶振的连线犹如一个天线,很容易耦合系统其余电路的高频干扰。而干扰信号被耦合到晶振引脚将导致时钟数的增加或减少。考虑到线路板上大多数信号的频率高于32.768kHz,所以,通常会产生额外的时钟脉冲计数。因此,晶振应尽可能靠近X1、X2引脚安装,同时晶振、X1/X2引脚的下方最好布成地平面。晶振电路如图3.1.1。图3.1.1 晶振电路3.2

9、复位电路当STC89C52单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。根据应用的要求,复位操作通常有两种基本形式:上电复位和上电或开关复位。上电复位要求接通电源后,自动实现复位操作。上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。上电后,由于电容的充电和反相门的作用,使RST持续一段时间的高电平。当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。复位电路如图3.2.1图 3.2.1 复位电路3

10、.3 数码管显示电路所谓数码管就是为数码管显示提供的各段状态组合,即字形代码。八段数码管的段码为八位,用一个字节即可表示。在段码字节中代码位与各段发光二极管的对应关系表3.3.1。表3.3.1 段码字节代码位与发光二极管的关系段码D7D6D5D4D3D2D1D0段名dpgfedcba段码的值与数码管公共引脚的接法有关。以八段数码管为例,显示十六进制的段码值如表3.3.2。表3.3.2 十六进制段码表数字共阳极段码共阴极段码数字共阳极段码共阴极段码0C0H3FH990H6FH1F9H06HA88H77H2A4H5BHB83H7CH3B0H4FHCC6H39H499H66HDA1H5EH592H6

11、DHE86H79H682H7DHF8EH71H7F8H07H灭FFH00H880H7FH并排使用的多位数码管称为LED显示器。LED显示器多采用动态显示方式,全部数码管共用一套段码驱动电路,各位数码管的同段引脚短接后在借到应段码的驱动线上。显示时通过位控信号采用扫描的方法逐位地循环点亮各位数码管。动态显示虽然在任何一时刻只有一位数码管被点亮,但是由于人眼具有的视觉残留效应,看起来与全部数码管持续点亮的效果完全一样。LED显示器动态显示需要为各位提供段码以及相应的位控制,此即通常所说的段控和位控。把LED显示器段码表预先存放在存储器中,使用时通过查表就可以得到段码。段码输出后送到公共段码线上,也

12、可称为段控信号。而通过并行口输出的相互独立的为嘛则是起选通作用的,也称位控或扫描信号,用于选择显示位。数码管电路如图3.3.1。图3.3.1 数码管电路图3.4 DS1302电路DS1302 所进行的一切工作必须先由CPU 向DS1302 发送命令字节, 命令字节格式如图3.4.1 。各位定义如下:命令字节的最高位7 必须为“1”,否则禁止对DS1302 进行操作。第6 位是时钟/ 日历或RAM 选择位, 如它为“1”可对内部RAM 读写,如它为“0”可对时钟日历操作。此处所谓日历型数据即数据格式为压缩型BCD 码,且数值必须在它的定义域内;例如,“月份”的定义域为112“, 秒”的定义域为0

13、59 等等。所谓RAM型数据即指一般16 进制数据。位5 至位1 为DS1302 内部寄存器地址。DS1302 有单字节和多字节两种读、写方式。所谓单字节读、写方式即每次只能从DS1302 中读、写1 字节数据。所谓多字节读、写方式则每次可从DS1302 中连续读、写若干字节数据。当位5 至位1 各位均为“1”时,DS1302为多字节读、写方式。最低位0 为“0”表示写操作,否则为读操作。命令字节的传输都是从最低位开始。图3.4.1 DS1302时钟芯片的控制字DS1302 采用串行方式与微控制器通讯。在片选信号RST 变为高电平后,可向芯片发送指令及读取数据。DS1302 的命令字的传输从最

14、低位开始。当对DS1302 进行写数据时,首先发写控制指令,在控制指令字输入后的下一个SCL K时钟的上升沿,数据被写入DS1302 ,数据输入从低位即位0开始。当对DS1302 进行读数据时,首先发读控制指令,在紧跟8 位的控制指令字后的下一个SCL K脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位至高位7 。注意在SCLK为高电平期间,不能读I/ O 线,此期间I/ O 端为高阻状态。因此,在程序设计时应保证在SCLK上升沿之前读I/ O线,即可正确读出时钟数据3 8 。在本记录仪表系统中,实时时钟软件首先应将日历信息初值秒、分、时、日、月、星期、年等按序写入到DS1302

15、相关寄存器中,此后,时钟便以此初值为基准进行计时,只要主电源VCC2 和备份电源VCC1 尚有一个工作正常,则计时就不会终止。初始化日历信息程序分为三部分:(1) 发送“解除写保护”命令字8EH 和内容00H ,以开放DS1302 写操作。(2) 发送“涓流充电”命令字90H 和内容A7H ,以开放DS1302 内部充电电路。本系统选择DS1302 内部充电电路为一只串联二极管和8k限流电阻,因此常规情况下,主电源VCC2 对备份电源VCC1 之最大充电电流为Imax = (VDD - 二极管压降) / 限流电阻= (5 - 0. 7) 8 = 0. 538mA 。(3) 发送“多字节写日历型

16、数据”或“单字节写日历型数据”命令字写入日历信息初值。上述部分属于对DS1302 内部功能寄存器操作,因此必须以“单字节”方式进行发送;而第3 部分属于对DS1302 一般寄存器操作,故可以采用“多字节”方式发送,以便提高效率。同时,在仪表工作过程中需要读取时间日历信息时,可根据具体需要采用“多字节”方式或“单字节”方式。这里,无论采用“单字节”还是“多字节”方式,能否可靠、准确地读出这些信息,其技术关键是和硬件密切相联的DS1302 读写驱动程序的设计。该驱动程序的功能是产生正确的同步时钟脉冲,并在同步时钟脉冲上升沿将数据按位写入DS1302 或在同步时钟脉冲的下降沿按位从DS1302 中读

17、出日历型数据,从而完成1 字节数据的发送或接收。对于“多字节”方式,只需改变命令控制字和增加循环次数即可完成多字节的连续读写。写了DS1302 的读写程序。编写DS1302 驱动程序时,首先应对硬件电路使用的端口进行定义声明,并初始化芯片引脚及工作状态,系统一切就绪后执行读写操作。同时,DS1302 在执行相应操作时,应保证延时时间的选择需满足芯片的时序要求,并注意RTS 引脚的及时打开与关闭,以确保数据的正常读写和避免CPU 的长时间占用,减少干扰,提高程序的执行效率。这里由于篇幅的原因仅给出程序设计流程,驱动程序有需要可向笔者索取。具体程序流程如图3.4.2。图3.4.2 DS1302工作

18、流程图4.1 接口电路设计在温度测量记录仪表中,DS1302 与微处理器的接口电路如图2 所示。该微处理器采用宏晶科技推出的STC89C516RD + 单片机作为主控芯片,该产品具有片内资源丰富、超强抗干扰、高抗静电、超低功耗、宽电压、不怕电源抖动、在系统可编程、加密性强、无法解密、可降低单片机时钟对外部电磁辐射等特点7 ,其良好的性能保证了各个器件的协调可靠工作及控制要求。在电路中单片机的P1. 7 控制DS1302 的复位输入端, P1. 4 与数据输入/ 输出引脚相连, P1. 3 用来作为DS1302 的输入时钟SCL K控制端。由于单片机复位时,所有单片机的端口均为高电平,如果直接用

19、单片机的某一口线同DS1302 的RST 相连,则影响了系统加电时对DS1302 的初始化,从而造成DS1302 计时的不稳定。因此,本电路在设计时采用反相器来完成单片机的I/ O 线同DS1302 的RST 相连。供电时,仪表主电源(5 V) 接VCC2 ,备份电池采用可充电镉镍电池(3. 6 V) 接VCC1 ,可启用内部涓流充电器在主电压正常时向电池充电,以延长电池使用时间。备份电池也可用1 微法以上的超容量电容代替,但需要注意的是备份电池电压应略低于主电源工作电压。DS1302 与STC89C52 单片机的接口电路如图4.1.1。图4.1.1 DS1302 与STC89C51 单片机的

20、接口电路5 调试与软件设计5.1 调试调试分为硬件调试和软件调试,硬件调试就是检测电路是否有错误或者有短路、虚焊、短路的现象,通过万用表的检测可以最终完成硬件的调试。软件调试是指通过Keil软件编译生成Hex文件,在通过Protus软件的联调,再进行仿真,出现所能实现的功能,最后通过串口下载到STC89C52单片机芯片中让整个硬件可以得到运行。5.2 程序设计#include#include#define uint unsigned int#define uchar unsigned charsbit rtc_clk=P10;sbit rtc_io=P11;sbit rtc_rst=P12;s

21、bit set=P13;sbit up=P14;sbit out=P15;sbit qiehuan=P16;uchar cnt,num;uchar done,count,temp,up_flag,flag;uchar time=0x00,0x00,0x00,0x00,0x00,0x00,0x00;uchar code SEG710=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/uchar code SEG710=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar hide_sec

22、,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;uchar ACT8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; #define RD 0x01#define WR 0x00#define C_SEC 0x80#define C_MIN 0x82#define C_HR 0x84#define C_DAY 0x86#define C_MTH 0x88#define C_WK 0x8a#define C_YR 0x8c#define C_WP 0x8e#define CLK_HALT 0

23、x80#define CLK_START 0x00#define M12_24 0x80#define PROTECT 0x80#define UNPROTECT 0x00void delay(uint k)uint i,j;for(i=0;ik;i+)for(j=0;j121;j+);void DS1302_writeB(uchar byte)uchar i;for(i=0;i1;uchar DS1302_readB()uchar i,date;for(i=0;i1;rtc_clk=1;rtc_clk=0;delay(1);if(rtc_io=1)date=date|0x80;elsedat

24、e=date&0x7f;return(date);void DS1302_writeD(uchar add,uchar date)rtc_rst=0;rtc_clk=0;rtc_rst=1;DS1302_writeB(add);delay(1);DS1302_writeB(date);rtc_clk=0;rtc_rst=0;uchar DS1302_readD(uchar add)uchar date;rtc_rst=0;rtc_clk=0;rtc_rst=1;delay(1);DS1302_writeB(add|RD);delay(1);date=DS1302_readB();delay(1

25、);rtc_clk=0;rtc_rst=0;return(date);void DS1302_init()/开启ds1302uint second;second=DS1302_readD(C_SEC);if(second&0x80)DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_SEC|WR,CLK_START);DS1302_writeD(C_WP|WR,PROTECT);elsevoid DS1302_getT();void DS1302_getT()uchar i,value;uchar addr=0x80;for(i=0;i4)*10+

26、(value&0x0f);addr+=2;void outkey()/跳出调整按键/out=1;uchar second;if(out=0)delay(10);if(out=0);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week,hide_month=0,hide_year=0;/hide_sfm=0,hide_nyr=0,hide_week=0;second=DS1302_readD(C_SEC);DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_SEC|WR,seco

27、nd&0x7f);DS1302_writeD(C_WP|WR,PROTECT);done=0;while(out=0);void upkey()/升序按键/uchar valueble;up=1;if(up=0)delay(20);if(up=0);while(up=0);switch(count) case 1:temp=DS1302_readD(C_SEC);/temp=(valueble&0x70)4)*10+(valueble&0x0f);temp=temp+1;up_flag=1;if(temp&0x7f)0x59)temp=0;break;case 2:temp=DS1302_re

28、adD(C_MIN);temp=temp+1;up_flag=1;if(temp&0x7f)0x59)temp=0;break;case 3:temp=DS1302_readD(C_HR);temp=temp+1;up_flag=1;if(temp&0x7f)0x23)temp=0;break;case 4:temp=DS1302_readD(C_WK);temp=temp+1;up_flag=1;if(temp&0x7f)0x07)temp=1;break;case 5:temp=DS1302_readD(C_DAY);temp=temp+1;up_flag=1;if(temp&0x7f)0

29、x31)temp=1;break;case 6:temp=DS1302_readD(C_MTH);temp=temp+1;up_flag=1;if(temp&0x7f)0x12)temp=1;break;case 7:temp=DS1302_readD(C_YR);temp=temp+1;up_flag=1;if(temp&0x7f)0x85)temp=0;break; void setkey()/功能切换set=1;if(set=0)delay(10);if(set=0) count=count+1;done=1; while(set=0);void qiehuankey()qiehuan=

30、1;if(qiehuan=0)delay(10);if(qiehuan=0)while(qiehuan=0);num=num+1;if(num=2)num=0;void keydone()uchar value;uchar second;if(flag=0)temp=DS1302_readD(C_SEC);DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_SEC|WR,temp|0x80);DS1302_writeD(C_WP|WR,PROTECT);flag=1;setkey();switch(count)case 1:dooutkey();u

31、pkey();if(up_flag=1)DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_SEC|WR,temp|0x80);DS1302_writeD(C_WP|WR,PROTECT);up_flag=0;/dis_play(); hide_sec+;if(hide_sec10)hide_sec=0;value=DS1302_readD(C_SEC);/timei=DS1302_readD(addr|RD);time0=(value&0x70)4)*10+(value&0x0f);while(count=2);break;case 2:dohi

32、de_sec=0;outkey();upkey();if(up_flag=1)DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_MIN|WR,temp);DS1302_writeD(C_WP|WR,PROTECT);up_flag=0; hide_min+;if(hide_min10)hide_min=0;value=DS1302_readD(C_MIN);/timei=DS1302_readD(addr|RD);time1=(value&0x70)4)*10+(value&0x0f);while(count=3);break;case 3:do

33、hide_min=0;outkey();upkey();if(up_flag=1)DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_HR|WR,temp);DS1302_writeD(C_WP|WR,PROTECT);up_flag=0;hide_hour+;if(hide_hour10)hide_hour=0;value=DS1302_readD(C_HR);/timei=DS1302_readD(addr|RD);time2=(value&0x70)4)*10+(value&0x0f);while(count=4);break;case 4:

34、dohide_hour=0;outkey();upkey();if(up_flag=1)DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_WK|WR,temp);DS1302_writeD(C_WP|WR,PROTECT);up_flag=0;hide_week+;if(hide_week10)hide_week=0;value=DS1302_readD(C_WK);time5=(value&0x70)4)*10+(value&0x0f);while(count=5);break;case 5:dohide_week=0;outkey();upk

35、ey();if(up_flag=1)DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_DAY|WR,temp);DS1302_writeD(C_WP|WR,PROTECT);up_flag=0;hide_day+;if(hide_day10)hide_day=0;value=DS1302_readD(C_DAY);time3=(value&0x70)4)*10+(value&0x0f);while(count=6);break;case 6:dohide_day=0;outkey();upkey();if(up_flag=1)DS1302_wri

36、teD(C_WP|WR,UNPROTECT);DS1302_writeD(C_MTH|WR,temp);DS1302_writeD(C_WP|WR,PROTECT);up_flag=0;hide_month+;if(hide_month10)hide_month=0;value=DS1302_readD(C_MTH);time4=(value&0x70)4)*10+(value&0x0f);while(count=7);break;case 7:dohide_month=0;outkey();upkey();if(up_flag=1)DS1302_writeD(C_WP|WR,UNPROTEC

37、T);DS1302_writeD(C_YR|WR,temp);DS1302_writeD(C_WP|WR,PROTECT);up_flag=0;hide_year+;if(hide_year10)hide_year=0;value=DS1302_readD(C_YR);time6=(value&0x70)4)*10+(value&0x0f);while(count=8);break;case 8: count=0;/*hide_sfm=0;hide_week=0;hide_nyr=0;*/hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_wee

38、k=0,hide_month=0,hide_year=0;second=DS1302_readD(C_SEC);DS1302_writeD(C_WP|WR,UNPROTECT);DS1302_writeD(C_SEC|WR,second&0x7f);DS1302_writeD(C_WP|WR,PROTECT);done=0;break;default:break;void init()TMOD=0x01;TH0=0xfc;TL0=0x18;ET0=1;TR0=1;EA=1;void main()init();DS1302_init();while(1)while(done=0) DS1302_

39、getT();. setkey(); qiehuankey(); flag=0;while(done=1) keydone();void time0(void) interrupt 1TH0=0xfc;TL0=0x18;cnt+;if(cnt9)cnt=0;if(num=0)switch(cnt)case 1:if(hide_sec6)P0=SEG7time0%10;P2=ACT0;break;elseP0=0xff;P2=ACT0;break;case 2:if(hide_sec6)P0=SEG7time0/10;P2=ACT1;break;elseP0=0xff;P2=ACT1;break;case 3:if(hide_min6)P0=SEG7time1%10;P2=ACT2;break;elseP0=0xff;P2=ACT2;break;case 4:if(hide_min6)P0=SEG7time1/10;P2=ACT3;break;

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号