付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机原理课程设计设计说明书设计题目:智能钟带密码锁程序设计设计者:李海军班级:自动化121学号:指导教师:陈伟利日期:2014.01.052014.01.16目录1 .设计的目的32 .设计原则和要求32.1 设计原则32.2 设计要求33 .设计任务33.1 设计思路33.2 设计题目要求43.3 设计流程44 .单片机及各模块选择54.1 AT89C51单片机54.2 矩阵键盘54.3 LCD160264.4 总系统仿真图75 .系统设计框图86 .主要程序介绍86.1 键盘扫描及键值返回程序86.2 LCD程序96.3 显小和中断程序96.4 密码锁程序107 .设计总结108 .参考
2、文献119 .附录12智能钟带密码锁的设计报告1.设计的目的1 .通过单片机原理与应用课程设计,使学生理解单片机系统设计的方法和设计原则及相应的硬件调试、软件编程方法。进一步理解单片机应用系统的设计和应用。2 .通过本次课程设计达到理论与实践相结合,提高学生分析问题和解决问题的能力。3 .学会使用电子图书馆的数据库资源进行查找相关文献和资料。4 .初步掌握Keil编程软件和Protues软件进行仿真设计,掌握编写设计说明书的基本方法。2 .设计原则和要求2.1 设计原则1 .合理性。所设计内容应符合国家相关政策和法令,符合现行的行业行规要求。2 .先进性。杜绝使用落后,淘汰的产品,不使用未经认
3、可的技术,要充分考虑未来发展。3 .实用性。考虑降低物耗,保护环境,综合利用等因素。2.2 设计要求1 .独立设计原理图及相应的硬件电路。2 .独立焊接电路板并对电路板调试。3 .针对选择的设计题目,设计系统软件。软件要做到:操作方便,实用性强,稳定可靠。4 .设计说明书格式规范,层次合理,重点突出。并附上设计原理图、电路板图及相应的源程序。3 .设计任务3.1 设计思路通过查找相关资料,复习单片机所学内容做好知识储备,然后根据题目要求利用Protues软件画出合理的仿真图,再利用Keil软件进行编程设计。多功能数字时钟和电子密码锁先分开仿真分别写程序,确定都仿真成功以后将两个程序合理的进行无
4、缝连接成为一个程序,最后将调试完成的程序写入同一个Protues仿真图中完成仿真。3.2 设计题目要求1 .多功能数字时钟(1)在显示屏上显示时间。时间格式:LED为“时:分”;LCD为“时:分:秒”。(2)可显示“年、月、日、周”等信息。(3)可对时钟的“年、月、日、周、时:分:秒”进行更改。(4)增加COM1口程序,实现用计算机软件程序调节时钟及其附加功能。(5)扩展定时控制功能(选作)。(6)扩展计时器功能,可实现30个计时记录。(7)自定义的扩展功能。2 .电子密码锁(1)上电启动时,即显示输入密码。如果用数码管做为显示,输入密码为自定义字符(非正常的数字或字符);如果采用LCD故为显
5、示,输入密码为“*”号。并要求有中文提示。(2)有修改密码的功能。但必须输入原密码后验正后才能修改密码。且修改密码也要两次验证。密码一旦更改,不再记忆原密码。密码为6位键盘码。(3)密码输入正确,显示开锁标志。否则,提示密码输入错误,并提示重新输入。当连续输入三次错误时,中止密码输入,并显示报警标志,2个小时后放可进行下一次密码输入。(4)设置一个万能的通用密码,在必要时使用。且此密码长度要超过6位。(5)设置COM勺接口程序,达到计算机可实现上述所有功能。(6)自定义的扩展功能。3.3 设计流程4 .单片机及各模块选择4.1 AT89C51单片机AT89C51是一种带4K字节闪烁可编程可擦除
6、只读存储器(FPEROMFalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS粒微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATME麻密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPlffi闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。其主要特性包括:(1)与MCS-51兼容(2)4K字节可编程闪烁存储器(3)三级程序存储器锁定(4)寿命:1000写/擦循环(5)128X8位内部RAM6)32可编程I/O线(7)两个16位定时器
7、/计数器(8)5个中断源(9)可编程串行通道(10)片内振荡器和时钟电路4.2 矩阵键盘考虑到单片机的I/O口是十分宝贵的,并且我设计的万年历在进行年月日、时分秒的调节时是按不同的按键从而进入调节模式,这样一共需要6个按键。同时还有一个六位的密码锁、一个确认输入密码按键、一个密码锁和万年历模式切换按键以及调节万年历的加减按键,这样一共需要16个按键。如果直接利用I/O口写的话必定会造成I/O口的浪费,这与设计原则不符,所以我决定采用矩阵键盘,这样只用八个I/O口就可以实现16按键控制。但是加减按键不能加入到矩阵键盘中,需要用两个I/O口单独引出。因为我写的程序中switch函数是对矩阵键盘的键
8、值进行寻键的,也就是只能在switch函数中执行一种情况。假使要对年份进行调节,按过年份调节按键后在按加减键是没有任何反应的。4.3LCD160216代表液晶显示器每行可显示16个字符,02表示显示两行,由字符库可看出显示器显示的数字和字母部分的代码,恰好是ASCII码表中的编码。单片机控制LCD1602M示时,只需将待显示字符部分的ASCII码写入内部的显示用数据存储器(DDRAM,内部控制电路就可将字符在显示器上显示出来。当向DDRAMJ00H0FH(第一行)、40H4FH(第二行)地址中的任一处写入数据时LCD将立即显示出来。LCD是慢显示器件,所以在写每一条命令前,一定要查询忙标志位B
9、F,即LCD1602g否处于“忙”状态。如果LCD正忙于处理其他命令,就等待;如果不忙,则向LCD?入命令。LCD的基本操作包括:(1)初始化LCD(2)读状态。检测“忙”标志位BF,如果BF为1说明LCD正处于忙状态,不能对其写命令;如果BF为0,则可以写入命令。(3)写命令。(4)写数据。将要显示字符的ASCII码写入LCD中的数据显示RAMDDRAM(5)自动显示。我之所以用LCD1602是因为用数码管显示万年历和密码锁每次都要清屏(防止残影产生造成显示乱码)并且数码管由于本身的限制无法显示字符,在实际应用的时候没有LCD方便。同时,如果选用数码管的话必定会导致I/O的浪费,数码管要进行
10、段码和位码的选择,而LCD则会简单很多。4.4总系统仿真图R9T©TEjJ1RW10k33pC2II比四母拉说0:方热手口QM算钠q将词句解班松肚景字mE将d甘扑斜调幅致率2目西工系.卜时网11St字1CRY3TA-.R2J1RsJlR5HPt/llRJlR8jljwJ10J10it)kidJ10JWkJ_ilr4ehggzOOCOiZiOOOJ=i_*HI10uJ曰州吕十干再范7rI.rrj.snjjP1.6P3GiWRP1.5P3.5JT1P1.4P3.-4JTDP1.3P3.3J1NT1P1.2P3JANT0P1.1P3ijTTKDP1.0P3.0AXDAT89C61P”内5P
11、2.BW14EAPZ5阂3nLkr,2.4FAl上PSENIP2.3AM1P2.2A1DP2.1岫P2.(MBRSIPU7/AD?P0&AD6F0.5/AD5P0.4/AD1KTSL2F0.3ZAD3P0.2/AD2F0.1/AD1>liP0DWDDE39Enufi?535P0436P033?P023£P01JS.Fno5.系统设计框图)密码输入正确LCD®示万年历开启启动万年历显示模式按下年、月、日等启动调节模式按下加减键调节确认调节完毕,正常显示行列值中间变量行线输出全为0读入列线值先检测有无按键按下去抖6.主要程序介绍6.1 键盘扫描及键值返回程序1.键
12、盘扫描程序键盘扫描函数unsignedcharKeyScan(void)/(unsignedcharcord_h,cord_l;/P1=0x0f;/cord_h=P1&0x0f;/if(cord_h!=0x0f)/(delay(10);/if(P1&0x0f)!=0x0f)cord_h=P1&0x0f;/读入列线值P1=cord_h|0xf0;/输出当前列线值cord_l=P1&0xf0;/读入行线值while(P1&0xf0)!=0xf0);/return(cord_h+cord_l);/return(0xff);/返回该值2.键值返回程序unsign
13、edcharKeyPro(void)switch(KeyScan()case0xee:returnkeyval=1;break;/0等待松开并输出键盘最后组合码值按下相应的键显示相对应的码值说明:case中有很多还有很多情况,此处并未列写,此处返回的键值方便主函数中的switch语句寻键时比较方便。并且这样在主函数中调用键盘扫描函数时只需写“KeyPro();"即可。6.2 LCD程序1. 判断液晶的忙碌状态函数:unsignedcharBusyTest(void)2. 将指令写入液晶模块:voidWriteInstruction(unsignedchardictate)3. 指定字
14、符显示的实际地址:voidWriteAddress(unsignedcharx)4. 将数据(字符的ASCII码)写入液晶模块:voidWriteData(unsignedchary)5. LCD的初始化:voidLcdInitiate(void)说明:将这些LCD的小程序都写成函数的形式,方便其调用,具体的程序会在附录中给出6.3 显小和中断程序1 .将年份、月份、日期、小时、分钟、秒分别做成函数再调用2 .所有的计时共能全部写在中断程序中6.4 密码锁程序Flag=1;/先把比较位置1for(j=0;j<8;j+)/循环比较8个数值,/如果有一个不等则最终Flag值为0Flag=Fl
15、ag&&(tempj=dofly_DuanMapasswordj);/比较输入值和已有密码for(j=0;j<8;j+)/清屏TempDataj=0;if(Flag)/如果比较全部相同,标志位置1TempData0=0x3f;/"o"TempData1=0x73;/"p"TempData2=0x79;/"E"TempData3=0x54;/"n"说明:主程序中密码锁程序的一部分,密码锁的原理是将按键值存在缓存区中然后与之前设置好的密码数组每一位都经行比较,如果每一位都相同的话则Flag为1,经
16、行OPEN勺显示。如果有一位不相同的话则Flag为0,经行LOCK勺显示。7.设计总结在本次智能钟带密码锁的课程设计中,学习兼理论与实践相结合,初步掌握综合运用所学知识,增强了动手解决实际问题的能力。学会了踏实的迈开第一步。我分析应该将两者先分开设计然后再合在一起。按照这个思路我准备先进行万年历的设计,开始我想用数码管进行设计,因为原来用数码管做过秒表和一个简单的时钟。我找到自己原来写的程序,在此之上我又加了一个8个显示的数码管进行年份、月份、日期的显示,但是这样只能用下加的小数点来区分年月日。一共用两个数码管,一个6位一个8位,但是在画图的时候发现这样会浪费非常多的I/O口,即便是用74LS
17、138等译码器也会用到很多端口,而且也不算很好控制,所以我决定还是用LCD160怵显示。用LCD显示其实比较简单,像LCM始化,忙位检测,读命令,写命令等都可以写成函数直接调用,把要显示的字符串写成字符串数组的形式然后直接调用就好。我设计的电子锁并没有实现可以直接按键改动密码的功能,该密码只能通过对程序中的密码进行更改,也没有实现密码三次输入三次锁屏的效果,所以我设计成了只要输入错误则万年历就不会显示的效果,但是你可以通过重新选择解锁模式经行密码的重新输入,只要输入正确即可显示更改万年历。开始合成两个程序的时候首先要解决定时器的问题,因为两个程序用的定时器不太一样,但是发现其实相差并不算太大,
18、所以我让两者公用一个定时器,即将两者的中断程序写在同一个中断函数中。又因为两者要有一个传递的关系即解锁才能显示万年历,所以我把密码锁的程序写在显示万年历的switch函数中,让两者呈现出一种传递关系。通过这次课程设计,综合运用本专业所学课程的理论和生产实际知识智能钟带密码锁相结合,培养并提高了我独立工作的能力,巩固与扩充了课堂所学内容,掌握智能钟设计的方法,步骤及方案了解了智能钟的基本结构,熟悉了规范和标准同时各科相关的知识都有了全面的复习,独立思考的能力也有了提高。8 .参考文献1邱关源.电路M.(第四版)北京:高等教育出版社,2006,241-2682张海兵,李敏.protel电路设计实例
19、与分析M.北京:人民邮电出版社,2005,119-2053徐晓秋.单片机原理及接口技术M.北京:国防工业出版社,2008,102-1124刘迎春.MCS-51单片机原理及应用教程M.北京:清华大学出版社,2005,145-1575张奇,朱宁西.单片机应用系统技术设计:基于C51的proteus仿真M.(第二版)北京:电子工业出版社,2009,245-2646兰建军,伦向敏,关硕编著.单片机原理、应用与Proteus仿真M.北京:机械工业出版社,2014.7陈洪财主编.单片机原理与应用技术M.哈尔滨:哈尔滨工程大学出版社,2014.8楼然苗,胡佳文,李光飞编著.51系列单片机原理及应用M.北京:
20、北京航空航天大学出版社,2014.10.119张刚毅主编.单片机原理及应用M.北京:高等教育出版社,2012.11.10周润景,张丽娜,丁莉编著.基于PROTEU的电路及单片机设计与仿真M.北京:北京航空航天大学出版社,2010.01.9 .附录#include<reg51.h>#include<stdlib.h>#include<intrins.h>sbitRS=P2A0;/将RS位定义为P2.0sbitRW=P2A1;/将RW立定义为P2.1sbitE=P2A2;/将E位定义为P2.2sbitBF=P0A7;/将BF位定义为P0.7sbitP25=P2A
21、5;sbitP24=P2A4;sbitP23=P2A3;unsignedcharcodedigit=""unsignedcharcodestring="Data:"unsignedcharcodestring1="Password:*"unsignedcharcodestring2="Calendar:OPEN"unsignedcharcodestring3="CalendarLOCK"unsignedcharcount;/定义变量统计中断累计次数unsignedchars,m,h,day,mo
22、n;/定义变量储存秒、分钟、小时、天和月份unsignedcharkeyval;/定义寻键变量unsignedintyear;/定义变量储存年份voiddelay1ms()unsignedchari,j;for(i=0;i<10;i+)for(j=0;j<33;j+);/*函数功能:延时若干毫秒*/voiddelay(unsignedcharn)unsignedchari;for(i=0;i<n;i+)delay1ms();/*按键扫描函数,返回扫描键值键盘扫描函数*/unsignedcharKeyScan(void)/unsignedcharcord_h,cord_l;/行
23、歹1J值中间变量P1=0x0f;/cord_h=P1&0x0f;/if(cord_h!=0x0f)/(delay(10);/if(P1&0x0f)!=0x0f)(cord_h=P1&0x0f;/P1=cord_h|0xf0;/cord_l=P1&0xf0;/行线输出全为0读入列线值先检测有无按键按下去抖读入列线值输出当前列线值读入行线值while(P1&0xf0)!=0xf0);/等待松开并输出return(cord_h+cord_l);/键盘最后组合码值return(0xff);/返回该值/*函数功能:判断液晶模块的忙碌状态返回值:result。res
24、ult=1,忙碌;result=0,不忙*/unsignedcharBusyTest(void)bitresult;RS=0;/根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1;/E=1_nop_();/,才允许读写空操作_nop_();_nop_();_nop_();/空操作四个机器周期,给硬件反应时间result=BF;/E=0;/将忙碌标志电平赋给result将E恢复低电平(while(BusyTest()=1);/RS=0;/RW=0;E=0;/Ereturnresult;/*函数功能:将模式设置指令或显示地址写入液晶模块*/voidWriteInstruction(
25、unsignedchardictate)如果忙就等待根据规定,RS和R/W同时为低电平时,可以写入指令置低电平(根据表8-6,写指令时,E为高脉冲,13_nop_();_nop_();/空操作两个机器周期,给硬件反应时间P0=dictate;/将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_();/空操作四个机器周期,给硬件反应时间E=1;/E置高电平_nop_();_nop_();_nop_();_nop_();/空操作四个机器周期,给硬件反应时间E=0;/当E由高电平跳变成低电平时,液晶模块开始执行命令/就是让E从0到1发生正跳变,所以应先置&q
26、uot;0"/*函数功能:指定字符显示的实际地址*/voidWriteAddress(unsignedcharx)WriteInstruction(x|0x80);/*函数功能:将数据(字符的标准ASCII码)写入液晶模块*/voidWriteData(unsignedchary)while(BusyTest()=1);RS=1;/RSRW=0;E=0;/E为高电平,RW为低电平时,可以写入数据置低电平(根据表8-6,写指令时,E为高脉冲,/就是让E从0到1发生正跳变,所以应先置"0"P0=y;/_nop_();_nop_();_nop_();_nop_();/E
27、=1;/E_nop_();_nop_();_nop_();_nop_();/E=0;/将数据送入P0口,即将数据写入液晶模块空操作四个机器周期,给硬件反应时间置高电平空操作四个机器周期,给硬件反应时间当E由高电平跳变成低电平时,液晶模块开始执行命令/*函数功能:对LCD的显示模式进行初始化设置*/voidLcdlnitiate(void)(delay(15);/Writelnstruction(0x38);/delay(5);/WriteInstruction(0x38);delay(5);WriteInstruction(0x38);/delay(5);WriteInstruction(0x
28、0c);/delay(5);WriteInstruction(0x06);/delay(5);WriteInstruction(0x01);/delay(5);*延时15ms,首次写指令时应给LCD一段较长的反应时间显示模式设置:16X2显示,5X7点阵,8位数据接口延时5ms,给硬件一点反应时间连续三次,确保初始化成功显示模式设置:显示开,无光标,光标不闪烁显示模式设置:光标右移,字符不移清屏幕指令,将以前的显示内容清除/*函数功能:显示小时*/voidDisplayHour()(unsignedchari,j;取整运算,求得十位数字取余运算,求得各位数字写显示地址,将十位数字显示在第2行第
29、5列将十位数字的字符常量写入LCD将个位数字的字符常量写入LCDi=h/10;/j=h%10;/WriteAddress(0x44);/WriteData(digiti);/WriteData(digitj);/*函数功能:显示分钟*/voidDisplayMinute()(unsignedchari,j;i=m/10;j=m%10;WriteAddress(0x47);/写显示地址,将十位数字显示在第2行第8列WriteData(digiti);WriteData(digitj);15/*函数功能:显示秒*/voidDisplaySecond()unsignedchari,j;i=s/10;
30、j=s%10;WriteAddress(0x4a);/写显示地址,将十位数字显示在第2行第11列WriteData(digiti);WriteData(digitj);/*函数功能:显示年份*/voidDisplayYear()unsignedchari,j,a,b;i=year/1000;j=(year/100)%10;a=(year/10)%10;b=year%10;WriteAddress(0x06);/写显示地址,将千位数字显示在第1行第7列WriteData(digiti);WriteData(digitj);WriteData(digita);WriteData(digitb);/
31、*函数功能:显示月份*/voidDisplayMon()unsignedchari,j;/写显示地址,将十位数字显示在第1行第12列i=mon/10;j=mon%10;WriteAddress(0x0b);WriteData(digiti);WriteData(digitj);/*函数功能:显示天数*voidDisplayDay()(unsignedchari,j;/写显示地址,将十位数字显示在第1行第15列i=day/10;j=day%10;WriteAddress(0x0e);WriteData(digiti);WriteData(digitj);/*函数功能:显示万年历*Ivoidsho
32、w()(/显示年份/给硬件一点反应时间/显示月份/显示天数/显示小时显示分钟显示秒DisplayYear();delay(5);DisplayMon();delay(5);DisplayDay();delay(5);DisplayHour();delay(5);DisplayMinute();/delay(5);DisplaySecond();/delay(5);/*按键值处理函数,返回扫键值*/unsignedcharKeyPro(void)switch(KeyScan()case0xee:returnkeyval=1;break;/0按下相应的键显示相对应的码值case0xde:retur
33、nkeyval=2;break;/1case0xbe:returnkeyval=3;break;/2case0x7e:returnkeyval=4;break;/3case0xed:returnkeyval=5;break;/4case0xdd:returnkeyval=6;break;/5case0xbd:returnkeyval=7;break;/6case0x7d:returnkeyval=8;break;/7case0xeb:returnkeyval=9;break;/817case0xdb:returnkeyval=10;break;/9/*mainfunction*voidmain
34、(void)unsignedchari,a,b;P1=0x0f;LcdInitiate();/调用LCD初始化函数TMOD=0x01;/TH0=(65536-46083)/256;/使用定时器T0的模式1定时器T0的高8位设置初值定时器T0的低8位设置初值EA=1;/开总中断ET0=1;/定时器T0中断允许TR0=1;/启动定时器T0count=0;/中断次数初始化为0s=0;/秒初始化为0m=0;/分钟初始化为0h=0;/小时初始化为0day=8;/天数初始化0mon=1;/月份初始化0year=2015;/年份初始化0TL0=(65536-46083)%256;/while(1)KeyPr
35、o();delay(5);switch(keyval)case1:if(a=4)if(b=0)LcdInitiate();/调用LCD初始化函数b+;/WriteAddress(0x00);i=0;/写地址,从第1行第1列开始显示从字符数组的第1个元素开始显示继续while(stringi!='0')/只要没有显示到字符串的结束标志0',就(WriteData(stringi);/i+;/WriteAddress(0x46);/WriteData(':");/WriteAddress(0x49);/WriteData(':");Wri
36、teAddress(0x0a);WriteData('-');WriteAddress(0x0d);WriteData('-');show();break;case2:if(a=4)(DisplayYear();if(P24=0)(delay(100);if(P24=0)year+;if(P23=0)(delay(100);if(P23=0)year-;break;case3:if(a=4)(DisplayMon();if(P24=0)(delay(100);if(P24=0)mon+;if(mon=13)mon=1;将第i个字符数组元素写入LCD指向下一个数组元素写地址,将第二个分号显示在第2行第7列将分号的字符常量写入LCD写地址,将第二个分号显示在第2行第10列/写地址,第一个破折号写在第一行11列/写地址,第一个破折号写在第一行14列19)if(P23=0)(delay(100);if(P23=0)mon-;if(mon=0)mon=12;)break;case4:if(a=4)(DisplayDay();if(P24=0)(delay(100);if(P24=0)day+;if(day=31)day=1;)if(P23=0)(delay(100);if(P23=0)day-;if(day=0)day=30;)break;case5:if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年农业机械用钢材品种升级与需求预测
- 护理质量评价标准及方法
- 临泉六年级科学淮北生态测试卷
- 肺癌术后伤口愈合的促进措施
- 初中情绪管理心理设计2025
- 职场护士培训获取
- 老年人旅游安全与健康准备
- 美容护理工具的社交影响
- 26年心脏毒性发生机制深度解读
- 初中生废物利用说课稿2025
- 2026广东东莞市城市管理和综合执法局招聘编外聘用人员6人备考题库及答案详解(真题汇编)
- 2026年7月浙江高中学业水平合格考生物试卷试题(含答案详解)
- 2026年真空镀膜机电源行业分析报告及未来发展趋势报告
- 2025年劳动保障监察大队招聘考试真题(附答案)
- 煤矿尽职调查报告
- 2026年高中历史教师招聘试题及答案
- 2025年《青铜葵花》(曹文轩)阅读测试题和答案
- (完整版)气体灭火系统安装施工方案
- (正式版)T∕CPCPA 0017-2026 托育机构婴幼儿回应性照护服务规范
- (2026版)视网膜中央动脉阻塞神经介入专家共识课件
- 2025年四川省广元市八年级地理生物会考考试真题及答案
评论
0/150
提交评论