




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第五章第五章 C51吸取了匯編語言的精華吸取了匯編語言的精華 提供了對位、字節(jié)及地址的操作,使程序可以直接對內提供了對位、字節(jié)及地址的操作,使程序可以直接對內存及指定寄存器進行控制;存及指定寄存器進行控制; 吸取了宏匯編技術中的某些靈活的處理方法,提供宏代吸取了宏匯編技術中的某些靈活的處理方法,提供宏代換換#define和文件蘊含和文件蘊含#include的預處理命令;的預處理命令; C51繼承和發(fā)揚了高級語言的長處繼承和發(fā)揚了高級語言的長處 C51 的可移植性好的可移植性好 生成的代碼質量高生成的代碼質量高目前使用目前使用C51開發(fā)系統(tǒng)最流行的是開發(fā)系統(tǒng)最流行的是Keil C51軟件平臺軟件
2、平臺 5.1 C51語言特點語言特點3/2/2022n5.2 標識符與關鍵字標識符與關鍵字 C51的標識符的標識符 C51的標識符基本同標準的的標識符基本同標準的C語言語言C51的關鍵字的關鍵字C51的關鍵字有的關鍵字有ANSI C標準的關鍵字,見表標準的關鍵字,見表5-1所示;所示;C51擴展的關鍵字,見表擴展的關鍵字,見表52所示(這里略)。所示(這里略)。3/2/2022n5.3 C51程序設計的基本規(guī)則程序設計的基本規(guī)則5.3.1 數據類型與存儲模式數據類型與存儲模式一、一、C51數據類型數據類型 數據類型 大小 數表示范圍char/unsigned char8 bit-128127
3、/ 0255int/unsigned int16 bit-3276832767 / 065535long/unsigned long32 bit-21474836482147483647/04294967295float/double32 bit1.75494E-38 3.402823E+38 C51實際上不支持雙精度浮點數實際上不支持雙精度浮點數double,即便定義了即便定義了double,也是按照,也是按照float處理的。處理的。1、基本數據類型、基本數據類型3/2/20222、C51擴充數據類型擴充數據類型3/2/2022二、常量、變量與數據存儲模式二、常量、變量與數據存儲模式常量和
4、變量一樣可以有不同的數據類型。常量和變量一樣可以有不同的數據類型??梢杂靡粋€標識符可以用一個標識符const來聲明一個量是常量。來聲明一個量是常量。例:例:unsigned char system_status=0;unsigned int unit_id2;const char samp_string16;float outport_value; 常量常量在程序運行的過程中,其值始終不能改變的量。在程序運行的過程中,其值始終不能改變的量。 變量變量在程序運行的過程中其值可以改變的量。在程序運行的過程中其值可以改變的量。3/2/2022 還可以使用預編譯語句還可以使用預編譯語句#define定
5、義定義符號常量符號常量:#define CONST100#define NULL0#define TRUE1#define FALSE0 符號常量的值不能改變,它僅僅是代表某個固符號常量的值不能改變,它僅僅是代表某個固定常數的一個符號而已。定常數的一個符號而已。 習慣上符號常量通常用大寫,而變量用小寫,習慣上符號常量通常用大寫,而變量用小寫,注意養(yǎng)成良好的編程習慣。注意養(yǎng)成良好的編程習慣。3/2/2022C51變量定義格式:變量定義格式:存儲種類存儲種類 數據類型數據類型 存儲器類型存儲器類型 變量名變量名;存儲種類存儲種類 auto (自動自動) extern (外部外部) static (
6、靜態(tài)靜態(tài)) register (寄存器寄存器) 如果省略,則默認為如果省略,則默認為auto3/2/2022存儲器類型存儲器類型存儲區(qū)描述data尋址片內低128字節(jié),速度最快(MOV);bdata尋址片內20H-2FH的單元(bit 位); idata間接尋址片內256字節(jié)(MOV Ri ); pdata尋址外部存儲區(qū)的256個字節(jié)(MOVX Ri ),一般是片外RAM第一頁空間;xdata尋址外部64KRAM ( MOVX DPTR );code尋址程序區(qū)(MOVC A+DPTR 或MOVC A+PC);3/2/2022(1)data區(qū)區(qū) 對對data區(qū)的尋址是最快的,所以應該把使用頻區(qū)的
7、尋址是最快的,所以應該把使用頻率高的變量放在率高的變量放在data區(qū)。區(qū)。 注意使用注意使用data區(qū)不要超過區(qū)不要超過data區(qū)的范圍,除了區(qū)的范圍,除了包含程序變量外,還包含了包含程序變量外,還包含了堆棧堆棧和和寄存器組寄存器組。 當內部堆棧溢出時,程序會莫名其妙地復位,當內部堆棧溢出時,程序會莫名其妙地復位,實際原因是實際原因是8051系列微處理器沒有硬件報錯機制,系列微處理器沒有硬件報錯機制,堆棧溢出只能以這種方式表示出來堆棧溢出只能以這種方式表示出來unsigned int data k1,k2; char data inp_string16;3/2/2022(2)bdata區(qū)區(qū) 在
8、在bdata區(qū)定義變量,這個變量的每個位就可區(qū)定義變量,這個變量的每個位就可進行位尋址。進行位尋址。 unsigned char bdata s1;unsigned int bdata s2;sbit flag=s14;if(s215) flag=1;3/2/2022 idata區(qū)也可存放使用比較頻繁的變量,區(qū)也可存放使用比較頻繁的變量,使用寄使用寄存器作為指針進行尋址存器作為指針進行尋址。(3)idata區(qū)區(qū)int idata y110; float idata outp_value;3/2/2022 在這兩個區(qū)聲明變量和在其它段的語法是一樣的。在這兩個區(qū)聲明變量和在其它段的語法是一樣的。p
9、data區(qū)只有區(qū)只有256個字節(jié),而個字節(jié),而xdata區(qū)可達區(qū)可達65536個字個字節(jié)節(jié)。(4)pdata和和xdata區(qū)區(qū) 對對pdata區(qū)尋址比對區(qū)尋址比對xdata區(qū)尋址要快,因為對區(qū)尋址要快,因為對pdata區(qū)尋址只需要裝入區(qū)尋址只需要裝入8位地址,而對位地址,而對xdata段尋段尋址需裝入址需裝入16位地址,位地址,所以盡量把外部數據存儲在所以盡量把外部數據存儲在pdata段中。段中。3/2/2022(5)code區(qū)區(qū) 代碼區(qū)的數據是不可改變的,一般代碼段中可代碼區(qū)的數據是不可改變的,一般代碼段中可存放存放數據表數據表、跳轉向量跳轉向量和和狀態(tài)表狀態(tài)表,代碼段中的變量代碼段中的變量
10、在定義的時候需要初始化,在定義的時候需要初始化,否則就得不到想要的值。否則就得不到想要的值。unsigned int code unit_id2=1234;unsigned char code Num= 0 x00, 0 x01, 0 x02, 0 x03, 0 x04, 0 x05, 0 x06, 0 x07, 0 x08, 0 x09, 0 x10, 0 x11, 0 x12, 0 x13, 0 x14, 0 x15;3/2/2022如果在變量定義時略去存儲類型,編譯器會自動選擇如果在變量定義時略去存儲類型,編譯器會自動選擇默認的存儲類型默認的存儲類型,而默認的存儲類型進一步由,而默認的存
11、儲類型進一步由SMALL、COMPACT和和LARGE存儲模式指令限制。存儲模式指令限制。存儲模式說明SMALL參數及局部變量放入data區(qū),默認存儲類型是data,??臻g位于片內idata(片內RAM)COMPACT參數及局部變量放入pdata區(qū),默認存儲類型是pdata(片外RAM);??臻g位于片內idata(片內RAM)LARGE參數及局部變量放入xdata區(qū),默認存儲類型是xdata,模擬堆棧位于片外xdata(片外RAM)存儲模式可以在存儲模式可以在Keil C51編譯器中設置編譯器中設置3/2/2022 Keil C編譯器能產生高度優(yōu)化的代碼,但你編譯器能產生高度優(yōu)化的代碼,但你可
12、以幫助編譯器產生更好的代碼。可以幫助編譯器產生更好的代碼。使用使用Keil C時應做的和應該避免的時應做的和應該避免的3/2/2022 一個提高代碼效率的最基本的方式就是減小變量一個提高代碼效率的最基本的方式就是減小變量的長度。使用的長度。使用C編程時,我們都習慣于對循環(huán)控制變編程時,我們都習慣于對循環(huán)控制變量使用量使用int類型,這對類型,這對8位的單片機來說是一種極大的位的單片機來說是一種極大的浪費。應該仔細考慮你所聲明的變量值可能的范圍,浪費。應該仔細考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型。然后選擇合適的變量類型。很明顯,經常使用的變量應該是很明顯,經常使用的變量應該是u
13、nsigned char,只占用一個字節(jié)只占用一個字節(jié):(1)采用短變量)采用短變量unsigned char data n;3/2/2022 如果程序中可以不需要負數,那么把變量都定如果程序中可以不需要負數,那么把變量都定義成無符號類型的變量義成無符號類型的變量:(2)使用無符號類型)使用無符號類型 unsigned int data n1,n2;3/2/2022 在在8位操作系統(tǒng)上使用位操作系統(tǒng)上使用32位浮點數是得不償位浮點數是得不償失的。你可以這樣做,但會浪費大量的時間。所失的。你可以這樣做,但會浪費大量的時間。所以當你要使用浮點數的時候,你要問問自己是否以當你要使用浮點數的時候,你要
14、問問自己是否一定需要。一定需要。 可以通過提高數值數量級和使用整型運算來可以通過提高數值數量級和使用整型運算來消除浮點指針。處理消除浮點指針。處理int和和long比處理比處理double和和float要方便得多,代碼執(zhí)行起來會更快。要方便得多,代碼執(zhí)行起來會更快。 如果一定要采用浮點指針的話,應該采用已如果一定要采用浮點指針的話,應該采用已經對數處理進行過優(yōu)化的單片機。經對數處理進行過優(yōu)化的單片機。 (3)避免使用浮點數)避免使用浮點數3/2/2022(4)使用位變量)使用位變量 對某些標志位應使用位變量對某些標志位應使用位變量bit而不是而不是unsigned char,節(jié)省內存。不用多浪
15、費節(jié)省內存。不用多浪費7位存儲區(qū),而且位變量在位存儲區(qū),而且位變量在RAM中訪中訪問只需要一個處理周期。問只需要一個處理周期。 把變量定義成局部變量比全局變量更有效率,編譯把變量定義成局部變量比全局變量更有效率,編譯器為局部變量在器為局部變量在內部存儲區(qū)中分配存儲空間內部存儲區(qū)中分配存儲空間,而為,而為全局全局變量在外部存儲區(qū)中分配存儲空間變量在外部存儲區(qū)中分配存儲空間,這會降低訪問速度。,這會降低訪問速度。 (5)用局部變量代替全局變量)用局部變量代替全局變量 考慮到存儲速度,按下面的順序使用存儲器:考慮到存儲速度,按下面的順序使用存儲器:data、idata、pdata、xdata,但要記
16、得留出足夠的堆??臻g。,但要記得留出足夠的堆棧空間。(6)為變量分配內部存儲區(qū))為變量分配內部存儲區(qū)3/2/2022sfr 特殊功能寄存器名特殊功能寄存器名 = 地址常數;地址常數;例如例如: sfr P0 = 0 x80;/定義了定義了I/O口口P0,其地址為,其地址為80Hsfr P1 = 0 x90;/定義了定義了I/O口口P1,其地址為,其地址為90H (可參考可參考Keil C51 中中reg51.h 各定義各定義)5.3.2 對硬件主要資源的定義對硬件主要資源的定義一、一、sfr定義方法定義方法3/2/2022編程時包含頭文件即可編程時包含頭文件即可 #include 或或 #in
17、clude 在在reg51中中,已經宏定義了所有已經宏定義了所有SFR寄存器。如:寄存器。如:/* BYTE Register */ sfr P0 = 0 x80; sfr P1 = 0 x90; sfr P2 = 0 xA0; sfr P3 = 0 xB0; sfr PSW = 0 xD0; sfr ACC = 0 xE0;sfr B = 0 xF0; sfr SP = 0 x81; sfr DPL = 0 x82; sfr DPH = 0 x83; sfr PCON = 0 x87; sfr TCON = 0 x88;sfr TMOD = 0 x89; sfr TL0 = 0 x8A; s
18、fr TL1 = 0 x8B; sfr TH0 = 0 x8C; sfr TH1 = 0 x8D; sfr IE = 0 xA8;sfr IP = 0 xB8; sfr SCON = 0 x98; sfr SBUF = 0 x99; sfr AUXR = 0 x8e; 3/2/2022sfr16 特殊功能寄存器名特殊功能寄存器名 = 地址常數地址常數 ;如:對于如:對于8052單片機的定時器單片機的定時器T2,可采用如下的方法來定義。,可采用如下的方法來定義。sfr16 T2 = 0 xCC;/定義定義timer2,其地址為,其地址為T2L=0 xCC,T2H=0 xCD二、二、sfr16定義
19、方法定義方法三、三、sbit 定義方法定義方法sbit 位變量名位變量名 = 位地址;位地址;sbit OV = 0 xD2 ;/ 定義了定義了PSW中的溢出標志中的溢出標志sbit CY = 0 xD7 ;/ 定義了定義了PSW中的進位標志中的進位標志sbit clk = 0 x91;/ 定義了定義了P1.1口信號線口信號線3/2/2022sbit 位變量名位變量名 = 特殊功能寄存器名特殊功能寄存器名位位置位位置sfr PSW = 0 xD0 ;sfr P1 = 0 x90 ;sbit OV = PSW2 ;/定義了定義了PSW的第的第2位為溢出標志位為溢出標志sbit CY = PSW7
20、 ;/定義了定義了PSW的第的第7位為進位標志位為進位標志sbit clk = P11 ; /定義了定義了P1的第的第1位為信號線位為信號線sbit 位變量名位變量名 = 字節(jié)地址字節(jié)地址位位置位位置sbit OV = 0 xD02 ;sbit CY = 0 xD07 ;sbit clk = 0 x901;3/2/2022sbit 位變量名位變量名 = 可位尋址對象可位尋址對象位位置位位置8051單片機內部單片機內部0 x200 x2F可位尋址區(qū)稱之可位尋址區(qū)稱之“可位尋址對象可位尋址對象”int bdata inumb ;/ 在位尋址區(qū)定義在位尋址區(qū)定義一個整型變量一個整型變量inumb c
21、har bdata bary4;/在位尋址區(qū)定義一個字符數組在位尋址區(qū)定義一個字符數組bary4sbit mybit0 = inumb0 ;/整型變量的第整型變量的第0位(共位(共16位)位)sbit mybit15 = inumb15;/整型變量的第整型變量的第15位位sbit ary07 = bary07; /第第1個字節(jié)中的第個字節(jié)中的第7位位sbit ary37 = bary37; /第第4個字節(jié)中的第個字節(jié)中的第7位位reg51.h和和reg52.h也包含有位定義,編程時包含頭文件即可也包含有位定義,編程時包含頭文件即可3/2/2022例如:例如:#include sbit P10=
22、P10;sbit P12=P12;main()P10=1;P12=0;PSW=0 x08;3/2/2022利用利用bit只能定義一個普通的位變量,取值只能定義一個普通的位變量,取值0或或1。 (定義的變量在(定義的變量在8051的的20H-2FH字節(jié)中)字節(jié)中)如,如,bit a,b,c; /定義了三個位變量定義了三個位變量a、b、c。這三個位變量應位于。這三個位變量應位于/8051內部內部00H7FH中的某三位。中的某三位。 四、四、bit 定義方法定義方法3/2/2022使用使用#define宏定義宏定義如,如, #include /XBYTE的頭文件的頭文件 #define PORTA
23、XBYTE0 x8000 /將將PORTA定義為外部定義為外部I/O口,地址為口,地址為0 x8000 main() PORTA=0 x3A; /將數據將數據3AH寫入地址為寫入地址為0 x8000的的I/O端口端口 使用地址定位使用地址定位 _at_ 定義定義如,如,unsigned char xdata x_data _at_ 0 x50; /這是以這是以0 x50開頭的外部地址,無符號字符變量數組開頭的外部地址,無符號字符變量數組x_data 的起址的起址 unsigned char xdata x_data0 x40 _at_ 0 x50; /這是以這是以0 x50開頭的外部地址空間開
24、頭的外部地址空間, 為為0 x40個個 unsigned char xdata Y0 _at_ 0 x1000; /這是以這是以0 x1000開頭的外部地址,無符號字符變量開頭的外部地址,無符號字符變量Y0的起址的起址 五、對片外擴展五、對片外擴展I/O或地址的定義方法或地址的定義方法3/2/2022使用指針變量操作外部地址使用指針變量操作外部地址 如如: unsigned char xdata * px; /定義了外部存儲器的指針變量定義了外部存儲器的指針變量 px=0 x1000; /給指針變量賦地址給指針變量賦地址 *px =0 x55; /給外部給外部1000h寫入寫入0 x553/2
25、/2022對片內具體地址的定義可以采用指針變量對片內具體地址的定義可以采用指針變量如:如: unsigned char idata * px; /定義了內部存儲器的指針變量定義了內部存儲器的指針變量 px=0 x90; /給指針變量賦地址給指針變量賦地址 *px =0 x66; /給內部給內部90h寫入寫入0 x66六、對片內地址的定義方法六、對片內地址的定義方法3/2/20225.3.3 C51的運算符與表達式的運算符與表達式略(參看略(參看131135)3/2/2022C51的位運算符的位運算符 能對運算對象進行能對運算對象進行按位操作是按位操作是C51的一大特點的一大特點,使使C51能對
26、硬件直接進行操作。能對硬件直接進行操作。C51提供了六種位運算提供了六種位運算如下表所示。如下表所示。3/2/2022n5.4 C51基本語句基本語句略(參看略(參看p135142)3/2/2022n5.5 函數函數略(參看略(參看p142148)3/2/2022C51中斷函數中斷函數void 函數名函數名 interrupt n using minterrupt后面的后面的n是中斷號,是中斷號,n取值取值031using后面的后面的m是選擇的寄存器組,取值是選擇的寄存器組,取值03編譯器從編譯器從8n+3處產生中斷向量處產生中斷向量常用中斷號與中斷向量常用中斷號與中斷向量中斷號n中斷源中斷向
27、量8n+30外部中斷00003H1定時/計數器0000BH2外部中斷10013H3定時/計數器1001BH4串口0023H3/2/2022C51庫函數庫函數reg51.h 8051內部內部SFR定義定義reg52.h 8052內部內部SFR定義定義absacc.h 允許直接訪問允許直接訪問8051不同存儲器的定義函數不同存儲器的定義函數ctype.h 字符轉換和分類程序字符轉換和分類程序stdlib.h 存儲器分配程序存儲器分配程序stdio.h 常用輸入輸出庫函數常用輸入輸出庫函數string.h 字符串操作、緩沖區(qū)操作函數字符串操作、緩沖區(qū)操作函數math.h 常用數學函數常用數學函數3/
28、2/2022#include #define uint unsigned int#define uchar unsigned charsbit P14=P14; /LED0sbit P15=P15; /LED1void delay(uint); /延時函數聲明延時函數聲明void delay(uint x) /延時延時xms uchar i; while(x-0) for(i=0;i125;i+); void main() while(1) P14=0; /LED0亮亮 P15=1; /LED1滅滅 delay(1000); /延時延時1秒秒 P14=1; /LED0滅滅 P15=0; /LE
29、D1亮亮 delay(1000); /延時延時1秒秒 流水燈程序流水燈程序3/2/2022#include #define uint unsigned int#define uchar unsigned charsbit K1=P13; /按鍵按鍵K1uchar n=0; /數碼管編碼計數數碼管編碼計數 uchar code ss =0 x0C0,0 x0F9,0 x0A4,0 x0B0,0 x99,0 x92,0 x82,0 x0F8, /數碼管編碼數碼管編碼 0 x80,0 x90,0 x88,0 x83,0 x0C6,0 x0A1,0 x86,0 x08E; void delay(uin
30、t); /延時函數聲明延時函數聲明void delay(uint x) /延時延時xms uchar i; while(x-0) for(i=0;i125;i+); void main() P2=0 x0FE; P0=0 x0C0; /數碼管初始顯示數碼管初始顯示0 while(1) /自己編寫程序自己編寫程序 數碼管增一程序數碼管增一程序3/2/20223/2/20223/2/2022/*=讀取鍵盤代碼子程序讀取鍵盤代碼子程序=*/void read_key(void) unsigned char x; P3=0 xf0; /將鍵盤的列賦值將鍵盤的列賦值0 x=P3|0 x0f; /將鍵盤的
31、行值付給將鍵盤的行值付給x if(x!=0 xff) /軟件的鍵盤防抖動軟件的鍵盤防抖動,ff無鍵按下無鍵按下 !=ff有鍵按下有鍵按下 delay(200); P3=0 xf0; /延時去抖,再判斷是否有鍵按下延時去抖,再判斷是否有鍵按下 x=P3|0 x0f; if(x!=0 xff) /如果鍵盤的行有低電平,則有鍵按下如果鍵盤的行有低電平,則有鍵按下 P3=x; /將對應的行賦值將對應的行賦值0 key_code=P3; /此時根據行和列的值,即為按鍵代碼此時根據行和列的值,即為按鍵代碼 if(key_code=238) /如果按鍵為如果按鍵為0,蜂鳴器響,蜂鳴器響 P1=0 xbf;
32、else P1=0 xff; key_press=1; /將按鍵標志位置將按鍵標志位置1 3/2/2022附:keil C51 使用簡介u(1)點擊 Project 菜單,選擇彈出的下拉式菜單中的 New Project,如圖 12。 圖 12 New Project 菜單 3/2/2022u(2)選擇所要的單片機,這里選擇常用的 Ateml 公司的 AT89c52。此時屏幕如圖 14 所示。 圖 14 選取芯片 3/2/2022u(3)、首先在項目中創(chuàng)建新的程序文件或加入舊程序文件。如果您沒有現(xiàn)成的程序,那么就要新建一個程序文件。在 KEIL 中有一些程序的 Demo,在這里我們還是以一個 C 程序 為例介紹如何新建一個 C 程序和如何加到您的第一個項目中。點擊圖 15 中 1 的新建文件的快捷按鈕,在 2 中出現(xiàn)一個新的文字編輯窗口。圖 15 新建程序文件 這個操作也能通過菜單 F
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公室租賃合同范本
- 農業(yè)種植包工合同范本
- 農田施工工程合同范本
- 共同承包協(xié)議工程合同范本
- 會林租賃合同范本
- 勞動關系聯(lián)營合同范本
- 現(xiàn)澆橋面板腳手架施工方案
- 陜西涼亭廊架施工方案
- 2025四川內江川豫汽車銷售服務有限公司招聘15人筆試參考題庫附帶答案詳解
- 農村拆遷土地合同范本
- 2024年青島港灣職業(yè)技術學院單招職業(yè)技能測試題庫及答案解析
- 提高留置針規(guī)范使用率
- 4月23日幼兒園世界讀書日讀書繪本名人讀書故事春暖花開日正是讀書時課件
- 指導青年教師課堂教學活動方案
- 情緒管理團體輔導專項方案
- 一年級美術課后輔導方案-1
- 免疫學基礎與病原生物學課件
- 2022版義務教育(地理)課程標準(附課標解讀)
- 《鍛造安全生產》課件
- 小學數學1-6年級(含奧數)找規(guī)律專項及練習題附詳細答案
- 中考英語閱讀理解(含答案)30篇
評論
0/150
提交評論