




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、【精品文檔】如有侵權,請聯系網站刪除,僅供學習與交流CT107D編程手冊.精品文檔.一、IO口編程IO編程,該開發板使用了573鎖存器,通過P2口的5,6,7位連接3-8譯碼器,擴展出了8個口,其中4個口分別連接4個573鎖存器,這里以的鎖存器來舉例:原理圖:分析代碼:();其中,與進行與運算,高三位清零,其余位保持原來狀態,不改變,即把控制譯碼器的高三位留出來:接著再或上;容易發現;或運算,與或結果為,與或結果不變,所以或上只需看的高三位,則高三位為,對應譯碼器的話,;所以輸出;再經過與非運算,看下圖示:則輸出;即對應的鎖存器的片選信號被選中,鎖存器打通,接下來就可以對口進行操作,操作完之后
2、,;高三位直接清零,此時Y4C=0,則把鎖存器鎖上了。類似的方法,數碼管、蜂鳴器等都是如此操作,選中鎖存器代碼:P2=(P2&0x1f)|(這里填對應鎖存器的位移號)。二、 數碼管動態掃描和定時器數碼管顯示分為段選和位選,數碼管定義和顯示函數:Code unsigned char tab = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned chardspbuf=10,10,10,10,10,1
3、0,10,10;unsigned chardspcom=0;void display()/段選,消隱P2=(P2&0x1f)|0xe0);P0=0xff;P2=P2&0x1f;/位選P2=(P2&0x1f)|0xc0);P0=(1<<dspcom);P2=P2&0x1f;/段碼輸入P2=(P2&0x1f)|0xe0);P0=tabdspbufdspcom;P2=P2&0x1f;if(+dspcom=8) dspcom=0;注意:這里1左移dspcom位,剛開始dspcom=0,則1左
4、移dspcom位依舊為1,接著dspcom每次自增1,1對應二進制00000001,即把1每次向左移,每次都比上一次多移一位,直至8位移完,對應8個數碼管。定時器配置:這里只需記住定時器的配置,知道怎么使用就可以了。首先有兩個定時器,T0和T1,(也有的單片機有T2),定時器有4種工作方式0,1,2,3;其中最常用的是方式1(16位),其次是方式2(8位自動重裝,串口通訊中斷會用到)。定時器需要配置:TMOD |=0x01;配置成使用定時器0,工作方式為1;同理使用定時器1工作方式1:TMOD|=0x10;則同時使用兩個定時器且工作方式為1,那么可以:TMOD|=0x11;定時器1配置成工作方
5、式2:TMOD |=0x20;接著配置(以定時器0舉例):TH0=(65535-2000)/256;/配置初值TL0=(65535-2000)%6;ET0=1;TR0=1;/定時0中斷EA=1;/總中斷定時器1也是同理的,只不過0要改成1.接著定時中斷函數和優先級:定時器0void isr_timer_0(void) interrupt1 /默認中斷優先級1 TH0= (65536-2000)/256; TL0= (65536-2000)%6; /定時器重載 display(
6、);定時器1:voidisr_timer_1(void) interrupt 3 /默認中斷優先級3 TH0= (65536-2000)/256; TL0= (65536-2000)%6; /定時器重載 display();注意:定時器0優先級為1,定時器1為3,串口中斷優先級為4,總共有5個中斷源,后面還會介紹外部中斷和串口中斷。數碼管動態掃描,顯示函數放在定時中斷函數里面,2ms掃一次是最穩定的!三、
7、60; 矩陣鍵盤矩陣鍵盤需要死記了!這里不再講獨立鍵盤。第二種單片機鍵盤掃描代碼(沒有消抖):sfrP44=0xC0;/鍵盤定義sbitr1=P30; /4行sbit r2=P31;sbit r3=P32;sbit r4=P33;/4列sbit c1=P44;sbit c2=P42;sbit c3=P35;sbit c4=P34;/讀取矩陣鍵盤鍵值unsigned charkey_scan() unsigned char key_value; r1=0;
8、60; r2=r3=r4=1; c1=c2=c3=c4=1; if(!c1) key_value=0; else if(!c2) key_value=1; else if(!c3) key_value=2; else if(!c4) key_value=3; r2=0; r1=r3=r4=1; c1=c2=c3=c4=1; if(!c1) key_value=4;&
9、#160; else if(!c2) key_value=5; else if(!c3) key_value=6; else if(!c4) key_value=7; r3=0; r2=r1=r4=1; c1=c2=c3=c4=1; if(!c1) key_value=8; else if(!c2) key_value=9; else if(!c3) key_value=10
10、; else if(!c4) key_value=11; r4=0; r2=r3=r1=1; c1=c2=c3=c4=1; if(!c1) key_value=12; else if(!c2) key_value=13; else if(!c3) key_value=14; else if(!c4) key_value=15; return key_value;四
11、、 串口通訊和串口中斷串口中斷配置只需記住幾個寄存器就行了,初始化: SCON =0x50; /串口配置成模式1TMOD|=0x20;/定時器1,方式2,8位自動重裝TH1=256-(unsigbedchar)(SYSTEMCLOK/BAUDRATE/384+0.5);/定時初值 ES=1; /串口中斷
12、打開 TR1=1; /啟動定時器1 EA=1; /總中斷打開這里必須使用定時器1,不能用定時器0.下面是模塊化的函數:void Uart_Init()SCON = 0x50;TMOD |=0x20;TH1=256-(SYSREMCLOCK/BAUDRATE/384+0.5);ES=1;TR1=1;EA=
13、1;void UartSend(unsignedchar*pBuff,int length)unsigned charc;int i=0;for(i=0;ic=pBuff;SBUF=c;while(TI=0);TI=0;接收數據可以這樣寫:定義全局變量:unsigned charuart_buf100;/串口緩沖區unsignedint uart_Count=0;/串口數據長度void uart_inte()interrupt 4 unsigned char c; if(RI)
14、 RI=0; c=SBUF; uart_bufuart_Count=c; uart_Count+;如果可以指定的接收,可以這樣寫/串口中斷服務函數void isr_uart(void)inte
15、rrupt 4 if(RI) RI = 0; /清除接收標志位 rxbufrxcnt = SBUF; if(rxbufrxcnt = 'n') rxcnt = 0; rx_over
16、= 1; ES = 0;/回車為接收結束標志,檢測到回車符后,關閉串口中斷 else rxcnt+;當接收完一幀數據時關閉串口中斷,設一個標志位,處理完之后再打開。#include"reg51.h"#include&quo
17、t;intrins.h"typedef unsigned charBYTE;typedef unsigned intWORD;BYTEcode_tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;char arry10="I CANPLAY"unsigned charx;#define FOSC11059200/12000000L /系統頻率#define BAUD115200
18、0; /串口波特率#defineNONE_PARITY 0 /無校驗#defineODD_PARITY 1 /奇校驗#defineEVEN_PARITY 2 /偶校驗#defineMARK_PARITY 3 /標記校驗#de
19、fineSPACE_PARITY 4 /空白校驗#define PARITYBITNONE_PARITY /定義校驗位sfrAUXR =0x8e; /輔助寄存器sfrP_SW1 =0xA2; /外設功能切換寄存器1#define
20、S1_S00x40 /P_SW1.6#define S1_S10x80 /P_SW1.7sbit P22 =P22;bit busy;void SendData(BYTEdat);void SendString(char*s);void main() ACC= P_SW1; ACC&= (S1_S0 |S1_S1);
21、 /S1_S0=0 S1_S1=0 P_SW1 =ACC; /(P3.0/RxD, P3.1/TxD)/ ACC= P_SW1;/ ACC&= (S1_S0 |S1_S1); /S1_S0=1 S1_S1=0/ ACC|=S1_S0; &
22、#160; /(P3.6/RxD_2, P3.7/TxD_2)/ P_SW1 = ACC; / ACC= P_SW1;/ ACC&= (S1_S0 |S1_S1); /S1_S0=0 S1_S1=1/ ACC|=S1_S1; /(P1.6/RxD_3, P1.7/TxD_3)/ P_SW1 = ACC; /#if (PARITYBIT =NONE_PARITY)&
23、#160; SCON=0x50; /8位可變波特率/#elif (PARITYBIT =ODD_PARITY) | (PARITYBIT = EVEN_PARITY) | (PARITYBIT =MARK_PARITY)/ SCON =0xda; /9位可變波特率,校驗位初始為1/#elif (PARITY
24、BIT =SPACE_PARITY)/ SCON =0xd2; /9位可變波特率,校驗位初始為0/#endif AUXR=0x40; /定時器1為1T模式 TMOD=0x20; &
25、#160; /定時器1為模式2(8位自動重載) TL1= (256 - (FOSC/32/BAUD); /設置波特率重裝值 TH1= (256 - (FOSC/32/BAUD); TR1=1; /定時器1開始工作 ES =1; &
26、#160; /使能串口中斷 EA =1; while(1)/ SendString(arry); SendString("I CAN PLAYrn");/上位機顯示接收文本模式/ SendData(x);void Uart() interrupt 4using 1 if(RI)/單片機接收數據,發送數字09,可
27、在數碼管上顯示,發送hex模式 RI =0; /清除RI位/ P0= SBUF; x=SBUF;/將緩存器的數據賦值給x P0=0xff;
28、; /消隱 P2|=0xe0; P2&=0x1f; P0=code_tabx; &
29、#160; /段選 P2|=0xe0; P2&=0x1f; P0=0x01; &
30、#160; /位選第一位 P2|=0xc0; P2&=0x3f; if(TI) TI =0; /清除TI位
31、 busy =0; /清忙標志void SendData(BYTEdat) while(busy); /等待前面的數據發送完成 ACC=dat;
32、/獲取校驗位P (PSW.0) if(P) /根據P來設置校驗位#if (PARITYBIT =ODD_PARITY) TB8 =0; /設置校驗位為0#elif (PARITYBIT =EVEN_PARITY)&
33、#160; TB8 =1; /設置校驗位為1#endif else#if (PARITYBIT =ODD_PARITY) TB8 =1; /設置校驗位為1#elif (PARITYBIT =EVEN_PARITY)
34、 TB8 =0; /設置校驗位為0#endif busy= 1; SBUF=ACC; /寫數據到UART數據寄存器void SendString(char*s) while(*s)
35、0; /檢測字符串結束標志 SendData(*s+); /發送當前字符記不住可以看手冊!#include"reg51.h"#include"intrins.h"typedef unsigned charBYTE;typedef unsignedint WORD;#define FOSC11059200L#de
36、fine BAUD115200sfrAUXR=0x8e; /輔助寄存器sbit P22=P22;bit busy;void SendData(BYTEdat);void SendString(char*s);void main() SCON=0x50; AUXR=0x40; /設置定時器T1為1T,即一個機器周期模式 TMOD=0x20; TL1=(256-(FOSC/32/BAU
37、D); TH1=(256-(FOSC/32/BAUD); TR1=1; ES=1; EA=1; SendString("Hello"); while(1);void Uart() interrupt 4using 1 if(RI)
38、 RI=0; P0=SBUF; if(TI) TI=0; busy=0;void SendData(BYTEdat)
39、160;while(busy); busy=1; SBUF=dat;void SendString(char*s) while(*s) SendData(*s+);五、 外部中斷的使用#includesbit L1=P00;in
40、t main()IT0=1;/IT0=1,下降沿觸發外部中斷0,IT0=0邊沿觸發EX0=1;/使用外部中斷0EA=1;while(1)void Ex_int0() interrupt 0 /外部中斷優先級最高P2=(P2&0x1f)|0x80);L1=L1;P2=(P2&0x1f); 其中,外部中斷的引腳控制是P32,P33,即對應獨立按鍵的S5,S4。六、 實時時鐘DS1302的使用藍橋杯提供函數,解釋
41、為:里面的命令和寫入的數據可以看芯片手冊:左側的READ、WRITE分別是讀寫的命令,BIT7-BIT0是要寫入的數據,根據需要進行配置。DS1302只需記住這兩個函數即可:Write_Ds1302( , )與Read_Ds1302(x),配置看手冊。重點:芯片表說明:第一行:秒->因為秒的范圍是0-59,所以6,5,4位表示秒的十位,3,2,1,0表示個位,十位最大是5,所以三位即可。第二行:跟上面一樣;第三行:7位:1為12小時制,0為24小時制;5位:12小時制時為0表示上午,1表示下午,24小時制時,和4位一起表示小時的十位;其余的時間一樣的表示。倒數第二行:只看7位:為1時禁止
42、寫數據,所以開始寫數據時必須置0;讀數時:!需要加“寫操作這一行代碼”。讀的話直接按照命令讀即可。DS1302進階(BCD碼轉換):解決之前60秒不能進位的問題。1)寫入初始值時,要把10十進制數轉換為碼,例:寫入時間:Ds1302_Single_Byte_Write(0x8e,0x00);/寫操作Ds1302_Single_Byte_Write(0x85, (17/10)<<4 |(17);/寫時 Ds1302_Single_Byte_Write(0x83, (58/10)<<4 |(58);/寫分Ds1302_Single_Byte_Writ
43、e(0x81, (50/10)<<4 |(50);/寫秒Ds1302_Single_Byte_Write(0x8e,0x80);/寫保護即轉換的公式是:(Value/10)<<4 | (Value),可以寫一個()函數。2 )讀數:讀回來的數要進行轉換成十進制數(ReadValue&0x70)>>4)*10 +(ReadValue&0x0F);八進制轉十進制->ReadValue=Ds1302_Single_Byte_Read(0x85); hour=(Read
44、Value&0x70)>>4)*10 +(ReadValue&0x0F); !(這句一定不要省) Ds1302_Single_Byte_Write(0x00, 0x00);/寫操作 ReadValue=Ds1302_Single_Byte_Read(0x83); minute=(ReadValue&0x70)>>4)*10 +
45、(ReadValue&0x0F); Ds1302_Single_Byte_Write(0x00, 0x00);/寫操作 ReadValue=Ds1302_Single_Byte_Read(0x81); sec=(ReadValue&0x70)>>4)*10 +(ReadValue&0x0F); &
46、#160; Ds1302_Single_Byte_Write(0x00, 0x00);/寫操作顯示: dspbuf0=hour/10; dspbuf1=hour; dspbuf2=minute/10; dspbuf3=minute;
47、160;dspbuf4=sec/10; dspbuf5=sec;七、 PCF8591與IIC總線的使用(1) IIC總線的使用:比賽提供了IIC的兩個庫文件,IIC.h;IIC.c,其中需要注意的函數是:其中,該函數是初始化的,當使用AD轉換的時候需要在main函數開始時調用,該函數內部只需看這句代碼即可:i2c_sendbyte(0x03);/ADC通道3,板上有4個模
48、擬輸入口,分別為0,1,2,3;設置哪一個模擬輸入口就是根據這句代碼,0x03表示通道3,這是根據芯片手冊配置的,如圖:8位前6位不用管,都為0,最后兩位就是配置選擇哪一個通道的。第二個函數:讀取AD轉換后的數值,這個函數直接調用就可以了,函數內部如何實現不用管,但是需要注意的是:該函數掃描調用最好是100ms。第三個函數,上面的都是轉換,即模擬信號轉數字信號,下面這個函數是DA轉換,數字信號轉換成模擬信號,就是單片機輸出數字信號,用萬能表去量單片機引出的引腳,量一下電壓大小,這個估計比賽不會考,不過預防萬一:該函數和上面兩個函數分離開來的,一、二函數是要在一起使用,初始化后之后才能調用,第三
49、個加入頭文件,直接調用即可,比較簡單!上面說法有誤,A/D轉換的初始化函數和讀取轉換后的數值都需要自己寫。這里了解一下PCF8591只需根據時序格式發送地址字節和控制字節:,這是地址字節,其中A2,A1,A0硬件已經接地,故都為0,最低位表示的是你要從IIC總線上讀數還是寫數據,1表示讀,0表示寫,即讀數據發的地址是:0x91;寫數據發的地址是0x90;控制字節:由芯片資料知,控制字節有8位,有兩位固定是0,除了第0、1位需要自己設置,其他的我們都設為0,那些位都是一些具體的功能,我們暫時用不著,不用管先,第0、1位是模擬通道選擇,PCF8591上提供了4路模擬通道,根據需求進行選擇,如選擇通
50、道3即發送控制字節:0x03;地址字節和控制字節都明白了,接下來根據時序要求進行配置,A/D轉換需要一個初始化函數:Init_ADpcf8591();和一個獲得AD轉換后的數值的函數:adc_pcf8591(); 其中初始化函數的作用是發送AD轉換的控制字節;adc_pcf8591()發送讀取得地址并讀回數據,先寫指令才能讀;格式如下:這個是初始化的協議:分別是startIIC、(地址寫)發送0x90、等待應答、發送控制字節(AD這里是選擇通道的指令,如選擇通道3,0x03)0x03、等待應答、(達到目的,沒有后續的操作,直接停止總線)StopIIC.初始化的函數就是如此寫;adc_pcf85
51、91的協議:依次是:startIIc、發送讀地址0x91、等待應答、讀回AD轉換后的數值、讀回后發送應答給PCF8591,表示收到,并且不需要再返回應答,要傳參數1,如圖紅圈示,即函數Ack(1);、最后stopIIC總線。D/A轉換(其實挺麻煩,先前太自信了,哈):所謂D/A轉換其實就是把數字信號轉換成模擬信號輸出,用單片機發數字通過D/A轉換成電壓輸出,檢測的方法可以用電壓表測量。配置的方法跟A/D類似,先發地址字節,再發控制字節,然后把數字發出去(AD這里是接收模擬信號,是相反的機制)。控制字節:如圖示,控制字節的第6位是1的話是模擬輸出模式,其余位全為0,發送格式跟AD一樣:代碼如一開
52、始圖示。(2) EEPROM的使用,AT24C02,可以掉電依舊保存上一次操作的數據,下次上電后接著運行。需要注意兩個函數,一個是寫進EEPROM里面保存,再次上電再從里面讀回來:其中寫函數需要指定AT24C02的地址以及需要寫入的數據,讀函數要想取回寫進的數據,需要從相同的地址里面讀:其中AT24C02的存儲地址是0x00,可以是其他地址,如0x02,但是讀和寫的地址必須一致。寫與讀的協議與AD或相同,由芯片資料及原理圖知()的寫地址為;讀地址為;注意:讀數的時候讀出一個數之后發送一個應答信號,若()表示還想繼續讀下一個字節,若();則不想再讀數,讓停止發送。八、
53、160; DS18B20時鐘芯片的使用比賽有提供代碼,只需記住這個函數:讀取溫度值,整數(其中,提示EA總中斷要打開、關閉,也可以不用)。浮點數的表示。注意,只有提供函數,沒有提供讀取溫度的函數,即上面的那個,只有下面:這幾個函數。編寫讀取溫度的函數需要記住DS13B20的三條指令,0xCC,跳過ROM檢測;然后啟動溫度轉換:0x44;轉換需要時間,這里精確延時Delay_OneWire(200);然后再次初始化,再次執行跳過,然后讀取溫度指令:0xBE.;注意讀出的溫度是低字節先
54、,然后才是高字節,分別用兩個變量保存還要通過公式轉換成我們需要的整數或浮點數。完整代碼如上圖示。九、 超聲波傳感器的使用#include"reg52.h" /定義51單片機特殊功能寄存器#include "intrins.h"#include "absacc.h"/12M用這個/11.0592用這個#define somenop_nop_();_nop_();_nop_();_nop_()
55、;_nop_(); _nop_();_nop_();sbit TX =P10; /發射引腳sbit RX =P11; /接收引腳code unsigned char tab = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
56、160; 0xff;unsigned char dspbuf8 =10,10,10,10,10,10,10,10; /顯示緩沖區unsigned char dspcom =0;unsigned int intr =0;bit s_flag;unsigned int t = 0;voidsend_wave(void);void display(void);void main(void) unsigned int distance; TMOD|= 0
57、x11; /配置定時器工作模式 TH0= (65536-2000)/256; TL0= (65536-2000)%6; TH1= 0; TL1= 0; EA =1; ET0= 1; /打開定時器0中斷 TR0= 1; /啟動定時器 while(1)
58、 if(s_flag) s_flag = 0; t = TH1; t <<= 8;
59、60; t |= TL1; distance = (unsigned int)(t*0.017); /計算距離
60、 TH1 = 0; TL1 = 0; dspbuf5 = distance/100; dspbuf6 = distance0/10; dspb
61、uf7 =distance; /定時器0中斷服務函數voidisr_timer_0(void) interrupt 1 /默認中斷優先級 1 TH0= (65536-2000)/256; TL0= (65536-2000)%6; /定時器重載display(); /2ms執行一次if(+intr = 200) s_flag = 1; intr =
62、 0;/顯示函數 void display(void) XBYTE0xE000 = 0xff; /去除鬼影 XBYTE0xC000 = (1<<dspcom); XBYTE0xE000 = tabdspbufdspcom;if(+dspcom = 8) dspcom = 0;/TX引腳發送40KHz方波信號驅動
63、超聲波發送探頭void send_wave(void)unsigned char i =8; /發送8個脈沖do TX = 1; somenop; TX = 0; somenop;while(i-);必要時還可以加個看門狗: WDT_CONTR=0x34;十、
64、0; 步進電機與直流電機的使用參考代碼如下:#includesbit A1=P14;/定義步進電機連接端口sbit B1=P13;sbit C1=P12;sbit D1=P11;void qudong1();#define Dy_A1A1=1;B1=0;C1=0;D1=0;/A相通電,其他相斷電#define Dy_B1A1=0;B1=1;C1=0;D1=0;/B相通電,其他相斷電#define Dy_C1A1=0;B1=0;C1=1;D1=0;/C相通電,其他相斷電#define Dy_D1A1=0;B1=0;C1=0;D1=1;/D相通電,其他相斷電
65、160; /采用1相勵磁#define Dy_OFFA1=0;B1=0;C1=0;D1=0;/全部斷電unsigned charSpeed,Speed1;void DelayUs2x(unsigned chart)while(-t);void DelayMs(unsigned chart)while(t-) /大致延時1mS DelayUs2x(245); DelayUs2x(245);main()Dy_OFF;for(;) qudong1();void qudong1()unsigned inti=470;/旋轉一周時間Speed=5;while(i-) /正向 Dy_A1 /遇到Coil_A1 用A1=1;B1=0;C1=0;D1=0;代替
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥學研究方法試題及答案指南
- 因果關系在護理研究中的試題及答案
- 掌握2025年主管護師考試的試題及答案
- 知識體系全面分析試題及答案
- 2025自考行政管理課程結構與試題及答案
- 2025年執業藥師考試基礎知識試題及答案
- 自考行政管理多元化考察試題及答案
- 2025年經濟法考試流程詳解試題及答案
- 提升執業護士考試通過率的試題及答案
- 專科咳嗽咳痰課件
- GB/T 10066.1-2004電熱設備的試驗方法第1部分:通用部分
- 被執行人財產申報表
- 吊裝安全確認表及技術交底
- 遙控器檢驗作業指導書
- DBJ41∕T 228-2019 河南省房屋建筑施工現場安全資料管理標準
- 三級安全教育考試試題(的)
- 生態環境執法大練兵練習(行政處罰法、新固廢法、大氣法)
- 芒針療法課件
- 小學二年級下冊科學課件1.《春夏秋冬》大象版(22張)ppt課件
- 第三章:船舶主機安裝工藝
- 鼻咽癌放療臨床路徑
評論
0/150
提交評論