tài liệu hướng dẫn thí thực hành thí nghiệm học phần thiết kế hệ thống nhúng

45 2 0
Tài liệu đã được kiểm tra trùng lặp
tài liệu hướng dẫn thí thực hành thí nghiệm học phần thiết kế hệ thống nhúng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Mô phỏng trênproteus và kiểm tra trên mạch phần cứng.1.5.. - CờbáobậnBF:BusyFlagKhi đang thực thi các hoạt động bên trong, LCD bỏ qua mọi giao tiếp với bênngoài và bật cờ BF thông qua ch

Trang 3

LẬPTRÌNHCVỚIVIĐIỀUKHIỂN80511.1 MỤCĐÍCH

ƯuđiểmcủagóicôngcụMikroC8051là:- Giaodiệntrựcquan

- Rất dễ sử dụng đặc biệt là với những người mới làm quen với việc lập trình cho vi điều khiển 8051

- Hỗtrợthưviệnhầuhếtchocácứngdụngnhư:Uart,Spi,i2c,onewrite, Nhược điểm:

- Người sử dụng gặp khó khăn trong việc tìm hiểu cấu trúc của hàm libraryvà khó thay đổi được nó.

1.2.2 ĐiềukhiểnLedđơn

Ledlàlà1loạidiodephátquang,đểLedsángđơngiảncấpcho nóđủdòng điện tầm 10mA.

- Điềukhiểnởchếđộhútdòng(hình1.3).- Điềukhiểnởchếđộxảdòng(hình1.4).

Trongbàinàytasẽlàmởchếđộhútdòngnhưhình1.1

Trang 4

- MuốnLedsángchỉviệcchođầuKatotcủaLedởmứclogic“0”- MuốnLedtắtchỉviệcchođầuKatotcủaLedởmứclogic“1”.

1.3 Thiếtbịthựchànhthínghiệmvàvậttưtiêuhao:1.3.1 Thiếtbịthựchànhthínghiệm

- MáytínhcàiđặtphầnmềmMikroCfor8051.

1.4 CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM1.4.1 Kếtnốivàlậptrình

Nộidungbài toány ê u cầu :sinhvi ên p hả i thực hiệnbậttắtcác đ è n Ledđơn theo các yêu cầu sau: ON/OFF led trong 1 thời gian.

Trênmáytính,mởphầnmềmMikroC

Trang 5

DeviceName:tênchipmàchúngtasửdụng Device Clock: Thạch anh của mạch

TiếptheochọnNext vàchọn I n c l u d e Nonenghĩalàtakhôngthêmbấtkỳ library nào vào dự án cả.

Trang 6

//design by : Template code// version: 1.0

Delay_ms(100); // 1 second delay

P0 = 0xFF;P1 = 0xFF;P2 = 0xFF; P3 = 0xFF;

// Turn OFF diodes on PORT0// Turn OFF diodes on PORT1// Turn OFF diodes on PORT2// Turn OFF diodes on PORT3Delay_ms(100); // 1 second delay

} while(1);// Endless loop}

Trang 7

1.4.2 Bàitậpthựchành

1 ViếtlạichươngtrìnhđiềukhiểnLedđơnnóitrênvớicáchiệuứngledđuổinhau từ P0.0🠒P0.7🠒P1.0🠒P1.7🠒P2.0🠒P2.7🠒P3.0🠒P3.7 sử dụng các lệnh

dịchb i t T h ờ i g i a n c h u y ể n t r ạ n g t h á i c ủ a m ỗ i đ è n L E D l à 1 g i â y M ô p h ỏ ng trên

2 Sử dụng ma trận đèn LED 4 × 8 tạo bởi các port P0, P1, P2, P3 để hiện têncủa bản thân, thời gian chuyển trạng thái của mỗi ký tự là 500ms Mô phỏng trênproteus và kiểm tra trên mạch phần cứng.

1.5 CÂUHỎIKIỂMTRA

- VớisơđồmắcLednhưhình1.5:tínhgiátrịđiệntrởphùhợp?- Vònglặpwhile,dowhile,for?

- Cáchthựchiệnloopforevervớiwhile,dowhile,for?- ViđiềukhiểnAT89S8253?

Trang 8

- Lưuđồthuậttoán?

Trang 9

1.6 TÀILIỆUTHAMKHẢO

- DatasheetAT89S8253;- Easy8051V6Usermanual;- Easy8051V6Schematic;- HelpMikroC8051.

Trang 10

char keypadPort at P0 ;Keypad_Init();

// khai báo ma trận phím ở port0// khởi tạo ma trận bàn phím

char Keypad_Key_Click(void);// trả về trạng thái của phím bấm từ (116))

GIAOTIẾPVỚIMATRẬNBÀNPHÍMVÀMÀNHÌNHLCD16x22.1 MỤCĐÍCH

- Tìmhiểuvàviếtchươngtrìnhgiaotiếpvớikeypad4x4;- HiểnthịtrạngtháiphímbấmlênLCD16x2.

2.2 CƠSỞLÝTHUYẾT2.2.1 Matrậnbànphím

Trong các hệ thống sử dụng vi điều khiển , bàn phím ,LCD là công cụ giúp cho việc giao tiếp giữa người và vi xử lý.

Ma trận bàn phím kết nối với vi điều khiển thông qua PORT0,n g u y ê n t ắ ch o ạ t đ ộ n g c ủ a m a t r ậ n p h í m l à : k í c h l ầ n l ư ợ t c á c c h â n P 0 0 ,P 0 1 , P 0 2 , P 0 3 v à đ ọ c t r ạ n g t h á i c ủ a c á c p h í m b ấ m t h ô n g q u aP 0 4 , P 0 5 , P 0 6 , P 0 7

Trong mikroC cung cấp các thư viện hàm giao tiếp với keypad 4x4 Thamkhảotrong phần help của MikroC.

2.2.2 LàmviệcvớiLCD16x2

Trang 11

Hình2.2.MànhìnhLCD16x2.

Trang 12

- CờbáobậnBF:(BusyFlag)

Khi đang thực thi các hoạt động bên trong, LCD bỏ qua mọi giao tiếp với bênngoài và bật cờ BF( thông qua chân DB7 khi có thiết lập RS=0, R/W=1) lên để chobiết nó đang “bận”.

Trang 13

- BộđếmđịachỉAC:(AddressCounter)

Khi một địa chỉ lệnh được nạp vào thanh ghi IR, thông tin được nối trựctiếpc h o 2 v ù n g R A M ( v i ệ c c h ọ n l ự a v ù n g R A M t ư ơ n g t á c đ ãđ ư ợ c b a o h à m t r o n g m ã lệnh).

Saukhighivào(đọctừ)RAM,bộđếmACtựđộngtănglên(giảmđi)1đơnvị.- VùngnhớcủaLCD

Vùng CGRAM : (Character Generator RAM) Ngườidùngcóthểtạocácmẫukítựđồhọariêng-PhầncứnggiaotiếpvớiLCD:

7 Dịchhiểnthịsangtrái8 Tắtcontrỏ,tắthiểnthị

Trang 14

voidLcd_Out(row,column,*text);//inraởhàngvàcộttươngứng void Lcd_Cmd(char out_char);

A Tắthiểnthị,bậtcontrỏC Bậthiểnthị,tắtcontrỏ

E Bậthiểnthị,nhấpnháycontrỏF Tắtcontrỏ,nhấpnháycontrỏ10 Dịchvịtrícontrỏsangtrái14 Dịchvịtrícontrỏsangphải18 Dịchtoànbộhiểnthịsangtrái1C Dịchtoànbộhiểnthịsangphải

80 épcontrỏvềđầudòngthứnhấtC0 épcontrỏvềđầudòngthứhai

38 Haidòngvàmatrận57-MộtsốcấuhìnhvàhàmLCDtrongmikroC

_LCD_MOVE_CURSOR_LEFT MovecursorleftwithoutchangingdisplaydataRAM

_LCD_MOVE_CURSOR_RIGHT MovecursorrightwithoutchangingdisplaydataRAM

_LCD_SHIFT_LEFT ShiftdisplayleftwithoutchangingdisplaydataRAM

Trang 15

_LCD_SHIFT_RIGHT ShiftdisplayrightwithoutchangingdisplaydataRAM

2.3.THIẾTBỊTHỰCHÀNHTHÍNGHIỆMVÀVẬTTƯTIÊUHAO:2.3.1 Thiếtbịthựchànhthínghiệm

- MáytínhcàiđặtphầnmềmMikroCfor8051.

2.4.CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM2.4.1 GiaotiếpvớimatrậnphímvàmànhìnhLCD16x2

//Design by : Template code// version: 1.0

//date: 1/3/2023

//description: keypad 4x4 on LCD unsigned short kp, cnt, oldstate = 0;char txt[6)];

// Keypad module connectionschar keypadPort at P0;

// End Keypad module connections

// LCD module connectionssbit LCD_RS at P2_0_bit; sbit LCD_EN at P2_1_bit;

sbit LCD_D4 at P2_2_bit;

sbit LCD_D5 at P2_3_bit; sbit LCD_D6) at P2_4_bit; sbit LCD_D7 at P2_5_bit;

// End LCD module connections

void main() {cnt = 0; Keypad_Init();

// Reset counter// Initialize Keypad

Lcd_Init();// Initialize LCD

Lcd_Cmd(_LCD_CLEAR);// Clear display Lcd_Cmd(_LCD_CURSOR_OFF);// Cursor off

Trang 16

Lcd_Out(1, 1, "Key: " ) ; //WritemessagetextonLCD Lcd_Out(2, 1, "Times:");

//Waitforkeytobepressedandreleaseddo//k p = K e y p a d _ K e y _ P r e s s ( ) ;

//Storekeycodeinkpvariable kp = Keypad_Key_Click(); // Store key code in kp variable

//Preparevalueforoutput,transformkeytoit'sASCIIvalue switch(kp) {

case1 : kp=49;break;//1case2 : kp=50;break;//2case3 : kp=51;break;//3case4 : kp=6)5;break;//Acase5 : kp=52;break;//4case6) : kp=53;break;//5case7 : kp=54;break;//6)case8 : kp=6)6);break;//Bcase9 : kp=55;break;//7case10:kp=56);break;//8case11: kp=57;break;//9case12:kp=6)7;break;//Ccase13: kp= 42;break;// *case14: kp=48;break;//0case15: kp= 35;break;// #case16):kp=6)8;break;//D

if (kp != oldstate) { //Pressedkeydiffersfromprevious cnt = 1;

oldstate=kp;

Trang 17

- Viết chương trình trên, vẽ sơ đồ trên proteus và kiểm tra hoạt động của hệthống quan sát kết quả.

- Vẽlưuđồthuậttoánchochươngtrìnhtrên.

2.4.2 Bàitậpthựchành

1 Viết chương trình nhập vào một số nhị phân 4 bit và chuyển đổi số nhị phânđó sang số hexa hiển thị lên màn hình LCD Mô phỏng trên proteus và kiểm tratrênmạch phần cứng.

2 Viết chương trình nhập vào hai số hexa và tính tổng, tích của hai số hiểnthịhai số đó lên màn hình LCD Mô phỏng trên proteus và kiểmtra trên mạch phần cứng.

- Giảithíchcấutrúcswitch?- Phươngphápquétmatrậnphím?

- DatasheetAT89S8253.- Easy8051V6Usermanual.- Easy8051V6Schematic.- HelpMikroC8051.

else { cnt++;}

Lcd_Chr(1, 10, kp);

// Pressed key is the same as previous

// Print key ASCII value on LCD

if (cnt == 255) {cnt = 0;

Lcd_Out(2, 10, " ");}

// If counter variable overflow

WordToStr(cnt, txt);Lcd_Out(2, 10, txt);} while (1);

// Transform counter value to string// Display counter value on LCD

}

Trang 18

- TìmhiểuvềLed7thanhvàphươngphápđiềukhiển;- LậptrìnhứngdụnghiểnthịLed7thanh.

3.2.1 GiớithiệuvềđènLED7thanh

Led7thanhlàthiếtbịchuyêndùngđểhiểnthịsố0🠒9 Hình dạng của led 7 thanh trong hình 3.1.

Có2loạiLed7thanh:- Led7thanhAnotchung.- Led7thanhKatotchung.

8 3

A B76

G DP10 95

8 3

Trang 20

unsignedshortshifter,digits_array_index; unsigned intd i g i t , n u m b e r ;

ĐiềukhiểnLed7thanhthôngquaPort0và q u é t ledthôngquaDIS0, DIS1, DIS2, DIS3.

Các số hiểnthị

3.4.CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM3.4.1 LậptrìnhgiaotiếpvớicácđènLED7thanh

Viếtchươngtrìnhthựchiệnhiểnthịsốcó4chữsốlênđènLED7thanhvàđếm lùi về 0000 Vẽ sơ đồ nguyên lý trên proteus, lưu lại kết quả để viết báo cáo.

Trang 21

voidmain(){ int n=0;

digit = 0; //initializevariables digits_array_index = 0;

shifter =1;

P0= 0; //InitializePORT0

number = 6)789; //someinitialvalue do{

digit = number / 1000u ; // extract thousands digit digits_array[3]=mask(digit);/ / andstoreittodigitsarray digit = (number / 100u) % 10u;/ / e x t r a c t h u n d r e d s d i g i t

d i g i t s _ a r r a y [ 2 ] =mask(digit);/ / andstoreittodigitsarraydigit = (number / 10u) % 10u;/ / e x t r a c t t e n s d i g i t

d i g i t s _ a r r a y [ 1 ] =mask(digit);/ / andstoreittodigitsarray digit = number % 10u; // extract ones digit

digits_array[0]=mask(digit);/ / andstoreittodigitsarray

P0=digits_array[digits_array_index];//bringappropriatevaluetoPORT0 P1 = shifter; // turn on appropriate 7seg display

//Delay_us(10); //oneseconddelay//moveshiftertonextdigit

shifter <<= 1;

if(shifter>8u) shifter = 1;delay_ms(1);

//incrementdigits_array_index digits_array_index++ ;

digits_array_index=0; //turnon1st,turnoff2nd7seg.}

}while(1); //endlessloop

Trang 22

// -ReturnsmaskforcommoncathodeDisplay_utils.hunsignedshortmask(unsignedshortnum){ switch

(num) {

case0:return0xC0;case1 :return0xF9;case2:return0xA4;case3:return0xB0;case4:return0x99;case5:return0x92;case6):return0x82;case7 :return0xF8;case8:return0x80;case9:return0x90;}//caseend

- Giảithíchcấutrúcfor?

- Tínhthờigianlưuảnhcủamắtngười?Từđósuyrathờigiantrễtốithiểu?- Phươngphápquétled7thanh?

3.6 TÀILIỆUTHAMKHẢO

- DatasheetAT89S8253.

- Easy8051V6Usermanual,Easy8051V6Schematic.- HelpMikroC8051.

Trang 23

sbit OW_Bit at P1_2_bit;unsigned short Ow_Reset();

//Khởi tạo chân data

// Phát ra lệnh reset cảm biến DS1820unsigned short Ow_Read();// Đọc dữ liệu từ cảm biến ds1820, dữ liệu trả vềdưới dạng unsigned short

Void Ow_Write( char par)// Gửi lệnh xuống ds1820

4.2 CƠSỞLÝTHUYẾT4.2.1 CảmbiếnnhiệtđộDS1820

Cảm biến nhiệt độ DS18B20 là cảm biến nhiệt độ chuyên dùng để đo nhiệt độmôi trường với đầu ra dạng số khác với một số loại cảm biến analog như:LM35,LM335,

4.3.THIẾTBỊTHỰCHÀNHTHÍNGHIỆMVÀVẬTTƢTIÊUHAO:4.3.1 Thiếtbịthựchànhthínghiệm

-MáytínhcàiđặtphầnmềmMikroCfor8051.

Trang 24

4.4.CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM4.4.1 LậptrìnhgiaotiếpvớicảmbiếnnhiệtđộDS1820

Hiển thị nhiệt độđođượctừ cảmbiến DS1820lênLCD16x2 Trongphần code dưới đây là 1 đoạn code ví dụ:

//description:mesurementtempbyds1820onlCD//LCDmoduleconnections sbit

LCD_RS at P2_0_bit; sbit LCD_EN at P2_1_bit; sbit LCD_D4 at P2_2_bit; sbit LCD_D5 at P2_3_bit; sbit LCD_D6) at P2_4_bit; sbit LCD_D7 at P2_5_bit;

//S e t TEMP_RESOLUTIONtothecorrespondingresolutionofusedDS18x20sensor://1 8 S 2 0 : 9( d e f a u l t setting;canbe9,10,11,or12)

//1 8 B 2 0 : 12

constunsignedshortTEMP_RESOLUTION=9; char *text = "000.0000";

void Display_Temperature(unsigned int temp2write) { constunsignedshortRES_SHIFT=TEMP_RESOLUTION -8; char temp_whole;

unsignedinttemp_fraction;//checkiftemperatureisnegative if (temp2write & 0x8000) {

//extracttemp_whole

Trang 25

temp_whole=temp2write>>RES_SHIFT;//converttemp_wholetocharacters if (temp_whole/100)

text[0]=temp_whole/100+ 48;elsetext[0]='0';

text[1] = (temp_whole/10)%10 + 48; //Extracttensdigit text[2] =t e m p _ w h o l e % 1 0 + 48; // Extract ones digit

//extracttemp_fractionandconvertittounsigned int

temp_fraction= t e m p 2 w r i t e < < ( 4 - R E S _ S H I F T ) ; t e m p _ f r a c ti o n & = 0 x 0 0 0 F ;

text[4] =t e m p _ f r a c ti o n / 1 0 0 0 + 48; // Extractthousands digit text[5] = (temp_fraction/100)%10 + 48;

//Extracthundredsdigit text[6)] =

(temp_fraction/10)%10+ 4 8 ; // Extract tens digit text[7] =t e m p _ f r a c ti o n % 1 0 + 48; // Extract ones digit

//printtemperatureonLCD Lcd_Out(2, 5, text);

Lcd_Init(); // Initialize LCDLcd_Cmd(_LCD_CLEAR); // Clear

LCDLcd_Cmd(_LCD_CURSOR_OFF); //Turncursoroff Lcd_Out(1, 1, " temp exemple :" ) ;

Lcd_Cmd(_LCD_CLEAR); //ClearLCD Lcd_Out(1, 1, " Temperature:" ) ;

Lcd_Chr(2,13,223);/ / differentLCDdisplayshavedifferentcharcodefordegree//

// -mainloop

Trang 26

4.4.2 Bàitậpthựchành

1 ViếtlạichươngtrìnhtrênđổinhiệtđộC🠒 Fvàngượclại.Môphỏngtrên proteus và kiểm tra trên mạch phần cứng.

2 Hiển thị nhiệt độ đo được từ cảm biến DS1820 lên các đèn LED 7 thanh Mô phỏng trên proteus và kiểm tra trên mạch phần cứng.

- Chuẩn1dâylàgiaotiếpmấychiều?- Hàmconlàgì?cấutrúchàmcon?

4.6 TÀILIỆUTHAMKHẢO

- DatasheetAT89S8253.- Easy8051V6Usermanual.- Easy8051V6Schematic.- HelpMikroC8051.

do {

// - perform temperature reading P3=0X00;

Ow_Reset();Ow_Write(0xCC); Ow_Write(0x44); Delay_us(120); Ow_Reset(); Ow_Write(0xCC); Ow_Write(0xBE);temp = Ow_Read();

// Onewire reset signal// Issue command SKIP_ROM// Issue command CONVERT_T

// Issue command SKIP_ROM

// Issue command READ_SCRATCHPAD

temp = (Ow_Read() << 8) + temp;

// - Format and display result on LcdDisplay_Temperature(temp);

Delay_ms(500);} while (1);}

Trang 27

LẬPTRÌNHSỬDỤNGNGẮTNGOÀI5.1 MỤCĐÍCH

- Tìmhiểungắtngoàicủaviđiềukhiển8051

- LậptrìnhứngdụngđếmsốlầnbấmnútvàhiểnthịlênLCD

5.2 CƠSỞLÝTHUYẾT5.2.1 Ngắtngoàicủa8051

Khái niệm ngắt: Ngắt là sự đáp ứng các sự kiện bên trong hoặc bên ngoài nhằm thông báo cho bộ vi điều khiển biết thiết bị đang cần được phục vụ

Ngắtngoàiđượcsửdụngtrongcácứngdụngnhư:- Đếmtrạngtháixuấthiệnsựkiện

- Đolườngtốcđộđộngcơdùngencoder-

Trang 28

EA:( I E 7 bit)là bitchophép ngắt toàn bộ.Tức lànếu bạn sử dụng mộttrong5 ngắtkể trên của vđk thì bạn phải setb i t n à y l ê n v ớ i g i á t r ị 1 N g ư ợ cl ạ i k h i b i t E A = 0 t h ì t o à n b ộ c á c n g ắ t c ủ a v đ k s ẽb ị c ấ m

ET2: (IE.5 bit) là bit cho phép ngắt của timer 2 ( chỉ ở họ 52 ) Khi bit này = 1thì ngắt định thời 2 sẽ được cho phép và ngược lại.

ET1,ET0: (IE.3, IE.1 bit) là bitchophép ngắtđịnhthời1,0của vđk8051 Khi các bitnày =1 thì ngắt của hai bộ định thời này được cho phép và ngược lại.

TF1(TCON.7)c ờ tràncủaTimer1

TR1(TCON.6)b i t ĐkhoạtđộngcủaTimer1 TF0 ( TCON.5)c ờ t r à n c ủ a T i m e r 0

TR0(TCON.4)b i t ĐkhoạtđộngcủaTimer0

IE1(TCON.3)C ờ ngắtngoàikíchtheosườn ;đượcCPUthiếtlậpkhiphát hiền có sườn xuống ngắt ngoài và đựơc CPU xoá khi ngắt được xư lý

IT1 ( TCON.2)b i t Đ k k i ể u n g ắ t I N T 1 đ ư ợ c t h i ế t l ậ p v à x o á b ở i p h ầ n m ề m đ ể x á c đ ị n h k i ể u n g ắ t t h e o s ư ờ n h a y m ứ c t h ấ p

IE0(TCON.1)C ờ ngắtngoàikíchtheosườn ;đượcCPUthiếtlậpkhiphát hiền có sườn xuống ngắt ngoài và đựơc CPU xoá khi ngắt được xư lý

IT0 ( TCON.0)b i t Đ k k i ể u n g ắ t I N T 0 đ ư ợ c t h i ế t l ậ p v à x o á b ở i p h ầ n m ề m đ ể x á c đ ị n h k i ể u n g ắ t t h e o s ư ờ n h a y m ứ c t h ấ p

Như vậy từ 2 thanh ghi trên , để sử dụng ngắt INT0 (ngắt theomứcta sẽ phảik h ở i t ạ o n h ư s a u ) :

5.2.2 NguyênlýghépnốiviđiềukhiểnvớiphímbấmvàmànhìnhLCD16x2

voidExternal_ISR()org0x0003ilevel0{

Trang 29

Sơ đồ nguyên lý ghép nối vi điều khiển với phím bấm và màn hình LCD 16x2 được trình bày trên hình 5.1 và 5.2.

Trang 30

Hình5.2.SơđồnguyênlýghépnốiviđiềukhiểnvớimànhìnhLCD16x2

Trang 31

//Design by : Template code// version: 1.0

//date: 1/3/2023

//description: counter on lcd NOTES:

Make sure you turn ON the PORT0 LEDs (SW7.1), set Pull up PORT3.2 (SW4.3) and set jumper J4 in GND position

// End LCD module connectionsunsigned int cnt=0;

values bit tmp;char *text="0000" ;

// Global variable cnt and tmp with starting

void External_ISR()org 0x0003 ilevel 0 {// Interrupt rutineEA_bit = 0;// Disable Interrupts

tmp= 1;// Increment variable cntEA_bit = 1;// Enable Interrupts}

void main() { unsigned int j=0; tmp=0;P0 = 0xFF;

// Main program

// Set P0 as output

5.3 THIẾTBỊTHỰCHÀNHTHÍNGHIỆMVÀVẬTTƯTIÊUHAO:5.3.1 Thiếtbịthựchànhthínghiệm

- MáytínhcàiđặtphầnmềmMikroCfor8051.

5.4 CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM

5.4.1 HiểnthịsốlầnngắtngoàitrênchânP3.2lênLCD16x2

Ngày đăng: 16/05/2024, 17:38

Tài liệu cùng người dùng

Tài liệu liên quan