




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机原理与应用课程设计说明书 题 目:DS18B20温度传感器和DS1302时钟设计 系 部:信息与控制工程学院 专 业:自动化 班 级:09级3班 学生姓名: 学 号:指导教师: 2011年12月4日单片机课程设计说明书目 录1 设计任务与要求11.1 课程设计的任务11.2 课程设计的要求12 设计方案12.1 设计思路12.2 芯片及功能12.2.1 MAX81312.2.2 DS130222.2.3 DS18B0222.2.4 MAX23242.2.5 74LS16453 硬件电路设计54 主要参数计算与分析94.1 DS18B20温度数值转换94.2 DS1302时钟BCD的转换95 软件设计105.1 流程图105.2 源代码116 调试过程226.1 调试步骤226.2 实验出现的问题227 结论23参考文献241 设计任务与要求1.1 课程设计的任务基本要求:本次课程设计的基本任务为完成一个温度传感器的功能。当温度低于某一个温度值或高于某个温度是报警。扩展功能:结合个人能力和电路板的现有硬件,看增加其他功能。这里扩展为按下某个键进入时钟功能。1.2 课程设计的要求(1)焊接电路,编制程序,实现电子音乐盒的基本功能,并完成课程设计说明书。(2)课程设计期间遵守纪律,注意安全,爱护设备,合理分工,加强合作。2 设计方案2.1 设计思路使用单片机读取温度传感器的值,经过转换,在8段LED数码管上显示出来。根据读取的值来设定温度报警范围。当高于或低于某个温度值通过蜂鸣器报警。扩展功能:时钟显示。通过一个按键切换到时钟显示。时钟系统是通过I2C总线访问DS1302获取和设置时钟。2.2 芯片及功能2.2.1 MAX813MAX813L 功能介绍MAX813L 监控电路可用于计算机、控制器、自动化设备、智能设备及微处理器监控中。它们有以下四方面的功能: 1、 上电、掉电状态下的复位功能; 2、 MAX813 L 还有 WATCHDOG 输出功能; 3、 内有一个 1.25V掉电告警门限检测器; 4、 手动复位输入。MAX813L 当供电电压降至 4.65V以下将会产生一个复位脉冲,它有 DIP、SO封装。 MAX813L 管脚图及管脚功能:图1 MAX813管脚图脚1(/MR) :当电压降至 0.8V以下时,手动复位触发一个复位脉冲。这个低电平为有效输入提供一个内部 250uA 的上拉电流。它能被 TTL 或CMOS 逻辑电路来驱动。 脚 2(VCC) :+5V电源输入端。 脚 3(GND) :对所有信号 0V参考地。 脚4(PFI) :电源失效监督输入端。当 PFI 低于 1.25V,/PFO 为低电平。若 PFI不用,可将其与 GND或 VCC 相连。 脚 5(/PFO) :当 PFI 低于 1.25V时,电源失效输出为低电平,且吸收电流。 脚 6(WDI) :看门狗输入端。 脚 7(RESET) :高电平有效输出端。 脚 8(/WDO) :看门狗输出端。2.2.2 DS1302DS1302的引脚功能图:X1 X2 32.768KHz 晶振管脚 GND 地 RST 复位脚 I/O 数据输入输出引脚 Vcc1,Vcc2 电源供电管脚SCLK 串行时钟图2 D1302管脚图2.2.3 DS18B02DS18B20的外形及管脚排列如下图图3 外形及管脚排列DS18B20工作原理。DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。 DS18B20测温原理如下图所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。DS18B20温度值格式表 图4 DS18B20温度值格式表这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125的数字输出为07D0H,+25.0625的数字输出为0191H,-25.0625的数字输出为FE6FH,-55的数字输出为FC90H 。 DS18B20温度数据表 表1 DS18B20温度数据表温度数据输出(二进制)数据输出(十六进制)+12500000000 1111101000FA+2500000000 001100100032+1/200000000 000000010001000000000 000000000000-1/211111111 11111111FFFF-2511111111 11001110FFCE-5511111111 10010010FF92表2 ROM指令表指令 约定代码功能读ROM33H读DS1820温度传感器ROM中的编码(即64位地址) 符合ROM 55H发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。 搜索ROM 0FOH用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。为操作各器件作好准备。 跳过ROM 0CCH忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作。 告警搜索命令0ECH执行后只有温度超过设定值上限或下限的片子才做出响应。 温度变换44H启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中。 读暂存器 0BEH 读内部RAM中9字节的内容 写暂存器 4EH 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。 复制暂存器 48H 将RAM中第3 、4字节的内容复制到EEPROM中。 重调 EEPROM 0B8H 将EEPROM中内容恢复到RAM中的第3 、4字节。 读供电方式 0B4H 读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”。 2.2.4 MAX232MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。图5 MAX232管脚图第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。 第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。 其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。 8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。 第三部分是供电。15脚GND、16脚VCC(+5v)。2.2.5 74LS164引脚功能:CLEAR: 同步清除输入端(低电平有效) A,B :串行数据输入端QAQH: 输出端CLOCK :时钟输入端图6 74LS164管脚图表3 74LS164真值表InputsOutputsClearClockABQAQB.QHLXXXLL.LHLXXQAOQBO.QHOHHHHQAn.QGnHLXLQAn.QGnHXLLQAn.QGnH高电平 L低电平 X任意电平 低到高电平跳变 QA0,QB0,QH0 规定的稳态条件建立前的电平 QAn,QGn 时钟最近的前的电平 当清除端(CLEAR)为低电平时,输出端(QAQH)均为低电平。 串行数据输入端(A,B)可控制数据。当 A、B任意一个为 低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0 为低电平。当A、B 有一个为高电平,则另一个就允许输入数据,并在CLOCK 上升沿作用下决定Q0 的状态。 3 硬件电路设计(1) 3路LED灯图五 发光二极管检测电路共阳极接法,通过给P2.1-P2.3低电平来点亮。用来进行程序测试和流水灯显示。(2) 7段LED数值数码管与74LS164移位寄存器图8 7段LED数值数码管与74LS164移位寄存器P0.0、P0.1、P0.2、P2.6、P2.7、P0.7为从左到右六位数码管位选口(上图只给出前三位)。通过移位寄存器74LS164输出端进行段选,P2.4为74LS164数据输入,P2.5为74LS164同步脉冲。(3) 6路按键图9 6路按键P1.0-P1.5为6路按键开关。通过上拉电阻使得按键低电平有效。(4) DS18B20GNDDQVDD123DS18B20GND+5vR27512P0.6图10 DS18B20数字温度传感器,通过单总线通信。P0.6为DS18B20的温度数据传输口。VDD有+5V供电。(5) DS1302图11 DS1302数字时钟芯片,通过I2C通信。P0.3为DS1302的初始化端。P0.4为数据传输端。P0.5同步时钟端。DS1302需要外接32.768MHz的独立晶振。(6) Max232图12 Max232电平转换芯片,使得单片机可以与PC通信。TXD与RXD接MCU的TXD(P3.0)与RXD(P3.1)(7) Max813图13 Max813看门狗复位芯片,实现开机复位单片机。(8) 蜂鸣器/喇叭图14蜂鸣器/喇叭P2.0为声音数据输出口。通过三极管进行功率放大驱动蜂鸣器/喇叭。4 主要参数计算与分析4.1 DS18B20温度数值转换读取DS18B20后得到9个字节中前两位为温度数值th1,tl1,其温度数值为0.0625的倍数先将二进制转换为浮点数tempFloattempFloat= th1*162+tl1获取整数部分:把tempFloat给一个整型变量tempInttempInt= tempFloat;把温度值分成6位显示:整数部分:0=tempInt/100;1=tempInt%100/10;2=tempInt%10; 小数部分:tempLt=(tempFloat- 0*100+ 1*10+ 2)*10000;3=tempLt%10;4=tempLt%100/10;5=tempLt%1000/100;4.2 DS1302时钟BCD的转换十进制转BCD十进制整数time_buf1,转换成十六进制BCD码值time_buftmp=time_buf1/10;/获得十位time_buf=time_buf1%10;/获得个位time_buf=time_buf+tmp*16;/转换十六进制BCD转十进制十六进制整数time_buf,转换成十进制BCD码值time_buf1mp=time_buf/16;/获得高八位time_buf1i=time_buf%16;/获得高低位time_buf1i=time_buf1+tmp*10;/转换成十进制5 软件设计5.1 流程图图15 主程序流程图图15左边为主程序,通过不断扫描输出暂存数组使用数码管实现显示。图15右边为定时器中断程序,通过定时获取DS18B20或DS1302值改变暂存数组,实现实时显示当前相应芯片的值。图16为按键处理程序,通过四个按键分别实现时钟设置、对要设置的时钟选项加1与减1、时钟/温度的转换。由上图可知该段程序应放在主程序里,扫描获取按键值,然后进行相应处理图16 按键处理程序5.2 源代码/MyDefindeBefore.h*/文件功能:定义、函数声明、公用函数。*sbit SIN=P24;/LED显示移位输出口sbit CLK=P25;/移位输出时钟sbit led1=P21;/Led口sbit led2=P22;sbit led3=P23;sbit S1=P00;/位选口sbit S2=P01;sbit S3=P02;sbit S4=P26;sbit S5=P27;sbit S6=P07;sbit tt=P33; /测试口sbit tt1=P34;bit keyDown=0;/按键是否按下bit alarmOn=0;/温度报警是否在报警sbit alarmSPK=P20;/报警口,0-报警、1-关闭报警unsigned char T0_Mode=0;/T0要触发的模式,0-读取DS1302、1-读取DS18B20bit timeSetBlink=0;/时间设置时的闪烁判定unsigned char timeSetIndex=0;/按键1的功能标识 1:全闪、 2:设置小时、 3:设置分钟、 4:设置秒、 5:写入DS1302unsigned char T0_Num=0,T1_Num=0; /定时器次数记录unsigned char const el21=0xE7,0x05,0xE9,0xAD,0x0F,0xAE,0xEE,0x85,0xEF,0xAF,0x77,0x7c,0x39,0x5e,0x79,0x71,0X80,0x40,0x38,0x76,0x00;/ 显示段码值 0 1 2 3 4 5 6 7 8 9 A B C D E F . - L H 空unsigned char ledNum6=0,1,2,3,4,5;/6位管暂存初始化void scanLed(); void b_SIN(unsigned char);void getKeyInput();void dis_buf1();/延迟=void delay(unsigned int n) while(n-);/kcsj.c*/程序主文件*#include/C52通用定义头文件#include MyDefindeBefore.h /一部分定义及,函数声明,共用函数#include IIC_DS1302_RW.c/DS1302时钟函数库#include ss_DS18B20.c/DS18B20温度传感器函数库/主程序=void main()TMOD=0x11;/设置T0、T1都在模式一/设置并开启T0TH0=0x00;TL0=0x00;ET0=1;EA=1;TR0=1;/设置T1TH1=0x00;TL1=0x00;ET1=1;TR1=0;alarmSPK=1;ds1302_init();ds1302_read_time();/读取时钟scanLed();/开始扫描LED显示/LED扫描显示=void scanLed() unsigned char i,elTmp; while(1)for(i=0;i6;i+) /6位扫描输出/检测按键=if(P1!=0xff) if(keyDown=0)/只有上次按键松开才看可以再次处理按键程序getKeyInput();keyDown=1;elsekeyDown=0;elTmp=elledNumi; /获得该位数码if(T0_Mode=0)/时间模式时每两位加一个小数点if(i%2!=0)/是否加小数点elTmp=(elledNumi)|0x10; else/温度模式只在第3位加一个小数点if(i=2)elTmp=(elledNumi)|0x10;S1=1;S2=1;S3=1;S4=1;S5=1;S6=1;/清位b_SIN(elTmp); /移位输出switch(i) /选位case 0:S1=0;break;case 1:S2=0;break;case 2:S3=0;break;case 3:S4=0;break;case 4:S5=0;break;case 5:S6=0;break;delay(20); /延迟显示 /移位输出一个字节=void b_SIN(unsigned char SINTmp)unsigned char i; for(i=0;i8;i+) SINTmp=SINTmp=23)time_buf14=0;else time_buf14+;elseif(time_buf1timeSetIndex+2=59) /分、秒封顶time_buf1timeSetIndex+2=0;else time_buf1timeSetIndex+2+;else if(P1=0xfb&T0_Mode=0)/3键 -1=if(time_buf1timeSetIndex+2=5)/每中断5次才读一次芯片T0_Num=0; if(T0_Mode=0)/读取DS1302ds1302_read_time();dis_buf1();else if(T0_Mode=1) /读取DS18B20温度传感器transformTemp();readTemp();T0_Num+;/T1=/时间设置时闪烁=void int_T1() interrupt 3TH1=0x00;TL1=0x00;tt1=tt1;if(T1_Num=5) /每中断5次闪烁一下T1_Num=0;timeSetBlink=timeSetBlink;/取反下次亮暗的状态取反if(timeSetIndex=1) /all if(timeSetBlink=0)ledNum0=20;ledNum1=20;ledNum2=20;ledNum3=20;ledNum4=20;ledNum5=20; elsedis_buf1();else if(timeSetIndex=2) /Hourif(timeSetBlink=0)ledNum0=20;ledNum1=20; elseledNum0=time_buf14/10;ledNum1=time_buf14%10;else if(timeSetIndex=3)/minutesif(timeSetBlink=0)ledNum2=20;ledNum3=20; elseledNum2=time_buf15/10;ledNum3=time_buf15%10;else if(timeSetIndex=4)/secondsif(timeSetBlink=0)ledNum4=20;ledNum5=20; elseledNum4=time_buf16/10;ledNum5=time_buf16%10;else if(timeSetIndex=5) /保存修改T1_Num+;/把”time_buf1“的值写入显示暂存=void dis_buf1()ledNum0=time_buf14/10;ledNum1=time_buf14%10;ledNum2=time_buf15/10;ledNum3=time_buf15%10;ledNum4=time_buf16/10;ledNum5=time_buf16%10;/IIC_DS1302_RW.c*/DS1302时钟芯片的读取写入函数库*#includesbit SCK=P05;sbit SDA=P04;sbit RST=P03;/*复位脚*/#define RST_CLRRST=0/*电平置低*/#define RST_SETRST=1/*电平置高*/*双向数据*/#define IO_CLRSDA=0/*电平置低*/#define IO_SETSDA=1/*电平置高*/#define IO_RSDA/*电平读取*/*时钟信号*/#define SCK_CLRSCK=0/*时钟信号*/#define SCK_SETSCK=1/*电平置高*/#define ds1302_sec_add0x80/秒数据地址#define ds1302_min_add0x82/分数据地址#define ds1302_hr_add0x84/时数据地址#define ds1302_date_add0x86/日数据地址#define ds1302_month_add0x88/月数据地址#define ds1302_day_add0x8a/星期数据地址#define ds1302_year_add0x8c/年数据地址#define ds1302_control_add0x8e/控制数据地址#define ds1302_charger_add0x90 #define ds1302_clkburst_add0xbeunsigned char time_buf18 = 20,9,3,13,18,51,0,6;/空年月日时分秒周unsigned char time_buf8 ;/空年月日时分秒周/*向DS1302写入一字节数据*/void ds1302_write_byte(unsigned char addr, unsigned char d) unsigned char i;RST_SET;/*启动DS1302总线*/*写入目标地址:addr*/addr = addr & 0xFE;/*最低位置零*/for (i = 0; i 1;/*写入数据:d*/for (i = 0; i 1;RST_CLR;/*停止DS1302总线*/*从DS1302读出一字节数据*/unsigned char ds1302_read_byte(unsigned char addr) unsigned char i;unsigned char temp;RST_SET;/*启动DS1302总线*/*写入目标地址:addr*/addr = addr | 0x01;/*最低位置高*/for (i = 0; i 1;/*输出数据:temp*/for (i = 0; i 1;if (IO_R) temp |= 0x80;else temp &= 0x7F;SCK_SET;SCK_CLR;RST_CLR;/*停止DS1302总线*/return temp;/*向DS302写入时钟数据*/void ds1302_write_time(void) unsigned char i,tmp;for(i=0;i8;i+) /BCD处理tmp=time_buf1i/10;time_bufi=time_buf1i%10;time_bufi=time_bufi+tmp*16;ds1302_write_byte(ds1302_control_add,0x00);/关闭写保护 ds1302_write_byte(ds1302_sec_add,0x80);/暂停 /ds1302_write_byte(ds1302_charger_add,0xa9);/涓流充电 ds1302_write_byte(ds1302_year_add,time_buf1);/年 ds1302_write_byte(ds1302_month_add,time_buf2);/月 ds1302_write_byte(ds1302_date_add,time_buf3);/日 ds1302_write_byte(ds1302_day_add,time_buf7);/周 ds1302_write_byte(ds1302_hr_add,time_buf4);/时 ds1302_write_byte(ds1302_min_add,time_buf5);/分ds1302_write_byte(ds1302_sec_add,time_buf6);/秒ds1302_write_byte(ds1302_day_add,time_buf7);/周 ds1302_write_byte(ds1302_control_add,0x80);/打开写保护 /*从DS302读出时钟数据*/void ds1302_read_time(void) unsigned char i,tmp;time_buf1=ds1302_read_byte(ds1302_year_add);/年 time_buf2=ds1302_read_byte(ds1302_month_add);/月 time_buf3=ds1302_read_byte(ds1302_date_add);/日 time_buf4=ds1302_read_byte(ds1302_hr_add);/时 time_buf5=ds1302_read_byte(ds1302_min_add);/分 time_buf6=(ds1302_read_byte(ds1302_sec_add)&0x7F;/秒 time_buf7=ds1302_read_byte(ds1302_day_add);/周 for(i=0;i8;i+) /BCD处理tmp=time_bufi/16;time_buf1i=time_bufi%16;time_buf1i=time_buf1i+tmp*10;/*DS302初始化函数*/void ds1302_init(void) RST_CLR;/*RST脚置低*/SCK_CLR;/*SCK脚置低*/ ds1302_write_byte(ds1302_sec_add,0x00); /ss_DS18B20.c*/DS18B20温度传感器的读取写入函数库unsigned char data tRead9;/5位AA后跟9位读取的DS18B20的数据unsigned int tempInt,tempLt;/unsigned int T1_RunS=0;/T1,触发的次数,用来长延时unsigned char alarmSetI=0;/报警设置,设置项目sbit DQ=P06;/数据线void tempHtoD(); /温度数值转换,并写入八位管暂存void writeRAM(); /写入DS18B20RAMvoid readTemp(); /读取温度值,其实9位数据都读取,并保存到tRead13中void transformTemp(); /DS18B20进行温度转换void ds_set(); /初始化DS18B20void writeByte(unsigned char);/写入DS18B20一个字节unsigned char readByte();/读取DS18B20一个字节/读取温度=void readTemp()unsigned char i;ds_set();writeByte(0xcc);writeByte(0xbe);for(i=0;i=0xf0) /温度如果为负情况,取反tempH=0xff-tempH;tempL=0xff-tempL+1;tempi=tempH*16*16+tempL; /温度台阶(0.0625)数tempFloat=tempi*0.0625;/获得十进制温度值tempInt=tempFloat;/截取整数位/温度检测报警=if(tempFloat=18) /设置温度报警限,精确到小数后(tempFloat为浮点数)led1=0;led2=0;led3=0; alarmSPK=0;if(alarmOn=0)/防止开始报警后重复进入该函数而无法跳出alarmOn=1;elsealarmSPK=1;alarmOn=0;led1=1;led2=1;led3=1; /end 温度检测报警=if(tRead1=0xf0)/温度如果为负情况,最高位显示“-”,否则按原值显示 ledNum0=17;else ledNum0=tempInt/100; ledNum1=tempInt%100/10; ledNum2=tempInt%10; /ledNum3=16;tempLt=(tempFloat-ledNum0*100+ledNum1*10+ledNum2)*10000; ledNum3=tempLt%10;ledNum4=tempLt%100/10;ledNum5=tempLt%1000/100; /修改时间写入ds1302=void writeRAM()ds_set();writeByte(0xcc);writeByte(0x4e);writeByte(tRead2);writeByte(tR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中能建敖汉旗及元宝山区风光制氢一体化项目(光伏部分)环评报告表-报批稿
- 2026届广东省东华高级中学化学高二第一学期期末教学质量检测模拟试题含答案
- 幼儿园活动室布置方案
- IT薪酬管理制度及薪酬体系设计方案
- 恶劣天气安全教育课件
- 恩格斯简介课件
- 幼儿园托班活动方案
- 小车驾驶考试试题及答案
- 音乐教师口试题及答案
- 烟台市小学考试试题及答案
- 服装生产工艺全流程图解
- 厂区高空作业施工方案
- 建筑行业财务试题及答案
- NB/T 11629-2024煤炭行业物资分类与编码规范
- DBJ51-T276-2024 球墨铸铁可调式防沉降检查井盖安装及维护技术规程
- 2025-2030中国增强型飞行视觉系统行业市场发展趋势与前景展望战略研究报告
- 区域性物流枢纽项目可行性研究报告
- 能美消防R-21Z火灾报警控制器使用说明书
- 婚前协议书电子版
- 电梯有限空间作业安全专项施工方案
- 防水工程验收单
评论
0/150
提交评论