Để đảm bảo module LCD hoàn tất một thao tác điều khiển, người lập trình có thể dùng một
trong hai phương pháp. Cách thứ nhất là sử dụng chương trình con tạo trễ để chờ module
hoàn thành lệnh hiện thời. Thời gian chờ cụ thể của module LCD cần phải xem cụ thể trong
mô tả kỹ thuật của vi mạch HD44780. Cách thứ hai là sau mỗi lần truy xuất đến module
LCD, người lập trình cần liên tục đọc trạng thái của module LCD và kiểm tra bit thứ 7 của
byte trạng thái nhận được. Nếu bit này là 1 thì LCD vẫn còn đang bận, chương trình cần tiếp
tục chờ. Nếu bit này là 0 thì LCD đã hoàn tất thao tác hiện thời và sẵn sàng cho thap tác điều
khiển khác.
80 trang |
Chia sẻ: huyhoang44 | Lượt xem: 657 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Tài liệu thí nghiệm vi xử lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Trong bài thí nghiệm đầu tiên, vòng lặp lệnh được dùng để tiêu hao thời gian của vi điều
khiển. Tuy nhiên, cách sử dụng vòng lặp lệnh đòi hỏi nhiều công sức tinh chỉnh để có được
độ trễ chính xác. Mặt khác, khi sử dụng vòng lặp lệnh sẽ tiêu tốn thời gian hoạt động của
CPU. Để tạo ra các khoảng thời gian chính xác người ta thường dùng ngoại vi timer.
Timer (bộ định thì) thường được dùng để đo khoảng thời gian. Thực chất Timer là một bộ
đếm với xung đếm có tần số cố định và biết trước. Khi xác định được số xung đếm và biết
chu kỳ của xung thì có thể tính được thời gian. Timer của 8051 có thể hoạt động ở chế độ 8-
bit hoặc 16-bit. Tùy theo số xung đếm cần nhiều hay ít mà có thể cấu hình Timer ở chế độ
tương ứng.
3.2 LẬP TRÌNH SỬ DỤNG TIMER
Timer là ngoại vi on-chip của 8051, để cấu hình và điều khiển ngoại vi này, người lập trình
có thể truy xuất vào các thanh ghi tương ứng trong vùng SFR (địa chỉ 80h đến FFh). Đối với
Timer đó là các thanh ghi TMOD, THx, TLx, TCON. Trong đó, THx và TLx chứa giá trị hiện
thời của bộ đếm xung. Ví dụ, để cấu hình Timer0 hoạt động ở chế độ 8-bit
MOV TMOD, #02h
Để khởi tạo giá trị đầu cho Timer0
MOV TH0, #HIGH(-50000) ; giá trị khởi động là -50000
MOV TL0, #LOW(-50000)
Để chờ hết khoảng thời gian đã định trước, người lập trình có thể quan sát cờ TFx. Cờ này sẽ
lên 1 mỗi khi Timerx bị tràn, tức là giá trị bộ đếm xung quay trở lại giá trị 0 (zero)
JNB TF0, $ ; chờ Timer0 tràn sau 50000 chu kỳ máy
Nếu timer hoạt động ở chế độ 16 bit, sau khi timer tràn ta phải nạp lại giá trị đầu cho timer.
Khi Timer chạy ở chế độ 2, thanh ghi đếm TLx sẽ được tự nạp lại khi timer tràn, vì vậy
chương trình không cần dừng timer để nạp lại giá trị đầu .
Ví dụ, để cấu hình Timer0 hoạt động ở chế độ 8-bit:
MOV TMOD, #02h
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
35/80
Để khởi tạo giá trị đầu cho Timer0
MOV TH0, #(-50) ; giá trị khởi động là -50
MOV TL0, #(-50)
Để khởi động timer, set cờ TR
SETB TR0
Để chờ hết khoảng thời gian đã định trước, người lập trình có thể quan sát cờ TFx. Cờ này sẽ
lên 1 mỗi khi Timerx bị tràn, tức là giá trị bộ đếm xung quay trở lại giá trị 0 (zero)
JNB TF0, $ ; chờ Timer0 tràn sau 50000 chu kỳ máy
Để tạo xung tuần hoàn, ta chỉ cần đảo chân port và xóa cờ tràn TF. Lưu ý là timer chạy độc
lập với CPU, có nghĩa là trong khi CPU đang thực thi câu lệnh, timer vẫn chạy
Xung có thể được tạo ra như sau:
LOOP:
JNB TF0,$
CPL P1.0
CLR TF0
SJMP LOOP
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
36/80
CHƯƠNG 4 THÍ NGHIỆM HIỂN THỊ DÙNG LED 7 ĐOẠN
4.1 LÝ THUYẾT CƠ BẢN
Led 7 đoạn thường được dùng để hiển thị các chữ số hoặc chữ cái đơn giản. Giao tiếp này
cho phép người không rành về kỹ thuật cũng có thể sử dụng hệ thống thông qua việc đọc các
thông tin hiển thị trên led. Ví dụ nhiều led 7 đoạn có thể được dùng để hiển thị số điện thoại
tại các buồng gọi điện thoại công cộng, hoặc các giá trị giây tại các trục đèn giao thông.
Cấu tạo của led 7 đoạn gồm 8 led đơn được nối chung cực anode (dạng led anode chung)
hoặc nối chung cực cathode (dạng led cathode chung). Các đoạn led đơn này được đặt tên là
a, b, c, d, e, f, g và dấu chấm dp. Để hiển thị một giá trị lên led 7 đoạn, cần cấp điện áp lên
chân chung và các tín hiệu điều khiển đoạn tương tự như điều khiển các led đơn.
Hình 29 Led 7 đoạn dạng anode chung
Để hiển thị một giá trị số lên led 7 đoạn, người lập trình cần xuất các giá trị để điều khiển các
led a, b,, g và dp. Tuy nhiên, dữ liệu trong các hệ thống vi xử lý thường tồn tại dưới dạng
nhị phân, dạng này không thể trực tiếp hiển thị lên led 7 đoạn. Do đó cần phải thực hiện
chuyển đổi từ mã biểu diễn nhị phân sang mã biểu diễn lên led 7 đoạn. Việc chuyển đổi này
có thể thực hiện bằng phần cứng với vi mạch chuyển mã hoặc dùng phần mềm (phương pháp
tra bảng, look-up table).
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
37/80
4.2 THIẾT KẾ PHẦN CỨNG
Hình 30 Sơ đồ thiết kế khối led 7 đoạn
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
38/80
Khối led 7 đoạn gồm có 4 led anode chung dùng vi mạch 74x47 để chuyển từ mã BCD (một
dạng mã nhị phân trong hệ thống vi xử lý) sang mã 7 đoạn (mã cho phép hiển thị lên led 7
đoạn). Khối led 7 đoạn được thiết kế để hoạt động với cơ chế 3 bus. Trong cơ chế này,
Port0 và Port2 được dùng để làm bus dữ liệu và bus địa chỉ. Hai tín hiệu đọc ghi của bus điều
khiển nằm trên Port3. Mỗi ngoại vi hoặc bộ nhớ trong chế độ 3 bus sẽ được gán địa chỉ thông
qua mạch giải mã địa chỉ. Dữ liệu cần được ghi ra một vi mạch chốt 74x573 vì bus dữ liệu
thông thường ở trạng thái Hi-Z.
Trong sơ đồ thiết kế khối led 7 đoạn ở trên, 4 bit thấp của bus dữ liệu sẽ được dùng để chứa
mã BCD của số cần hiển thị, 4 bit cao chứa tín hiệu điều khiển khóa của mỗi led. Giá trị BCD
sẽ đi qua vi mạch chuyển mã 74x47, ngõ ra của vi mạch này là các tín hiệu lái các đoạn A
đến G của led 7 đoạn dạng anode chung. Các tín hiệu dữ liệu và điều khiển được lấy từ ngõ ra
của vi mạch chốt ‘573. Đó là do bus dữ liệu của MCU có tính Hi-Z, nên khi hết chu kỳ truy
xuất, các đường dữ liệu sẽ mất hết giá trị. Vi mạch chốt ‘573 giúp đảm bảo dữ liệu vẫn tiếp
tục tồn tại sau khi MCU không còn truy xuất đến khối led (MCU phải liên tục hiển thị từng
led sau một khoảng thời gian nhất định, thường là vài ms). Tín hiệu cho phép chốt ‘573 tích
cực mức cao và được tạo ra bằng cách NOR tín hiệu giải mã địa chỉ nCS0 từ 74x138 với tín
hiệu cho phép ghi nWR. Địa chỉ của ‘573 này là 0000h.
Cũng theo sơ đồ trên, vì tín hiệu đoạn A đến F của các led 7 đoạn được nối chung nên tất cả
các led 7 đoạn đều nhận được cùng một dữ liệu khi MCU truy xuất đến. Tuy nhiên chỉ có duy
nhất 1 led 7 đoạn được phép hiển thị bằng cách mở khóa BJT cho led đó. Tín hiệu mức 0 tại
cực B của BJT A1015 sẽ làm cho BJT dẫn bão hòa và cực C của BJT sẽ có giá trị gần 5V
(gần bằng điện thế tại cực E) cung cấp nguồn 5V cho led 7 đoạn.
4.3 GIAO TIẾP KHỐI LED 7 ĐOẠN
Như đã phân tích ở trên, khối Led 7 đoạn được thiết kế như là 1 ngoại vi dạng ánh xạ bộ nhớ,
với tín hiệu chọn địa chỉ là CS0 như Hình 31.
Hình 31 Tín hiệu chọn chip cho khối LED 7 đoạn
A.15
A.14
A.13
nCS.3
nCS.2
nCS.6
nCS.5
nCS.7
nCS.[0..7]
nCS.4
nCS.1
VCC
nCS.0
U104
74LS138
A
1
B
2
C
3
Y0
15
Y1
14
Y2
13
Y3
12
Y4
11
Y5
10
Y6
9
Y7
7
G1
6
G2A
4
G2B
5
UA3A
74HC02
2
3
1
nWR
nCS.0
LED7SEG_CS
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
39/80
Một ngoại vi hoặc bộ nhớ dữ liệu ngoài (off-chip) được thiết kế để hoạt động với cơ chế 3
bus có thể được truy xuất bằng câu lệnh MOVX. Câu lệnh này chứa các thông tin gồm địa chỉ
của ngoại vi hoặc ô nhớ cần truy xuất, dạng lệnh là đọc hoặc ghi.
MOVX A, @DPTR ; đọc ngoại vi tại địa chỉ trong DPTR vào A
Khi câu lệnh đọc được thực thi, 8051 sẽ thực hiện các bước sau:
Đặt địa chỉ cần đọc lên bus địa chỉ A0-A15 (tức là Port0 và Port2), giá trị này sẽ làm cho
tín hiệu giải mã địa chỉ tương ứng được phép tích cực.
Ra lệnh đọc bằng tín hiệu điều khiển nRD (bit P3.7).
Đưa dữ liệu đọc được từ bên ngoài vào thanh ghi A thông qua bus dữ liệu (Port0).
MOVX @DPTR, A ; ghi A ra ngoại vi tại địa chỉ trongDPTR
Khi câu lệnh ghi được thực thi, 8051 sẽ thực hiện các bước sau:
Đặt địa chỉ cần ghi lên bus địa chỉ A0-A15, giá trị này sẽ làm cho tín hiệu giải mã địa chỉ
tương ứng được phép tích cực.
Đặt dữ liệu trong thanh ghi A lên bus dữ liệu.
Ra lệnh ghi bằng tín hiệu nWR (bit P3.6).
Hình 32 Giản đồ định thì của lệnh đọc/ghi ngoại vi trong chế độ 3 bus
Điều quan trọng trong việc hiển thị một giá trị lên led 7 đoạn là cần phải chuyển biểu diễn
của giá trị tính toán trong MCU (thường là dạng nhị phân) sang dạng hiển thị được lên led 7
đoạn (thường gọi là mã 7 đoạn).
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
40/80
Với phương pháp giải mã phần cứng, giá trị cần ghi ra vi mạch chuyển mã 74x47 phải là mã
BCD. Như vậy trong chương trình, người lập trình cần chuyển từ giá trị nhị phân cần hiển thị
sang dạng mã BCD. Ví dụ, để hiển thị giá trị 25h (tức là giá trị 37 thập phân), người lập trình
cần chuyển giá trị 25h này thành hai số BCD là 3 và 7 (thường được biểu diễn trong hệ thống
là 37h). Sau đó lần lượt ghi ra led 7 đoạn tương ứng. Hàm thực hiện việc chuyển đổi này
thường được gọi là BIN2BCD (Binary to BCD).
Để hiển thị được nhiều led 7 đoạn, người thiết kế có thể dùng một trong hai phương pháp chủ
yếu. Thứ nhất là phương pháp quét led (4 led 7 đoạn của EME-MC8 được hiển thị bằng
phương pháp quét led). Trong phương pháp này một led 7 đoạn sẽ được hiển thị trong một
khoảng thời gian nhất định sau đó sẽ chuyển sang hiển thị led 7 đoạn khác. Chu trình này
được lặp liên tục với tốc độ hiển thị tổng cộng của các led 7 đoạn phải đảm bảo lớn hơn 24
hình/s (tức là tối đa là 40ms cho một lần hiển thị tất cả các led). Để có thể dùng phương pháp
quét led, tín hiệu điều khiển các đoạn A đến G của các led được nối chung. Tuy nhiên các led
sẽ không hiển thị dữ liệu giống nhau vì tín hiệu cấp nguồn cho led sẽ được điều khiển thông
qua một khóa dùng BJT như sơ đồ mạch.
Phương pháp hiển thị thứ hai là phương pháp chốt led. Lúc này nguồn cấp cho mỗi led luôn
được mở, tuy nhiên mỗi led sẽ có các tín hiệu điều khiển đoạn A đến G riêng biệt và thường
là ngõ ra của một vi mạch chốt ví dụ như 74x573. Phương pháp này đòi hỏi phải có một số
lượng vi mạch chốt bằng với số lượng led 7 đoạn. Muốn hiển thị lên led, người lập trình chỉ
cần ghi mã hiển thị của led ra vi mạch chốt tương ứng.
4.4 HIỂN THỊ MỘT SỐ TỪ 0-9 LÊN 1 LED 7 ĐOẠN
4.4.1 Sử dụng hợp ngữ
Như đã thấy ở thiết kế phần cứng, để có thể hiển thị một số lên led 7 đoạn, người lập trình
cần xuất giá trị BCD của số cần hiển thị ra 4 bit thấp của vi mạch ‘573, 4 bit cao sẽ được
dùng để chọn led nào được phép sáng. Giả sử ta cần hiển thị lên led 7 đoạn ngoài cùng bên
phải (LED 0) , như vậy, giá trị của 4 bit cao sẽ là 1110 để làm tín hiệu LED0 bằng 0, kích dẫn
BJT Q401. Nếu ta muốn hiển thị số 5, 4 bit thấp sẽ có giá trị là 0101. Giá trị này sẽ được IC
giải mã chuyển từ BCD sang mã 7 đoạn để hiển thị LED. Vậy, giá trị cần xuất ra là
11100101B hay là E0H.
Vì ‘573 được thiết kế để giao tiếp với MCU thông qua cơ chế 3 bus nên người lập trình cần
dùng lệnh MOVX dạng ghi, trong đó DPTR trỏ đến địa chỉ 0000h.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
41/80
Đoạn chương trình sau sẽ hiển thị số 5 lên Led 7 đoạn số 0.
MOV A, #0E0h ; hiển thị 5 lên led 7 đoạn SỐ 0
MOV DPTR, #0000h ; trỏ đến ‘573 của khối led 7 đoạn
MOVX @DPTR, A ; ghi giá trị ra ‘573
Để dễ hơn trong việc ghi 10 giá trị từ 0 đến 9 ra led 7 đoạn, người lập trình có thể sử dụng
phương pháp tra bảng để tận dụng khả năng dùng vòng lặp, trong đó nội dung bảng tra chính
là 10 giá trị sẽ lần lượt được xuất ra ‘573
TABLE:
DB 0E0h, 0E1h, 0E2h, ...
Câu lệnh sau cho phép tra lấy nội dung trong bảng
MOV DPTR, #TABLE ; trỏ đến bảng tra
MOV A, #0 ; thứ tự của phần tử cần lấy trong bảng
MOVC A, @A+DPTR ; A = 0E0h
4.4.2 Sử dụng ngôn ngữ C
Như đã nói ở trên, khối LED 7 đoạn được thiết kế như là một ngoại vi ở địa chỉ 0x0000 -
0x1FFF ở vùng nhớ dữ liệu ngoài của 8051. Để truy xuất đến vùng nhớ này ta sử dụng con
trỏ như sau:
Hình 33 Sử dụng con trỏ để giao tiếp LED 7 đoạn
Với cách viết này, con trỏ p là một biến con trỏ chỉ đến vùng nhớ dữ liệu ngoài vì nó được
khai báo với từ khóa xdata .
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
42/80
Ta gán giá trị 0x0000 vào p để làm nó trỏ đến địa chỉ 0x0000 ở vùng nhớ ngoài.
Câu lệnh *p = 0xE5 sẽ xuất giá trị 0xE5 ra địa chỉ 0x0000 ở vùng nhớ ngoài, tương tự như
các câu lệnh hợp ngữ ở phần trên.
Ngoài cách truy cập thông qua con trỏ, ta có thể định nghĩa một macro chỉ đến ô nhớ 0x0000
và dùng nó để xuất giá trị ra LED như sau
Hình 34 Định nghĩa một ngoại vi ánh xạ bộ nhớ
Để khai báo bảng hằng số trong bộ nhớ chương trình và tra bảng này như ở phần trên, ta khai
báo 1 mảng với từ khóa "code" và truy cập thông qua chỉ số như ví dụ sau:
Hình 35 Thực hiện bảng tra dùng ngôn ngữ C
4.5 HIỂN THỊ ĐỒNG THỜI GIÁ TRỊ SỐ LÊN CẢ 4 LED 7 ĐOẠN
Thiết kế của kit thí nghiệm không cho phép hiển thị 4 số khác nhau lên cả 4 led một cách
đồng thời. Để có thể nhìn thấy 4 giá trị cùng 1 lúc ta dùng phương pháp quét LED.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
43/80
Ví dụ như ta cần hiển thị 4 số 1234 ra 4 LED. Để làm được điều này, ta sẽ cho LED0 hiển thị
số 4 trong một thời gian T, sau đó tắt LED0 và cho LED1 hiển thị số 3 cũng trong thời gian
T. Tương tự cho LED2 và LED3.
Như vậy, các LED sẽ lần lượt sáng/tắt. Trong 1 giây số lần sáng của mỗi LED sẽ là 1s/4T.
Như vậy, quá trình hiển thị 4 số 1234 lên LED 7 đoạn như sau:
Hình 36 Lưu đồ chương trình quét LED
Nhờ vào hiệu ứng lưu ảnh của mắt người, nếu LED sáng tắt đủ nhanh thì mắt người sẽ không
nhận ra hiện tượng chớp nháy. Theo lý thuyết, nếu số lần LED sáng tắt lớn hơn 24 lần trong 1
giây thì mắt người coi như LED sáng liên tục. Như vậy, thời gian T càng nhỏ thì mắt người
càng thấy hình ảnh ổn định.
Cách thức để ghi giá trị ra 1 led tương tự như trong thí nghiệm 1. Tuy nhiên, tín hiệu cho
phép led sẽ lần lượt được tích cực để hiển thị 4 giá trị lên 4 led 7 đoạn khác nhau. Như vậy, 4
START
Turn off all LEDs
LED 0 display number 1
Delay T
LED 1 display number 2
Delay T
LED 2 display number 3
Delay T
LED 3 display number 4
Delay T
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
44/80
bit cao sẽ lần lượt có các giá trị là 0111, 1011, 1101, 1110; và 4 bit thấp sẽ chứa mã BCD của
số cần hiển thị ra led (tức là 0001, 0010, 0011, 0100). Người lập trình cũng có thể sử dụng
phương pháp tra bảng để lấy giá trị xuất ra LED.
TABLE:
DB 071h, 0B2h, 0D3h, 0E4h
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
45/80
CHƯƠNG 5 THÍ NGHIỆM HIỂN THỊ DÙNG LCD
5.1 LÝ THUYẾT CƠ BẢN
Để có thể hiển thị thông tin linh hoạt và tiết kiệm năng lượng, hệ thống có thể sử dụng
module LCD. Có nhiều loại module LCD, trong đó thông dụng là loại hiển thị 2 hàng 16 ký
tự. Module LCD có thể được dùng để hiển thị các thông tin dạng ký tự. Vì được tích hợp sẵn
bộ lái LCD nên việc điều khiển module LCD tương đối đơn giản. Các tín hiệu điều khiển
module LCD gần giống với các tín hiệu của một MCU hoạt động theo cơ chế 3 bus.
Module LCD đã được thiết kế chuẩn để cho phép ta có thể giao tiếp với LCD do một hãng
bất kỳ sản xuất với điều kiện là các LCD có sử dụng cùng IC điều khiển HD44780. Phần lớn
các module LCD sử dụng giao tiếp 14 chân trong đó có 8 đường dữ liệu, 3 đường điều khiển
và 3 đường cấp nguồn. Kết nối được bố trí dưới dạng 1 hàng 14 chân hoặc 2 hàng 7 chân.
Các chân 1 và 2 là các chân cấp nguồn Vss, Vdd. Chân 3 Vee là chân điều khiển độ tương
phản của màn hình. Chân 4 là đường RS, đây là chân điều khiển lệnh. Khi RS = 0 thì dữ liệu
ghi vào LCD được hiểu là các lệnh, dữ liệu đọc từ LCD được hiểu là trạng thái của nó. Chân
5 là đường điều khiển đọc ghi R/nW, mức thấp sẽ cho phép ghi vào LCD, mức cao cho phép
đọc ra từ LCD. Chân 6 là đường điều khiển cho phép E. Các chân còn lại chứa dữ liệu 8-bit
vào hoặc ra LCD.
Chân số Tên Chức năng
1 VSS Đất
2 VDD Cực + của nguồn điện
3 VEE Tương phản (constrast)
4 RS Register Select
(Chọn thanh ghi)
5 R/W Read/Write
6 E Cho phép (Enable)
7 D0 Bit 0 của dữ liệu
8 D1 Bit 1 của dữ liệu
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
46/80
9 D2 Bit 2 của dữ liệu
10 D3 Bit 3 của dữ liệu
11 D4 Bit 4 của dữ liệu
12 D5 Bit 5 của dữ liệu
13 D6 Bit 6 của dữ liệu
14 D7 Bit 7 của dữ liệu
5.1.1 Chức năng các chân của LCD
Module LCD được điều khiển thông qua một tập lệnh chuẩn. Bảng sau tóm tắt các lệnh điều
khiển LCD.
Command
(Lệnh)
RS RW Nhị phân Hex
D7 D6 D5 D4 D3 D2 D1 D0
NOP
(No operation =
không làm gì cả)
0 0 0 0 0 0 0 0 0 0 00
Clear display
(xóa hiển thị)
0 0 0 0 0 0 0 0 0 1 01
Display & Cursor
home
(hiển thị và đặt cursor
ở góc trái phía trên)
0 0 0 0 0 0 0 0 1 x 02 hoặc
03
Character Entry mode
(Chế độ nhập ký tự)
0 0 0 0 0 0 0 1 I/D S 04 đến
07
Display On/Off &
Cursor
0 0 0 0 0 0 1 D U B 08 đến
0F
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
47/80
(Tắt mở hiển thị và
cursor)
Display/Cursor Shift
(Dịch curson/hiển thị)
0 0 0 0 0 1 D/C R/L x x 10 đến
1F
Function set
(Đặt chức năng)
0 0 0 0 1 8/4 2/1 10/7 x x 20 đến
3F
Set CGRAM address
(Đặt địa chỉ CGRAM)
0 0 0 1 A A A A A A 40 đến
7F
Set DDRAM address
(Đặt địa chỉ DDRAM)
0 0 1 A A A A A A A 80 đến
FF
Busy Flag & Addr
(Cờ bận và bộ đếm
địa chỉ)
0 1 BF Bộ đếm địa chỉ
Read Data
(Đọc dữ liệu từ
CGRAM hoặc
DDRAM)
1 0 Dữ liệu đọc
Write Data
(Ghi dữ liệu vào
CGRAM hoặc
DDRAM)
1 1 Dữ liệu ghi
Chú thích:
I/D: 1 =Increment *, 0=Decrement
R/L: 1 = Right shift, 0 = Left shift
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
48/80
S: 1 = Display shift on, 0 = Display shift off *
D: 1 = Display on, 0 = Diaplay off *
U: 1 = Cursor underline on, 0=Underline off *
B: 1 = Cursor blink on, 0 = cursor blink off *
D/C: 1 = Display shift, 0 = cursor move
8/4: 1 = 8 bit interface *, 0 = 4 bit interface
2/1: 1 = chế độ 2 hàng, 0 = chế độ 1 hàng *
10/7: 1=5x10 dot format, 0=5x7 dot format *
x = don’t care * = đặt ban đầu
5.1.2 Tóm tắt tập lệnh điều khiển LCD
Các dữ liệu được hiển thị lên LCD dựa vào một tập ký tự chuẩn. Các dữ liệu 8-bit sẽ được
chuyển thành ký tự hiển thị dựa trên bảng ký tự chuẩn này.
Bảng 4 Bảng ký tự chuẩn cho LCD
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
49/80
Định thì giao tiếp các tín hiệu điều khiển của LCD có thể được xem thêm trong mô tả kỹ
thuật của vi mạch HD44780.
5.2 THIẾT KẾ PHẦN CỨNG
Hình 37 Sơ đồ thiết kế giao tiếp LCD
LCD được thiết kế để hoạt động với cơ chế 3 bus, tức là phải bật ON SW_CC1 và SW_CC3.
8 đường dữ liệu D0-D7 chứa dữ liệu hiển thị hoặc lệnh điều khiển LCD được ghi vào LCD
thông qua vi mạch chốt 74x573, trong đó tín hiệu cho phép chốt CS được tạo ra từ mạch giải
mã địa chỉ.
U501
74HC573
D0
2
D1
3
D2
4
D3
5
D4
6
D5
7
D6
8
D7
9
LE
11
OE
1
Q0
19
Q1
18
Q2
17
Q3
16
Q4
15
Q5
14
Q6
13
Q7
12
nWR
UA01D
74HC02
11
12
13
nCS.3
J501
LCD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
R501
20
VCC
VCC
R502
1k
R503
10k
RS
E
R/nW
RS
ENABLE
D.[0..7]
+ ENABLE = P3.3
+ RS = P3.5
D.7
D.6
D.5
D.4
D.3
D.2
D.1
D.0
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
50/80
Hai tín hiệu điều khiển E và RS của LCD được kết nối đến P3.3 và P3.5 của 8051. Người sử
dụng phải bật ON hai switch này trên SW_CC4 để có thể điều khiển LCD. Như vậy,
SW_CC4 phải bật ON tổng cộng 6 switch tương ứng với các bit 0, 1, 4, 5, 6, 7 của Port 3,
tức là các tín hiệu RXD, TXD, E, RS, nWR, nRD
Hình 38 Cài đặt SW_CC4 của Port 3 để điều khiển LCD
5.3 LẬP TRÌNH GIAO TIẾP LCD
Vì giao tiếp thông qua cơ chế 3 bus nên người lập trình cần dùng câu lệnh MOVX phối hợp
với việc điều khiển hai tín hiệu E (P3.4) và RS (P3.5) để truy xuất LCD theo đúng định thì
ghi. Để điều khiển LCD, trước tiên cần khởi động và đặt cấu hình cho LCD. Việc này được
thực hiện bằng cách gửi một số lệnh khởi động đến LCD. Lệnh thứ nhất mà ta gửi báo cho
LCD biết ta sẽ giao tiếp với nó thông qua bus dữ liệu 4-bit hay 8-bit. Ta cũng chọn font ký tự
là 5x8. Điều này được thực hiện bằng cách gửi lệnh 38h đến LCD. Lưu ý là đường RS phải
giữ ở mức thấp để báo cho LCD biết đang nhận lệnh. Tiếp theo ta cần gửi lệnh 0Eh. Lệnh này
dùng để bật LCD và tắt con trỏ ký tự. Byte thứ 3 được gửi thêm để cài đặt một số tham số
hoạt động của LCD. Ví dụ ta có thể gửi lệnh 06h để ra lệnh cho con trỏ tự động dịch phải mỗi
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
51/80
khi ta gửi một ký tự hiển thị cho nó. Lệnh MOVX có thể được dùng để truy xuất đến module
LCD với DPTR chứa địa chỉ của thao tác cụ thể.
Để đảm bảo module LCD hoàn tất một thao tác điều khiển, người lập trình có thể dùng một
trong hai phương pháp. Cách thứ nhất là sử dụng chương trình con tạo trễ để chờ module
hoàn thành lệnh hiện thời. Thời gian chờ cụ thể của module LCD cần phải xem cụ thể trong
mô tả kỹ thuật của vi mạch HD44780. Cách thứ hai là sau mỗi lần truy xuất đến module
LCD, người lập trình cần liên tục đọc trạng thái của module LCD và kiểm tra bit thứ 7 của
byte trạng thái nhận được. Nếu bit này là 1 thì LCD vẫn còn đang bận, chương trình cần tiếp
tục chờ. Nếu bit này là 0 thì LCD đã hoàn tất thao tác hiện thời và sẵn sàng cho thap tác điều
khiển khác.
MOVX A, @DPTR ; đọc trạng thái LCD
JB ACC.7, wait ; nếu busy thì nhảy đến wait
; nếu không thì tiếp tục
5.4 VIẾT CHƯƠNG TRÌNH HIỂN THỊ CHUỖI LÊN LCD
Khối LCD được kết nối với 8051 thông qua cơ chế 3 bus, trong đó 8 đường dữ liệu của LCD
được nối đến bus dữ liệu của MCU, 3 đường điều khiển được nối đến ngõ ra của khối giải mã
địa chỉ. Như vậy lệnh MOVX sau có thể được dùng để đọc hoặc ghi LCD, trong đó DPTR
chứa địa chỉ của thao tác tương ứng
MOVX A, @DPTR ; lệnh đọc LCD
MOVX @DPTR, A ; lệnh ghi LCD
Giả sử ta cần ghi chuỗi "Hello" lên LCD. Trước tiên cần khởi động LCD theo mô tả ở phần
trên. Sau đó, lần lượt ghi mã của các ký tự ‘H’, ‘e’, ‘l’, ‘l’, ‘o’ đến LCD theo bảng ký tự của
LCD. Lưu ý là sau mỗi lần truy xuất module LCD cần chờ cho thao tác hiện thời được hoàn
tất trước khi bắt đầu thao tác khác.
Để dễ dàng hơn trong việc lấy các ký tự và xuất ra LCD, người lập trình có thể dùng phương
pháp tra bảng như sau
Message: DB ‘Hello’
Nên thiết kế chương trình bằng cách sử dụng các chương trình con để có thể sử dụng lại. Ví
dụ, một chương trình con có tên lcd_init có nhiệm vụ khởi động module LCD, chương trình
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
52/80
con write_char có nhiệm vụ ghi 1 byte dữ liệu hiển thị đến LCD, chương trình con
write_command có nhiệm vụ ghi 1 byte lệnh đến LCD.
Mã nguồn chương trình mẫu hiển thị một chuỗi lên LCD có thể download trên trang web của
bộ môn điện tử.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
53/80
CHƯƠNG 6 THÍ NGHIỆM VỚI CÔNG TẮC ĐƠN VÀ BÀN
PHÍM MA TRẬN
6.1 LÝ THUYẾT CƠ BẢN
Công tắc (Switch) là linh kiện cơ khí được dùng để nối 2 hoặc nhiều tiếp điểm lại với nhau
khi có tác động. Thông thường Switch có 2 tiếp điểm (Switch đơn).
Để giao tiếp switch đơn có hai cách giao tiếp như sau.
Hình 39 Giao tiếp phím nhấn
Ở cách phía trên, một điện trở kết nối nguồn VCC và 1 đầu của switch, đầu này lấy tín hiệu ra
đưa vào chân vi điều khiển, đầu còn lại nối với GND. Khi Switch không đóng, tín hiệu ra sẽ
là HIGH (logic 1). Khi Switch đóng, tín hiệu ra sẽ là LOW (logic 0). Cách kết nối này là sử
dụng điện trở kéo lên (pull-up resistor)
Cách giao tiếp còn lại thì hoàn toàn ngược lại, dùng điện trở kéo xuống (pull-down resistor).
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
54/80
Trên bàn phím ma trận, các phím nhấn được tổ chức thành dạng ma trận, ở đó một đầu của
phím nối vào các hàng, đầu còn lại nối vào các cột như Hình 40.
Hình 40 Tổ chức bàn phím ma trận
Với cách kết nối trên, khi ta nhấn một phím thì hàng và cột sẽ được kết nối với nhau. Từ số
hàng và cột trên ta có thể suy ra vị trí phím được nhấn.
6.2 THIẾT KẾ PHẦN CỨNG
Trên kit thí nghiệm, bàn phím ma trận gồm có 16 phím được tổ chức thành 4 hàng, bốn cột và
kết nối tới PORT 1.
Hình 41 Kết nối bàn phím ma trận
VCC
R602
10K
R603
10K
R604
10K
R605 10K
R606
10K
SW338
BUTTON1
SW340
BUTTON2
SW343
BUTTON3
SW344
BUTTON4
R607 10K
R608
10K
SW347
BUTTON5
SW348
BUTTON6
SW349
BUTTON7
SW352
BUTTON8
SW354
BUTTON9
SW357
BUTTON10
SW361
BUTTON11
SW362
BUTTON12
SW363
BUTTON13
SW364
BUTTON14
SW365
BUTTON15
SW368
BUTTON16
VCC
P1.0
P1.1
P1.2
P1.3
R601
10K
P1.4
P1.5
P1.7
P1.6
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
55/80
Như trên Hình 41, bốn hàng của bàn phím kết nối vào P1.0, P1.1, P1.2 và P1.3. Bốn cột kết
nối vào P1.4, P1.5, P1.6 và P1.7.
6.3 PHẦN MỀM GIAO TIẾP
Để giao tiếp bàn phím ma trận ta sử dụng kỹ thuật quét phím. Ta có thể quét phím theo hàng
hoặc theo cột. Sau đây trình bày quá trình quét phím theo cột.
Đầu tiên, ta xuất giá trị 1 ra các chân giao tiếp hàng (P1.0 đến P1.3) để có thể sử dụng các
chân này làm input.
Cho cột 0 (P1.4) bằng 0 và 3 cột còn lại lên 1. Nếu như có bất kỳ phím nào trên cột 0 được
nhấn, hàng tương ứng sẽ được kết nối vào cột 0 và sẽ có giá trị là 0. Như vậy ở lần quét này
ta biết được có phím nào trên cột 0 được nhấn.
Tương tự, Cho cột 1 (P1.5) bằng 0 và 3 cột còn lại lên 1. Nếu như có bất kỳ phím nào trên cột
0 được nhấn, hàng tương ứng sẽ được kết nối vào cột 1 và sẽ có giá trị là 0. Như vậy ở lần
quét này ta biết được có phím nào trên cột 1 được nhấn.
Làm tương tự đối với cột 2 và cột 3.
Như vậy, một chu kỳ quét phím sẽ quét qua lần lượt 4 cột, và phát hiện được có phím nhấn
trên toàn bộ các phím trên ma trận phím.
Thời gian quét hết 4 cột là rất nhanh so với tốc độ nhấn và nhả phím của tay người, vì vậy
đảm bảo khi bất kỳ phím nào được nhấn, quá trình quét phím sẽ phát hiện được.
6.4 RUNG PHÍM VÀ CHỐNG RUNG
Với phím nhấn cơ khí, tiếp điếm cơ khí sau khi được nhấn hay nhả sẽ bị rung động. Do đó,
khi nhấn hay nhả phím sẽ tạo ra một chuỗi các xung thay vì một xung đơn như ở Hình 42.
Hình 42 Phím đơn bị rung khi nhấn hay nhả
Khi đó, nếu ta dùng tín hiệu này để xác định số lần phím nhấn thì kết quả sẽ bị sai lệch. Để có
kết quả đúng ta cần chống rung (debounce).
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
56/80
Có hai cách để chống rung là chống rung bằng phần cứng và chống rung bằng phần mềm.
Hình 43 Chống rung bằng phần cứng
Hình 43 trình bày cách chống rung bằng phần cứng, sử dụng một tụ điện khoảng 0.1 uF mắc
như trong hình. Tụ này phối hợp với điện trở kéo lên hoặc kéo xuống sẽ lọc đi các xung hẹp
sinh ra do quá trình rung phím.
Cách thứ hai là sử dụng phần mềm để chống rung.
Cách chống rung đơn giản nhất là đọc tín hiệu ra hai lần liên tiếp sau một khoảng thời gian
trễ thích hợp, nếu 2 lần này mà kết quả đọc được giống nhau thì ta cho là kết quả đúng, nếu
kết quả là sai thì ta lại đọc lần thứ 3 cũng sau thời gian T, nếu kết quả giống như lần đọc thứ 2
thì coi như kết quả lần này là đúng, còn nếu không thì lại lặp lại quá trình. Thời gian T
thường được chọn là 50ms.
Ta có thể tăng độ chính xác bằng cách giảm thời gian T và tăng số lần đọc lên. Ví dụ phím
được coi là trả về giá trị 1 nếu như ta đọc được liên tiếp 20 lần cùng giá trị 1 với mỗi lần đọc
cách nhau 1ms.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
57/80
CHƯƠNG 7 THÍ NGHIỆM GIAO TIẾP QUA CỔNG NỐI TIẾP
7.1 LÝ THUYẾT CƠ BẢN
Truyền thông nối tiếp là một phần rất quan trọng trong các hệ thống xử lý. Đối với 8051, việc
truyền nối tiếp được thực hiện thông qua ngoại vi cổng nối tiếp. Ngoại vi này cho phép người
lập trình giao tiếp với bên ngoài thông qua giao thức truyền nối tiếp 8 bit dữ liệu, 1 stop bit.
Tốc độ truyền có thể lập trình được bằng phần mềm.
7.1.1 Khung truyền nối tiếp bất đồng bộ
Khi không có dữ liệu gửi thì đường tín hiệu duy trì ở trạng thái cao (trạng thái Mark). Bắt đầu
của một ký tự dữ liệu được chỉ bởi mức thấp trong thời gian 1 bit. Bit này được gọi là bit bắt
đầu (Start bit). Rồi sau đó các bit dữ liệu được gửi ra trên đường tín hiệu lần lượt từng bit một
(bắt đầu với LSB). Từ dữ liệu có thể 5, 6, 7, hoặc 8 bit và có thể theo sau là bit kiểm tra chẵn
lẻ P (Parity bit). Tiếp theo các bit dữ liệu và P (nếu có sử dụng kiểm tra chẵn lẻ), đường tín
hiệu được trả về mức cao trong ít nhất thời gian 1 bit để giúp nhận biết kết thúc ký tự. Bit này
còn gọi là bit dừng (Stop bit), một số hệ thống cũ có thể sử dụng 2 bit dừng.
Thuật ngữ tốc độ baud dùng để chỉ tốc độ dữ liệu nối tiếp được truyền. Tốc độ baud được
định nghĩa là 1/(thời gian giữa những chuyển tiếp tín hiệu). Thí dụ: Nếu tín hiệu thay đổi cứ
sau 3.33 ms thì tốc độ baud là 1/3.33ms = 300 bd (hay baud). Chú ý là tốc độ này tổng quát
thì khác với tốc độ định nghĩa theo bps (bits/giây). Các tốc độ baud thông dụng là 300, 600,
1200, 2400, 4800, 9600, và 19200 baud (hiện nay các số này còn cao hơn nữa, thường giới
hạn với truyền bất đồng bộ là 100000 baud).
Bộ thí nghiệm EME-MC8 đã sử dụng cổng nối tiếp này để giao tiếp với chương trình
HyperTerminal trên máy tính, từ đó cho phép người dùng có thể sử dụng các chức năng của
chương trình monitor.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
58/80
Trong thực tế, cổng nối tiếp của 8051 có thể giao tiếp với cổng RS-232 trên máy tính thông
qua một vi mạch chuyển đổi từ TTL sang RS-232 như MAX232. Việc truyền thông tin chỉ
cần 3 dây TXD, RXD, và GND nếu không dùng bắt tay bằng phần cứng.
7.2 THIẾT KẾ PHẦN CỨNG
Trên kit thí nghiệm, cổng nối tiếp của 8051 được nối đến cổng DB9 trên mạch thông qua vi
mạch chuyển đổi từ TTL sang RS-232 (MAX232) và nối với cổng USB qua IC chuyển đổi
FTDI232. Điều này cho phép kết nối DB9 với cổng COM của máy tính hoặc cổng USB của
kit với cổng USB của máy tính để giao tiếp máy tính với serial port của 8051.
Chân của DB25
(chân số)
Chân của DB9
(chân số)
Viết tắt Tên đầy đủ
2 3 TD Transmit Data
3 2 RD Receive Data
4 7 RTS Request To Send
5 8 CTS Clear To Send
6 6 DSR Data Set Ready
7 5 SG Signal Ground
8 1 CD Carrier Detect
20 4 DTR Data Terminal Ready
22 9 RI Ring Indicator
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
59/80
Hai tín hiệu dùng cho giao tiếp là TXD và RXD trên Port 3 của 8051. Như vậy, người lập
trình cần bật ON hai switch này (của SW_CC4) để có thể dùng cổng nối tiếp.
Hình 44 Sơ đồ kết nối cổng nối tiếp và cài đặt switch tương ứng
7.3 PHẦN MỀM GIAO TIẾP
Để truyền nhận dữ liệu thông qua cổng nối tiếp, người lập trình chỉ cần khởi động nó bằng
các thao tác: truy xuất thanh ghi SMOD để cài đặt chế độ làm viêc; truy xuất Timer 1 để điều
khiển tốc độ baud (EME-MC8 sử dụng thạch anh 11.0592MHz, cho phép tạo tốc độ baud với
sai số là 0%).
MOV SMOD, #52h ; khởi động ở chế độ 2
MOV TH1, #... ; cài đặt tốc độ
Để có thể ghi hoặc đọc dữ liệu từ cổng nối tiếp, người lập trình cần truy xuất thanh ghi SBUF
bằng các chương trình con
JNB TI, $ ; chờ phát xong byte trước đó
CLR TI ; chuẩn bị phát byte kế
MOV SBUF, A ; phát
+
C112
1uF
U107
FT232RL
VCCIO
4
VCC
20
USBDM/D-
16
USBDP/D+
15
NC
8
RESET
19
NC1
24
OSCI
27
OSCO
28
3V3OUT
17
AGND
25
GND
7
GND
18
GND
21
TEST
26
CBUS4
12
CBUS3
14
CBUS2
13
CBUS1
22
CBUS0
23
RI
6
DCD
10
DSR
9
DTR
2
CTS
11
RTS
3
RXD
5
TXD
1
VCC
+
C108
10uF
J1
USB/B/Fe
1
2
3
4
USBD+
USBD-
R102 FERRITE
C109
10n
C110
100n
C111
100n
P101
RS232
5
9
4
8
3
7
2
6
1
DB9,
SOCKET
TXD
RXD
RB1
330DB2
LED-TX
DB3
LED-RX
RBL2
330
VCCUSB TYPE B FEMALE
RB2
0R
RB3 0R
+
C105
10u
+
C104
10u
+ C106
10u
+C107
10u
VCC
U105
MAX232
C1+
1
C1-
3
C2+
4
C2-
5
V+
2
V-
6
R1OUT
12
R2OUT
9
T1IN
11
T2IN
10
R1IN
13
R2IN
8
T1OUT
14
T2OUT
7
TXD_232
RXD_232
TXD
RXD
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
60/80
Hoặc
JNB RI, $ ; chờ nhận xong 1 byte
CLR RI ; nhận byte kế
MOV A, SBUF ; byte kế nằm trong A
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
61/80
CHƯƠNG 8 THÍ NGHIỆM LẬP TRÌNH NGẮT CHO 8051
8.1 LÝ THUYẾT CƠ BẢN
Ngắt là tính năng rất quan trọng của vi xử lý, cho phép chương trình phục vụ một ngoại vi khi
cần mà không cần phải mất thời gian hỏi vòng (polling) các ngoại vi.
Với 8051, khi xảy ra sự kiện ngắt, ví dụ như timer tràn, chương trình sẽ quay về một địa chỉ
cố định trong bộ nhớ chương trình, địa chỉ này được gọi là vector ngắt của ngoại vi. Từ địa
chỉ này, chương trình thực hiện một lệnh nhảy đến địa chỉ của chương trình phục vụ ngắt.
Để cho phép ngắt, người lập trình phải cho phép bit tương ứng trong thanh ghi IE
Người lập trình cũng có thể chọn mức ưu tiên cho ngắt thông qua thanh ghi IP
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
62/80
8.2 LẬP TRÌNH SỬ DỤNG NGẮT
Một chương trình assembly sử dụng ngắt, ví dụ ngắt timer 0 sẽ có cấu trúc như sau:
Hình 45 Lập trình ngắt dùng assembly
Khi timer 0 tràn, chương trình sẽ quay về địa chỉ 000BH, từ đó nhảy đến TO_ISR, sau khi
gặp lệnh RETI thì quay về lệnh kế tiếp từ thời điểm thực thi ngắt.
LẬP TRÌNH SỬ DỤNG NGẮT TRÊN KIT THÍ NGHIỆM
Trên kit thí nghiệm, bảng vector ngắt được chương trình monitor dời về địa chỉ 2000H. Do đó khi
lập trình, ta phải dời bảng vector ngắt lên địa chỉ 2000H như sau
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
63/80
Hình 46 Lập trình ngắt dùng assembly, với bảng vector ngắt tại 2000H
Nếu sử dụng C để lập trình, ta chỉnh các thông số cấu hình cho project như đã nói ở phần lập
trình C và lập trình bình thường
Hình 47 Lập trình ngắt dùng C
Dòng 15: "void T0ISR (void) interrupt 1 using 0" có ý nghĩa khai báo hàm T0ISR là trình
phục vụ ngắt cho ngắt Timer 0 (ngắt số 1 trong bảng sau) và sử dụng bank thanh ghi 0
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
64/80
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
65/80
CHƯƠNG 9 THÍ NGHIỆM ĐIỀU KHIỂN ADC
9.1 LÝ THUYẾT CƠ BẢN
Vi mạch ADC được sử dụng để chuyển đổi các tín hiệu từ dạng tương tự sang dạng số. Cũng
cần phải nói thêm về tín hiệu tương tự. Đó là các tín hiệu liên tục trong miền thời gian và
biên độ. Trong thực tế, hầu hết các tín hiệu vật lý đều tồn tại dưới dạng tương tự. Muốn xử lý
được các tín hiệu này bằng các hệ thống số thì cần phải chuyển đổi các tín hiệu tương tự này
sang dạng số và vi mạch ADC (Analog to Digital Converter) thực hiện công việc đó.
9.2 THIẾT KẾ PHẦN CỨNG
Kit thí nghiệm sử dụng vi mạch chuyển đổi ADC0809. Sơ đồ kết nối như hình sau
Hình 48 Sơ đồ kết nối với ADC0809
Có thể thấy là ADC0809 được thiết kế để giao tiếp với 8051 thông qua cơ chế 3 bus. Tín hiệu
giải mã địa chỉ cho ADC được lấy ra từ mạch giải mã địa chỉ 74x138. Các tín hiệu điều khiển
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
66/80
chủ yếu là START và OE đều được tổ hợp từ tín hiệu giải mã địa chỉ nCS2. Tần số chuyển
đổi của ADC (tín hiệu CLK) được chia ra từ tín hiệu dao động của 8051 bằng IC đếm
74x393. Tín hiệu EOC (tích cực khi đã chuyển đổi xong được nối đến header để sử dụng khi
cần).
ADC0809 có thể chuyển đổi lên đến 8 kênh. Trong đó kênh 0 đã được nối sẵn đến một biến
trở để người sử dụng có thể thử nghiệm hoạt động của ADC một cách nhanh chóng. Để chọn
kênh, 3 đường địa chỉ thấp của bus địa chỉ (A0, A1, A2) đã được sử dụng. Như vậy, người
lập trình có thể truy xuất đến 8 địa chỉ thấp nhất của nCS2 để truy xuất đến 8 kênh này.
9.3 PHẦN MỀM GIAO TIẾP
Vì ADC0809 được thiết kế để hoạt động với cơ chế 3 bus và tín hiệu giải mã địa chỉ là từ
chân nCS2 nên người lập trình cần dùng các lệnh truy xuất không gian bộ nhớ dữ liệu ngoài
để truy cập ADC, cụ thể là lệnh MOVX.
Các bước cụ thể gồm: thứ nhất, người lập trình cần yêu cầu ADC0809 thực hiện chuyển đổi
một kênh cụ thể bằng cách tích cực tín hiệu START và 3 đường địa chỉ (dùng tín hiệu ALE).
Với kết nối phần cứng này, khi tín hiệu START tích cực thì đường ALE cũng tích cực. Như
vậy chỉ cần dùng một lệnh ghi ra ngoại vi tại địa chỉ tương ứng là được
MOV DPTR, #nCS2 ; kết hợp địa chỉ ADC với địa chỉ kênh
MOVX @DPTR, A ; ra lệnh chuyển đổi kênh tương ứng
Sau khi chờ một khoảng thời gian (thường lấy khoảng 100us), hoặc chờ mức tích cực trên
chân EOC, người lập trình cần đọc từ ADC bằng cách tích cực chân OE. Điều này cũng được
thực hiện bằng lệnh đọc ngoại vi
MOVX A, @DPTR
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
67/80
CHƯƠNG 10 THÍ NGHIỆM GIAO TIẾP CẢM BIẾN NHIỆT ĐỘ
10.1 LÝ THUYẾT CƠ BẢN
DS18S20 là vi mạch số đo độ C 9-bit với chức năng cảnh báo khi nhiệt độ vượt quá một
ngưỡng trên hoặc dưới lập trình được. Vi mạch thông tin trên bus 1 dây (1-Wire bus), tức là
chỉ cần 1 chân port để thông tin giữa cảm biến và MCU. Tầm đo của vi mạch trong khoảng -
55oC đến +125oC với độ chính xác tối đa là 0.5oC. Bên cạnh đó, DS18S20 có thể được cấp
nguồn trực tiếp thông qua đường dữ liệu.
Mỗi DS18S20 có chứa một mã nối tiếp 64-bit duy nhất, điều đó cho phép nhiều vi mạch có
thể cùng hoạt động trên cùng bus 1 dây. DS18S20 gồm 3 chân: GND, DQ, và VDD, trong đó
DQ là chân vào và ra của dữ liệu.
Giao thức bus 1 dây (1-Wire) là một giao thức được Dallas định nghĩa. Đường điều khiển cần
có điện trở kéo lên vì tất cả các vi mạch đều được kết nối đến bus thông qua 1 cổng 3 trạng
thái hoặc cực máng hở (chân DQ). Trong hệ thống bus này, MCU (master) nhận dạng và định
địa chỉ các vi mạch trên bus bằng mã địa chỉ 64-bit. Vì mỗi vi mạch có một mã nhận dạng 64-
bit duy nhất nên gần như là không giới hạn số vi mạch kết nối trên bus.
10.2 Sơ đồ khối DS18S20
Chức năng cốt lõi của DS18S20 là chuyển đổi trực tiếp nhiệt độ thành tín hiệu số. Ngõ ra
cảm biến nhiệt có độ phân giải 9-bit, tương ứng 0.5oC mỗi bước. DS18S20 khởi động ở trạng
thái nghỉ công suất thấp, để khởi động đo nhiệt độ và chuyển đổi tương tự sang số, MCU
(master) phải thực hiện lệnh Convert T [44h]. Sau khi chuyển đổi, kết quả được lưu vào thanh
ghi nhiệt độ 2-byte trong bộ nhớ và DS18S20 trở lại trạng thái nghỉ.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
68/80
Dữ liệu ngõ ra của DS18S20 được hiệu chỉnh theo độ C. Dữ liệu nhiệt độ được lưu trữ dưới
dạng số bù 2 16-bit (mở rộng dấu). Bit dấu (S) chỉ nhiệt độ dương (S=0) hay âm (S=1).
Định dạng thanh ghi nhiệt độ
Mối quan hệ giữa dữ liệu số và nhiệt độ
Sau khi DS18S20 thực hiện chuyển đổi nhiệt độ, giá trị này được so sánh với giá trị nhiệt độ
cảnh báo được lưu trong 2 thanh ghi 8-bit TH và TL. Tuy nhiên chỉ các bit từ 8 đến 1 trong
thanh ghi nhiệt độ được so sánh. Nếu nhiệt độ ngoài ngưỡng, tức là cao hơn TH hoặc thấp hơn
TL, thì một điều kiện cảnh báo xuất hiện và cờ cảnh báo được đặt lên bên trong DS18S20.
Nếu nhiệt độ trở lại bình thường thì điều kiện cảnh báo bị tắt ở lần chuyển đổi nhiệt độ kế
tiếp.
Định dạng thanh ghi TH và TL
Bộ nhớ DS18S20 được tổ chức như sau
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
69/80
Bản đồ bộ nhớ DS18S20
Bộ nhớ DS18S20 bao gồm bộ nhớ RAM và bộ nhớ EEPROM để lưu trữ thanh ghi cảnh báo
TH và TL. Byte 0 và 1 của bộ nhớ RAM chứa LSB và MSB của thanh ghi nhiệt độ. Các byte
này là chỉ đọc. Byte 2 và 3 dùng để truy xuất thanh ghi TH và TL. Byte 4 và 5 được dành riêng
để sử dụng bên trong vi mạch. Byte 6 và 7 chứa các thanh ghi COUNT REMAIN và COUNT
PER oC, được dùng để tính các kết quả phân giải mở rộng (xem thêm trong mô tả kỹ thuật
của DS18S20, phần OPERATION – MEASURING TEMPERATURE). Byte 8 là byte chỉ
đọc và chứa CRC của byte từ 0 đến 7 của bộ nhớ RAM.
Dữ liệu được viết vào byte 2 và 3 của RAM sử dụng lệnh Write Scratchpad [4Eh]; dữ liệu
được phát với LSB của byte 2. Bộ nhớ RAM có thể được đọc sử dụng lệnh Read Scratchpad
[BEh] sau khi viết dữ liệu. Khi đọc bộ nhớ RAM, dữ liệu được phát với LSB của byte 0. Để
chuyển TH và TL từ RAM vào bộ nhớ EEPROM, MCU (master) phải thực thi lệnh Copy
Scratchpad [48h].
Hệ thống bus 1 dây (1-Wire bus)
Hệ thống này sử dụng một master (chủ của bus) để điều khiển một hoặc nhiều slave (tớ của
bus). DS18S20 luôn là slave. Khi chỉ có một slave, hệ thống được gọi là “single-drop”, khi có
nhiều slave, hệ thống được gọi là “multi-drop”. Tất cả dữ liệu và lệnh đều được phát với LSB
trước tiên.
Mỗi thiết bị giao tiếp với đường dữ liệu thông qua cổng 3 trạng thái hoặc cực máng hở. Khả
năng này cho phép thiết bị giải phóng đường dữ liệu khi thiết bị không phát dữ liệu đến bus,
do đó bus có sẵn để các thiết bị khác sử dụng. Bus 1 dây cần một điện trở kéo lên khoảng 5k,
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
70/80
do đó trạng thái nghỉ của bus là mức cao. Nếu bus được giữ ở mức thấp nhiều hơn 480μs, các
thiết bị trên bus sẽ bị reset.
Chuỗi thao tác để truy xuất DS18S20 như sau:
Khởi động: bao gồm một xung reset được phát bởi master, và xung có mặt được phát bởi
slave.
Định thì khởi động
Lệnh ROM: sau khi master phát hiện được sự có mặt của slave, nó có thể ra lệnh ROM.
Các lệnh này hoạt động trên các mã 64-bit duy nhất của mỗi slave và cho phép master
truy xuất đến một thiết bị cụ thể trên bus. Các lệnh này cũng cho phép master xác định
loại và số lượng thiết bị trên bus. Có 5 lệnh ROM, mỗi lệnh dài 8-bit, bao gồm SEARCH
ROM [F0h], READ ROM [33h], MATCH ROM [55h], SKIP ROM [CCh], ALARM
SEARCH [ECh].
Lệnh chức năng DS18S20: sau khi master đã dùng lệnh ROM để xác định được slave mà
nó cần thông tin, master có thể ra các lênh chức năng DS18S20. Các lệnh này bao gồm:
CONVERT T [44h], WRITE SCRATCHPAD [4Eh], READ SCRATCHPAD [BEh],
COPY SCRATCHPAD [48h], RECALL E2 [B8h], READ POWER SUPPLY [B4h].
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
71/80
Định thì khe thời gian đọc/ghi
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
72/80
Lưu đồ lệnh ROM
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
73/80
Lưu đồ lệnh chức năng DS18S20
Chuỗi thao tác này là bắt buộc cho mỗi lần truy xuất DS18S20.
10.3 THIẾT KẾ PHẦN CỨNG
Tín hiệu giao tiếp giữa 8051 và DS18S20 thông qua chuẩn 1-Wire là P3.4. Như vậy, người sử
dụng cần bật ON switch này trên SW-CC4.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
74/80
Hình 49 Sơ đồ kết nối DS18B20
10.4 PHẦN MỀM GIAO TIẾP
Người lập trình cần dùng các lệnh SETB, CLR để thao tác trên bit P3.4 theo giao thức điều
khiển DS18S20.
JE01
SENSOR_CON
1
2
3
RE01
10k
VCC
VCC
SENSOR_OUT = P3.4
SENSOR_OUT
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
75/80
CHƯƠNG 11 THÍ NGHIỆM VỚI VI MẠCH DAC MCP4922
11.1 LÝ THUYẾT CƠ BẢN
Vi mạch chuyển đổi DAC được sử dụng để chuyển tín hiệu từ dạng số sang dạng tương tự.
DAC thường được dùng để tạo ngõ ra giao tiếp giữa hệ thống số với thế giới analog bên
ngoài.
Vi mạch DAC MCP4922 là vi mạch chuyển đổi số sang tương tự 12-bit dùng giao tiếp SPI
của Microchip. Dưới đây là bảng chức năng chân của vi mạch
Chân VDD là ngõ vào nguồn cung cấp dương, điện áp có thể thay đổi từ 2.7V đến 5.5V. Chân
nCS là chân ngõ vào cho phép của vi mạch. Chân này phải được giữ ở mức thấp để cho phép
vi mạch làm việc. SCK là ngõ vào clock nối tiếp. SDI là chân ngõ vào dữ liệu nối tiếp tương
thích SPI. Ngõ vào nLDAC ở mức thấp sẽ cho phép chuyển thanh ghi chốt ngõ vào sang
thanh ghi DAC.(chốt ngõ ra). Chân này cũng có thể nối đến GND nếu dùng cạnh lên của
nCS. Chân nSHDN ở mức thấp sẽ làm cho DAC ở vào trạng thái nghỉ. Các ngõ ra DAC là
VOUTA và VOUTB. Tín hiệu ngõ ra này thay đổi giữa AVSS và VDD, trong đó chân AVSS là chân
GND của tín hiệu analog. Các ngõ vào VREFA và VREFB là các ngõ vào điện áp tham khảo.
11.2 THIẾT KẾ PHẦN CỨNG
Trên kit thí nghiệm, vi mạch MCP4922 được thiết kế giao tiếp với MCU thông qua giao tiếp
SPI. Các tín hiệu SCK, SDI, nLDAC, và DAC_nCS từ MCP4922 được nối đến DIP-SW4 cấu
hình trước khi nối vào MCU. Do đó, cần bật ON các switch này để kết nối tín hiệu điều khiển
của EME-MC8 vào module MCU tương ứng.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
Như vậy, để điều khiển các tín hiệu n
bằng các lệnh thông qua thanh ghi port P1.
11.3 PHẦN MỀM GIAO TIẾP
Vì tín hiệu điều khiển MCP4922
cho phép thao tác trên thanh ghi P1
từ 8051 vào MCP4922
CLR SCK
MOV SDI, C
SETB SCK
Ví dụ để xuất các mức điện áp 0V, 1V, 2.5V, 4V, và 5V ra ngõ ra c
trình có thể làm như sau:
Vì MCP4922 là DAC 12-bit với điện áp tha
5V/4096 = 1.22mV/LSB. Như v
cần xuất ra MCP4922 để tạo ra các mức điện áp nh
Vì độ phân giải này có thể tạo ra sai số ở ng
vi mạch tạo điện áp tham khảo chính xác MCP1541. Vi mạch n
xác ở ngõ ra, do đó, MCP4922 sẽ có độ phân giải l
Dùng các chương trình dịch dữ liệu v
ày, người lập trình cần truy xuất đến các bit trên port 1
được kết nối trực tiếp đến các bit của port 1 n
. Ví dụ đoạn mã sau có thể được dùng để dịch 1 bit
; tạo xung clock
; dịch cờ C
; vào MCP4922
ủa MCP492
m khảo là 5V nên độ phân giải t
ậy, người lập trình có thể tính ra được các giá trị nhị phân
ư yêu cầu.
õ ra của MCP4922 nên người thiết kế có thể d
ày tạo điện áp 4.096V chính
à 1mV/LSB.
ào và ra ở phần trên để ghi dữ liệu vào MCP492
76/80
ên các lệnh
dữ liệu
2, người lập
ương ứng là
ùng
2.
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
CHƯƠNG 12
12.1 LÝ THUYẾT CƠ BẢN
Led ma trận có thể dùng để hiển thị thông tin đến từng điểm ảnh. Do đó, led ma trận có thể
biểu diễn được chữ số, chữ cái, v
(thường là màu đỏ), hoặc đa sắc. Đối với dạng đa sắc, một điểm ảnh chứa đến 2 led với m
khác nhau (ví dụ màu đỏ và màu xanh lá cây). S
thêm một số màu trung gian. Quá trình này có th
xung điều khiển của từng màu (t
cả hai chân anode và cathode của led đều đ
Led ma trận
Led ma trận được hiển thị bằng ph
thường là 1/8 (hoặc 1/16). Điều n
(hoặc 16) lần quét hàng (hoặc cột). Khi quét led ma trận cần quan tâm đến d
dòng đỉnh qua led vì thông số này s
phương pháp quét cột, nếu mỗi led cần d
tối đa của 1 cột sẽ là 8 led x 5mA = 40mA. Tuy nhiên vì led ch
của chu kỳ quét nên dòng đỉnh của xung quét phải đ
Các chân của vi mạch số thường không thể cung cấp đủ d
THÍ NGHIỆM VỚI LED MA TRẬN
à các hình ảnh khác. Led ma trận có thể là d
ử dụng phối hợp hai màu này có th
ể được thực hiện bằng cách thay đổi độ rộng
ức là thời gian sáng của từng led màu). Đối với led ma trận,
ược đưa ra thành tín hiệu điều khiển.
ương pháp quét từng hàng hoặc từng cột. Chu kỳ quét
ày có nghĩa là một khung hình sẽ được hiển thị đầy đủ sau 8
òng trung bình và
ẽ quyết định độ sáng của led. Ví dụ với led 8 h
òng trung bình là 5mA để sáng thì dòng trung bình
ỉ hiển thị trong 1/8 (hoặc 1/16)
ạt đến 8x40mA = 360mA (hoặc 720mA).
òng như thế này. Do đó các tín hi
77/80
ạng đơn sắc
àu
ể sinh ra
àng dùng
ệu
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
78/80
lái led cần phải được đệm với các linh kiện dòng lớn như transistor để đảm bảo đủ dòng cho
từng led.
Để hiển thị được một ký tự chữ hoặc số, chương trình cần một bảng font để chuyển giữa giá
trị bên trong MCU thành giá trị hiển thị lên led ma trận tương tự như với led 7 đoạn. Bảng
font này có thể được ghi trực tiếp vào chương trình.
12.2 THIẾT KẾ PHẦN CỨNG
Led ma trận trên kit là led có kích thước 8x8 với phương pháp quét led là quét cột (vì mỗi cột
đã được đệm với dãy transistor ULN2803 có dòng tối đa lên đến 500mA). Led có hàng là
anode và cột là cathode. Thiết kế sẽ sử dụng vi mạch ULN2803 cho phép kéo dòng lên đến
500mA ở phía cột và BJT B562 ở phía hàng vì phía cột sẽ gánh dòng tối đa lên đến 8 led
đồng thời. Để hiển thị một điểm ảnh thì dữ liệu xuất ra trên hàng phải là mức 0 vì khi đó khóa
BJT sẽ dẫn làm cho hàng được cấp nguồn VCC, dữ liệu xuất trên cột sẽ là mức 1 vì ULN2803
hoạt động như cổng đảo nên tín hiệu lái cột sẽ có điện áp là mức 0 (tức là gần GND) cho
phép các led trên cột tương ứng được sáng.
Hình 50 Sơ đồ mạch phía cột của khối led ma trận
Hình 51 Sơ đồ mạch phía hàng của khối led ma trận
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
79/80
Các tín hiệu dữ liệu hàng và cột được thiết kế theo phương pháp 3 bus. Do đó, led ma trận
được điều khiển thông qua hai vi mạch chốt 74x573, một chốt dữ liệu của từng hàng và một
dùng để chọn cột quét. Tín hiệu cho phép chốt dữ liệu được tổ hợp từ tín hiệu giải mã địa chỉ
và tín hiệu cho phép ghi nWR. Giải mã địa chỉ được thiết kế bằng 74138 với địa chỉ cụ thể
của hàng và cột có thể xem trong bản đồ bộ nhớ.
12.3 PHẦN MỀM GIAO TIẾP
Để có thể hiển thị lên led ma trận, phương pháp được chọn là quét cột. Mỗi cột sẽ được hiển
thị trong một khoảng thời gian nhất định sau đó chuyển sang cột kế tiếp. Vì led ma trận có
kích thước 8x8 nên xung dòng quét cột sẽ là 1/8. Để đảm bảo hiển thị rõ, toàn bộ bảng hiển
thị phải được quét trong vòng trước 40ms (25 hình/s). Như vậy mỗi cột sẽ có thời gian hiển
thị tối đa là 5ms (tuy nhiên nên dùng thời gian trễ là 1ms). Nếu thời gian hiển thị nhỏ hơn thì
tần số quét sẽ tăng, tuy nhiên lúc này dòng trung bình có thể không đủ để led sáng tốt. Do đó
không thể giảm thời gian quét xuống quá nhỏ, trung bình nên chọn vào khoảng 1-3ms (giá trị
cụ thể còn tùy thuộc vào loại led).
Trước tiên, người lập trình cần chuyển đổi giá trị cần hiển thị thành dạng có thể hiển thị lên
led ma trận bằng cách dùng phương pháp tra bảng để tra trên bảng font. Lưu ý là một dữ liệu
hiển thị sẽ được chuyển thành 8 byte dữ liệu hiển thị (vì led ma trận có 8 cột).
Để hiển thị được 1 cột, người lập trình cần xuất 1 byte ra hàng (1 byte trong 8 byte tra được
từ bảng font), cho phép cột đó, chờ một khoảng thời gian và chuyển sang hiển thị cột kế tiếp
với qui trình tương tự. Sau khi hết 8 cột, qui trình hiển thị được lặp lại từ đầu.
Ví dụ ta muốn hiển thị ký tự chữ A lên led ma trận.
Hình 52 Chữ A trên led ma trận 8x8
HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ
80/80
Để có thể hiển thị được chữ A lên led ma trận, trước tiên cần xác định địa chỉ của chốt hàng
và cột bằng bản đồ bộ nhớ. Địa chỉ này sẽ được dùng để xuất các dữ liệu ra led.
Bước kế tiếp là chuẩn bị dữ liệu để xuất. Vì phương pháp quét là quét cột nên dữ liệu xuất ra
cột sẽ lần lượt là 10000000B, 01000000B, 00100000B, 00010000B, 00001000B,
00000100B, 00000010B, 00000001B (mức tích cực của 1 cột là mức cao). Mỗi lần xuất cách
nhau 1ms, sau khi đã chuẩn bị dữ liệu trên hàng. Dữ liệu xuất trên hàng sẽ được lấy ra bằng
phương pháp tra bảng. Nhìn vào hình ảnh của chữ A dự định hiển thị, ta có thể xác định được
các mã xuất ra 8 hàng của 1 cột lần lượt là 03h, 0EDh, 0EEh, 0EEh, 0EDh, 03h, 0FFh, 0FFh
(đây chính là font của chữ A). Dùng dẫn xuất DB để khai báo chuỗi dữ liệu này như sau
CharA: DB 03h, 0EDh, 0EEh, 0EEh, 0EDh, 03h, 0FFh, 0FFh
Dẫn xuất DB không phải là một lệnh của MCU. Đó là một hướng dẫn để trình biên dịch ghi
sẵn các giá trị cho từng byte vào trong bộ nhớ chương trình tại địa chỉ có nhãn là CharA. Dẫn
xuất này nên được đặt trong phân đoạn dữ liệu hoặc cuối của chương trình chính.
MCU sẽ dùng chuỗi lệnh sau để thực hiện tra bảng (look-up table)
MOV A, #n ; n = cột cần hiển thị
MOV DPTR, #CharA
MOVC A, @A+DPTR
Để đọc được mã của chữ A cần hiển thị tại cột thứ n. Lúc này n sẽ thay đổi từ 0 (cho cột đầu
tiên) đến 7 (cho cột cuối cùng). Quá trình này sẽ được lặp liên tục.
Các file đính kèm theo tài liệu này:
- labmanual_cs2_8218.pdf