基于51单片机的数字温度计设计--本科毕业设计论文.doc

上传人:知****量 文档编号:86250600 上传时间:2023-04-14 格式:DOC 页数:36 大小:1.86MB
返回 下载 相关 举报
基于51单片机的数字温度计设计--本科毕业设计论文.doc_第1页
第1页 / 共36页
基于51单片机的数字温度计设计--本科毕业设计论文.doc_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《基于51单片机的数字温度计设计--本科毕业设计论文.doc》由会员分享,可在线阅读,更多相关《基于51单片机的数字温度计设计--本科毕业设计论文.doc(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、基于51单片机的数字温度计设计摘要 随着现代信息技术的飞速发展和传统工业改造的逐步实现能够独立工作的温度检测和显示系统应用于诸多领域。这里设计的数字温度计采用DS18B20为传感器,选用AT89C51型单片机作为主控制器件,通过4位一体共阳极的数码管进行温度显示。与热敏电阻为温度敏感元件的温度计相比,该数字温度计具有读数方便,测温范围广,测温精确等特点。另外,还在该温度计中加入了秒表计时的功能,能够实现“分,秒”的计时显示,并且,两种功能能够用按键实现切换。关键词:AT89C51;DS18B20传感器;温度;秒表Abstract:With the development of modern i

2、nformation technology and the progressive of the traditional industrial transformation. Using DS18B20 as the sensor of the digital thermometer , AT89C51 microcontroller as the main control device,and the four digital tube are used to display. Compared with the thermometer thermistor for temperature

3、sensitive element,the digital thermometer have many advantages,for example,its can get temperature more convenient, wider,and more accurate.In adition,The digital thermometer also as a stopwatch,according to the minutes and seconds.And with the pressing of the keys,we can choose the different functi

4、ons of the digital thermometer.Key words: AT89C51;DS18B20;the temperature;stopwatch目 录1 系统硬件设计方案11.1 单片机选择11.2 温度传感器介绍21.3 温度传感器与单片机的连接41.4 复位电路51.5 时钟电路51.6 按键电路51.7 显示电路51.8 电源电路和系统供电52 软件设计52.1 DS18B20测温52.1.1 DS18B20复位52.1.2 DS18B20读写逻辑0与152.1.3单片机访问DS18B2052.1.4 DS18B20程序设计52.2 秒表程序设计52.3 按键功能5

5、3 系统测试53.1 测试方案53.2 测试条件与仪器53.3 测试结果及分析54 系统特色55 心得和体会56 参考文献5附录1:电路原理图5附录2:实物图5附录3:仿真测试图5附录4:源程序534数字温度计设计1 系统硬件设计方案作品主要利用AT89C51单片机、DS18B20数字温度传感器而设计的数字温度计,实现对空气温度的测量。图1 系统原理结构框图如图1所示,该温度计通过ds18b20数字传感器进行采集,将数据传送给单片机,程序通过按键对单片机进行操作,然后再数码管上显示。1.1 单片机选择AT89C51作为温度测试系统设计的核心器件。该器件是INTEL公司生产的MCS一5l系列单片

6、机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS51的CMOS产品。不仅结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,而且继承和扩展了MCS48单片机的体系结构和指令系统。单片机小系统的电路图如图2所示。图2 单片机小系统电路AT89C51单片机的主要特性:(1)与MCS-51 兼容,4K字节可编程闪烁存储器;(2)灵活的在线系统编程,掉电标识和快速编程特性;(3)寿命为1000次写/擦周期,数据保留时间可10年以上;(4)全静态工作模式:0Hz-33Hz;(5)三级程序存储器锁定;(6)128*8位内部RAM,32可编程I/O线;(7)两

7、个16位定时器/计数器,6个中断源;(8)全双工串行UART通道,低功耗的闲置和掉电模式;(9)看门狗(WDT)及双数据指针;(9)片内振荡器和时钟电路;1.2 温度传感器介绍 DS18B20可以程序设定912位的分辨率,精度为0.5C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EPROM中,掉电后依然保存。温度传感器DS18B20引脚如图3所示。 8引脚封装 TO92封装图3 温度传感器引脚功能说明: NC :空引脚,悬空不使用; VDD :可选电源脚,电源电压范围35.5V。当工作于寄生电源时,此引脚必须接地。 DQ :数据输入/输出脚。漏极开路,常态下

8、高电平。 GND :为电源地DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器(如图4)。图4 DS18B20内部结构图光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 DS18B20中的温度传感器可完成对温度的测量

9、,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625/LSB形式表达,其中S为符号位。 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。图5 温度寄存器格式第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。 该字节各位的意义如下

10、:TM R1 R0 1 1 1 1 1低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如表1所示:(DS18B20出厂时被设置为12位) 表1 DS18B20温度转换时间表R1R0分辨率/位温度最大转向时间00993.750110187.510113751112750根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作

11、。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。1.3 温度传感器与单片机的连接温度传感器的单总线(数据线DQ)与单片机的/P3.3口连接(如图5)。图6 DS18B20和单片机的接口连接程序设计时通过P3.3口对DS18B20进行操作,实现初始化和温度读取等功能。1.4 复位电路MCS-51单片机的复位是靠外部电路实现的。MCS-51单片机工作后,只要在它的RESET引线上加载10ms以上的高电平,单片机就能有效地复位。上电复位:上电复位电路是种简单的复位电路,只要在RST复位

12、引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。图7 复位电路1.5 时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。设计采用的是内部时钟方式。

13、图8 时钟电路1.6 按键电路按键的开关状态通过一定的电路转换为高、低电平状态。当按键按下时,在单片机的相应I/O口产生负脉冲,闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动;消抖一般是通过在程序中给一定的延时再检测信号。本设计中采用的是独立式按键,每个按键的工作状态不会产生互相影响,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,这样只需要对单片机单个I/O口进行操作就能实现按键功能(如图9)。图9 按

14、键电路1.7 显示电路LED数码管使用发光二极管构成显示字型,LED数码管连接方式分类:共阴极数码管和共阳极数码管(如图10)。共阴极数码管:将数码管阴极接地,相应段上的阳极接正电压。共阳极数码管:将数码管阳极接地,相应段上的阴极接正电压。图10 共阴和共阳数码管根据数码管连接方式的不同,在应用中,要实现数字显示,则需要用不同的编码,从低到高位为:a b c d e f g h。如:数字“5”,需要相应二极管亮的是:a f g c d;共阳极编码为:10010010(0x92),共阴极则正好相反。表2 09共阳极数码管编码(不含小数点)需要显示数字编码需要显示数字编码0c0H(1100 000

15、0)592H(1001 0010)1f9H(1111 1001)682H(1000 0010)2a4H(1010 0100)7f8H(1111 1000)3b0H(1011 0000)880H(1000 0000)499H(1001 1001)990H(1001 0000)同理可得09共阳极数码管编码(含小数点):40H,79H,24H,30H,19H,12H,02H,78H,00H,10H本设计中采用的是4位一体的数码管(图11),与单个数码管相比,有4个位选线A1,A2,A3,A4,通过接高电平实现对每一位的操作,数据线的原理则与单个数码管一样。图11 四位一体数码管引脚图如图12,数码管

16、上拉电阻采用共阳极方式,以单片机P2口为位选信号,由于直接使用单片机I/O口不足以驱动数码管,因此在显示电路上加入了三级管驱动,采用的是s9012三极管,s9012是PNP型的三级管,基极通过1k电阻接单片机的P2口,发射极接正电压,集电极接数码管位选信号;由于是PNP型三级管,只有当单片机P2口为低时,数码管的相应的位选才选中。图12 显示电路图1.8 电源电路和系统供电由于该系统需要稳定的5 V电源,因此必须采用能满足电压、电流和稳定性要求的电源。设计采用外部的5V电源供电,在电源两端并连上了两个电容(如图13)。图13 电源电路图设计中外部供电采用的是Mini-usb(B型)接口,由于并

17、没有用到数据的传输,只是单纯供电,所以设计中只用到了Pin 1(V Bus)和Pin 5(GND)。图14 mini-usb引脚图对系统供电的设计,可采用以下方法:直流稳压电源,单片机开发板,手机电池,迷你USB接口;其中利用迷你USB接口供电可以通过手机充电器、电脑USB接口等,可以让温度计在使用起来更方便,这也是本设计中的特点之一。2 软件设计2.1 DS18B20测温2.1.1 DS18B20复位图15 DS18B20复位时序DS18B20复位时序:1单片机拉低总线480950us,然后释放总线(拉高电平);2DS18B20会拉低电平60240us表示应答;3DS18B20拉低电平的60

18、240us之间,单片机读取总线电平,为低则复位成功,为高则复位失败;4DS18B20拉低电平60240us之后,会释放总线。2.1.2 DS18B20读写逻辑0与1图16 DS18B20写逻辑0与1DS18B20写逻辑0与1时序:1 单片机拉低电平约1015us;2 单片机持续拉低“0”(高“1”)电平约2045us;3 释放总线。图17 DS18B20读逻辑0与1DS18B20读逻辑0与1时序:1 读取时单片机拉低总线1us;2 单片机释放总线,读取总线电平;3 DS18B20会拉低“0”(高“1”)电平;4 读取电平后延时4045us。2.1.3单片机访问DS18B20DS18B20充当从

19、机,单片机是主机,而单片机作为主机通过一线总线访问DS18B20需要经过以下步骤:1DS18B20复位指令;2执行ROM指令;3执行DS18B20功能指令(RAM指令)。设计程序中需要用到的DS18B20功能指令有:10xcc:跳过读序号列;20x44:启动温度转换;30xbe:读取温度寄存器。2.1.4 DS18B20程序设计图18 DS18B20程序测温流程DS18B20可以精确到0.0625,对于正的温度直接将高八位和低八位进行整合,即可求出温度;对于负的温度,读出的高8位的最高4位代表了温度的符号位(0000则代表温度为正,1111代表了温度为负),可以对这4位进行判断,如果为1111

20、,说明温度为负,则需要将temp取反再补1,图18为DS18B20程序测温流程图。2.2 秒表程序设计秒表程序实现的是计时功能,分为4位显示:分十位,分个位,秒十位,秒个位。把定时器的定时时间定为50ms,这样,计数溢出20次即可得到时钟的最小计时单位秒(若计数2次则得到的秒表精度为0.1s);秒计时是采用中断方式进行溢出次数的累积,计满20次,即得到秒计时。当秒计时到“59”时,秒清零,分个位加“1”。图19为秒表计时程序流程图。图19 秒表计时程序流程图2.3 按键功能设计中共有5个按键,其中一个用于对AT89C51的复位,当按键按下时复位成功;另外四个按键分别定义为KEY1测温,KEY2

21、秒表,KEY3秒表暂停/开始,KEY4秒表清零;图20为按键处理流程图。图20 按键处理流程程序开始:KEY1按下:测温功能,显示温度为xx.xC(正温度)或xx.xE(负温度);KEY2按下:开始秒表计时,显示当前计时xx分,xx秒;KEY3按下:定时器0的定时控制位TR0=TR0,开始时TR0=1,第一次按下时,秒表暂停,以后每次按下,TR0取反,即第二次按下,TR0=1,则实现秒表开始计时;KEY4按下:关定时器中断,使定时器定时控制位置0,令min和sec为零,即实现清零。3 系统测试3.1 测试方案 1硬件测试把系统板分为几个部分,分别单独测试,然后再整体测试。2软件仿真测试利用软件

22、仿真,分别实现温度测试,秒表测试,按键测试。3 软件硬件联合测试把程序下载到C51单片机上,进行系统测试。具体操作:将写好的C程序通过单片机开发板下载到AT89C51上,再将单片机安装在系统板上,供5v直流电,操作按键看是否能进行测温和秒表功能。3.2 测试条件与仪器 测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。硬件测试仪器:万用表,直流稳压电源、示波器、单片机开发板;3.3 测试结果及分析Protus 仿真测试(见附页):综合测试(如图21):分别显示:温度为17.8C; 秒表计时到146秒。 测空气中的温度 秒表计时图21 综合测试图刚

23、开始测试的时候,发现数码管不够亮,后来自己查找了许多资料,找到了原因:三级管驱动没有工作,后来我自己用面包板焊接了一个三极管驱动,再修改了程序进行检测,最后数码管能很好的显示温度;结合自己的系统板,我将单片机的P2口作为数码管的位选端,重新设计了一下原有的驱动,采用1k电阻和S9012 PNP型三级管。最后我在系统的供电端加入了迷你usb接口,这样整个系统就能采用usb接口与电脑连接和手机充电器供电。结合软件和硬件的测试结果看,该温度计能实现对温度的测量,并且能随接触物的温度改变而改变。4 系统特色 系统的特色主要有:采用多种供电方式,采用迷你USB接口能实现多种方式的使用,如:手机充电器,电

24、脑,手机等;采用数字温度传感器DS18B20更精确的获得温度值;在测量温度功能的基础上加入了秒表计时的功能,秒表可用于长时间的计时,并且用户可以通过按键实现功能之间的相互转换。5 心得和体会通过这次对数字温度计的设计,我发现自己还有许多需要加强的地方,比如:画PCB板和画原理图;缺少对以前许多学过的C语言、模电等课程的温习;过程中我也查找了许多资料,同时我也学到了许多东西,在调适过程中,动手写程序和改程序,一步步将结果调适出来,在动手能力和解决问题能力的有所提高。更重要的是团队的协作,有这样一句话:如果我用个人的能力,可以赚一个亿,可能100%是我的;但我用十个人的时候,我们可能赚到十个亿,可

25、能我只有10%,我同样是一个亿,但我们的事业变大了。在做这次课题的过程中,我明白了一个人的力量是有限的,只有协调好团队才能获得最多的成就。6 参考文献1电子技术基础模拟部分/康华光主编2单片微机原理、汇编与C51及接口技术 清华大学出版社3C程序设计(第三版) 谭浩强(著) 清华大学出版社附录1:电路原理图附录2:实物图 附录3:仿真测试图温度仿真测试:显示13.0C即13.0摄氏度秒表仿真测试:附录4:源程序/*程序说明: 主要两大功能:DS18B20测温,秒表计时(精确到秒);显示:测温显示为xx.xC(xx.xE) 温度为正,最后一位显示字母C;温度为负,最后一位显示字母E; 秒表显示为

26、xx分xx秒;当秒增加到59时,秒清零,分+1;精度为秒; 按键说明:按键1KEY1 选择测温功能; 按键2KEY2 选择秒表功能; 按键3KEY3 按下秒表暂停,再次按下秒表开始; 按键4KEY4 按下秒表清零;*/#include #include #define uchar unsigned char #define uint unsigned int/*变量定义*/sbit KEY1 = P10; /按键,低有效;KEY1测温,KEY2秒表;sbit KEY2 = P11;sbit KEY3 = P12; /秒表模式暂停sbit KEY4 = P13; /秒表开始sbit DQ = P

27、33; /原理图中ds18b20接INT1,INT1为P3.3口;sbit wei4 = P27; /位选口sbit wei3 = P26;sbit wei2 = P25;sbit wei1 = P24;uchar flagnum; /按键标志uchar wenbiao; /温度标志,温度为负 wenbiao=0;温度为正 wenbiao=1;uchar min,sec;/秒表分、秒uchar k;/定时50msuint temp;/温度变量/*共阳极数码管不含小数点编码*/uchar code Tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,

28、0x90;/*共阳极数码管不含小数点编码*/uchar code Tab1=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/*函数声明*/ void Delay_ms(uint n); /毫秒延时 void Delay_us(uchar n); /微秒延时 void Display2(); /分、秒显示 void System_Ini(); /定时器0初始化 void timer0 (); /定时器0中断1 void DS18b20_Reset(); /DS18b20复位 bit Read_bit(); /读1位 uchar DS18b20

29、_Read(); /读1个字节 void Write_bit(bit bitval); /写1位 void DS18b20_Write(uchar byte); /写1个字节 void Changtemp(); /开启温度转换 uchar Readtemp(); /读取温度 void Display1(uint z); /温度显示 void Wenduji(); /温度计 uchar Keycheck(); /按键检测 void Key_ser(uchar num); /按键实现功能转换/*函数名称:void main()函数功能:主函数输入参数:无函数变量:num1函数调用:void Sys

30、tem_Ini(); void Wenduji(); uchar Keycheck(); void Key_ser(uchar num);返回值: 无函数说明:无*/void main()uchar num1;System_Ini();while(1) if(flagnum = 1)Wenduji();num1 = Keycheck();Key_ser(num1); /*函数名称:void Delay_ms(uint n)函数功能:毫秒延时输入参数:n函数变量:i,j函数调用:无 返回值: 无函数说明:无*/void Delay_ms(uint n) /毫秒延时 uint i,j;for(i=

31、n;i0;i-) for(j=110;j0;j-); /*函数名称:void Delay_us(uchar n)函数功能:微秒延时输入参数:n函数变量:无函数调用:无 返回值: 无函数说明:无*/void Delay_us(uchar n) /微秒延时 while(n-); /*秒表模块*/*函数名称:void Display2()函数功能:分、秒显示输入参数:无函数变量:无函数调用:void Delay_ms(uint n);返回值: 无函数说明:无*/void Display2()wei1 = 0; P0 = Tabsec%10;Delay_ms(2);wei1 = 1;P0 = 0xff

32、; /消影wei2 = 0; P0 = Tabsec/10;Delay_ms(2);wei2 = 1;P0 = 0xff;wei3 = 0; P0 = Tabmin%10;Delay_ms(2);wei3 = 1;P0 = 0xff;wei4 = 0; P0 = Tabmin/10; Delay_ms(2);wei4 = 1;P0 = 0xff; /*函数名称:void System_Ini()函数功能:定时器初始化输入参数:无函数变量:无函数调用:无 返回值: 无函数说明:无*/void System_Ini() /定时器初始化TMOD= 0x01; /定时器0方式1TH0=(65535-5

33、0000)/256; TL0=(65535-50000)%256; ET0 = 1; TR0 = 0;EA=1;/*中断1*/void timer0 () interrupt 1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; k+; if( k=20 ) /定时器定时50ms,20次就是1秒 k = 0; sec+; if(sec59) sec = 0; min+; if(min59) min = 0; /*温度计模块*/*函数名称:void DS18b20_Reset()函数功能:DS18b20复位输入参数:无函数变量:DQ函数调用:void D

34、elay_us(uchar n); 返回值: 无函数说明:无*/void DS18b20_Reset()DQ = 1; _nop_(); /1usDQ = 0; /拉低总线 Delay_us(80); /延时530us_nop_(); DQ = 1; /拉高总线(释放数据线)Delay_us(5);_nop_();_nop_();_nop_();Delay_us(30);_nop_();_nop_();DQ = 1; /拉高总线,让总线处于空闲状态/*函数名称:bit Read_bit()函数功能:读1位输入参数:无函数变量:b ; DQ函数调用:void Delay_us(uchar n);

35、 返回值: b函数说明:无*/bit Read_bit()bit b;DQ = 0; /拉低总线1us_nop_();DQ = 1; /释放总线 _nop_();_nop_();b = DQ;Delay_us(7); /延时4050微秒return(b); /*函数名称:uchar DS18b20_Read()函数功能:读1个字节输入参数:无函数变量:i , j, byte;函数调用:无 返回值: byte函数说明:无*/uchar DS18b20_Read()uchar i,j,byte;byte = 0;for(i=0;i8;i+) j = Read_bit(); byte = (j1);

36、 /读出的数据最低位在前面 return(byte); /*函数名称:void Write_bit(bit bitval)函数功能:写1位输入参数:bitval函数变量:DQ , bitval;函数调用:void Delay_us(uchar n); 返回值: 无函数说明:无*/void Write_bit(bit bitval)DQ = 0;Delay_us(2); /拉低总线1015usif(bitval=1) /如果写1就拉高总线DQ = 1;Delay_us(5); /延时2045uselseDQ = 0;Delay_us(5);DQ = 1; /释放总线 _nop_(); _nop_

37、();/*函数名称:void DS18b20_Write(uchar byte)函数功能:写1个字节输入参数:byte函数变量:i ,temp;函数调用:void Write_bit(bit bitval); 返回值: 无函数说明:无*/void DS18b20_Write(uchar byte)uchar i,temp;for(i=0;ii; /分别将temp的每一位移到最低位temp = temp&0x01; /将temp的最低位取出来Write_bit(temp);/*函数名称:void Changtemp()函数功能:开启温度转换输入参数:无函数变量:无函数调用:void DS18b20_Reset() void DS18b20_Write(uchar byte) 返回值: 无函数说明:无*/void Changtemp() DS18b20_Reset();DS18b20_Write(0xcc); / 跳过读序号列号的操作

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁