1. Trang chủ
  2. » Giáo án - Bài giảng

lập trình c căn bản (hướng dẫn làm đồ án)

29 970 3

Đ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

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 1,2 MB

Nội dung

Giao tiếp LCD 16x2 chế độ 4 bit dữ liệu GIAO TIẾP MAX7219LED MA TRẬN ĐƠN SẮC 8x8 LẬP TRÌNH ĐIỀU KHIỂN LED 7 ĐOẠN 1 SỐ Điều khiển 6 led dùng 3 IO. BÀN PHÍM MA TRẬN 4x4 Đo điện áp 05000mV dùng bộ ADC, hiển thị LCD. NHIỆT KẾ ĐIỆN TỬ ADC 12 BIT MCP3204 TIMER BỘ ĐỊNH THỜI

[HƢỚNG DẪN LẬP TRÌNH PIC CĂN BẢN] BÀI 1: DIGITAL OUTPUT GIAO TIẾP MAX7219-LED MA TRẬN ĐƠN SẮC 8x8 Phần cứng: -Max7219 giao tiếp MCU IO: DIN(1): Dữ liệu vào nối tiếp LOAD(12): Chốt liệu, cho phép hiển thị CLK(13): Xung nhịp clock -Đặc tính: Quét led độc lập - không phụ thuộc vào vi điều khiển Vi điều khiển việc đƣa liệu vào ghi nhớ ứng với digit (1 led đoạn/ hàng led ma trận) Dữ liệu không bị chƣa có liệu đƣợc đƣa vào Tƣơng tự nhƣ 74HC595, IC Max7219 nối liệu với cách nối Dout IC trƣớc với Din IC sau Phần mềm: Khai báo tiền xử lý: #define LOAD PIN_A1 #define CLK PIN_A2 #define DIN PIN_A0 #define NUM //Số IC đƣợc sử dụng, ứng với số led ma trận #include unsigned char alphabet[NUM][8]={}; //Mảng lƣu giá trị hiển thị led ma trận, led byte liệu Khai báo config: InitDisplay(); delay_ms(100); Hàm hiển thị: Display(i+1,j+1,alphabet[i][j]); /* i thứ tự IC, nối chân Din với vi điều khiển thứ i=0, j thứ tự hàng, alphabet[i],[j] truy xuất liệu cần hiển thị tƣơng ứng */ VD mẫu: Hiển thị chữ TEC led ma trận dùng Max7219 #include #fuses XT, INTRC_IO, NOWDT, PROTECT, NOMCLR, NOBROWNOUT #use delay(clock=4M) #define LOAD PIN_A1 #define CLK PIN_A2 #define DIN PIN_A0 #define NUM #include unsigned char alphabet[NUM][8]= { 0xFE,0xFE,0x38,0x38,0x38,0x38,0x38,0x38, //T 0xFE,0xFE,0xC0,0xF8,0xF8,0xC0,0xFE,0xFE, //E 0x7C,0xFE,0xE6,0xC0,0xC0,0xE6,0xFE,0x7C //C }; void TEC_display() { for(int i=0;i Chƣơng trình đứng phía dƣới đƣợc phép gọi chƣơng trình phía mà không cần khai báo chƣơng trình cần gọi tiền xử lý Khai báo tiền xử lý: #include //Khai báo thƣ viện biên dịch PIC sử dụng ví dụ: #include //Thƣ viện dòng PIC chứa C:\Program Files\PICC\Devices #device ADC=10 //Chỉ khai báo Chip có chuyển đổi ADC 10bit #fuses HS, NOWDT //Khai báo "cầu chì", cần ý khai báo HS dùng dao động cao tần bên nhƣ thạch anh //Nếu dùng dao động tần số thấp ( Khi ta set trạng thái trạng thái đƣợc giữ nguyên ta set trạng thái khác điện delay_us(16 bit value); //Delay micro giây delay_ms(16 bit value); //Delay mili giây IV VÍ DỤ: #include #fuses HS, NOWDT #use delay(clock=20M) void main() { set_tris_b(0x00); //0x số hexa, 0b số binary, số thƣờng decimal 0x00=0b00000000 while(true) { output_b(0x55); //0x55=0b01010101 output_high(PIN_A0); delay_ms(250); output_b(0xaa); //0xaa=0b10101010 output_low(PIN_A0); delay_ms(250); } } BÀI 1: DIGITAL OUTPUT [TT] I LẬP TRÌNH ĐIỀU KHIỂN LED ĐOẠN SỐ: Xác định phần cứng: - Xác định loại led đoạn: âm cực chung (CC), dƣơng cực chung (CA) - Kết nối với IO vi điều khiển tuỳ ý cho dễ thi công mạch Chú ý sử dụng port IO để dễ điều khiển VD mẫu: Điều khiển led đoạn CA kết nối port B PIC16F877A, hiển thị từ đến Các bƣớc thực nhƣ sau: Qui định IO: Bit 0: A Bit 1: B Bit 2: C Bit 3: D Bit 4: A Bit 5: E Bit 6: F Bit 7: DP Bảng mã đoạn: Vì led đoạn dƣơng chung nên led sáng mức 0: 0xc0 1: 0xf9 2: 0xa4 3: 0xb0 4: 0x99 5: 0x92 6: 0x82 7: 0xd8 8: 0x80 9: 0x90 Chƣơng trình điều khiển: #include #fuses HS, NOWDT #use delay(clock=20M) unsigned char ma_7doan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; void main() { set_tris_b(0x00); while(true) { for(int i=0;i=100 reset Tức mạch đếm từ 00-99 count=0; //Reset biến đếm sau 250 lần đếm } } } BÀI 1: DIGITAL OUTPUT [TT2] I Giao tiếp LCD 16x2 chế độ bit liệu: Kết nối phần cứng: Các IO LCD đƣợc sử dụng: RS, RW, EN, D4, D5, D6, D7 Chân RW nối GND, chân lại nối với vi điều khiển Phần mềm: Khai báo tiền xử lý cần thêm vào:(Các IO kết nối tuỳ ý, không bắt buộc theo port) #define LCD_RS PIN_B0 #define LCD_EN PIN_B2 #define LCD_D4 PIN_B3 #define LCD_D5 PIN_B4 #define LCD_D6 PIN_B5 #define LCD_D7 PIN_B6 #include unsigned char string[17]; Các config void main(): LCD_Init(); delay_ms(100); Các lệnh hiển thị: sprintf(string,"chuỗi cần hiển thị");// VD sprintf(string,"PIC16F877A"); Lƣu mã ASCII chuỗi PIC16F877A vào mảng string[] sprintf(string,"chuỗi cần hiển thị %kiểu liệu",biến liệu); LCD_Gotoxy(vị trí, hàng);//Chữ đƣợc in từ vị trí 0-15, hàng(trên 0, dƣới 1) LCD_Puts(string);//Gửi liệu mảng string lên LCD để hiển thị LCD_Clear_All();//Xoá hết hình LCD_Clear_Row(hàng);//Xoá theo hàng VD mẫu: Hiển thị chữ "DEE-TDTu" giữ, hàng chữ "CLB Dien Tu TEC" hàng dƣới vòng 2s đếm từ 0-99 hàng dƣới, hàng giữ nguyên #include #fuses XT, INTRC_IO, NOWDT, NOMCLR #use delay(clock=4M) /*Định nghĩa IO giao tiếp với LCD*/ #define LCD_RS PIN_A0 #define LCD_EN PIN_A1 #define LCD_D4 PIN_C0 #define LCD_D5 PIN_C1 #define LCD_D6 PIN_C2 #define LCD_D7 PIN_C3 #include unsigned char string[17]; /* Hiển thị chữ "DEE-TDTu" giữ, hàng Hiển thị chữ "CLB Dien Tu TEC" hàng dƣới vòng 2s Đếm từ 0-99 hàng dƣới, hàng giữ nguyên */ void hien_thi1() { sprintf(string,"DEE-TDTu"); LCD_Gotoxy(4,0); LCD_Puts(string); sprintf(string,"CLB Dien Tu TEC"); LCD_Gotoxy(0,1); LCD_Puts(string); delay_ms(2000); LCD_Clear_Row(1); sprintf(string,"Gia tri dem="); LCD_Gotoxy(0,1); LCD_Puts(string); } /* Hiển thị giá trị đếm */ void hien_thi2(int count) { sprintf(string,"%02d",count); LCD_Gotoxy(12,1); LCD_Puts(string); } void main() { LCD_Init(); delay_ms(100); hien_thi1(); while(true) { for(int i=0;i Giúp mở rộng ngỏ số cho vi điều khiển > Đồng hoá liệu đầu Vào nối tiếp, song song Phần mềm: Khai báo tiền xử lý: #define EXP_OUT_ENABLE PIN_A2 //Chân ST_CP #define EXP_OUT_CLOCK PIN_A0 //Chân SH_CP #define EXP_OUT_DO PIN_A1 //Chân DS #define NUMBER_OF_74595 //Số IC sử dụng IC có chân DS nối với MCU IC thứ 0, 1,2,3, #include byte data[2]; //mảng lƣu giá trị cần hiển thị ứng với IC Lệnh hiển thị: write_expanded_outputs(mảng liệu); VD mẫu: Viết chƣơng trình điều khiển IC 74HC595 dùng PIC12F629 Yêu cầu: IC thứ dịch bit từ phải qua trái, IC thứ dịch bit từ trái qua phải #include #fuses XT, INTRC_IO, NOMCLR, NOWDT #use delay(clock=4M) #define EXP_OUT_ENABLE PIN_A2 #define EXP_OUT_CLOCK PIN_A0 #define EXP_OUT_DO PIN_A1 #define NUMBER_OF_74595 #include byte data[2]; void main() { while(true) { for(int i=0;i Nhiều bạn chƣa học xử lý số tín hiệu nên AD tạm giải thích nhƣ sau: + Độ phân giải (số bit phân giải) 10bit, tức có 2^8=256 2^10=1024 giá trị số đƣợc chuyển đổi (số bậc phân giải) + Áp tham chiếu: Là điện áp chuẩn, lớn nhất, điện áp đƣợc chia cho số bậc phân giải VD minh hoạ với độ phân giải bit (4 bậc phân giải) Áp tham chiếu Vref=9V Giá trị analog Giá trị số 9V 6V 3V 0V Ta thấy, ngỏ vào [0V;3V) ADC=0, [3V;6V) ADC=1, [6V;9V) ADC=2, [9V; ) ADC=3 > Với PIC, giá trị ADC min=Vfref-=0, ADC max=Vref+ Công thức chung để tính giá trị bậc ADC PIC là: Vref/((2^bit)-1) II Phần cứng: - Cần kiểm tra datasheet xem chip sử dụng có ADC hay không - Một số dòng PIC, ADC có bit, hầu hết có độ phân giải 8/10 bit - Trong Proteus, chân ANx chân vào tín hiệu analog Một chip có nhiều ngỏ vào analog - Với PIC, áp tham chiếu tối đa 5V, sử dụng áp khác cần cấp áp chuẩn vào chân có kí hiệu Vref III Phần mềm: Khai báo tiền xử lý: #device ADC=8 //Chế độ bit #device ADC=10 //Chế độ 10 bit > Khai báo sau khai báo #include trƣớc khai báo #fuses Khai báo config: setup_adc(ADC_CLOCK_INTERNAL); //Chu kỳ lấy mẫu 2-6us setup_adc_ports(pin name); //Chọn port vào analog Tối đa port, phân cách dấu phẩy set_adc_channel(value); //Đi chung với setup_adc_port() tƣơng ứng Chỉ khai báo lệnh dùng port analog > Xem file device.h Hàm lấy giá trị ADC: /*Dùng port analog*/ delay_us(20); //Delay tối thiểu để lấy mẫu float value=read_adc(); /*Dùng port analog*/ set_adc_channel(x); delay_us(20); float value1=read_adc(); set_adc_channel(y); delay_us(20); float value2=read_adc(); /*Dùng port analog*/ setup_adc_ports(pin name); set_adc_channel(x); delay_us(20); float value2=read_adc(); VD mẫu: Đo điện áp 0-5000mV dùng ADC, hiển thị LCD #include #device ADC=10 #fuses XT, INTRC_IO, NOWDT, NOMCLR #use delay(clock=4M) #define LCD_RS PIN_C2 #define LCD_EN PIN_C3 #define LCD_D4 PIN_C4 #define LCD_D5 PIN_C5 #define LCD_D6 PIN_C6 #define LCD_D7 PIN_C7 #include unsigned char string[17]; void main() { float temp, adc; unsigned int16 vol; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); set_adc_channel(0); LCD_Init(); delay_ms(100); sprintf(string,"ADC VOL"); LCD_Gotoxy(0,0); LCD_Puts(string); while(true) { delay_us(20); adc=read_adc(); //Đọc giá trị ADC temp=(5000*adc)/1023; //Chuyển giá trị điện áp (mV) vol=(unsigned int16)temp; //Lấy phần nguyên số thực temp sprintf(string,"%04ld %04ldmV",(unsigned int16)adc, vol); LCD_Gotoxy(0,1); LCD_Puts(string); } } BÀI 3: ANALOG INPUT NHIỆT KẾ ĐIỆN TỬ I Giới thiệu: - Để đo đƣợc nhiệt độ phƣơng pháp điện tử, ta phải chuyển đại lƣợng nhiệt (dạng phi điện) dạng tín hiệu điện với tỉ lệ chuyển đổi tƣơng đối tuyến tính Phƣơng pháp chuyển đổi sở hình thành cảm biến mà cụ thể cảm biến nhiệt - Trên thị trƣờng có nhiều loại cảm biến nhiệt với cấu tạo phƣơng thức chuyển đổi sang tín hiệu điện khác Khá phổ biến cảm biến nhiệt LM35 - Đặc điểm LM35: http://www.ti.com/lit/ds/symlink/lm35.pdf + Điện áp hoạt động: 4-30VDC, khuyên dùng 5VDC + Dạng tín hiệu ngỏ: Analog + Độ phân giải: 10mV/ độ C + Tầm đo: -55 đến 150 độ C II Phần cứng: Nhƣ hình bên III Phần mềm: - Ngỏ cảm biến analog nên ta cài đặt PIC chế độ analog - Ta dùng kênh analog - VD mẫu: Đo nhiệt độ dùng LM35 với yêu cầu sau: + Hiển thị led đoạn số + Tầm đo 0-99 độ C Vƣợt báo lỗi + Nhiệt độ đƣợc cập nhật lần/s #include #device ADC=10 #fuses XT, INTRC_IO, NOMCLR, NOWDT #use delay(clock=4M) #define CA1 PIN_B4 //Pin lái cực dƣơng led hàng nghìn #define CA2 PIN_B5 //Pin lái cực dƣơng led hàng trăm #define CA3 PIN_B6 //Pin lái cực dƣơng led hàng chục #define CA4 PIN_B7 //Pin lái cực dƣơng led hàng đv #define LOW output_low #define HIG output_high unsigned char ma_7doan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //Mã led đoạn unsigned char digit[4]; //Mảng nhớ mã hiển thị cho led đoạn float temp; unsigned int8 doC, count=250; void hien_thi() { HIG(CA1); output_c(digit[0]); delay_ms(1); LOW(CA1); HIG(CA2); output_c(digit[1]); delay_ms(1); LOW(CA2); HIG(CA3); output_c(digit[2]); delay_ms(1); LOW(CA3); HIG(CA4); output_c(digit[3]); delay_ms(1); LOW(CA4); } void main() { set_tris_c(0x00); setup_adc(adc_clock_internal); setup_adc_ports(sAN0); set_adc_channel(0); delay_us(20); while(true) { /* Tạo định thời 1s Ta bỏ qua thời gian xử lý dòng lệnh tổng thời gian thực hết đoạn chƣơng trình 4ms hàm delay_ms(1) hàm hien_thi() Vậy để định thời 1s ta cần đếm 250 lần */ if(count2)&0x01); output_bit(B3,(value>>3)&0x01); } void main() { unsigned int8 count; unsigned int8 pre=1; setup_counters(T0_EXT_H_TO_L,T0_DIV_1); enable_interrupts(GLOBAL); set_timer0(pre); while(true) { count=get_timer0(); if(count>=10) { set_timer0(pre); count=pre; } hien_thi_led_BCD(count); delay_ms(250); } } BÀI 6: NGẮT NGOÀI I Phần cứng: - PIC16 đa số đƣợc trang bị chân phục vụ ngắt đƣợc kí hiệu INT - Chức năng: Giống nhƣ timer, ngắt chế độ ƣu tiên thực thi đoạn chƣơng trình có xung (cạnh lên cạnh xuống) tác động vào chân INT - Ứng dụng: đo tần số, đếm kiện, thực đoạn chƣơng trình đƣợc qui định II Phần mềm: - Khai báo tiền xử lý: - Khai báo ngắt: #INT_EXT void ngat_ngoai() { //Chương trình thực thi ngắt } - Khai báo config: enable_interrupts(GLOBAL); //Ngắt toàn cục ext_int_edge(H_TO_L); //Ngắt cạnh xuống, cạnh lên L_TO_H enable_interrupts(INT_EXT); //Cho phép ngắt - VD mẫu: Đếm số lần bấm nút dùng ngắt #include #fuses HS, NOWDT #use delay(clock=20M) #define LCD_RS PIN_D2 #define LCD_EN PIN_D3 #define LCD_D4 PIN_D4 #define LCD_D5 PIN_D5 #define LCD_D6 PIN_D6 #define LCD_D7 PIN_D7 #include unsigned char string[17]; unsigned int8 count=0; #INT_EXT void ngat_ngoai() { count++; if(count>9) count=0; } void main() { /*Cài đặt ngắt ngoài*/ enable_interrupts(GLOBAL); ext_int_edge(H_TO_L); enable_interrupts(INT_EXT); /*Cài đặt LCD*/ LCD_Init(); delay_ms(100); sprintf(string,"NGAT NGOAI"); LCD_Gotoxy(3,0); LCD_Puts(string); while(true) { sprintf(string,"So Dem=%d",count); LCD_Gotoxy(0,1); LCD_Puts(string); } } [...]... main sẽ đƣ c sao lƣu và core xử lý sẽ xử lý nội dung trong chƣơng trình ngắt, khi th c hiện xong thì xoá c ngắt, set lại thanh ghi định thời, core xử lý quay về tiếp t c xử lý chƣơng trình đƣ c backup l c đầu  Chƣơng trình ngắt chạy đ c lập và ƣu tiên hơn chƣơng trình chính [HƯỚNG DẪN LẬP TRÌNH PIC C N BẢN] 3 Khai báo config: setup_timer_x(Tx_INTERNAL|Tx_DIV_prescaler);// C i đặt bộ chia trƣ c enable_interrupts(INT_TIMERx);//Cho... mẫu: Viết chƣơng trình đ c điện áp 0-5000mV dùng MCP3204 hiển thị LCD 16x4 Thời gian c p nhật giá trị là 1s #include #fuses HS, NOWDT, PROTECT, NOMCLR #use delay(clock=20M) /*Giao tiếp LCD*/ #define LCD_RS PIN _C0 #define LCD_EN PIN _C1 #define LCD_D4 PIN _C2 #define LCD_D5 PIN _C3 #define LCD_D6 PIN _C4 #define LCD_D7 PIN _C5 /*Giao tiếp MCP3204*/ #include #define MCP3204_CLK PIN_B0... [HƯỚNG DẪN LẬP TRÌNH PIC C N BẢN] BÀI 5: COUNTER - BỘ ĐẾM I Phần c ng: - Kết hợp c ng module với bộ định thời là bộ đếm Nếu ở ch c năng định thời, xung clock lấy từ core xử lý thì ở chế độ đếm, xung clock lấy từ ngoài đƣa vào Sự chia tần số xung clock, thanh ghi và số bit thanh ghi giống nhƣ định thời - Ngỏ vào xung clok c a bộ đếm đƣ c lấy từ IO c tên TxCKI - C 2 dạng tín hiệu xung clock là xung c nh... + 12 bit ADC + 4 kênh ngỏ vào analog + Cho phép sử dụng áp tham chiếu kh c áp nguồn + Giao tiếp 4 dây theo kiểu giao tiếp SPI - sẽ tìm hiểu kỹ c c phần sau, nhƣng về c bản ta c n kết nối IC với PIC bằng 4 IO bất kỳ với c c ch c năng: IO tạo xung clock, IO cho phép, IO dữ liệu vào, IO dữ liệu ra Về bản chất, giữa PIC và IC ADC chỉ truyền nhận tín hiệu số + Nguồn nuôi 5VDC II Lập trình: CCS đã hỗ trợ... xem chip sử dụng c bộ ADC hay không - Một số dòng PIC, ADC chỉ c 8 bit, hầu hết là c 2 độ phân giải 8/10 bit - Trong Proteus, chân ANx là chân vào c a tín hiệu analog Một chip c thể c nhiều ngỏ vào analog - Với PIC, áp tham chiếu tối đa là 5V, nếu sử dụng áp kh c thì c n c p áp chuẩn vào chân c kí hiệu Vref III Phần mềm: 1 Khai báo tiền xử lý: #device ADC=8 //Chế độ 8 bit #device ADC=10 //Chế... delay(clock=4M) #define LCD_RS PIN _C2 #define LCD_EN PIN _C3 #define LCD_D4 PIN _C4 #define LCD_D5 PIN _C5 #define LCD_D6 PIN _C6 #define LCD_D7 PIN _C7 #include unsigned char string[17]; void main() { float temp, adc; unsigned int16 vol; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); set_adc_channel(0); LCD_Init(); delay_ms(100); sprintf(string,"ADC VOL"); LCD_Gotoxy(0,0); LCD_Puts(string); while(true)... Phần mềm: Chép và ghi đè file key_4x4 .c đính kèm file PDF này vào "C: \Program Files\PICC\Drivers" - Phƣơng pháp điều khiển: Ở ví dụ này, ta dùng 4 hàng phát xung và 4 c t nhận xung C c IO hàng đặt ở chế độ output, 4 IO c t c chế độ input Ta lần lƣợt cho c c IO hàng lên m c cao C mỗi lần nhƣ thế ta lại kiểm tra 4 IO c t Nếu c t nào c m c logic cao, t c nút đƣ c nhấn thì trả về giá trị c t và giá... nguyên c a giá trị sprintf(string,"CH%d=%04ld mV",i,vol); LCD_Gotoxy(0,i); LCD_Puts(string); } delay_ms(1000); } } [HƯỚNG DẪN LẬP TRÌNH PIC C N BẢN] BÀI 4: TIMER - BỘ ĐỊNH THỜI I Giới thiệu: - T c độ xử lý c a PIC16 tối đa là 5 MIPS (Million Instructions Per Second) t c 5 triệu lệnh mỗi giây ứng với nguồn c p xung 20MHz - PIC16 c t c độ core xử lý (fcore) bằng ¼ t c độ nguồn c p xung nhịp (fosc) T c xung... m c cao và 500ms m c thấp Vậy mỗi m c logic sẽ chiếm 1250/2 số count t c 625 [HƯỚNG DẪN LẬP TRÌNH PIC C N BẢN] BÀI 4: TIMER - BỘ ĐỊNH THỜI [TT1] ĐỒNG HỒ ĐẾM NGƯ C I Giới thiệu: - Ứng dụng ch c năng định thời c a PIC, ta tạo ra bộ định thời 1 giây Sau mỗi giây, giá trị định thời sẽ giảm 1 đơn vị cho đến khi bằng 0 thì dừng đếm - Vì phụ thu c vào tần số nguồn dao động (luôn c sai số), nên định thời chỉ... nhịp c p cho PIC hoạt động đƣ c đƣa qua bộ chia 4 trƣ c khi đƣa vào core Bộ định thời c a PIC16 hoạt động dựa trên xung nhịp core xử lý Tuy nhiên, PIC không dùng tr c tiếp xung nhịp c a core để định thời mà đƣa nó qua một bộ chia trƣ c gọi là prescaler Sau khi qua bộ chia trƣ c, xung nhịp mới đƣ c cấp vào thanh ghi định thời Vậy xung nhịp từ nguồn xung đến đƣ c thanh ghi định thời c t c độ là: C 1

Ngày đăng: 26/05/2016, 12:42

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w