




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
简易电子密码保险箱系统的设计 摘 要围绕电子密码锁系统的设计与开发进行研究和实践,详细介绍了电子密码锁系统的整体结构,硬件设计,软件设计,系统方案以及其它的开发和具体实现。介绍一种基于在系统可编程技术和at89c51编译器配有集成开发的新型电子密码锁的设计方法,阐述其工作原理和软硬件设计。在硬件上,用c51大规模集成芯片对其外围电路进行集成,用一片at89c51芯片实现了几十片分离元件才能实现的功能,几乎将整个系统下载于同一芯片,实现了所谓的片上系统,从而大大简化了系统结构,增强了系统结构的可靠性和性价比。该密码锁可以适用于家庭及一般机构,起到防盗报警的效果。关键字: 密码锁 at89c51芯片 keil软件 proteus软件 蜂鸣器 液晶显示屏 直流电机 矩阵键盘 滚珠开关目 录摘要11电子密码保险箱系统总体设计21.1系统设计要求21.2方案的论证与选择21.3 系统总体框图32电子密码保险箱系统硬件设计32.1芯片介绍(at89c51)32.2 液晶显示屏(lcd1602)介绍52.3 各个模块电路的设计62.3.1 复位电路模块62.3.2 晶体振荡电路模块72.3.3 led电路模块72.3.4 矩阵键盘电路模块72.3.5 直流电机模块82.3.6 液晶1602显示电路模块82.3.7 蜂鸣器电路模块92.3.8 防撬报警电路模块92.4 整体电路模块的设计103电子密码保险箱系统的软件设计113.1 总程序流程图的设计113.2 开锁程序流程图的设计123.3 注册用户密码程序的设计134电子密码保险箱系统的测试与分析135 结论16附 件161电子密码保险箱系统总体设计1.1系统设计要求 1、 基本要求(1)实现3-6位数字为0-9的密码输入,第一次开启的时候注册管理员密码。(2)注册除管理员外的一个用户密码,在注册用户密码时需要先输入管理员密码。(3)当密码输入正确时,绿灯亮,电机反转,代表保险箱开启;当密码输入错误时,红灯亮,蜂鸣器连续叫五声,代表保险箱没开启,需重新输入密码。2、 发挥部分(1)用液晶显示屏或者数码管显示。(2)加入防撬功能,当发生剧烈震动时蜂鸣器一直叫。(3)系统可保存两个以上的用户密码,能够修改管理员密码。(4)其他。1.2方案的论证与选择根据设计的基本要求,经过多方面的查证与对比,以充分发挥资源和提高系统性价比为原则,本系统采用at89c51单片机为控制电路,使用lcd液晶显示屏及蜂鸣器电路来实现功能。具体设计方案的论证如下:方案一:采用数字电路控制用以74ls112双jk触发器构成的数字逻辑电路作为密码锁的核心控制,将密码保存在jk触发器中,与输入密码通过比较器比较,判断结果是否相符合。采用数字电路设计的方案好处就是设计简单,但控制的准确性和灵活性差,故不采用。方案二:采用以单片机为核心的控制方案选用单片机作为系统的核心部件,实现控制与处理的功能。单片机具有资源丰富、速度快、编程容易等优点。利用单片机内部的随机存储器(ram)和只读存储器(rom)及其引脚资源,外接液晶显示(lcd),键盘输入等实现数据的处理传输和显示功能,具有较好的灵活性,基本上能实现设计指标。因此综合考虑,本系统采用方案二。1.3 系统总体框图 系统框图如下图2-1所示,各模块设计如下:(1) 单片机的p1口接矩阵键盘,用于实现按键控制密码注册、密码修改和密码输入,达到开锁的目的。 (2) 单片机的p2口以及p3.1p3.3口与lcd液晶显示屏相连接,用于显示输出字符,如提示符以及开锁情况等。(3) 单片机的p3.4p3.7口接led灯,蜂鸣器以及直流电机,三者都是具有提示作用,用于传达是否正确开锁的信息。(4) p0口接防撬报警电路,当滚珠开关导通时,蜂鸣器会发出鸣叫,起到防撬报警的作用。 按键电路 振荡电路at89c51单片机led灯和直流电机(开锁显示)lcd液晶显示蜂鸣器电路防撬报警电路 图1-1 系统框图2电子密码保险箱系统硬件设计2.1芯片介绍(at89c51) 单片机是电子密码保险箱系统的核心部件,面它接收来自矩阵键盘的信号,控制后续电路的相应工作,完成大部分开锁及报警的工作。目前的单片机有很多的品种,但是比较流行的是由美国intel公司生产的mcs-51系列单片机,这个系列的单片机有很多的品种,不过其它的单片机都是在最原始的单片机的基础上或加或减一些功能组成的。目前,在我国比流行的是89c51单片机,它是由美国atmel公司开发生产的。 at89c51的管脚图如图2-1所示: 图2-1at89c51芯片管脚说明图管脚说明:vcc:这个管脚是用来给单片机供电的,接的是+5v电源 。gnd:这个管脚是单片机的接地端口。rst:这个管脚是复位端口,当这个管脚两个周期以上的高电平时,就可以使单片机复位,也可以当备用电源。/ea:这个端口是控制单片机取指的。当它的电平为低时,它只从片外程序存储器取指;当它是高电平的时候,它从片内取指,不过当超过片内时,它就从片外取指。如果单片机无片内存储器的话,那么这个端口就应该始终接低电平。/psen:当这个端口的电平为低时,就可以用单片机外部的存储器上进行读的操作。ale:可以当外部时钟脉冲使用,也可以用来扩展系统。p0:这个端口比较特殊,它作为i/o口使用时,要外接上拉电阻,不然的话无法拉高输出电平。当它作为地址/数据总线使用时,它是一个双向口,我们不必外接上拉电阻。p1:它只能作为i/o口使用,是一个标准的双向口。p2:这个端口和p0和p1这两个端口相似,但又不一样。它可以作为i/o口使用,也可以作为高8位的地址线a8到a15输出口使用。p3:这个端口跟前三种也不一样,它有两种功能,第一种功能是作为i/o口使用,这个很普通。第二种功能是一些比较特殊的功能,它的具体的特殊功能如下表2-1所示: 表2-1p3口的特殊功能管脚备选功能名称p3.0rxd串行输入口p3.1txd串行输出口p3.2/int0外部中断0p3.3/int1外部中断1p3.4t0记时器0外部输入p3.5t1记时器1外部输入p3.6/wr外部数据存储器写选通p3.7/rd外部数据存储器读选通xtal1,xtal2:这两个端口是用来设定单片机的时钟信号的。作为外部时钟时,用于外接时钟信号;当作为内部时钟时,常见的接法是接两个电容和一个晶振。2.2 液晶显示屏(lcd1602)介绍1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5x7或者5x11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。n1602lcd是指显示的内容为16x2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。管脚功能(1602采用标准的16脚接口):第1脚:vss为电源地 第2脚:vdd接5v电源正极 第3脚:v0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高。 第4脚:rs为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:rw为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:e(或en)端为使能(enable)端。 第714脚:d0d7为8位双向数据端。 第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。1602lcd的特性: +5v电压,对比度可调 内含复位电路 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器ddram 内建有192个5x7点阵的字型的字符发生器cgrom 8个可由用户自定义的5x7的字符发生器cgram1602lcd特征及应用:微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。2.3 各个模块电路的设计2.3.1 复位电路模块说明:该电路上电单片机自动复位,按下按键手动复位。2.3.2 晶体振荡电路模块说明:本设计采用外部振荡电路。在引脚xtal1和xtal2外接晶体振荡器(简称晶振)就构成了内部振荡方式。2.3.3 led电路模块说明:led灯采用灌电流方式连接。密码正确时,开锁,绿灯亮;密码错误时,不能开锁,红灯亮。2.3.4 矩阵键盘电路模块说明:用p1口组成4*4的矩阵键盘,各键的定义一次为:0、1、2、3、4、5、6、7、8、9、修改管理员密码、确定键、注册用户密码、该键按下才能进行密码输入操作、上锁、注册管理员密码。2.3.5 直流电机模块说明:有直流电通过时,电机会转动,对应的状态为密码锁已打开。2.3.6 液晶1602显示电路模块 说明:用于显示各个步骤的提示符以及当前正在操作的数据,起到直观提示和显示的效果。2.3.7 蜂鸣器电路模块说明:能够发出鸣叫,起到提示作用。在密码输入错误时,会连续鸣叫5声表示错误提示。同时也用于防撬功能中,起到报警防盗的效果。2.3.8 防撬报警电路模块说明:使用滚珠开关来进行防撬报警提示。当有人撬动密码锁时会导致滚珠开关倾斜,从而使得滚珠开关导通,蜂鸣器接通,发出鸣叫,起到报警作用。2.4 整体电路模块的设计3 电子密码保险箱系统的软件设计3.1 总程序流程图的设计3.2 开锁程序流程图的设计3.3 注册用户密码程序的设计4 电子密码保险箱系统的测试与分析 上电初始状态lcd显示:按注册管理员密码键后,出现提示符:进行管理员密码注册输入:按确定键后,显示已上锁状态,此时应按注册用户密码键:按下注册用户密码键后,出现提示,此时应该先输入管理员密码方可注册:若输入管理员密码正确,则显示ok及注册提示,可以注册用户密码1: 若输入管理员密码错误,则显示erro,蜂鸣器连续鸣叫5声,红色led灯亮,提示再次输入管理员密码,此时仍为上锁状态: 输入密码后按确定键完成用户密码注册1,同样的方法,可以注册用户密码2:在开锁时,按输入密码键进行密码输入和开锁:若密码(此时用户密码和管理员密码均可)正确,则开锁成功,显示ok,绿色led灯亮,直流电机反向转动;若密码错误,则显示erro,蜂鸣器连续鸣叫5声,红色led灯亮,提示再次输入管理员密码,此时仍为上锁状态(同上面管理员密码错误时一样)。 开锁成功后,要上锁,则可以按下上锁键,显示为已上锁状态:另外,在上锁情况下,可以按下修改管理员密码键,出现提示符后,即可对注册的管理员密码进行修改(输入新密码后按下确定键,显示为上锁状态,即表示已成功修改管理员密码):分析:以上为电子密码保险箱系统的测试内容,运用protues进行硬件仿真和软件测试,结果均为正确。符合设计要求的功能:密码输入,注册管理员密码,在注册用户密码时需要先输入管理员密码。当密码输入正确时,绿灯亮,电机反转,代表保险箱开启;当密码输入错误时,红灯亮,蜂鸣器连续叫五声,代表保险箱没开启,需重新输入密码。同时,实现了用液晶显示屏进行工作显示,系统可保存两个以上的用户密码,能够修改管理员密码以及具有防撬功能。5 结论本次设计的电子密码保险箱系统以at89c51为核心,用lcd1602液晶显示屏进行步骤显示,用led灯、蜂鸣器以及直流电机来表现实验效果,通过矩阵键盘来进行实现对密码锁的控制。通过对硬件的仿真及软件测试,实现了设计功能的要求。在设计本系统的过程中,小组各成员热情投入,相互配合,不仅学到了很多的知识,也培养了良好的团队精神。总之,电子竞赛是一个很好的平台,通过本次竞赛,我们小组各成员都受益匪浅。附件(程序):#include#define lcd p2 #define uchar unsigned char #define uint unsigned int#define no_key 20 /无按键时的返回值sbit rs=p30;sbit rw=p31;/lcd数据命令选择端sbit e=p32;/lcd使能信号端sbit key=p37;/开锁信号控制端sbit green=p36;sbit red=p35;sbit fm=p34;sbit enter=p13;/该键按下后才能进行输入密码等操作uchar keyflag=3;uchar conflag,conflag1,conflag0;uchar jz=20;/键值变量uchar temp1,temp11;/用此变量来存储键盘扫描的返回值,以便判断是否有键按下uchar table07;/初始密码uchar table97;/初始密码uchar code table12=zhuce yonghu1 ;uchar code table16=zhuce yonghu2 ;uchar code table3=enter please: ;uchar code table4=ok!;uchar code table6=erro!;uchar code table7=enter again: ; uchar code table8= locked! ;uchar code table10=can not more! ;uchar code table13= shuru mima ;uchar code table14=xiugai guanli;unsigned char m;uchar num,t0,keynum; uchar table57;/定义输入密码值存储数组uchar table157;/定义输入密码值存储数组uchar j,jk,tt,j1,j2,jk1=0;/*函数名称:delay*函数功能:软件延时,时间为z毫秒*入口参数:z延时控制值,值越大,延时越长*出口参数:无*/void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*函数名称:write_com*函数功能:1602写命令函数,可以用此函数写不同的指令*入口参数:com*出口参数:无*/void write_com(uchar com)rs=0;rw=0;e=0;p2=com;delay(5);e=1;delay(5);e=0;/*函数名称:write_date*函数功能:1602写数据函数,可以用此函数写不同的数据,程序对应的硬件1602的数据口为p2口*入口参数:date*出口参数:无*/void write_date(uchar date)rs=1;rw=0;e=0;p2=date;delay(5);e=1;delay(5);e=0;/*函数名称:init*函数功能:初始化函数*入口参数:无*出口参数:无*/void init() uchar num; e=0;write_com(0x38);/设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);/开显示,不显示光标write_com(0x06);/当读或写一个字符后地址指针加1,且光标加1write_com(0x01);/显示清屏:数据指针、所有显示清0while(1)p1=14|10|11|12|13|15|16|07; if(enter=0)break; /*检测enter(p1.3)键是否按下,只有该键按下才能进行输入密码等操作*/p1=04|10|11|12|13|15|16|17;while(enter);if(enter=0)delay(10);if(enter=0)write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x02);/设置数据地址指针for(num=0;num13;num+)write_date(table3num);/lcd显示enter please:delay(5); while(!enter);/判断按键是否释放delay(10);while(!enter);p1=0xff; /*函数名称:keyscan*函数功能:3*4键盘扫描*入口参数:无*出口参数:jz*/ uchar keyscan() uchar temp;p1=0xfe;/第一行扫描temp=p1;temp=temp&0xf0; while(temp!=0xf0)delay(5);temp=p1;temp=temp&0xf0;while(temp!=0xf0)temp=p1;switch(temp)case 0xee:jz=0;break;case 0xde:jz=1;break;case 0xbe:jz=2;break;case 0x7e:jz=3;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;p1=0xfd;/第二行扫描temp=p1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=p1;temp=temp&0xf0;while(temp!=0xf0)temp=p1;switch(temp)case 0xed:jz=4;break;case 0xdd:jz=5;break;case 0xbd:jz=6;break;case 0x7d:jz=7;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;p1=0xfb;/第三行扫描temp=p1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=p1;temp=temp&0xf0;while(temp!=0xf0)temp=p1;switch(temp)case 0xeb:jz=8;break;case 0xdb:jz=9;break;case 0xbb:jz=*;break;case 0x7b:jz=#;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;p1=0xf7;/第二行扫描temp=p1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=p1;temp=temp&0xf0;while(temp!=0xf0)temp=p1;switch(temp)case 0xe7:jz=10;break;case 0xd7:jz=11;break;case 0xb7:jz=12;break;case 0x77:jz=13;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0; temp=0xf0 ;return jz;void codefin() / 设置或修改管理员密码 uchar t=0;write_com(0x80+0x40+0x02);/重新设置lcd数据地址指针for(t=0;t7;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 temp1=keyscan();/继续扫描按键直至有键按下 table0t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/lcd显示* delay(5);jz=20;if(temp1=#)jk=t;break;if(t=6)jk=6;void codeffin() /设置用户密码1或用户密码2uchar t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x01);/设置数据地址指针if(!table90)for(num=0;num13;num+)write_date(table12num);/lcd显示zhuce yonghu1delay(5);write_com(0x80+0x40+0x02);/重新设置lcd数据地址指针for(t=0;t7;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 temp1=keyscan();/继续扫描按键直至有键按下 table9t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/lcd显示* delay(5);jz=20;if(temp1=#)j=t;break;if(t=6)j=6; else if(!table150)for(num=0;num13;num+)write_date(table16num);/lcd显示zhuce yonghu1delay(5);write_com(0x80+0x40+0x02);/重新设置lcd数据地址指针for(t=0;t7;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 temp1=keyscan();/继续扫描按键直至有键按下 table15t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/lcd显示* delay(5);jz=20;if(temp1=#)j2=t;break;if(t=6)j2=6;elsewrite_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x02);/设置数据地址指针for(num=0;num13;num+)write_date(table10num);/lcd显示zhuce yonghudelay(5);delay(100);/*/void codeain()/设置用户密码前先验证管理员密码并得到验证标志conflaguchar t=0;jz=20;write_com(0x80+0x40+0x02);/重新设置lcd数据地址指针for(t=0;t7;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 temp1=keyscan();/继续扫描按键直至有键按下 table5t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/lcd显示* delay(5);jz=20;if(temp1=#) jk1=t;break;if(jkjk1)jk=jk1; for(t=0;tjk;t+)if(table5t!=table0t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=jk)/要是条件退出的话说明六个数全对密码 conflag=1; / 进行标志密码正确elseconflag=0; void codein() /验证密码并得到标志conflag,conflag1uchar t=0;write_com(0x80+0x40+0x02);/重新设置lcd数据地址指针for(t=0;t7;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 temp1=keyscan();/继续扫描按键直至有键按下 table5t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/lcd显示* delay(5);jz=20;if(temp1=#) j1=t;break;if(jkj)jk=j; for(t=0;tjk;t+)if(table5t!=table0t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=jk)/要是条件退出的话说明六个数全对密码 conflag0=1; / 进行标志密码正确elseconflag0=0;if(jj1)j=j1; for(t=0;tj;t+)if(table5t!=table9t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=j)/要是条件退出的话说明六个数全对密码 conflag=1; / 进行标志密码正确elseconflag=0;if(j1j2)j1=j2; for(t=0;tj1;t+)if(table5t!=table15t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=j1)/要是条件退出的话说明六个数全对密码 conflag1=1; / 进行标志密码正确elseconflag1=0;/*函数名称:codeout*函数功能:根据密码输入正确与否作出相应的反应*入口参数:无*出口参数:无*/void codeaout() /验证管理员密码标志conflag后的液晶显示uchar t;if(conflag)t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x07);/设置数据地址指针for(t=0;t3;t+)write_date(table4t);/lcd显示ok!delay(5);delay(100);if(!conflag)t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x05);/设置数据地址指针for(t=0;t5;t+)write_date(table6t);/lcd显示erro!delay(5);write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x02);/设置数据地址指针for(t=0;t50;t+)write_date(table7t);/lcd显示enter again: delay(5); void codeout() /验证用户密码标志conflag,1conflag1。改变led灯、电机和蜂鸣器uchar t;if(conflag)|(conflag1)|(conflag0)t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x07);/设置数据地址指针for(t=0;t3;t+)write_date(table4t);/lcd显示ok!delay(5);red=1;green=0;key=1;temp11=keyscan();while(temp11!=12)/若相等则此时没有键按下 temp11=keyscan(); green=1; key=0; if(!(conflag)&!(conflag1)&!(conflag0)t=0;wri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 空中乘务专业教学标准(高等职业教育专科)2025修订
- 中医康复技术专业教学标准(高等职业教育专科)2025修订
- 小数乘小数(教学设计)-2024-2025学年五年级上册数学西师大版
- 2025年中国家用洗手液行业市场全景分析及前景机遇研判报告
- 2021-2026年中国海南省房地产行业投资分析及发展战略咨询报告
- 2025-2030年中国盘式真空机行业深度研究分析报告
- 免疫规划家长课堂
- 健康评估中的疼痛管理
- 2020-2025年中国婴儿配方食品行业市场调查研究及投资前景预测报告
- 2023-2029年中国高档铝木窗行业市场发展现状及未来发展趋势预测报告
- 2022-2023学年河南省郑州外国语中学数学八年级第二学期期末调研试题含解析
- RFJ05-2009-DQ人民防空工程电气大样图集
- Unit 2 Neither Pine nor Apple in Pineapple-高中英语外研版(2019)必修第一册
- 高危作业培训试卷及答案
- 有机基板课件
- 曹杨二中自招数学试卷(答案)
- 肝内胆管结石()
- 项目工程EHS管理
- 免疫学(全套课件)
- 热力工程竣工资料模板(含换热站)全
- 桥梁养护与加固教案
评论
0/150
提交评论