版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——单片机试验指导书
单片机试验指导书
指导老师:李念强
电子信息与通信工程系
2023-3-6
第一部分单片机下载软件使用说明
使用AT89S5X系列单片机必需使用该下载软件,使用STC系列单片机则不需要使用该软件。
progisp是超强的AT系列芯片下载软件,它支持所有的AVR芯片的编程,支持AT89S51/AT89S52,支持自定义并口下载编程器,支持自定义串口的下载编程器,支持USBASP编程器,支持并口的并行编程器,支持USBProg编程器,支持自定义编程芯片,支持自定义编程熔丝信息提醒信息,支持USBProg的在线升级,支持USBProg-C实现脱机下载,支持自定义汉化信息提醒,支持工程管理--可以将所有的配置数据与编程数据打包为单一文件。
1、如何安装?
progisp是一个绿色软件,直接解压缩即可使用,进入软件主目录,运行“progisp.exe〞(将该文件设为桌面快捷方式,便利以后操作)即可运行程序。
2、如何使用?
运行“progisp.exe〞后,进入以下界面:
按以下步骤进行操作:①选择芯片:AT89S52。
②②点击“调入Flash〞,选择要下载的HEX文件。③点击“自动〞即可完成下载。
其次部分Keil软件使用说明
利用KeilSoftware可以开发所有8051系列单片机的嵌入式应用。KeilSoftware的8051开发工具提供以下程序,可以用它们来编译C源码,汇编源程序,连接和重定位目标文件和库文件,创立HEX文件,调试目标程序。
一、uVision2集成开发环境
uVision2IDE是一个基于Window的开发平台,包含一个高效的编辑器,一个项目管理器和一个MAKE工具。
uVision2支持所有的KEIL8051工具,包括C编译器,6过程:
?全功能的源代码编辑器。
?器件库用来配置开发工具设置。?项目管理器用来创立和维护项目o
?集成的MAKE工具可以汇编,编译和连接嵌入式应用。?所有开发工具的设置都是对话框形式的。
?真正的源代码级的对CPU和外围器件的调试器。
?高级GDI(AGDl)接口用来在目标硬件上进行软件调试,以及和Monitor-51进行通信。
?与开发工具手册和器件数据手册和用户指南有直接的链接。
二、关于开发环境
uVision2界面提供一个菜单,一个工具条以便快速选择命令按钮,另外还有源代码的显示窗口,对话框和信息显示。uVision2允许同时开启浏览多个源文件。
1、项目管理
工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。一个单一的uVision2工程能够产生一个或多个目标程序。产生目标程序的源文件构成“组〞。开发工具选项可以对应目标,组或单个文件。
uVision2包含一个器件数据库(devicedatabase),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定微控制器的要求。此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extradatapointer)或者加速器(mathaccelerator)的特性。
uVision2可以为片外存储器产生必要的连接选项:确定起始地址和规模。
2、集成功能
uVision2的强大功能有助于用户按期完工。
?集成源极浏览器利用符号数据库使用户可以快速浏览源文件。用详细的符号信息来
优化用户变数存储器。
?文件寻觅功能:在特定文件中执行全局文件探寻。?工具菜单:允许在V2集成开发环境下启动用户功能。?可配置SVCS接口:提供对版本控制系统的入口。?PC-LINT接口:对应用程序代码进行深层语法分析。?Infineon的EasyCase接口:集成块集代码产生。
?Infineon的DAVE功能:协助用户的CPU和外部程序。DAVE工程可被直接输入
uVision2。
三、编辑器和调试器
1、源代码编辑器
uVision2编辑器包含了所有用户熟悉的特性。彩色语法显像和文件辩识都对C源代码进行和优化。可以在编辑器内调试程序,它能提供一种自然的调试环境,使你更快速地检查和修改程序。
2、断点
uVision2允许用户在编辑时设置程序断点(甚至在源代码未经编译和汇编之前)。用户启动V2调试器之后,断点即被激活。断点可设置为条件表达式,变量或存储器访问,断点被触发后,调试器命令或调试功能即可执行。在属性框(attributescolumn)中可以快速浏览断点设置状况和源程序行的位置。代码覆盖率信息可以让你区分程序中已执行和未执行的部分。
3、调试函数语言
uVision2中,你可以编写或使用类似C的数语言进行调试。
1).内部函数:如printf,memset,rand及其它功能的函数。2).信号函数:模拟产生CPU的模拟信号和脉冲信号。3).用户函数:扩展指令范围,合并重复动作。
4、变量和存储器
用户可以在编辑器中选中变呈来观测其取值。双层窗口显示,可进行以下调整:1).当前函数的局部变量
2).用户在两个不同watch窗口页面上的自定义变量
3).堆栈调用(callstack)页面上的调用记录(树)(calltree)4).不同格式的四个存储区
四、创立应用
如何创立一个新的工程?按如下步骤可建立一个新的工程1、首先开启Keil软件的开发环境,如下图所示。
2、点击菜单project,选择newproject:
3、输入工程文件的名字,选择你要保存的路径,譬如保存到Keil目录里,工程文件的名字
为test,如下图所示,然后点击保存。
4、这时弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,
keilc51几乎支持所有的51内核的单片机,例如,选择Atmel公司的AT89C51,可以选择ATMEL?AT89C51,然后点击确定。
5、点击确定后,弹出一个对话框,如下:询问是否复制标准8051启动代码并将其参与已
建工程中。按“是“,进入下一步。
6、接下来要创立一个源程序文件,建立一个汇编或.C文件,假使你已经有源程序文件,可
以忽略这一步,点击菜单File?New:
7、输入一个简单的程序,如下:
8、选择菜单File?Save
9、选择你要保存的路径,在文件名里输入文件名,注意一定要输入扩展名,假使是C程序
文件,扩展名为.C,假使是汇编文件,扩展名为.asm(或.a51),假使是ini文件,扩展名为.ini,其他文件类型,譬如注讲解明文件,可以保存为.txt的扩展名。这里将文件保存为asm结尾的源程序文件,所以扩展名为.asm,保存为test.asm的名字,点击保存。
10、点击Target1前面的+号,展开里面的内容sourceGroup1:
11、用鼠标右键点击SourceGroup1(注意用鼠标右键),弹出一个菜单,选择AddFilestoGroup?SourceGroup1?。选择方才编写的文件test.asm
假使在上述目录下看不到该文件,文件类型选Allfiles(*.*),将显示该目录下的所有文件。12、点击Add按钮,将文件参与工程。
注意:在类型Type一栏,选Assemblylanguagefile。
然后,点击OK按钮,把文件参与工程。点击CLOSE按钮,关闭该对话框。出现如下画面。
13、双击test.asm文件,可以开启文件,程序出现变色显示,说明程序已被系统辨识。
五、参数设置
1、接着上图,用鼠标右键点击Target1,选择OptionsforTarget?Target1?,出现下图:
Xtal(Mhz):是设置单片机的工作的频率,默认是24.OMHZ,假使单片机的晶振用的是1l.0592Mhz,那么在框里输入ll.0592(单位是Mhz,所以带小数点)。
UseOn-chipROM(0x0—0xfff):这个选项是使用片上的FlashRom,我们知道At89C51有4k的flashRom,取决于你的应用系统,你的单片机的EA接高电平的话,请选中这个选项,假使单片机的EA接低电平,表示使用外部Rom,不要选中该项。我们在这里选中它。
Off-chipCodememory:表示你在片外接的Rom的开始地址和大小,假使你没有外接程序存储器,那么不要填任何数据.我们在这里假设使用一个片外的Rom,地址从Ox8000开始(不要填成8000,假使是8000,是10进制的数,一般填16进制的数),Size为外接Rom的大小.假设接了一块0x1000字节的rom。最多可以外接3块Rom,假使还用了别的地址,就添上。
Off-ChipXdataMemory:那么可以填上你外接的Xdata(外部数据存储器的起始地址和大小,一般的应用是接一个62256,我们在这里特别的指定Xdata的起始地址为Ox2000,大小为Ox8000;
CodeBanking:是使用CodeBanking技术.keil可以支持程序代码超过64k的状况,最大可以有2兆的程序代码。假使代码超过64k,那么就要使用CodeBanking技术,以支持更多的程序空间.CodeBanking是一个高级的技术,支持自动的Bank的切换,是建立一个大型系统的需要,譬如要在单片机里实现汉字字库,实现汉字输入法,都要用到该技术.我们在这里不选中它。
MemoryModel:用鼠标点击MemoryModel的下拉箭头,会有3个选项。Small:变量存储在内部ram里.
Compact:变量存储在外部ram里,使用页8位间接寻址Large:变量存储在外部Ram里,使用16位间接寻址.
一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,假使内部ram不够了,才会存到外部去.Compact的方式要自己通过程序来指定页的高位地址,编程比较繁杂,假使外部ram很少,只有256个字节,那么对该256个字节的读取就比较快,
用MO@Ri,A或MOA,@Ri指令。
假使超过256字节,那么要不断地进行切换的话,就比较麻烦。Compact模式适用于比较少的外部ram的状况.Large模式,是指变量会优先分派到外部ram里,用MOA,@DPTR或MO@DPTR,A来读取.要注意的是,3种存储方式都支持内部256字节和外部64k字节的ram.区别是变量的优先(或默认)存储在哪里的区别.除非你不想把变量存储在内部ram,才使用后面的Compact,Large模式.由于变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small的模式.使用Small的方式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,譬如:unsignedcharxdataa;那么变量a就存储在外部的ram.unsignedchara;变量存储在内部ram.
假使用Large的模式:
unsignedcharxdataa:那么变量a就存储在外部的ram.unsignedchara;变量存储在外部ram.
这就是区别,就是说这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里,譬如上面的变量定义unsignedchara.
那么我们最好选择Small.
CodeRomSize:用鼠标点击下拉箭头,将有3个选项:
Small:program2KOrless:适用于89c2051这些芯片,2051只有2k的代码空间,所以跳转地址只有2k,编译的时候会使用ACALLAJMP这些短跳转指令,而不会使用LCALL,LJMP指令,假使你的代码跳转超过2k,那么会出错。
Compact:2kfunctions,64kprogram:表示每个子函数的程序大小不超过2k,整个工程可以有64k代码.就是说在main()里可以使用LCALL,LJMP指令,但在子程序里只会使用ACALL,AJMP指令.除非你确认你的每个子程序不超过2k,否则不要用Compact方式。
Large:64Kprogram:表示程序或子函数都可以大到64k.使用codebank还可以更大.寻常我们都选用该方式.CodeRomSize选择Large方式速度不会比Small慢好多,所以一般没有必要选择Compact和Small的方式.这里选择Large方式.
Operating:点击下拉箭头有3个选项:None:表示不使用操作系统
RTX—51TinyReal—Time0s:表示使用Tiny操作系统RTX—51FullReal—Time0s:表示使用Full操作系统
Keilc51提供了tiny系统(demo版没有tiny系统,正版软件才有),Tiny是一个多任务操作系统,使用定时器0来做任务切换.一般用11.0592Mhz时,切换任务的速度为30毫秒.假使有10个任务同时运行,那么切换时间为300毫秒.同时不支持中断系统的任务切换.也没有优先级.由于切换的时间太长,实时性大打折扣,多任务状况下(譬如5个),轮一次就要150毫秒,150毫秒才处理一个任务,连实现键盘扫描这些事情都不行.更不要说串口接收,外部中断等.同时切换需要大约1000个机器周期,对cpu的浪费很大,对内部ram的占用也很厉害.实际上用到多任务操作系统的状况少之又少.关键是不适用.多任务操作系统一般适合于16位,32位的cpu,不适合8位cpu.
Keil的多任务操作系统的思想值得学习,特别是任务切换的算法,如何切换任务和保存堆栈等,有一定的研究价值.假使熟悉了其切换的方法,可以编写更好的切换(譬如将一次切换的时间从30毫秒改为3毫秒,实用性会好一些。2、编译输出设置(产生.HEX文件)
在上图中,点击OUTPUT,弹出如下界面:
SelectFolderforObjects:为最终生成的可执行文件,选择文件夹。NameofExecutable:对生成的可执行文件进行命名。
CreateHexFile:选中小方框,编译输出将产生用于最终烧录的Hex文件,不选中,
则不会产生。
六、程序调试与仿真
[程序调试]
完成以上工作后,就可以对程序进行调试与仿真了。具体步骤如下:
1、进行编译,Project?BuildTarget(RebuildAllTargetFiles,工程包含文件不止一个)。
2、有错误出现,在编译窗口,对错误类型和出错原因有详细说明,双击错误标号,就会定位在程序的相应处,修改错误,保存,再进行编译,直到全部通过为止。
编译完全通过后,就可以进行功能仿真了。
[程序仿真]
1、Debug?Start/StopDebugSession
图中,从左边方框中可观测程序运行时,R0—R7,A,B,SP,PC,PSW等特别功能寄放器的值,便于及时了解运行结果的对错。还可以观测内部RAM的运行值,例如30H,VIEW?memorywindow,在地址窗口输入要观测地址,内部RAM(I:0X00—0X7F)30H单元,I:0X30H.从下图可以看出,运行结果为3。外部存储器单元(X:0X000000—0X00FFFFH)。
除此之外,仿真环境还可以观测、仿真实际外设的运行状况,譬如,定时/计数器,串口,P0,P1,P2,P3口,中断等。
观测外设窗口:点击Peripherals按钮,弹出如下菜单,包含5个功能菜单:
Interrupt:中断设置与激活。
调试技巧:外部中断INT0对应于P3.2口线,因此,用鼠标单击PORT3窗口从右向左数第三位(P3.2口线对应的位),每单击两次,触发一次中断,原因是外部中断是下降沿或低电平有效的。
外部中断INT1的试验方法与外部中断INT0基本相像。
I/O-ports:包含四个端口,即P0、P1、P2、P3。
单击PORT0,将弹出具体窗口,可以观测运行的结果。用鼠标可对其进行设置,更改运行时的数据。
Serial:可对串口进行设置,具体如下:
Timer:对定时器/计数器进行设置。单击Timer0,出现如下画面。
第三部分试验指导书
试验1、熟悉单片机开发环境
目的:熟悉单片机的开发环境,把握把握单片机的编程和调试方法。内容:
(1)由拨码开关输入开关量到单片机。单片机根据不同的开关量输出相应的信号,点亮或熄灭LED发光管。
(2)让小灯进行多种方式显示。向单片机端口发送不同的数据,点亮LED灯。所需设备:51单片机主控模块。
51单片机LED小灯拨码开关试验原理1:
试验步骤:
连接单片机模块P1口与LED灯的连线,以及P2口与拨码开关模块的连线。将P2定义为输入,接至拨码开关,把P2口的数据送出到P1口,用LED灯显示。程序代码:
ORG0000HAJMPMAINORG0040H
MAIN:MOVP2,#0FFH
MOVA,P2NOPNOP
MOVP1,ANOPNOPNOPNOPNOPNOP
AJMPMAINEND
试验原理2:
试验步骤:
连接单片机模块P2口与LED灯的连线,控制LED灯有多种显示方式,如:流水打灯,逐个熄灭/点亮,交织点亮/熄灭等。试验结果:8个LED灯依次熄灭程序代码:流水打灯:
ORG0000H
AJMPMAINORG0040H
MAIN:??ACALLDELAY
AJMP
LOOP
R7,#0FFH;延时程序R6,#0FFH
DELAY:MOVAGAIN1:MOVAGAIN:NOPNOPDJNZDJNZRETEND
R6,AGAIN
R7,AGAIN1
试验2、交通灯试验
目的:提高学生理论联系实际的能力,观测实际的交通灯的工作方式,在试验箱上实现。内容:通过端口数据的不同,控制交通灯。所需设备:51单片机主控模块。
交通灯微动开关试验原理:
试验步骤:P2.0、P2.1、P2.2分别对应接到交通灯S/N方向的1、2、3控制端;P2.3、P2.4、P2.5分别对应接到交通灯E/W方向的4、5、6控制端。(1—RED,2—YELLOW,3—GREEN,4—RED,5—YELLOW,6—GREEN)。程序代码:
ORG0000HAJMPMAINORG0040H
MAIN:?
?AJMPMAIN
DELAY:MOVR7,#0FFH;延时程序AGAIN1:MOVR6,#0FFHAGAIN:NOPNOPDJNZR6,AGAINDJNZR7,AGAIN1RETEND
试验3、数字时钟试验
利用CPU内部系统资源,实现数字时钟。
内容:用单片机实现确凿定时,串行口显示时间。所需设备:51单片机主控模块。
8位静态数码管
试验原理:
试验步骤:
连接好数码显示模块与单片机模块的RXD、TXD,了解74HC164驱动8段LED数码管(共阳)的编码规则,串并转换IC74HC164管脚低电平日对应的数码管段显示,从而组成不同的数字和代码。
试验板上LED数码管显示模块所对应的“0—9〞的编码为:77H、14H、0B3H、0B6H、0D4H、
0E6H、0E7H、33H、0F7H、0F4H灭:00H试验结果:显示走动的时间。
;连线:P3.0-->Data,P3.1-->CLK
程序代码:
ORG0000HAJMPMAIN
MAIN:MOVSP,#70H
?
ACALLTimer;定时1秒子程序?ACALLBCDACALLDISPACALLDELAY?
DISP:MOVSCON,#00H;显示子程序
MOVR0,#60HMOVR2,#08H
L00C9:MOVSBUF,@R0L00CB:JNBTI,$
CLRTIINCR0DJNZR2,L00C9
ACALLDELAYRET
BCD:MOVR0,#60H;转换为BCD码
MOVR2,#08H
MOV
TAB:MOV
MOVCMOVINCDJNZRET
TABL:DB
DB
DBDBDBDBDBDBDBDBDB;
DELAY:MOVAGAIN1:MOVAGAIN2:MOVAGAIN:NOP
DJNZ
DJNZDJNZRETEND
DPTR,#TABLA,@R0
A,@A+DPTR@R0,AR0
R2,TAB77H;014H;10B3H;20B6H;30D4H;40E6H;50E7H;634H;70F7H;80F4H;900H;灭R5,#0FFHR7,#0ffHR6,#01HR6,AGAIN2R7,AGAINR5,AGAIN1
试验4、外部中断试验
目的:把握外部中断的产生方式和中断的处理过程。内容:通过单脉冲产生中断,使LED灯点亮。所需设备:51单片机主控模块。
试验原理:
+5V微动开关AT89S51INT0/P3.2INT1/P3.3K1K2GNDP1.0+5V
试验步骤:
中断脚P3.2(INT0)或者P3.3(INT1)与按键模块的按键连接,P1.0接到LED小灯。试验结果:
按K1时,LED点亮1秒后熄灭;按K2时,LED点亮2秒后熄灭。程序代码:
ORG0000HAJMPMAINORG0003H;0中断入口地址AJMPK1_1SORG0013H;1中断入口地址AJMPK2_2SORG0033HMAIN:MOVSP,#60HMOVP1,#0FFHSETBEASETBEX1;开外中断1SETBEX0;开外中断0SJMP$
K1_1S:CLRP1.0acalldelay1ssetbP1.0RETI
K2_2S:CLRP1.0acalldelay1sacalldelay1ssetbP1.0
RETI
DELAY_1S:
MOVR6,#50
D1:MOVR4,#20D2:MOVR5,#248
DJNZR5,$DJNZR4,D2DJNZR6,D1RETEND
试验5、定时器/计数器试验
目的:把握单片机中断的原理,定时器/计数器计数以及使用方法、。
内容:通过定时器1来定时产生中断控制P1.0线上的脉冲输出,驱动LED灯闪烁。所需设备:51单片机主控模块。
单片机P1口LED灯
试验原理:
试验步骤:连接单片机模块P1.0LED灯的连线。试验结果:LED灯闪烁。
程序代码:
ORGAJMPORGAJMPORG
MAIN:MOV
MOVMOV
MOV
SETBSETBSETB
LL:NOPNOP
NOPNOP
AJMP
INTQR:?RETIEND
0000H
MAIN001BHINTQR001DHSP,#60HTMOD,#10HTH1,#00HTL1,#00HEAET1TR1
LL
试验6、频率测量试验
目的:把握简易频率计的原理及频率测量的方法,深入了解定时计数器的使用。
内容:由分频模块引一脉冲信号到单片机引脚P3.4/T0,由单片机测量并显示出其频率值。所需设备:51单片机主控模块、红外通信/标准信号源模块。
静态数码管信号源单片机P3口
试验原理:
利用定时/计数器T0的计数功能,记录单片机引脚P3.4/T0上在一定时间(1s)内的脉冲数,即该脉冲的频率,然后将其直观的显示在数码管上。
P3.0/RXDP3.1/TXD静态数码管89S51P3.4/T0
程序代码:MAIN:
ORGMOVSETBMOVMOVMOVSETBLCALLCLRMOVMOV??
LCALLLCALLAJMP
0000HSP,#70HP3.4
TMOD,#05HTH0,#00HTL0,#00HTR0DELAYTR030H,TL031H,TH0
BCDDISPMAIN
;双字节二进制数转换成三字节bcd码,bcd码存于50H开始的三个单元,其中高位字节在前,二进制数低位字节存于30H,高位存于31HDBINTBCD:MOVR1,#50HMOVR5,#03H
CLRALOOP1:MOV@R1,AINCR1DJNZR5,LOOP1MOVR7,#10HLOOP4:MOVR0,#30HMOVR6,#02HCLRCLOOP2:MOVA,@R0RLCAMOV@R0,AINCR0DJNZR6,LOOP2MOVR1,#50HMOVR5,#03HLOOP3:MOVA,@R1ADDCA,@R1DAAMOV@R1,AINCR1DJNZR5,LOOP3DJNZR7,LOOP4RET
;双字节bcd分解成单字节bcd,R0指向带分解的bcd数的地址,R1指向转换后的存放单元BCDD2S:MOVA,@R0ANLA,#0FHMOV@R1,AINCR1MOVA,@R0SWAPAANLA,#0FHMOV@R1,ARET
BCD:MOVR0,#60HMOVR2,#08HBCD1:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业化物流管理与服务承包协议书版A版
- 2025年度农业现代化项目合作种植养殖合同范本3篇
- 2025年度健康医疗大数据分析与应用服务合同4篇
- 2025年度剧本改编委托创作合同样本3篇
- 2025年度商务写字楼租赁及商务配套服务合同4篇
- 2024版设备与集成服务采购合同
- 2025年度航空航天器材定制厂家合同样本3篇
- 2024年金融投资与咨询服务合同标的及投资领域
- 二零二五年度老旧小区改造安置房交易协议范本3篇
- 2024矿物资源勘探技术与咨询服务协议版
- 资本金管理制度文件模板
- 2025年生产主管年度工作计划
- 2025年急诊科护理工作计划
- 高中家长会 高二寒假线上家长会课件
- 违规行为与处罚管理制度
- 个人教师述职报告锦集10篇
- 四川省等八省2025年普通高中学业水平选择性考试适应性演练历史试题(含答案)
- 《内部培训师培训》课件
- 《雷达原理》课件-3.3.3教学课件:相控阵雷达
- 西方史学史课件3教学
- 2024年中国医药研发蓝皮书
评论
0/150
提交评论