Khai báo các biến toàn cục 3.. Khai báo nguyên mẫu các hàm 4.. Xây dựng các hàm và chương trình chính... * Ví dụ:#include #include #define Led1 P1_0 Unsigned char code Led_arr[3]; Unsign
Trang 1Câu 1
1 Nêu c u trúc m t chấ ộ ương trình vi t b ng C đ y đ trong MikroC và KeilC? ế ằ ầ ủ
2 Hàm là gì? Nêu cách s d ng hàm trong C? ử ụ
Câu 2
1 Nêu các c u trúc : While, Do while, for, switch ? ấ
2 S khác nhau gi a While và do while? ự ữ
3 Trình bày v chu n giao ti p onewire g a vi đi u khi n và Ds1820? ề ẩ ế ữ ề ể
Câu 3
1 Nêu các phép d ch bit trong C ? ị
2 Vi t chế ương trình Led đu i nhau PORT1 dùng pháp d ch bit? ổ ị
1 Phương pháp quét Led 7 thanh?
2 Cách thay đ i th i gian đ m tr trong chổ ờ ế ễ ương trình Led 7 seg?
3 Vi t chế ương trình đi u khi n đ m t 0=>10=>20=> … ề ể ế ừ
=>500=>490=>480=>470=>…=> 0… và th c hi n l i? vẽ l u đ thu t toán? ự ệ ạ ư ồ ậ
4 Gi i thích t ng câu l nh trong chả ừ ệ ương trình?
Trang 2Câu 7:
1 L c thông th p là gì? ọ ấ
2 Phương pháp tăng đ chính xác c a phép đo nhi t đ , phép đo dòng đi n, ộ ủ ệ ộ ệ
đi n áp, ADC dùng l c thông th p, đ n gi n nh t là vi c l y trung bình c ng ệ ọ ấ ơ ả ấ ệ ấ ộ
c a các l n trích m u trong 1 th i gian nào đó t m 500ms Nêu thu t toán và ủ ầ ẫ ờ ầ ậcách th c hi n trong C? ự ệ
3 Vi t chế ương trình hi n c nh báo quá nhi t n u 20<nhi t đ ho c nhi t để ả ệ ế ệ ộ ặ ệ ộ
>40 đ C? ộ
4 Gi i thích t ng câu l nh? ả ừ ệ
Câu 8:
1 Ng t là gì? Trình bày các lo i ng t trong 8051? ắ ạ ắ
2 Phương pháp vi t 1 chế ương trình có s d ng ng t trong MikroC và KeilC? ử ụ ắ
3 Vi t chế ương trình đ m s b m nút s d ng ng t ngoài và hi n th lên Led ế ố ấ ử ụ ắ ể ị
7 thanh? L u đ thu t toán? ư ồ ậ
4 Gi i thích t ng câu l nh? ả ừ ệ
Bài Làm : Câu 1:
1 C u trúc c a m t ch ấ ủ ộ ươ ng trình vi t b ng ngôn ng C: ế ằ ữ
* Cấu trúc
1 Khai báo chỉ thị tiền xử lý
2 Khai báo các biến toàn cục
3 Khai báo nguyên mẫu các hàm
4 Xây dựng các hàm và chương trình chính
Trang 3* Ví dụ:
#include<regx51.h>
#include<string.h>
#define Led1 P1_0
Unsigned char code Led_arr[3];
Unsigned char data dem;
Unsigned int xdata X;
Void delay(unsigned int n);
bit kiemtra(unsigned int a);
void delay(unsigned int n)
Khai báo biến toàn cục
Khai báo nguyên mẫu hàm
Xây dựng các hàm và chươngtrình chính
Trang 4Bit kiemtra(unsigned int a){
Khai báo biến cục bô;
Mã chương trình kiểm tra biến a;
}Chú ý: Hàm không khai báo nguyên mẫu phải được xây dựng trước hàm có lờigọi hàm đó Ở ví dụ trên do hàm “bit kiemtra(unsigned int a)” đã được khai báonguyên mẫu hàm ở trên nên có thể xây dựng hàm ở bất kì vị trí nào trong chươngtrình
2 Hàm trong C
Hàm là khối tạo nên chương trình là bao gồm các chương trình con Hàm trong
C có thể trả về kết quả thông qua tên hàm hay có thể không trả về kết quả.Hàm có 2 loại: Hàm chuẩn và hàm tự định nghĩa
Hàm thư viện là những hàm đã được định nghĩa sẵn trong một thư viện nào đó, muốn sử dụng các hàm thư viện thì phải khai báo thưviện trước khi sử dụng bằng lệnh
#include <tên thư viện.h>
Cấu trúc của một hàm tựthiết kế:
<kiểukết quả> Tên hàm ([<kiểu t số><tham số>][,<kiểu t số><thamsố>][…]) {
[Khai báo biến cục bộvà các câu lệnh thực hiện hàm]
Trang 5void… Một hàm có thểcó hoặc không có kết quả trả về Trong trường hợp hàm không
có kết quả trảvề ta nên sử dụng kiểu kết quả là void
- Kiểu t số: là kiểu dữ liệu của tham số
- Tham số:là tham số truyền dữ liệu vào cho hàm, một hàm có thể có hoặc không có tham số
B ướ c 1: tính giá tr c a (bi u th c) sauị ủ ể ứ while
B ướ c 2: n u giá tr tính đế ị ượ ủc c a (bi u th c) làể ứ ‘sai’ (==0) thì k t ếthúc vòng l pặ while.
B ướ c 3: n u giá tr c a (bi u th c) làế ị ủ ể ứ ‘đúng’ (!=0) thì th c hi n ự ệ
kh i l nh sauố ệ while.
B ướ c 4: quay l i bạ ước 1
Chú ý: Thân while có th để ược th c hi n m t l n ho c nhi u l n và cũng ự ệ ộ ầ ặ ề ầ
có th không để ược th c hi n l n nào n u ngay t đ u bi u th c sau while ự ệ ầ ế ừ ầ ể ứ
đã sai
+ Bi u di n b ng l u đ : ể ễ ằ ư ồ
Trang 6Bi u th c 3: bể ứ ước nh y - thả ường dùng v i ý nghĩa là thay đ i bớ ổ ước nh y.ả
C 3 bi u th c này đ u là tuỳ ch n, chúng có th v ng m t trong câu ả ể ứ ề ọ ể ắ ặ
Ngượ ạc l i, n u bi u th c có giá tr ‘đúng’ ( khác 0) thì chuy n t i bế ể ứ ị ể ớ ước 3
B ướ c 3: Th c hi n kh i l nh sau for ( thân c a for ), chuy n t i bự ệ ố ệ ủ ể ớ ước 4
B ướ c 4: Th c hi n bi u th c 3, r i quay v bự ệ ể ứ ồ ề ước 2
Trang 8B ướ c 2: ki m tra giá tr bi u th c <bi u th c> sauể ị ể ứ ể ứ while, n u có giá tr ế ị
‘đúng’ ( khác 0) thì l p l i bặ ạ ước 1, n u ‘sai’ (=0) thì k t thúc vòng l p.ế ế ặ
+ Bi u di n b ng l u đ : ể ễ ằ ư ồ
- C u trúc l a ch n: switch ấ ự ọ
Cú pháp c a l nh switch là ki m tra m t vài giá tr h ng cho m t bi u ủ ệ ể ộ ị ằ ộ ể
th c, tứ ương t v i nh ng gì chúng ta làm đ u bài này khi liên k t m t vài ự ớ ữ ở ầ ế ộ
l nh if và else if v i nhau D ng th c c a nó nh sau:ệ ớ ạ ứ ủ ư
switch (expression)
{
case constant1:
block of instructions 1
Trang 9Nó ho t đ ng theo cách sau: switch tính bi u th c và ki m tra xem nó ạ ộ ể ứ ể
có b ng constant1 hay không, n u đúng thì nó th c hi n block of instructions ằ ế ự ệ
1 cho đ n khi tìm th y t khoá break, sau đó nh y đ n ph n cu i c a c u ế ấ ừ ả ế ầ ố ủ ấtrúc l a ch n switch Còn n u không, switch sẽ ki m tra xem bi u th c có ự ọ ế ể ể ứ
b ng constant2 hay không N u đúng nó sẽ th c hi n block of instructions 2 ằ ế ự ệcho đ n khi tìm th y t khoá break.ế ấ ừ
Cu i cùng, n u giá tr bi u th c không b ng b t kỳ h ng nào đố ế ị ể ứ ằ ấ ằ ược ch ỉ
đ nh trên (b n có th ch đ nh bao nhiêu câu l nh case tuỳ thích), chị ở ạ ể ỉ ị ệ ương trình sẽ th c hi n các l nh trong ph n default: N u nó t n t i vì ph n này ự ệ ệ ầ ế ồ ạ ầkhông b t bu c ph i có.ắ ộ ả
2. S khác nhau gi a while và do whil ự ữ e
While được dùng đ ki m tra đi u ki n trể ể ề ệ ước; n u đi u ki n tr ế ề ệ ả
về true thì th c thi nh ng câu l nh bên trong ự ữ ệ
Trang 10Do-While được dùng đ th c thi nh ng câu l nh bên trongể ự ữ ệ ít nh t m t ấ ộ
l ntrầ ước khi ki m tra đi u ki n; n u đi u ki n tr vể ề ệ ế ề ệ ả ề true thì ti p t c th c ế ụ ựthi; n u đi u ki n làế ề ệ false thì thoát kh i vòng l p.ỏ ặ
3. Ph ươ ng pháp đ c giá tr c a c m bi n DS1820 theo chu n giao ọ ị ủ ả ế ẩ
ti p 1 dây(onewire) ế Chu n onewire theo phẩ ương th c giao ti p ứ ếmaster/slave
Các hàm h tr đ th c hi n vi c giao ti p DS1820 v i vi đi u khi n.ỗ ợ ể ự ệ ệ ế ớ ề ể
N i dung các hàm nh sau :ộ ư
- Sbit OW_Bit at P1_2_bit; //Kh i t o chân dataở ạ
- Unsigned short Ow_Reset(); //Phát ra l nh reset c m bi n ệ ả ếDS1820
- Unsigned 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ử ệ ố
Quy t c: Mu n nhân 1 s v i 2 ta d ch s đó qua trái 1 bit ắ ố ố ớ ị ố
- T ng quát, mu n nhân m t s nguyene v i 2^i ta d ch s đó qua trái iổ ố ộ ố ớ ị ốbit;
Trang 11y=x Shl 2;//y=01001100=x*4=76//
}
D chị trái đượ cký hi uệ là : << d chị chuy nể toàn bộ dãy bit sang trái theo
s bit đố ượ yêu c uc ầ d ch.ị
// tat tat ca cac LED
P0 = 0xff ; // tat cac LED tren PORT0
P1 = 0xff ; // tat cac LED tren PORT1
P2 = 0xff ; // tat cac LED tren PORT2
Trang 12P3 = 0xff ; // tat cac LED tren PORT3
// LED duoi nhau tren PORT1
S đ nguyên lý: ơ ồ
Trang 13Mô ph ng: ỏ
Ma tr n phím 4x4 cho phép các b n nh p các ch s , ch cái, ký hi u vào b ậ ạ ậ ữ ố ữ ệ ộ
đi u khi n qua đó dùng đ đi u khi n m t thi t b ngo i vi nào đó.ề ể ể ề ể ộ ế ị ạ
Các b n có th m c thêm tr treo (thông thạ ể ắ ở ường là 10K) cho các nút b m đ ấ ểnút b m ho t đ ng n đ nh h n.ấ ạ ộ ổ ị ơ
- Nguyên lý ho t đ ng c a ma tr n phím – thu t toán quét ma tr n ạ ộ ủ ậ ậ ậ phím.
Đ giao ti p để ế ược v i ma tr n phím 4x4, tôi dùng phớ ậ ương pháp "Quét"
đ ki m tra xem nút nào để ể ược b m, c th cách quét nh sau (quét theo c t):ấ ụ ể ư ộ
Trang 14-Các chân P1.0, P1.1, P1.2, P1.3 (các hàng) được thi t l p là các ế ậ
chân INPUT, còn l i các chân P1.4, P1.5, P1.6, P1.7 (các c t) là các ạ ộ
chân OUTPUT ( m c logic ‘0’).ở ứ
-Gi sả ử SW9 được b m:ấ
- Cho COL1 = 0 (COL[2 4] = 1), ki m tra tr ng thái c a các hàng:ể ạ ủ
ROWA= ROWB= ROWC= ROWD=1: v y k t lu n không có nút đậ ế ậ ược b m trên ấCOL1
- Cho COL2 = 0 (COL[1,3,4] = 1), ki m tra tr ng thái c a các hàng:ể ạ ủ
ROWA=ROWB=ROWD=1, ROWC =0: v y k t lu n có nút n m trên hàng C, c t 2ậ ế ậ ằ ộ
được b m (SW9).ấ
- Cho COL3 = 0 (COL[1,2,4]=1): ROWA = ROWB = ROWC= ROWD=1: v y ậ
k t lu n không có nút đế ậ ược b m trên COL3.ấ
- Cho COL4 = 0 (COL[1,2,3]=1): ROWA= ROWB= ROWC= ROWD=1: v y k tậ ế
lu n không có nút đậ ược b m trên COL4.ấ
Quét tương t đ i v i nh ng nút b m khác.ự ố ớ ữ ấ
2 Ph ươ ng pháp ch ng nhi u, ch ng đè cho nút b m b ng ph n c ng và ố ễ ố ấ ằ ầ ứ
ph n m m ầ ề
- Ph n c ng: ầ ứ M ch ch ng d i.ạ ố ộ
Bình thường khi không tác đ ng ngõ ra qua c ng đ o m c th p Khi ộ ổ ả ở ứ ấ
nh n SW, t x nhanh qua SW t o m t xung m c cao t i ngõ ra Khi h ấ ụ ả ạ ộ ứ ạ ở
m ch ngõ vào, t n p lên Vcc qua Rạ ụ ạ
Th i gian n p: T1= 5RC =5x10(K)x1(uF)=50msờ ạ
Trang 16P1=0x7F; //Led 7 port 1 sáng P2=0x7F; //Led 7 port 2 sáng P3=0x7F; //Led 7 port 3 sáng Delay_ms(300); // Tr 300ms ễ } while(1); //L p ặ
Nh v y n u b ng cách nào đó ta cho m t con led đ n ch p t t th t ư ậ ế ằ ộ ơ ớ ắ ậnhanh (trên 25 Hz, nhanh h n n a càng t t, vài trăm Hz, th m chí vài ơ ữ ố ậKHz càng t t mi n là con led có th ch p t n s đó) ta sẽ th y con led ố ễ ể ớ ầ ố ấsáng luôn, mà th c ch t là nó đang sáng_ t t_sáng_t t… r t nhanh.ự ấ ắ ắ ấBây gi ta đi u khi n m t led b y đo n (lo i A chung), cho chân chung ờ ề ể ộ ả ạ ạlên ngu n, đi u khi n sáng t t nhanh cho hai thanh b,c c a nó (5 thanh ồ ề ể ắ ủcòn l i nh t t) ta th y nó sáng lên s 1, th c ch t là đang ch p s 1.ạ ớ ắ ấ ố ự ấ ớ ố
B ng cách cho luân phiên nhi u led hi n th thông tin khác nhau ta có ằ ề ể ị
c m giác nhi u led b y đo n đang sáng đ ng th i, v i cách này ta ch ả ề ả ạ ồ ờ ớ ỉ
c n m t bus d li u n i song song cho t t c các led (g m 7 dây ầ ộ ữ ệ ố ấ ả ồ
a,b,c,d,e,f,g) m i led đỗ ược đi u khi n b ng m t tín hi u khác sao cho ề ể ằ ộ ệ
t i m t th i đi m ch có duy nh t m t led b y đo n đạ ộ ờ ể ỉ ấ ộ ả ạ ược phép hi n ể
th và lúc này bus cũng đang truy n d li u ng v i Led này N u có quáị ề ữ ệ ứ ớ ế
Trang 17nhi u led b y đo n ta ph i k t h p thêm các IC gi i mã ch n kênh ề ả ạ ả ế ợ ả ọ
c p tín hi u a,b,c,d,e,f,g cho led 7 đo n ).ấ ệ ạ
Xem các hình dưới, n u cho các led luân phiên sáng t t, th i gian m i ế ắ ờ ỗled khá lâu (lâu h n th i gian l u nh c a m t) ta sẽ th y t ng led m t ơ ờ ư ả ủ ắ ấ ừ ộsáng nh sau:ư
N u tăng t n s quét (gi m th i gian dành cho m i led) ta sẽ th y k t qu 4 ế ầ ố ả ờ ỗ ấ ế ảled cùng sáng nh sau:ư
Trang 18Phương pháp này ti n d ng ph n c ng l n ph n m m, tuy nhiên n u ệ ụ ở ầ ứ ẫ ầ ề ế
s lố ượng led quá nhi u thì th i gian sáng trung bình dành cho m i led là T l i ề ờ ỗ ạ
gi m đi (T =1/n v i là s led b y đo n, s đ i tả ớ ố ả ạ ố ố ượng được quét ), Đi u này ềkéo theo các led sẽ suy gi m đ sáng M t khác ph i tích h p thêm IC gi i mã,ả ộ ặ ả ợ ảnhi u vi c phát sinh cho thi t k m ch l n l p trình Tóm l i, phề ệ ế ế ạ ẫ ậ ạ ương pháp này ng d ng cho các hi n th thông tin ít ít, c 20 led b y đo n tr xu ng thìứ ụ ể ị ỡ ả ạ ở ốtuy t v i nh ng thông tin nhi u nh b ng t giá ngo i t c n vài trăm led thì ệ ờ ư ề ư ả ỉ ạ ệ ầkhông n.ổ
2 Cách thay đ i th i gian đ m tr trong ch ổ ờ ế ễ ươ ng trình Led 7 seg?
Để thay đ i th i gian đ m tr trong chổ ờ ế ễ ương trình Led 7 seg ta ch n th i ọ ờgian delay l n h n thì tr sẽ l n h nớ ơ ễ ớ ơ
3.Vi t ch ế ươ ng trình đi u khi n đ m t 0 ề ể ế ừ 1020 … 500490480
470… 0 và th c hi n l i? Và l u đ thu t toán? Gi i thích t ng ự ệ ạ ư ồ ậ ả ừ câu l nh? ệ
#include "Display_utils.h"
unsigned short shifter=1, digits_array_index=0; // khai bao cac bien cuc bo
Trang 19unsigned int digit = 0, number = 0;
Trang 20S Đ THU T TOÁN: Ơ Ồ Ậ
Trang 21Câu 7:
Trang 221 LPF là b l c thông th p (Low Pass Filter) t c là b l c ch cho thành ph n ộ ọ ấ ứ ộ ọ ỉ ầ
t n s th p h n t n s c t đi qua , thành ph n t n s cao ầ ố ấ ơ ầ ố ắ ầ ầ ố sẽ b lo i b ị ạ ỏ
2 Phương pháp tăng đ chính xác c a phép đo nhi t đ , phép đo dòng đi n, ộ ủ ệ ộ ệ
đi n áp,… dùng ADC dùng l c thông th p, đ n gi n nh t là l y trung bình ệ ọ ấ ơ ả ấ ấ
c ng c a các l n trích m u trong m t th i gian nào đó t m 500ms nêu thu t ộ ủ ầ ẫ ộ ờ ầ ậtoán và cách th c hi n trongự ệ
Đọc giá trị đo nhiệt lần
n
Trể 500ms
Hiển thị kết quả lần đo
n
Trang 23// =================ket noi modul LCD ===============
sbit OW_Bit at P1_2_bit; // thiet lap pinout cho DS18x20
const unsigned short TEMP_RESOLUTION = 9; // thiet lap do phan giai tuong ung cho DS1820
char *text = "000.0000"; // thiet lap con tro voi 9 ky tu
unsigned temp; // khai bao bien temp
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; // hien thi gia tri T
am va T duong
char temp_whole; // khai bao bien T cuc bo
unsigned int temp_fraction; // khai bao bien T phan so
//=========== kiem tra nhiet do am =====================
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
Trang 24}
temp_whole = temp2write >> RES_SHIFT; // xuat temp_whole dich bit sang phai
//=========== canh bao qua nhiet =======================
if(temp_whole >=20 && temp_whole<= 40)
//=========== chuyen doi temp_whole thanh cac ky tu ========
if (temp_whole/50) // neu xuat hien nhiet do o hang tram thì text[0] = temp_whole/50 + 48; // xuat so hang tram
else
text[0] = '0'; // neu khong thi hien thi 0
text[1] = (temp_whole/10)%10 + 48; // xuat hang chuc
text[2] = temp_whole%10 + 48; // xuat hang don vi
Trang 25//=========== xuat nhiet do la phan so va chuyen sang kieu unsigned int temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
text[4] = temp_fraction/500 + 48; // xuat phan nghin text[5] = (temp_fraction/50)%10 + 48; // xuat phan tram text[6] = (temp_fraction/10)%10 + 48; // xuat phan chuc text[7] = temp_fraction%10 + 48; // xuat phan don vi Lcd_Out(2, 5, text); // va hien thi tren LCD bat dau tu hang 2 cot 5 }
//==================== chuong trinh chinh =============
Trang 26Lcd_Chr(2,14,'C'); // hien thi ky tu C
//====== vong lap chinh
// ======thuc hien doc nhiet do tu DS18x20
do {
Ow_Reset(); // thiet lap tin hieu OneWire Ow_Write(0xCC) // thuc hien lenh SKIP_ROM, gui 1 byte toi DS1820 Ow_Write(0x44); // thuc hien lenh Convert_T
temp = (Ow_Read() << 8) + temp;
Display_Temperature(temp); // hien thi nhiet do
Delay_ms(500); // T o tr 0,5s ạ ễ
}
//
Trang 27-Câu 8:
1 Ng t là gì ? Các lo i ng t trong h VĐK 8051 ắ ạ ắ ọ
Ng t (interrupt) là quá trình d ng chắ ừ ương trình chính đang ch y đ u ạ ể ưtiên th c hi n m t chự ệ ộ ương trình khác, chương trình này đượ ọc g i là chương trình ph c v ng t (ISR –Interrupt Service Routine) ISR hoàn toàn gi ng v i ụ ụ ắ ố ớ
m t chộ ương trình bình thường trên máy tính, nghĩa là nó có kh năng truy ả
xu t đ n t t c các l nh ngôn ng máy c a P Tuy nhiên cu i ISR sẽ k t thúcấ ế ấ ả ệ ữ ủ μ ố ế
b ng l nh IRET (Interrupt Return) đ P ti p t c th c hi n l nh đã k tthúc ằ ệ ể μ ế ụ ự ệ ệ ế
trước đây
Trong các quá trình ng t, ta phân bi t thành 2 lo i: ng t c ng và ng t ắ ệ ạ ắ ứ ắ
m m.ề
Ng t m m : là ng t đắ ề ắ ượ ọ ằc g i b ng m t l nh trong chộ ệ ương trình ngôn
ng máy Ng t m m đữ ắ ề ược th c hi n trên h p ng thông qua l nh INT Đ i ụ ệ ợ ữ ệ ố
v i các ngôn ng b c cao h n, v n cho phép th c hi n g i ng t nh ng ph i ớ ữ ậ ơ ẫ ự ệ ọ ắ ư ả
được biên d ch thành l nh INT trong h p ng r i m i th c hi n.ị ệ ợ ữ ồ ờ ự ệ
Ng t c ng :khác v i ng t m m, ng t c ng không đắ ứ ớ ắ ề ắ ứ ược kh i đ ng bên ở ộtrong máy tính mà do các linh ki n đi n t tác đông lên h th ng Ng t c ng ệ ệ ử ệ ố ắ ứcũng được chia thành 2 lo i: ng t che đạ ắ ược và ng t không che đắ ược Ng t cheắ
được là ng t có th cho phép hay không cho phép th c thi b ng ph n m m ắ ể ự ằ ầ ềthông qua c ng t IF (Interrupt Flag): l nh CLI (Clear InterruptFlag) sẽ c m ờ ắ ệ ấ
ng t và l nh STI (Set Interrupt Flag) sẽ cho phép các ng t này ho t đ ng.ắ ệ ắ ạ ộ
Khi th c hi n l nh g i m t ng t nào đó, chự ệ ệ ọ ộ ắ ương trình con ph c v cho ụ ụ