Tải bản đầy đủ (.pdf) (56 trang)

Đồng hồ số sử dụng vi điều khiển AT89S52 giao tiếp với IC DS1307 hiển thị thời gian thực lên LCD

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.03 MB, 56 trang )

Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

ĐỒ ÁN MÔN HỌC
KỸ THUẬT VI ĐIỀU KHIỂN VÀ GHÉP NỐI
NGOẠI VI

Đề tài: Đồng hồ số sử dụng Vi điều khiển AT89S52
giao tiếp với IC DS1307 hiển thị thời gian thực lên LCD

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 1


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

LỜI NÓI ĐẦU
Kỹ thuật vi điều khiển hiện nay rất phát triển, nó đƣợc ứng dụng vào rất nhiều
lĩnh vực sản xuất cơng nghiệp, tự động hóa, trong đời sống và còn nhiều lĩnh vực
khác nữa. So với kỹ thuật số thì kỹ thuật vi điểu khiển nhỏ gọn hơn rất nhiều do nó
đƣợc tích hợp lại và có khả năng lập trình đƣợc để điều khiển. Nên rất tiện dụng và
cơ động. Với tính ƣu việt của vi điều khiển thì trong phạm vi đồ án này, em dùng vi
điều khiển xử lí tín hiệu từ IC DS1307, đồng thời cho hiển thị lên LCD.
Mục đích của đề tài hƣớng đến: tạo ra bƣớc đầu cho sinh viên thử nghiệm
những ứng dụng của vđk trong thực tiễn để rồi từ đó tìm tịi, phát triển nhiều ứng
dụng khác trong đời sống hằng ngày cần đến.
Việc thực hiện xong đồ án môn học bằng các kiến thức đã học, một số sách


tham khảo và một số nguồn tài liệu khác nên khơng tránh khỏi những thiếu sót. Vì
vậy em rất mong đƣợc sự góp ý của thầy cơ và các bạn.

Đà Nẵng,ngày 19 tháng 4 năm 2014
Sinh viên thực hiện
Nguyễn Trọng Cƣờng

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 2


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Mục lục
Nội dung

Trang

Lời nói đầu ..................................... .............................................................. 2
Mục lục .......................................... .............................................................. 3
Chƣơng 1: GIỚI THIỆU TỔNG QUAN ĐỀ TÀI .......................................... 5
I. Giới thiệu ................................. .............................................................. 5
II. Sơ đồ khối và chức năng các khối ........................................................... 5
1. Sơ đồ khối .................... .............................................................. 5
2. Chức năng các khối ...... .............................................................. 6
Chƣơng 2: THIẾT KẾ MẠCH ....... .............................................................. 7
I. Giới thiệu sơ lƣợc về chuẩn giao tiếp I2C ................................................ 7

II. Giới thiệu IC thời gian thực DS1307 ...................................................... 8
III. Thuật toán giao tiếp I2C ......... .............................................................. 11
1. Điều kiện START và STOP.......................................................... 11
2. Chế độ hoạt động........... .............................................................. 12
IV. Giới thiệu về chip vi điều khiển AT89S52 ............................................ 14
1. Giới thiệu sơ lƣợc .......... .............................................................. 14
2. Sơ đồ khối ..................... .............................................................. 14
3. Sơ đồ chân..................... .............................................................. 15
4. Chức năng các chân ....... .............................................................. 15
V. Tổng quan về LCD .................. .............................................................. 16
1. Chức năng các chân LCD ............................................................. 16
2. Sơ đồ khối của HD44780.............................................................. 17
3. Tập lệnh ........................ .............................................................. 19
4. Biểu đồ thời gian ........... .............................................................. 22
VI. Sơ đồ mạch nguyên lý ............ .............................................................. 24
Chƣơng 3:THIẾT KẾ CHƢƠNG TRÌNH...................................................... 26
I. Lƣu đồ thuật tốn ...................... .............................................................. 26
1. Chƣơng trình chính........ .............................................................. 26
2. Chƣơng trình con giao tiếp với DS1307........................................ 26
SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 3


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

3. Chƣơng trình con hiển thị lên LCD............................................... 30
4. Chƣơng trình con giao tiếp với LCD ............................................ 30

5. Chƣơng trình con hiệu chỉnh giờ .................................................. 32
6. Chƣơng trình con DELAY............................................................ 39
II. Phần lập trình .......................... .............................................................. 42
TÀI LIỆU THAM KHẢO .............. .............................................................. 56

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 4


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

CHƢƠNG 1: GIỚI THIỆU TỔNG QUAN VỀ ĐỀ TÀI
I) Giới thiệu
Cùng với sự phát triển của khoa học và công nghệ, các thiết bị điện tử đã, đang
và sẽ tiếp tục đƣợc ứng dụng ngày càng rộng rãi và mang lại hiệu quả trong hầu hết
các lĩnh vực khoa học, kỹ thuật cũng nhƣ trong đời sống xã hội.
Việc gia cơng, xử lý các tín hiệu điện tử hiện đại đều dựa trên cơ sở nguyên lý số.
Vì các thiết bị làm việc làm việc dựa trên nguyên lý số có ƣu điểm hơn hẳn các thiết
bị làm việc dựa trên nguyên lý tƣơng tự, đặc biệt là trog kỹ thuật tính tốn.
Sự phát triển mạnh mẽ của cơng nghệ điện tử cho ra đời nhiều vi mạch số cỡ lớn
với giá thành rẻ và khả năng lập trình cao mang lại những thay đổi lớn trong ngành
điện tử. Mạch số ở những mức độ khác nhau đã và đang thâm nhập trong các lĩnh
vực điện tử thông dụng và chuyên nghiệp một cách nhanh chóng. Các trƣờng kỹ
thuật là nơi mạch số thâm nhập mạnh mẽ và đƣợc học sinh, sinh viện ƣa chuộng do
lợi ích và tính khả thi của nó. Vì thế sự hiểu biết sâu sắc về kỹ thuật số là không thể
thiếu đối với các sinh viên ngành điện tử hiện nay. Nhu cầu hiểu biết về kỹ thuật số
không chỉ riêng đối với những ngƣời theo chuyên ngành điện tử mà còn đối với

những cán bộ kỹ thuật khác có sử dụng các thiết bị điện tử.
Ngày nay, trong các ứng dụng dân dụng và công nghiệp, các bộ vi mạch vi điều
khiển đƣợc ứng dụng rộng rãi và đã phát huy đƣợc tính năng ƣu việt của nó. Việc sử
dụng các bộ vi điều khiển để điều khiển các công việc mang tính lặp lại có chu kỳ là
cần thiết để thay thế sự giám sát của con ngƣời. Ở đây em xin trình bày việc ứng
dụng vi điều khiển trong việc giao tiếp với IC DS1307 để hiển thị thời gian thực
trên LCD.

II) Sơ đồ khối và chức năng của các khối
1. Sơ đồ khối
KHỐI HIỂN THỊ

KHỐI ĐIỀU CHỈNH

KHỐI ĐIỀU KHIỂN
(VĐK)

KHỐI THỜI GIAN THỰC

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 5


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

2. Chức năng của các khối
- Khối điều chỉnh gồm 3 nút nhấn để đặt và hiệu chỉnh thời gian.

- Khối hiển thị là LCD.
- Khối điều khiển sử dụng vi điều khiển AT89S52 điều khiển toàn bộ các hoạt
động chính của mạch : nhận tín hiệu điều khiển của khối điều chỉnh và tín hiệu từ
IC thời gian thực xuất ra khối hiển thị. Mọi hoạt động của mạch đều do khối này
điều khiển.
- Khối thời gian thực là DS1307.

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 6


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

CHƢƠNG 2: THIẾT KẾ MẠCH
I. Giới thiệu sơ lƣợc về chuẩn giao tiếp I2C
Giao thức ƣu tiên truyền thông nối tiếp đƣợc phát triển bởi Philips
Semiconductor và đƣợc gọi là bus I2C. Vì nguồn gốc nó đƣợc thiết kế là để điều
khiển liên thơng IC (Inter-Intergrated Circuit) nên nó đƣợc đặt tên là I2C. Tất cả các
chip có tích hợp và tƣơng thích với I2C đều có thêm một giao diện tích hợp trên
Chip để truyền thơng trực tiếp với các thiết bị tƣơng thích I2C khác. Việc truyền dữ
liệu nối tiếp theo hai hƣớng 8 bit đƣợc thực thi theo 3 chế dộ sau:
- Chuẩn (Standard)—100 Kbits/sec
- Nhanh (Fast)—400 Kbits/sec
- Tốc dộ cao (High speed)—3.4 Mbits/sec
Ðƣờng bus thực hiện truyền thông nối tiếp I2C gồm hai đƣờng là đƣờng truyền
dữ liệu nối tiếp SDA và đƣờng truyền nhịp xung đồng hồ nối tiếp SCL. Vì cơ chế
hoạt động là đồng bộ nên nó cần có một nhịp xung tín hiệu đồng bộ. Các thiết bị hỗ

trợ I2C đều có một địa chỉ định nghĩa trƣớc, trong đó một số bit địa chỉ là thấp có
thể cấu hình. Ðơn vị hoặc thiết bị khởi tạo q trình truyền thơng là đơn vị Chủ và
cũng là đơn vị tạo xung nhịp đồng bộ, điều khiển cho phép kết thúc quá trình
truyền. Nếu đơn vị Chủ muốn truyền thơng với đơn vị khác nó sẽ gửi kèm thơng tin
địa chỉ của đơn vị mà nó muốn truyền trong dữ liệu truyền. Ðơn vị Tớ đều đƣợc gán
và đánh địa chỉ thông qua đó đơn vị Chủ có thể thiết lập truyền thông và trao đổi dữ
liệu. Bus dữ liệu đƣợc thiết kế để cho phép thực hiện nhiều đơn vị Chủ và Tớ ở trên
cùng Bus.
Q trình truyền thơng I2C đƣợc bắt đầu bằng tín hiệu start tạo ra bởi đơn vị
Chủ. Sau đó đơn vị Chủ sẽ truyền đi dữ liệu 7 bit chứa địa chỉ của đơn vị Tớ mà nó
muốn truyền thơng, theo thứ tự là các bit có trọng số lớn nhất MSB sẽ đƣợc truyền
truớc. Bit thứ tám tiếp theo sẽ chứa thông tin dể xác định đơn vị Tớ sẽ thực hiện vai
trò nhận (0) hay gửi (1) dữ liệu. Tiếp theo sẽ là một bit ACK xác nhận bởi đơn vị
nhận đã nhận đƣợc 1 byte truớc đó hay khơng. Ðơn vị truyền (gửi) sẽ truyền đi 1
byte dữ liệu bắt đầu bởi MSB. Tại diểm cuối của byte truyền, đơn vị nhận sẽ tạo ra
một bit xác nhận ACK mới. Khuôn mẫu 9 bit này (gồm 8 bit dữ liệu và 1 bit xác
nhận) sẽ đƣợc lặp lại nếu cần truyền tiếp byte nữa. Khi đơn vị Chủ đã trao dổi xong
dữ liệu cần nó sẽ quan sát bit xác nhận ACK cuối cùng rồi sau đó sẽ tạo ra một
tín hiệu dừng STOP để kết thúc q trình truyền thơng. I2C là một giao diện
truyền thơng đặc biệt thích hợp cho các ứng dụng truyền thông giữa các đơn
vị trên cùng một bo mạch với khoảng cách ngắn và tốc dộ thấp. Ví dụ nhƣ truyền
thơng giữa CPU với các khối chức năng trên cùng một bo mạch nhƣ EEPROM, cảm
biến, dồng hồ tạo thời gian thực... Hầu hết các thiết bị hỗ trợ I2C hoạt dộng ở tốc độ

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 7


Đồ án Vi điều khiển và ghép nối Ngoại vi


GVHD: Ths.Lê Xứng

400Kbps, một số cho phép hoạt động ở tốc độ cao vài Mbps. I2C khá đơn giản để
thực thi kết nối nhiều đơn vị vì nó hỗ trợ cơ chế xác định địa chỉ.
II. Giới thiệu IC thời gian thực (real time clock) DS1307
DS1307 là chip đồng hồ thời gian thực (RTC : Real-time clock), khái niệm thời
gian thực ở đây đƣợc dùng với ý nghĩa thời gian tuyệt đối mà con nguời đang sử
dụng, tình bằng giây, phút, giờ… DS1307 là một sản phẩm của Dallas
Semiconductor (một công ty thuộc Maxim Integrated Products). Chip này có 7
thanh ghi 8-bit chứa thời gian là: giây, phút, giờ, thứ (trong tuần), ngày, tháng, năm.
Ngồi ra DS1307 cịn có 1 thanh ghi điều khiển ngõ ra phụ và 56 thanh ghi trống có
thể dùng nhƣ RAM. DS1307 xuất hiện ở 2 gói SOIC và DIP có 8 chân nhƣ trong
hình 1.

Hình 1. Hai gói cấu tạo chip DS1307
Các chân của DS1307 đƣợc mô tả nhƣ sau:
X1 và X2: là 2 ngõ kết nối với 1 thạch anh 32.768KHz làm nguồn tạo dao
động cho chip.
VBAT: cực dƣơng của một nguồn pin 3V nuôi chip.
GND: chân mass chung cho cả pin 3V và Vcc.
Vcc: nguồn cho giao diện I2C, thƣờng là 5V và dùng chung với vi diều khiển.
Chú ý là nếu Vcc khơng đƣợc cấp nguồn nhƣng VBAT đƣợc cấp thì DS1307 vẫn
đang hoạt động (nhƣng không ghi và đọc đƣợc).
SQW/OUT: một ngõ phụ tạo xung vuông (Square Wave / Output Driver), tần
số của xung đƣợc tạo có thể đƣợc lập trình. Nhƣ vậy chân này hầu nhƣ không liên
quan đến chức năng của DS1307 là đồng hồ thời gian thực, chúng ta sẽ bỏ trống
chân này khi nối mạch.
SCL và SDA là 2 đƣờng giao xung nhịp và dữ liệu của giao diện I2C.
Có thể kết nối DS1307 bằng một mạch điện đơn giản nhƣ trong hình 2.


SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 8


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Hình 2: Mạch ứng dụng đơn giản của DS1307
Cấu tạo bên trong DS1307 bao gồm một số thành phần nhƣ mạch nguồn, mạch
dao động, mạch điều khiển logic, mạch giao diện I2C, con trỏ địa chỉ và các thanh
ghi (hay RAM). Sử dụng DS1307 chủ yếu là ghi và đọc các thanh ghi của chip này.
Vì thế có 2 vấn đề cơ bản đó là cấu trúc các thanh ghi và cách truy xuất các thanh
ghi này thông qua giao diện I2C.
Nhƣ đã trình bày, bộ nhớ DS1307 có tất cả 64 thanh ghi 8-bit đƣợc đánh địa chỉ
từ 0 dến 63 (từ 00H dến 3FH theo hệ HexaDecimal). Tuy nhiên, thực chất chỉ có 8
thanh ghi đầu là dùng cho chức năng ―đồng hồ‖ (RTC) còn lại 56 thanh ghi bỏ trống
có thể đƣợc dùng chứa biến tạm nhƣ RAM nếu muốn. Bảy thanh ghi đầu tiên chứa
thông tin về thời gian của đồng hồ bao gồm: giây (SECONDS), phút (MINUTES),
giờ (HOURS), thứ (DAY), ngày (DATE), tháng (MONTH) và năm (YEAR). Việc
ghi giá trị vào 7 thanh ghi này tƣơng đƣơng với việc ―cài dặt‖ thời gian khởi động
cho RTC. Việc đọc giá trị từ 7 thanh ghi là đọc thời gian thực mà chip tạo ra. Ví dụ,
lúc khởi động chƣơng trình, chúng ta ghi vào thanh ghi ―giây‖ giá trị 42, sau đó 12s
chúng ta đọc thanh ghi này, chúng ta thu đƣợc giá trị 54.
Thanh ghi thứ 8 (CONTROL) là thanh ghi điều khiển xung ngõ ra QW/OUT
(chân 6). Tuy nhiên, do chúng ta không dùng chân SQW/OUT nên có thề bỏ qua
thanh ghi thứ 8. Tổ chức bộ nhớ của DS1307 đƣợc trình bày trong hình 3.


Hình 3: Tổ chức bộ nhớ của DS1307
SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 9


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Vì 7 thanh ghi đầu tiên là quan trọng nhất trong hoạt động của DS1307, chúng ta
sẽ khảo sát các thanh ghi này một cách chi tiết. Trƣớc hết hãy quan sát tổ chức theo
từng bit của các thanh ghi này nhƣ trong hình 4.

Hình 4: Tổ chức thanh ghi thời gian
Thanh ghi giây (SECONDS): thanh ghi này là thanh ghi dầu tiên trong bộ nhớ
của DS1307, địa chỉ của nó là 0x00. Bốn bit thấp của thanh ghi này chứa mã BCD
4-bit của chữ số hàng đơn vị của giá trị giây. Do giá trị cao nhất của chữ số hàng
chục là 5 (khơng có giây 60) nên chỉ cần 3 bit (các bit SECONDS 6:4) là có thể mã
hóa đƣợc (số 5 =101, 3 bit). Bit cao nhất, bit 7, trong thanh ghi này là 1 điều khiển
có tên CH (Clock halt – treo dồng hồ), nếu bit này đƣợc set bằng 1 bộ dao động
trong chip bị vơ hiệu hóa, đồng hồ khơng hoạt động. Vì vậy, nhất thiết phải reset bit
này xuống 0 ngay từ dầu.
Thanh ghi phút (MINUTES): có địa chỉ 01H, chứa giá trị phút của đồng hồ.
Tƣơng tự thanh ghi SECONDS, chỉ có 7 bit của thanh ghi này đƣợc dùng lƣu mã
BCD của phút, bit 7 luôn luôn bằng 0.
Thanh ghi giờ (HOURS): có thể nói đây là thanh ghi phức tạp nhất trong
DS1307. Thanh ghi này có địa chỉ 02H. Truớc hết 4-bits thấp của thanh ghi này
đƣợc dùng cho chữ số hàng đơn vị của giờ. Do DS1307 hỗ trợ 2 loại hệ thống hiển
thị giờ (gọi là mode) là 12h (1h dến 12h) và 24h (1h dến 24h) giờ, bit6 (hình 4) xác

lập hệ thống giờ. Nếu bit6=0 thì hệ thống 24h đƣợc chọn, khi dó 2 bit cao 5 và 4
dùng mã hóa chữ số hàng chục của giá trị giờ. Do giá trị lớn nhất của chữ số hàng
chục trong truờng hợp này là 2 (=10, nhị phân) nên 2 bit 5 và 4 là đủ để mã hóa.
Nếu bit6=1 thì hệ thống 12h đƣợc chọn, với truờng hợp này chỉ có bit 4 dùng mã
hóa chữ số hàng chục của giờ, bit 5 (màu orange trong hình 4) chỉ buổi trong ngày,
AM hoặc PM. Bit5 =0 là AM và bit5=1 là PM. Bit 7 luôn bằng 0.
Thanh ghi thứ (DAY – ngày trong tuần): nằm ở dịa chỉ 03H. Thanh ghi DAY
chỉ mang giá trị từ 1 dến 7 tƣơng ứng từ Chủ nhật đến thứ 7 trong 1 tuần. Vì thế, chỉ
có 3 bit thấp trong thanh ghi này có nghĩa.
SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 10


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Các thanh ghi cịn lại có cấu trúc tƣơng tự, DATE chứa ngày trong tháng (1 đến
31), MONTH chứa tháng (1 dến 12) vàYEAR chứa năm (00 dến 99). Chú ý,
DS1307 chỉ dùng cho 100 năm, nên giá trị năm chỉ có 2 chữ số, phần đầu của năm
do nguời dùng tự thêm vào (ví dụ 20xx).
Ngồi các thanh ghi trong bộ nhớ, DS1307 cịn có một thanh ghi khác nằm riêng
gọi là con trỏ địa chỉ hay thanh ghi địa chỉ (Address Register). Giá trị của thanh ghi
này là địa chỉ của thanh ghi trong bộ nhớ mà ngƣời dùng muốn truy cập.

Hình 5: Cấu trúc DS1307
III. Thuật toán giao tiếp I2C
1. Điều kiện Start và Stop
Start và Stop là những điều kiện bắt buộc phải có khi một thiết bị chủ muốn thiết

lập giao tiếp với một thiết bị nào đó trong mạng I2C. Start là điều kiện khởi đầu,
báo hiệu bắt đầu của giao tiếp, còn Stop báo hiệu kết thúc một giao tiếp. Hình 11
mơ tả điều kiện Start và điều kiện Stop khi giao tiếp I2C giữa DS1307 với Vi Ðiều
Khiển.

Hình 9: Điều kiện Start và Stop
SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 11


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Ban đầu khi chƣa thực hiện quá trình giao tiếp, cả hai đƣờng SDA và SCL đều
ở mức cao (SDA = SCL = HIGH). Lúc này bus I2C đƣợc coi là ―rỗi‖ (―bus free‖),
sẵn sàng cho một giao tiếp. Hai điều kiện Start và Stop là không thể thiếu trong việc
giao tiếp giữa các thiết bị I2C, tất nhiên là trong giao tiếp này cũng không ngoại lệ.
Ðiều kiện Start: một sự chuyển đổi trạng thái từ cao xuống thấp trên đƣờng
SDA trong khi đƣờng SCL đang ở mức cao (cao = 1; thấp = 0) báo hiệu một điều
kiện Start.
Ðiều kiện Stop: Một sự chuyển đổi trạng thái từ mức thấp lên cao trên đƣờng
SDA trong khi đƣờng SCL đang ở mức cao.
Cả hai điều kiện Start và Stop đều đƣợc tạo ra bởi thiết bị chủ. Sau tín hiệu
Start, bus I2C coi nhu dang trong trạng thái làm việc (busy). Bus I2C sẽ rỗi, sẵn
sàng cho một giao tiếp mới sau tín hiệu Stop từ phía thiết bị chủ.
Sau khi có một diều kiện Start, trong qua trình giao tiếp, khi có một tín hiệu
Start duợc lặp lại thay vì một tín hiệu Stop thì bus I2C vẫn tiếp tục trong trạng thái
bận. Tín hiệu Start và lặp lại Start dều có chức nang giống nhau là khởi tạo một giao

tiếp.
2. Chế độ hoạt động

Hình 10: Chế độ hoạt động I2C
DS1307 có thể hoạt dộng ở 2 chế độ sau:
Ở chế độ slave nhận (chế độ DS1307 ghi ): chuỗi dữ liệu và chuỗi xung clock
sẽ đƣợc nhận thông qua SDA và SCL. Sau mỗi byte đƣợc nhận thì 1 bit
ACKnowledge sẽ đƣợc truyền. Các điều kiện START và STOP sẽ đƣợc nhận dạng
khi bắt đầu và kết thúc 1 truyền 1 chuỗi, nhận dạng địa chỉ đƣợc thực hiện bởi phần
cứng sau khi chấp nhận địa chỉ của slave và bit một chiều.
Chế độ slave phát ( chế độ DS1307 đọc ): byte đầu tiên slave nhận đƣợc tƣơng
tự nhƣ chế độ slave ghi. Tuy nhiên trong chế độ này thì bit chiều lại chỉ chiều
chuyền ngƣợc lại. Chuỗi dữ liệu đƣợc phát đi trên SDA bởi DS1307 trong khi chuỗi
xung clock vào chân SCL.
a. Các bước để thực hiện giao tiếp I2C
START I2C
SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 12


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Ghi: 0DxH (Ðây là dịa chỉ của DS1307 do nhà sản xuất quy dịnh trong giao
tiếp I2C) với: x=0: Ghi dữ liệu vào DS1307 x=1: Ðọc dữ liệu vào DS1307
Ghi tham số x này vào, có nghĩa là việc tiếp theo là chúng ta ghi hay đọc dữ
liệu từ con DS1307 tùy vào giá trị x=0 (ghi dữ liệu) hay x=1(đọc dữ liệu).
Ghi vào địa chỉ thanh ghi cần ghi hoặc cần đọc (bảng đồ thanh ghi của DS1307

này đã đƣợc giới thiệu ở hình 3 & hình 4).
Ghi hoặc dọc dữ liệu.
STOP I2C
b. Ví dụ minh học cho việc đọc, ghi
Thanh ghi có dịa chỉ 01H chứa Data về ―phút‖, muốn set phút vào DS1307
chúng ta làm theo quy trình:
START→Ghi: 0D0H→Ghi tiếp: 01H→Ghi tiếp: <thơng số cần cài đặt (BCD)>
→Ghi tiếp hoặc STOP nếu chỉ muốn cài đặt thời gian cho phút.

Hình 11: Chế độ ghi của DS1307
Nếu muốn Ghi vào địa chỉ 01H rồi kế tiếp Ghi vào địa chỉ 04H chẳng hạn thì
chúng ta phải START lại từ đầu→Ghi vào 0D0H (để xác định sẽ Ghi vào DS1307 _
hướng giao tiếp là Ghi vào) →Ghi tiếp 04H→Ghi dữ liệu của thanh ghi cần cài
dặt→STOP I2C.
Tƣơng tự, nếu chúng ta muốn đọc thì truớc hết chúng ta phải ghi vào địa chỉ
cần đọc: tức là vẫn tiếp tục tiến hành 3 thủ tục START→Ghi 0D0H→Ghi vào địa
chỉ (địa chỉ của thanh ghi mà ta muốn đọc dữ liệu). Sau đó, mới START lại rồi ghi
lại 0D1H (lúc này mới thông báo là ta sẽ đọc từ DS1307), tiếp theo cứ đọc bình
thuờng (thanh ghi đọc đƣợc sẽ là thanh ghi có địa chỉ ta mới vừa ghi vào), tiếp tục
đọc thì địa chỉ cần đọc sẽ tự động tăng lên cho dến khi STOP I2C.

Hình 12: Chế độ đọc của DS1307

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 13


Đồ án Vi điều khiển và ghép nối Ngoại vi


GVHD: Ths.Lê Xứng

IV. Giới thiệu về chip vi điều khiển AT89S52
1. Giới thiệu sơ lƣợc
Vi điều khiển 8051 đƣợc Intel cho ra đời vào năm 1980 thuộc vi điều khiển đầu
tiên của họ MCS-51. Hiện tại rất nhiều nhà sản xuất nhƣ Siemens, advanced Micro
Devices, Fusisu và Philips tập trung phát triển các sản phẩm trên cơ sở 8051. Atmel
là hãng đã cho ra đời các chip 89C51, 52, 55 và sau đó cải tiến thêm, hãng cho ra
đời 89S51, 89S52, 89S8252…
Cấu hình 89S52:
+ 8KB bộ nhớ chƣơng trình.
+ Dao động bên ngồi với thạch anh <24MHz. Thơng thƣờng, VÐK 89S52 chạy
với thạch anh 12MHz.
+ 256 Byte Ram nội.
+ 4 Port xuất nhập.
+ 3 Timer/ Counter 16 bit Timer 0 ,1,2. Timer 2 có các chức năng
capture/Compare .
+ 8 nguồn ngắt.
+ Nạp chƣơng trình song song hoặc nạp nối tiếp qua đƣờng SPI.
2. Sơ đồ khối

Hình 6: Sơ đồ khối họ 8051

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 14


Đồ án Vi điều khiển và ghép nối Ngoại vi


GVHD: Ths.Lê Xứng

Về cơ bản thì các chip nêu trên giống nhau, chỉ có một số tính năng đƣợc cải tiến
thêm. Các phiên bản về sau càng có nhiều khối tính năng đặc biệt hơn. Chúng ta
xem bảng so sánh một số loại phổ biến nhƣ dƣới đây.

Hình 7: Bảng so sánh cấu hình một số loại VĐK họ 8051

3. Sơ đồ chân VĐK AT89s52

Hình 8: Sơ đồ chân của AT89S52
4. Chức năng các chân AT89S52
P0,1,2,3 có chức năng cơ bản xuất/nhập.

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 15


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Riêng P0, P2 cịn có chức năng kết nối bộ nhớ mở rộng, sẽ đƣợc khảo sát trong
phần mở rộng bộ nhớ.
P1: Chân T2 và T2EX dùng cho timer/ counter 2. Hai chức năng này sẽ khảo
sát trong phần Timer. Chân SS\, MOSI, MISO, SCK truyền dữ liệu theo chuẩn SPI
đồng thời có chức năng kết nối với mạch nạp chƣơng trình.
P3: Tích hợp các chức nang dặc biệt. Xem bảng:


Chân ALE, PSEN, WR\, RD\ dùng dể kết nối bộ nhớ mở rộng.
Chân EA\ có chức nang chọn bộ nhớ chuong trình: EA\=GND: Chọn bộ nhớ
ngoại, EA\=VCC chọn bộ nhớ nội.
Chân Xtal1 và Xtal2 gắn với thạch anh.
V. Tổng quan về LCD

Hình dạng thực của LCD 16x2
1. Chức năng các chân của LCD
Chân Tên
Chức năng
số
1

Vss

2

Vdd

Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với
GND của mạch điều khiển.
Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này
với Vcc=5V của mạch điều khiển

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 16


Đồ án Vi điều khiển và ghép nối Ngoại vi


GVHD: Ths.Lê Xứng

Chân này dùng để điều chỉnh độ tƣơng phản của LCD
Chân chọn thanh ghi (Register select).
+ Logic ―0‖: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của
LCD (ở chế độ ―ghi‖ write) hoặc nối với bộ đếm địa chỉ của
LCD (ở chế độ ―đọc‖ - read)
+ Logic ―1‖: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR
bên trong LCD.
5
RW Chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với
logic ―0‖ để LCD hoạt động ở chế độ hi, hoặc nối với logic
―1‖ để LCD ở chế độ đọc.
6
E
Chân cho phép (Enable). Sau khi các tín hiệu đƣợc đặt lên bus
DB0-DB7, các lệnh chỉ đƣợc chấp nhận khi có 1 xung cho
phép của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ đƣợc LCD chuyển vào(chấp
nhận)thanh ghi bên trong nó khi phát hiện một xung (high-tolow transition) của tín hiệu chân E.
+ Ở chế độ đọc: Dữ liệu sẽ đƣợc LCD xuất ra DB0-DB7khi
phát hiệncạnhlên (low-tohightransition) ở chân E và đƣợc
LCD giữ ở bus đến khi nào chân E xuống mức thấp.
7-14 DB0- Tám đƣờng của bus dữ liệu dùng để trao đổi thông tin với MPU.
DB7 Có 2 chế độ sử dụng 8 đƣờng bus này :
+ Chế độ 8 bit : Dữ liệu đƣợc truyền trên cả 8 đƣờng, với bit MS
B là bit DB7.
+ Chế độ 4 bit : Dữ liệu đƣợc truyền trên 4 đƣờng từ DB4 tới DB
7, bit MSB là DB7.

15-16 A,K Đèn của LCD
2.
Sơ đồ khối của HD44780
Khi sản xuất LCD, nhà sản xuất dã tích hợp chíp diều khiển (HD44780) bên
trong lớp vỏ và chỉ dua các chân giao tiếp cần thiết.
3
4

Vee
RS

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 17


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

a. Các thanh ghi
Chíp HD44780 có 2 thanh ghi 8 bit quan trọng : Thanh ghi lệnh IR Instructor
Register) và thanh ghi dữ liệu DR (Data Register)
Thanh ghi IR : Ðể diều khiển LCD, nguời dùng phải ―ra lệnh‖ thông qua tám
đƣờng bus DB0-DB7. Mỗi lệnh đƣợc nhà sản xuất LCD đánh địa chỉ rõ ràng. Nguời
dùng chỉ việc cung cấp địa chỉ lệnh bằng cách nạp vào thanh ghi IR. Nghĩa là, khi ta
nạp vào thanh ghi IR một chuỗi 8 bit, chíp HD44780 sẽ tra bảng mã lệnh tại địa chỉ
mà IR cung cấp và thực hiện lệnh đó.
Thanh ghi DR : Thanh ghi DR dùng để chứa dữ liệu 8 bit để ghi vào vùng RAM
DDRAM hoặc CGRAM (ở chế độ ghi) hoặc dùng để chứa dữ liệu từ 2 vùng RAM

này gởi ra cho MPU (ở chế độ dọc). Nghĩa là, khi MPU ghi thông tin vào DR, mạch
nội bên trong chíp sẽ tự động ghi thông tin này vào DDRAM hoặc CGRAM. Hoặc
khi thông tin về địa chỉ đƣợc ghi vào IR, dữ liệu ở địa chỉ này trong vùng RAM nội
của HD44780 sẽ đƣợc chuyển ra DR để truyền cho MPU. Bằng cách điều khiển
chân RS và R/W chúng ta có thể chuyển qua lại giữ 2 thanh ghi này khi giao tiếp
với MPU.
Bảng sau đây tóm tắt lại các thiết lập đối với hai chân RS và R/W theo mục đích
giao tiếp.
RS RW
Khi cần
Ghi vào thanh ghi IR để ra lệnh cho LCD (VD: cần display clear)
0
0
SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 18


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Ðọc cờ bận ở DB7 và giá trị của bộ đếm địa chỉ ở DB0-DB6.
0
1
Ghi vào thanh ghi DR.
1
0
Ðọc dữ liệu từ DR.
1

1
b. Cờ báo bận BF (Busy Flag):
Khi thực hiện các hoạt động bên trong chíp, mạch nội bên trong cần một khoảng
thời gian để hoàn tất. Khi đang thực thi các hoạt động bên trong chip nhƣ thế, LCD
bỏ qua mọi giao tiếp với bên ngoà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 để báo cho MCU biết nó đang ―bận‖. Dĩ nhiên, khi xong
việc, nó sẽ đặt cờ BF lại mức 0.
c. Bộ Ðếm địa chỉ AC (Address Counter):
Nhƣ trong sơ đồ khối, thanh ghi IR không trực tiếp kết nối với vùng RAM
(DDRAM và CGRAM) mà thông qua bộ đếm địa chỉ AC. Bộ dếm này lại nối với 2
vùng RAM theo kiểu rẽ nhánh. Khi một địa chỉ lệnh đƣợc nạp vào thanh ghi IR,
thông tin đƣợc nối trực tiếp cho 2 vùng RAM nhƣng việc chọn lựa vùng RAM
tƣơng tác đã đƣợc bao hàm trong mã lệnh.
d. Vùng Ram hiển thị DDRAM(Display Data RAM):
Ðây là vùng RAM dùng để hiển thị, nghĩa là ứng với một địa chỉ của RAM là
một ơ kí tự trên màn hình và khi bạn ghi vào vùng RAM này một mã 8 bit, LCD sẽ
hiển thị tại vị trí tƣơng ứng trên màn hình một kí tự có mã 8 bit mà bạn đã cung cấp.
Vùng RAM này có 80x8 bit nhớ, nghĩa là chứa đƣợc 80 kí tự mã 8 bit. Những vùng
RAM cịn lại khơng dùng cho hiển thị có thể dùng nhƣ vùng RAM đa mục đích.
e. Vùng ROM chứa ký tự đồ họa:
Vùng ROM này dùng để chứa các mẫu kí tự loại 5x8 hoặc 5x10 điểm ảnh/kí tự,
và định địa chỉ bằng 8 bit. Tuy nhiên, nó chỉ có 208 mẫu kí tự 5x8 và 32 mẫu kí tự
kiểu 5x10 (tổng cộng là 240 thay vì 28 = 256 mẫu kí tự). Nguời dùng khơng thể
thay đổi vùng ROM này.
f. Vùng RAM chứa kí tự đồ họa CGRAM (Character Generator RAM):
Nhà sản xuất dành vùng có địa chỉ byte cao là 0000 dể ngƣời dùng có thể tạo các
mẫu kí tự đồ họa riêng. Tuy nhiên dung luợng vùng này rất hạn chế: Ta chỉ có thể
tạo 8 kí tự loại 5x8 điểm ảnh, hoặc 4 kí tự loại 5x10 điểm ảnh.
3. Tập lệnh của LCD:
Các lệnh của LCD có thể chia thành 4 nhóm nhƣ sau :

 Các lệnh về kiểu hiển thị. VD : Kiểu hiển thị (1 hàng / 2 hàng), chiều dài dữ
liệu (8 bit / 4 bit), …
 Chỉ định địa chỉ RAM nội.
 Nhóm lệnh truyền dữ liệu trong RAM nội.
 Các lệnh còn lại .

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 19


Đồ án Vi điều khiển và ghép nối Ngoại vi

Tên lệnh
Clear
Display

Return
home

Entry
mode set

Display
on/off
control

Cursor
or
display

shift

GVHD: Ths.Lê Xứng

Hoạt động
t(max)
Mã lệnh:DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx = 0
0 0
0
0
0
0
1
Lệnh Clear Display (xóa hiển thị) sẽ ghi một khoảng
trống-blank (mã hiển kí tự 20H) vào tất cả ơ nhớ trong
DDRAM, sau đó trả bộ đếm địa AC=0, trả lại kiểu hiện
thị gốc nếu nó bị thay đổi. Nghĩa là : Tắt hiển thị, con trỏ
dời về góc trái (hàng dầu tiên), chế độ tăng AC
Mã lệnh: DBx =DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 1.52
DBx = 0
0 0 0 0 0
1
*
ms
Lệnh Return home trả bộ đếm địa chỉ AC về 0, trả lại kiểu
hiển thị gốc nếu nó bị thay đổi. Nội dung của DDRAM
không thay đổi.
Mã lệnh:DBx= DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx= 0 0

0
0
0
1 [I/D] S
I/D : Tăng (I/D=1) hoặc giảm (I/D=0) bộ đếm địa chỉ hiển
thị AC 1đơn vị mỗi khi có hành động ghi hoặc đọc vùng
DDRAM. Vị trí con trỏ cũng di chuyển theo sự tăng giảm 37us
này.
S : Khi S=1 toàn bộ nội dung hiển thị bị dịch sang phải
(I/D=0) hoặc sang trái (I/D=1) mỗi khi có hành động ghi
vùng DDRAM. Khi S=0: không dịch nội dung hiển thị.
Nội dung hiển thị không dịch khi dọc DDRAM hoặc
đọc/ghi vùng CGRAM.
Mã lệnh:DBx= DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx= 0 0
0
0 1 [D] [C] [B]
D: Hiển thị màn hình khi D=1 và ngƣợc lại. Khi tắt hiển 37us
thị, nội dung DDRAM không thay đổi.
C: Hiển thị con trỏ khi C=1 và ngƣợc lại
B: Nhấp nháy kí tự tại vị trí con trỏ khi B=1 và nguợc lại
Mã lệnh:DBx= DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx= 0
0
0 1 [S/C] [R/L] * *
Lệnh Cursor or display shift dịch chuyển con trỏ hay dữ
liệu hiển thị sang trái mà không cần hành động ghi/đọc dữ
liệu. Khi hiển thị kiểu 2 dòng, con trỏ sẽ nhảy xuống dịng
dƣới khi dịch qua vị trí thứ 40 của hàng dầu tiên. Dữ liệu
hàng dầu và hàng 2 dịch cùng một lúc. Chi tiết sử dụng

xem bảng bên dƣới:

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 20


Đồ án Vi điều khiển và ghép nối Ngoại vi
S/C
0

R/L
0

0

1

1

0

1

1

GVHD: Ths.Lê Xứng

Hoạt động
Dịch vị trí con trỏ sang trái (Giảm AC

một đơn vị).
Dịch vị trí con trỏ sang phải (Tăng AC lên
1 đơn vị).
Dịch toàn bộ nội dung hiển thị sang trái,
con trỏ cũng dịch theo.

37us

Dịch toàn bộ nội dung hiển thị sang phải,
con trỏ cũng dịch theo

Function Mã lệnh:DBx= DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx= 0 0
1 [DL] [N] [F] * *
Set
DL: Khi DL=1, LCD giao tiếp với MPU bằng giao thức 8
bit (từ bit DB7 dến DB0). Ngƣợc lại, giao thức giao tiếp là
4 bit (từ bit DB7 dến bit DB0). Khi chọn giao thức 4 bit,
dữ liệu đƣợc truyền/nhận 2 lần liên tiếp. với 4 bit cao
gởi/nhận trƣớc, 4 bit thấp gởi/nhận sau.
N: Thiết lập số hàng hiển thị. Khi N=0 : hiển thị 1 hàng,
N=1: hiển thị 2 hàng.
F : Thiết lập kiểu kí tự. Khi F=0: kiểu kí tự 5x8 điểm ảnh,
F=1: kiểu kí tự 5x10 điểm ảnh.
* Chú ý:
 Chỉ thực hiện thay đổi Function set ở đầu chuong trình.
Và sau khi được thực thi 1 lần, lệnh thay dổi Function set
không được LCD chấp nhận nữa ngoại trừ thiết lập
chuyển dổi giao thức giao tiếp.
 Khơng thể hiển thị kiểu kí tự 5x10 điểm ảnh ở kiểu hiển

thị 2 hàng
Mã lệnh:
Set
CGRAM DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx = 0
1 [ACG] [ACG] [ACG] [ACG] [ACG] [ACG]
address
Lệnh này ghi vào AC dịa chỉ của CGRAM. Kí hiệu [ACG]
chỉ 1 bit của chuỗi dữ liệu 6 bit. Ngay sau lệnh này là lệnh
đọc/ghi dữ liệu từ CGRAM tại địa chỉ đã đƣợc chỉ dịnh.

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

37us

37us

Trang 21


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Mã lệnh :
DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx = 0 1 [AD] [AD] [AD] [AD] [AD] [AD]
Lệnh này ghi vào AC địa chỉ của DDRAM, dùng khi cần
thiết lập tọa độ hiển thị mong muốn. Ngay sau lệnh này là
lệnh đọc/ghi dữ liệu từ DDRAM tại địa chỉ đã đƣợc chỉ

định. Khi ở chế độ hiển thị 1 hàng: địa chỉ có thể từ 00H
đến 4FH. Khi ở chế độ hiển thị 2 hàng, địa chỉ từ 00h đến
27H cho hàng thứ nhất, và từ 40h đến 67h cho hàng thứ 2.
Mã lệnh :
Read
DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
BF and
Address DBx = [BF] [AC] [AC] [AC] [AC] [AC] [AC] [AC]
(RS=0, R/W=1).
Khi cờ BF bật, LCD đang làm việc và lệnh tiếp theo (nếu
có) sẽ bị bỏ qua nếu cờ BF chƣa về mức thấp. Cho nên,
khi lập trình điều khiển, bạn phải kiểm tra cờ BF truớc khi
ghi dữ liệu vào LCD.Khi đọc cờ BF, giá trị của AC cũng
đƣợc xuất ra các bit [AC]. Nó là địa chỉ của CG hay
DDRAM là tùy thuộc vào lệnh trƣớc đó.
Write
Mã lệnh :
DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
data to
DBx = [Write data]
(RS=1, R/W=0)
CG or
DDRAM Sau khi ghi, bộ dếm dịa chỉ AC tự dộng tang/giảm 1 tùy
theo thiết lập Entry mode. Luu ý là thời gian cập nhật AC
không tính vào thời gian thực thi lệnh.
Read
Mã lệnh :
DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
data
DBx = [Read data]

(RS=1, R/W=1)
from
Khi thiết lập RS=1, R/W=1,dữ liệu từ CG/DDRAM đƣợc
CG
chuyển ra MPU thông qua các chân DBx (địa chỉ và vùng
or
DDRAM RAM đã đƣợc xác định bằng lệnh ghi địa chỉ trƣớc đó).
Sau khi đọc, AC tự động tăng/giảm 1 tùy theo thiết lập
Entry mode, tuy nhiên nội dung hiển thị không bị dịch bất
chấp chế độ Entry mode.
Set
DDRAM
Address

37us

0us

40us

40us

4. Biểu đồ thời gian

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 22


Đồ án Vi điều khiển và ghép nối Ngoại vi


GVHD: Ths.Lê Xứng

- Giản đồ xung nạp dữ liệu cho LCD:

- Giản đồ đọc dữ liệu từ LCD :

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 23


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

VI. Sơ đồ nguyên lý mạch

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06

Trang 24


Đồ án Vi điều khiển và ghép nối Ngoại vi

GVHD: Ths.Lê Xứng

Hình ảnh mạch mơ phỏng trên phần mềm proteus:

SVTH: NGUYỄN TRỌNG CƢỜNG- NHÓM 06


Trang 25


×