You are on page 1of 287

ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.

HỒ CHÍ MINH
KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ – CÔNG NGHIỆP YS

ThS NGUYỄN ĐÌNH PHÚ


ThS TRƯƠNG NGỌC ANH
ThS PHAN VÂN HOÀN

GIÁO TRÌNH THỰC HÀNH

(SÁCH DÙNG CHO PHÒNG D401, E6VD)


TP HCM, 2/2021
i
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
LỜI NÓI ĐẦU
Thực hành Vi xử lý hoặc vi điều khiển là môn học cơ sở cho tất cả các ngành Kỹ Thuật
Điện – Điện Tử, Điện Tử - Truyền Thông, Tự Động Điều Khiển, Kỹ Thuật Máy Tính và Cơ Điện
Tử, sau khi đã học xong lý thuyết với mục đích tiếp cận thực tế lập trình điều khiển và ứng dụng
của vi điều khiển từ cơ bản đến nâng cao nhằm ôn tập các kiến thức đã học, rèn luyện các kỹ
năng lập trình, kỹ năng gỡ rối, kỹ năng kiểm tra, kỹ năng quan sát, kỹ năng phân tích, suy luận,
đánh giá.
Các bài thực hành được biên soạn theo theo kít thực hành vi điều khiển PIC 18F6722 với
cấu hình phần cứng giao tiếp với nhiều ngoại vi như led đơn, led 7 đoạn, phím đơn, phím ma
trận, LCD, GLCD, led ma trận 2 màu xamh đỏ, động cơ bước và động cơ DC, cùng nhiều loại
cảm biến khác nhau như cảm biến nhiệt độ LM35, cảm biến nhiệt 1 dây, cảm biến khoảng cách
dùng siêu âm, dùng hồng ngoại, cảm biến chuyển động, …
Các bài thực hành được biên soạn từ dễ đến khó, từ đơn giản đến phức tạp về phần cứng
lẫn phần mềm. Qua từng chương thì mức độ khó về phần cứng và phần mềm sẽ tăng dần do tính
chất kết hợp. Mỗi chương có rất nhiều bài thực hành và bài tập, mục đích của từng bài rõ ràng,
cùng một vấn đề nhưng được viết ở nhiều dạng khác nhau nhằm giúp người học có thể hiểu dễ
dàng và nhanh chóng.
Các phần cứng có liên quan đều được trình bày lại chi tiết, rõ ràng, có lưu đồ giải thuật,
có tính toán và giải thích rõ ràng.
Tài liệu được biên soạn chia thành 10 chương:
Chương 1: Cấu hình kit thực hành vi điều khiển.
Chương 2: Sử dụng phần mềm PIC KIT.
Chương 3: Thực hành module 32 led đơn, nút nhấn.
Chương 4: Thực hành module 8 led 7 đoạn, timer/counter, bàn phím cảm ứng, bộ mã hóa
xoay vòng.
Chương 5: Thực hành module LCD 20×4, IC thời gian thực DS1307.
Chương 6: Thực hành chuyển đổi tương tự sang số ADC, các cảm biến.
Chương 7: Thực hành động cơ bước, động cơ DC và encoder, PWM, điều khiển PID.’
Chương 8: Thực hành module led ma trận.
Chương 9: Thực hành module GLCD và các thiết bị giao tiếp theo chuẩn I2C: ADC-DAC
PCF 8591, Eeprom nối tiếp AT24C256 và các cảm biến.
Nội dung chương 1 trình bày chi tiết về cấu hình kết nối phần cứng của kit thực hành vi
điều khiển PIC 18F6722. Do kit được thiết kế theo tiêu chí không còn dùng dây bus để kết nối
giữa port của vi điều khiển với các đối tượng điều khiển nên có dùng thêm nhiều IC thanh ghi
chuyển nối tiếp sang song song MBI5026, người học cần phải hiểu rõ vai trò, chức năng của
các IC này. Mỗi module đều có trình bày sơ đồ kết nối phần cứng và có giải thích. Người học
cần phải hiểu rõ kết nối phần cứng mới khai thác hết được các tính năng độc lập điều khiển đơn
giản cũng như kết hợp nhiều module để điều khiển cho một chức năng lớn. Đây là chương quan
trọng trình bày hết mọi nguyên lý kết nối phần cứng, phải hiểu rõ chúng thì mới hiểu được các
thư viện và chương trình.
Nội dung chương 2 trình bày chi tiết về cách sử dụng phần mềm để lập trình các chương
trình cho vi điều khiển PIC, cách biên dịch, cách tìm lỗi và phần mềm để nạp code file HEX vào
bộ nhớ của vi điều khiển PIC.

ii Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Nội dung chương 3 thực hành điều khiển module 32 led đơn, nút nhấn, nội dung trình bày
rất chi tiết, từng bước như giới thiệu các hàm đã viết trong thư viện và giải thích chức năng các
hàm, các biến và các tên đã định nghĩa, … có rất nhiều hàm đã viết sẵn nhằm giúp bạn thực
hiện các ứng dụng điều khiển một cách nhanh chóng. Sau đó bắt đầu viết các chương trình mẫu
điều khiển 32 led từ đơn giản đến nâng cao, có nhiều cách viết và có nhiều bài tập để luyện tập
dựa vào các bài mẫu. Người học cần hiểu các bài mẫu để làm các bài tập vì đó là các bài mở
rộng nhằm ứng dụng các kiến thức đã học. Tiếp theo là các chương trình giao tiếp với nút nhấn
đơn, bài đơn giản, bài cho thấy hiện tượng dội của phím nhấn và cách chống dội.
Nội dung chương 4 thực hành điều khiển module 8 led 7 đoạn dùng 4 IC thanh ghi dịch
mở rộng. Nội dung trình bày rất chi tiết, từng bước như giới thiệu các hàm đã viết trong thư
viện và giải thích chức năng các hàm, các biến và các tên đã định nghĩa liên quan đến module
8 led 7 đoạn, … có rất nhiều hàm đã viết sẵn nhằm giúp bạn thực hiện các ứng dụng điều khiển
một cách nhanh chóng.
Sau đó bắt đầu viết các chương trình mẫu điều khiển 8 led 7 đoạn từ đơn giản đến nâng
cao. Kết hợp với các bộ định thời timer và counter và nguồn phát hiện xung khi có sản phẩm đi
qua để thực hành các chương trình đếm xung ngoại, định thời dùng timer. Giao tiếp bàn phím
cảm ứng. Bộ mã hóa xoay vòng để cài đặt và điều khiển. Kết hợp với module 32 led đơn, nút
nhấn và bàn phím cảm ứng để thực hiện yêu cầu điều khiển phức tạp hơn.
Nội dung chương 5 thực hành điều khiển module LCD 20x4 dùng IC thanh ghi dịch mở
rộng. Nguyên lý khởi tạo và hiển thị text, hiển thị hình ảnh. Từng bước giới thiệu các hàm đã
viết trong thư viện và giải thích chức năng các hàm, các biến và các tên đã định nghĩa liên quan
đến module LCD. Có rất nhiều hàm đã viết sẵn nhằm giúp bạn thực hiện các ứng dụng điều
khiển một cách nhanh chóng.
Tiếp theo phần viết các chương trình mẫu điều khiển hiển thị trên LCD từ đơn giản đến
nâng cao. Kết hợp với module 32 led đơn, 8 led 7 đoạn, nút nhấn và bàn phím cảm ứng, IC thời
gian thực DS1307, để thực hiện yêu cầu điều khiển phức tạp hơn.
Nội dung chương 6 thực hành phần chuyển đổi ADC tích hợp trong vi điều khiển PIC
18F6722. Trình bày đầu đủ nguyên lý hoạt động của ADC, các lệnh liên quan đến ADC. Trình
bày lý thuyết cảm biến LM35, mạch giao tiếp các cảm biến với vi điều khiển, cách tính toán độ
phân giải.
Tiếp theo phần viết các chương trình mẫu đọc và chuyển đổi nhiệt độ hiển thị trên led 7
đoạn, trên LCD, từ đơn giản đến nâng cao.
Thực hiện tương tự cho cảm biến đo khoảng cách dùng sóng hồng ngoại GP2D12 và cảm
biến nhiệt một dây DS18B20 và cảm biến đo khoảng cách dùng sóng siêu âm HCSR-04. Cảm
biến nhiệt và độ ẩm DHT11. Cảm biến Load-cell và module ADC 24 bit HX711.
Kết hợp với module 32 led đơn, 8 led 7 đoạn, nút nhấn và bàn phím ma trận để thực hiện
yêu cầu điều khiển phức tạp hơn, tổng hợp nhiều chương trình điều khiển với nhiều chức năng.
Nội dung chương 7 thực hành phần giao tiếp vi điều khiển PIC 18F6722 với động cơ bước
và động cơ DC thông qua IC giao tiếp công suất L298. Trình bày đầu đủ nguyên lý hoạt động
của động cơ bước, động cơ DC, sơ đồ mạch giao tiếp, nguyên lý điều khiển cơ bản và nguyên lý
điều khiển điều chế xung PWM.
Tiếp theo phần viết các chương trình mẫu điều khiển động cơ từ cơ bản đến nâng cao, điều
khiển ổn định tốc độ theo giải thuật PID.
Kết hợp với các module khác để thực hiện yêu cầu điều khiển phức tạp hơn, tổng hợp nhiều
chương trình điều khiển với nhiều chức năng.

Thực hành vi điều khiển PIC iii


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Nội dung chương 8 thực hành điều khiển module led ma trận 2 màu dùng IC thanh ghi
dịch mở rộng. Nội dung trình bày đầy đủ phần lý thuyết mạch giao tiếp giữa vi điều khiển với 3
led ma trận. Nguyên lý quét cột để hiển thị ký tự, nguyên lý quét hàng để đáp ứng yêu cầu mở
rộng, cách tìm mã ký tự.
Tiếp theo phần viết các chương trình mẫu điều khiển hiển thị từng ký tự trên led ma trận
từ đơn giản đến nâng cao.
Kết hợp với các module khác để thực hiện yêu cầu điều khiển phức tạp hơn, tổng hợp nhiều
chương trình điều khiển với nhiều chức năng.
Nội dung chương 9 thực hành phần giao tiếp vi điều khiển PIC 18F6722 với GLCD và các
thiết bị ngoại vi qua chuẩn I2C. Trình bày đầu đủ nguyên lý hoạt động của các thiết bị ngoại vi
như IC ADC-DAC PCF8591, IC nhớ nối tiếp AT24C256.
Tiếp theo phần viết các chương trình mẫu đọc khởi tạo, cài đặt thời gian các và chuyển
đổi nhiệt độ hiển thị trên led 7 đoạn, trên LCD, trên GLCD từ đơn giản đến nâng cao.
Kết hợp với module 32 led đơn, 8 led 7 đoạn, nút nhấn và bàn phím ma trận để thực hiện
yêu cầu điều khiển phức tạp hơn, tổng hợp nhiều chương trình điều khiển với nhiều chức năng.
Với tài liệu và bộ thực hành này sẽ giúp các sinh thực hành rất nhanh, hiệu quả cao, không
mất nhiều thời gian lãng phí như các bộ thực hành trước đây, sau khi kết thúc các bạn sẽ có kỹ
năng tay nghề cao, kỹ năng làm việc cũng như vững chắc về kiến thức, giúp bạn tự tin cho việc
làm trong tương lai.
Trong quá trình biên soạn không thể tránh được các sai sót nên rất mong các bạn đọc
đóng góp xây dựng và xin hãy gởi về nhóm tác giả.
Nhóm tác giả xin cảm ơn các bạn bè đồng nghiệp đã đóng góp nhiều ý kiến, xin cảm ơn
người thân trong gia đình cho phép nhóm tác giả có nhiều thời gian thực hiện biên soạn tài liệu
này.

Nhóm tác giả


Nguyễn Đình Phú
Trương Ngọc Anh
Phan Vân Hoàn

iv Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
DANH SÁCH HÌNH
Hình 1-1. Bộ thực hành vi điều khiển ........................................................................................................... 2
Hình 1-2. Sơ đồ khối vi điều khiển PIC giao tiếp với các module ngoại vi ............................................... 4
Hình 1-3. Sơ đồ khối thanh ghi MBI5026 .................................................................................................... 5
Hình 1-4. Sơ đồ nguyên lý module 32 led đơn ............................................................................................ 7
Hình 1-5. Sơ đồ nguyên lý module 8 led 7 đoạn.......................................................................................... 7
Hình 1-6. Sơ đồ giao tiếp LCD 20×4 ............................................................................................................ 9
Hình 1-7. Sơ đồ giao tiếp module GLCD 128×64 ....................................................................................... 9
Hình 1-8. Sơ đồ giao tiếp các phím nhấn đơn ............................................................................................ 10
Hình 1-9. Sơ đồ giao tiếp bàn phím cảm ứng điện dung TTP229 ............................................................ 11
Hình 1-10. Sơ đồ mạch module tạo xung ................................................................................................... 11
Hình 1-11. Sơ đồ giao tiếp IC MBI5026 để điều khiển động cơ, buzzer, … ........................................... 12
Hình 1-12. Mạch giao tiếp để điều khiển động cơ bước ........................................................................... 12
Hình 1-13. Sơ đồ module A4988 điều khiển động cơ bước ...................................................................... 13
Hình 1-14. Sơ đồ điều khiển động cơ Servo, 2 triac, buzzer..................................................................... 13
Hình 1-15. Sơ đồ mạch của Relay .............................................................................................................. 14
Hình 1-16. Sơ đồ mạch giao tiếp điều khiển động cơ DC ......................................................................... 14
Hình 1-17. Sơ đồ nguyên lý module giao tiếp I2C và các cảm biến tương tự ......................................... 15
Hình 1-18. Sơ đồ giao tiếp cảm biến PIR ................................................................................................... 16
Hình 1-19. Sơ đồ giao tiếp với 2 vi mạch đo nhiệt DS18B20................................................................... 17
Hình 1-20. Sơ đồ giao tiếp cảm biến DHT11 ............................................................................................. 17
Hình 1-21. Sơ đồ giao tiếp cảm biến siêu âm HC-SR04 ........................................................................... 17
Hình 1-22. Sơ đồ giao tiếp cảm biến khoảng cách hồng ngoại GP2D12 ................................................. 18
Hình 1-23. Sơ đồ giao tiếp cảm biến DHT11 ............................................................................................. 18
Hình 1-24. Sơ đồ nguyên lý mạch điều khiển 3 led ma trận ..................................................................... 19
Hình 1-25. Sơ đồ mạch chuyển đổi giao tiếp UART sang USB ............................................................... 20
Hình 1-26. Sơ đồ mạch giao tiếp với module SIM800 .............................................................................. 20
Hình 1-27. Sơ đồ mạch giao tiếp với module HX711 ............................................................................... 20
Hình 1-28. Sơ đồ mạch giao tiếp với module Bluetooth HC-05 ............................................................... 21
Hình 1-29. Sơ đồ mạch giao tiếp với module NRF24L01......................................................................... 21
Hình 1-30. Sơ đồ mạch giao tiếp với module RFID RC522 ..................................................................... 22
Hình 1-31. Sơ đồ mạch module Wifi BLE ESP32..................................................................................... 22
Hình 1-32. Sơ đồ mạch module đế vi điều khiển dạng Arduino 2560 ..................................................... 23
Hình 1-33. Sơ đồ mạch các module dạng socket ....................................................................................... 24

Thực hành vi điều khiển PIC v


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Hình 1-34. Sơ đồ mạch các module dạng socket ....................................................................................... 26

Hình 2-1. Biểu tượng phần mềm CCS ........................................................................................................ 30


Hình 2-2. Biểu tượng phần mềm PICKIT2 ................................................................................................ 30
Hình 2-3. Giao diện phần mềm CCS .......................................................................................................... 31
Hình 2-4. Chỉnh kích thước font của phần mềm CCS ............................................................................... 32
Hình 2-5. Trình tự mở file nguồn c ............................................................................................................. 32
Hình 2-6. Thư mục chứa thư viện và file code mẫu .................................................................................. 32
Hình 2-7. Giao diện phần mềm CCS với code mẫu .................................................................................. 33
Hình 2-8. Giao diện phần mềm CCS với code mẫu .................................................................................. 33
Hình 2-9. Giao diện đang biên dịch với code mẫu .................................................................................... 34
Hình 2-10. Màn hình thông báo kết quả biên dịch thành công ................................................................. 34
Hình 2-11. Kết quả tạo ra file Hex tương ứng ........................................................................................... 34
Hình 2-12. Giao diện phần mềm nạp PICKIT2 ......................................................................................... 35
Hình 2-13. Giao diện mở file hex của code mẫu để nạp ........................................................................... 36
Hình 2-14. PICKIT2 thông báo nạp thành công ........................................................................................ 36
Hình 2-15. Bố trí 2 phần mềm để dễ thao tác ............................................................................................ 37
Hình 2-16. Giao diện phần mềm nạp PICKIT2 ......................................................................................... 38
Hình 2-17. Giao diện phần mềm nạp PICKIT2 ......................................................................................... 38
Hình 2-18. Giao diện phần mềm không nhận ra mạch nạp ....................................................................... 38
Hình 2-19. Chọn Check Communication ................................................................................................... 39

Hình 3-1. Sơ đồ nguyên lý giao tiếp vi điều khiển với module 32 led đơn ............................................. 42
Hình 3-2. Sơ đồ giao tiếp vi điều khiển với 4 nút nhấn đơn ..................................................................... 52
Hình 3-3. Lưu đồ điều khiển 8 led sáng tắt bằng 2 nút ON và OFF ......................................................... 53
Hình 3-4. Lưu đồ điều khiển 8 led sáng tắt bằng 2 nút ON, OFF và INV ............................................... 54
Hình 3-5. Lưu đồ điều khiển 8 led bằng ON, OFF và INV – có chống dội ............................................. 56
Hình 3-6. Điều khiển 32 led sáng tắt dần từ phải sang trái dùng lệnh if .................................................. 61

Hình 4-1. Sơ đồ nguyên lý giao tiếp vi điều khiển với module 4 led 7 đoạn ........................................... 70
Hình 4-2. Sơ đồ khối timer T0: chế độ 8 bit .............................................................................................. 76
Hình 4-3. Sơ đồ khối timer T0: chế độ 16 bit ............................................................................................ 76
Hình 4-4. Hình ảnh led thu phát HY860F và sơ đồ nguyên lý ................................................................. 76
Hình 4-5. Sơ đồ nguyên lý module thu phát hồng ngoại tạo xung ........................................................... 77

vi Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Hình 4-6. Sơ đồ khối của timer T3 giống T1 ............................................................................................ 79
Hình 4-7. Các dạng module bàn phím cảm ứng ......................................................................................... 86
Hình 4-8. Chọn chế độ 8/16 phím, đơn phím hay đa phím ....................................................................... 86
Hình 4-9. Giản đồ thời gian chế độ 16 phím .............................................................................................. 87
Hình 4-10. Bộ mã hóa xoay vòng và tên các tín hiệu ................................................................................ 95
Hình 4-11. Bộ mã hóa xoay vòng ............................................................................................................... 96
Hình 4-12. Dạng sóng theo chiều kim đồng hồ - chiều thuận ................................................................... 96
Hình 4-13. Dạng sóng ngược chiều kim đồng hồ - chiều nghịch ............................................................. 96

Hình 5-1. Giao tiếp vi điều khiển với LCD qua thanh ghi dịch MBI5026 ............................................. 102
Hình 5-2. Hình ảnh các đoạn cho số lớn trên LCD .................................................................................. 111
Hình 5-3. Tìm mã của các đoạn cho số lớn trên LCD ............................................................................. 112
Hình 5-4. Hình ảnh các số lớn từ 0 đến 9 trên LCD ................................................................................ 112

Hình 6-1. Hình ảnh cảm biến LM35CZ.................................................................................................... 125


Hình 6-2. Hình ảnh Joystick ...................................................................................................................... 129
Hình 6-3. Hình cảm biến GP2D12 và sơ đồ khối bên trong ................................................................... 132
Hình 6-4. Dạng sóng của cảm biến khoảng cách GP2D12 ..................................................................... 132
Hình 6-5. Đồ thị chuyển đổi của cảm biến khoảng cách GP2D12 ......................................................... 132
Hình 6-6. Hình cảm biến siêu âm và góc phát thu sóng .......................................................................... 135
Hình 6-7. Giản đồ thời gian của cảm biến HC-SR04 .............................................................................. 136
Hình 6-8. Sơ đồ nguyên lý cảm biến khoảng cách siêu âm..................................................................... 136
Hình 6-9. Các dạng đóng gói của vi mạch DS18B20 .............................................................................. 139
Hình 6-10. Sơ đồ khối của vi mạch DS18B20 ......................................................................................... 140
Hình 6-11. Cấu trúc 2 thanh ghi lưu nhiệt độ của vi mạch DS18B20 .................................................... 141
Hình 6-12. Cấu trúc 2 thanh ghi lưu nhiệt độ báo động của vi mạch DS18B20.................................... 141
Hình 6-13. Sơ đồ cấp nguồn cho vi mạch DS18B20 ............................................................................... 142
Hình 6-14. Cấu trúc mã 64 bit của vi mạch DS18B20 ............................................................................ 142
Hình 6-15. Tổ chức bộ nhớ ROM của vi mạch DS18B20 ...................................................................... 143
Hình 6-16. Byte thanh ghi điều khiển của vi mạch DS18B20 ................................................................ 144
Hình 6-17. Lưu đồ các lệnh liên quan đến ROM của cảm biến DS18B20 ............................................ 145
Hình 6-18. Lưu đồ của các lệnh chức năng của DS18B20...................................................................... 147
Hình 6-19. Dạng sóng của xung reset và xung hiện diện ........................................................................ 149
Hình 6-20. Dạng sóng khe thời gian đọc/ghi ........................................................................................... 150

Thực hành vi điều khiển PIC vii


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Hình 6-21. Chi tiết dạng sóng khe thời gian đọc mức 1 của thiết bị chủ ............................................... 150
Hình 6-22. Thu ngắn các khoảng thời gian .............................................................................................. 151
Hình 6-23. Mạch đo nhiệt độ dùng 2 DS18B20 ...................................................................................... 151
Hình 6-24. Hình dạng cảm biến DHT11 .................................................................................................. 156
Hình 6-25. Sơ kết nối MCU với cảm biến DHT11 .................................................................................. 158
Hình 6-26. Định dạng 5 byte của DHT11 gửi đến MCU ........................................................................ 159
Hình 6-27. Biểu đồ thời gian tín hiệu Start của MCU và đáp ứng của DHT11 ..................................... 159
Hình 6-28. Biểu đồ thời gian DHT11 gửi dữ liệu bit ‘0’ ........................................................................ 160
Hình 6-29. Biểu đồ thời gian DHT11 gửi dữ liệu bit ‘1’ ........................................................................ 160
Hình 6-30. Biểu đồ thời gian của 1 chu kỳ giao tiếp giữa MCU và DHT11 ......................................... 160
Hình 6-31. Sơ kết đồ chân IC HX711 ...................................................................................................... 166
Hình 6-32. Sơ kết nối HX711 với cảm biến Load-cell ............................................................................ 167
Hình 6-33. Biểu đồ thời gian một chu kỳ chuyển đổi của HX711 ......................................................... 168
Hình 6-34. Biểu đồ thời gian vào chế độ ngủ của HX711 ...................................................................... 169
Hình 6-35. Module HX711 ....................................................................................................................... 171
Hình 6-36. Cảm biến Strain-gauge ........................................................................................................... 171
Hình 6-37. Cảm biến Strain-gauge nối vào cầu Wheatstone .................................................................. 172
Hình 6-38. Kết nối cảm biến Load-cell với module HX711 ................................................................... 172

Hình 7-1. Động cơ bước và sơ đồ nguyên lý ........................................................................................... 178


Hình 7-2. Hình dạng và sơ đồ nguyên lý IC L298 ................................................................................... 179
Hình 7-3. IC L298 điều khiển 1 động cơ bước ........................................................................................ 179
Hình 7-4. Mạch giao tiếp động cơ bước ................................................................................................... 180
Hình 7-5. Động cơ DC trong BTN và encoder ........................................................................................ 187
Hình 7-6. IC L298 điều khiển 1 động cơ DC dùng 1 cầu H ................................................................... 188
Hình 7-7. IC L298 điều khiển 1 động cơ DC dùng 2 cầu H ................................................................... 188
Hình 7-8. Mạch giao tiếp động cơ bước và động cơ DC ......................................................................... 189
Hình 7-9. Hệ thống điều khiển vòng kín của động cơ Servo .................................................................. 199
Hình 7-10. Các trục và bánh răng bên trong của động cơ Servo ............................................................ 199
Hình 7-11. Dạng sóng điều khiển của động cơ Servo ............................................................................. 200
Hình 7-12. Dạng sóng PWM ..................................................................................................................... 200

Hình 8-1. Sơ đồ nguyên lý giao tiếp vi điều khiển với 3 led ma trận ..................................................... 208

viii Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Hình 9-1. Hình ảnh của GLCD ................................................................................................................. 218
Hình 9-2. Cấu trúc IC ST7920 .................................................................................................................. 219
Hình 9-3. Tung độ hiển thị GDRAM và địa chỉ tương ứng của GLCD ................................................. 223
Hình 9-4. Vẽ lại hình GDRAM theo khối bộ nhớ.................................................................................... 224
Hình 9-5. Bộ nhớ GDRAM của GLCD có kích thước 32×256 .............................................................. 224
Hình 9-6. Bộ nhớ GDRAM của GLCD 32×256 bố trí theo kích thước 64×128 ................................... 224
Hình 9-7. Bộ nhớ GDRAM của GLCD 32×256 chi tiết.......................................................................... 225
Hình 9-8. Sơ đồ nguyên lý module GLCD 128×64 ................................................................................. 228
Hình 9-9. Sơ đồ chân và tên các chân của IC Eeprom AT24C256 ......................................................... 243
Hình 9-10. Sơ đồ khối của IC Eeprom AT24C256.................................................................................. 244
Hình 9-11. Tổ chức địa chỉ của IC Eeprom AT24C256 .......................................................................... 244
Hình 9-12. Ghi theo byte của IC Eeprom AT24C256 ............................................................................. 245
Hình 9-13. Ghi theo trang của IC Eeprom AT24C256 ............................................................................ 245
Hình 9-14. Đọc byte hiện tại của IC Eeprom AT24C256. ...................................................................... 245
Hình 9-15. Đọc byte ngẫu nhiên của IC Eeprom AT24C256. ................................................................ 246
Hình 9-16. Đọc nhiều byte liên tục của IC Eeprom AT24C256. ............................................................ 246
Hình 9-17. Sơ đồ khối IC PCF8591 .......................................................................................................... 251
Hình 9-18. Sơ đồ khối IC PCF8591 .......................................................................................................... 253
Hình 9-19. Cấu trúc thanh ghi điều khiển của IC PCF8591 .................................................................... 254
Hình 9-20. Cấu trúc khối DAC của IC PCF8591..................................................................................... 255
Hình 9-21. Công thức điện áp ra và đặc tính chuyển đổi ........................................................................ 256
Hình 9-22. Dạng sóng chuyển đổi D/A .................................................................................................... 256
Hình 9-23. Dạng sóng truyền dữ liệu của IC PCF8591 ........................................................................... 257
Hình 9-24. Dạng sóng chuyển đổi A/D ở chế độ đơn cực và vi sai ........................................................ 257
Hình 9-25. Địa chỉ của IC PCF8591 ......................................................................................................... 258
Hình 9-26. Tín hiệu đọc ghi ...................................................................................................................... 258
Hình 9-27. Chế độ ghi dữ liệu vào IC PCF8591 ...................................................................................... 258
Hình 9-28. Chế độ đọc dữ liệu từ IC PCF8591 ........................................................................................ 259
Hình 9-22. Hình ảnh cảm biến chuyển động ............................................................................................ 264
Hình 9-23. Phạm vi nhận biết của cảm biến chuyển động ...................................................................... 264
Hình 9-24. Sơ đồ chân và tên các chân của cảm biến chuyển động ....................................................... 264
Hình 9-25. Sơ đồ kết nối tải của cảm biến chuyển động ......................................................................... 265
Hình 9-26. Sơ đồ của cảm biến chuyển động PIR với vi điều khiển ...................................................... 265

Thực hành vi điều khiển PIC ix


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
DANH SÁCH BẢNG
Bảng 1-1. Bảng trạng thái IC MBI5026 ....................................................................................................... 6
Bảng 1-2. Bảng mã led 7 đoạn loại anode chung......................................................................................... 8
Bảng 1-3. Kết nối portA với các module.................................................................................................... 25
Bảng 1-4. Kết nối portB với các module .................................................................................................... 26
Bảng 1-5. Kết nối portC với các module .................................................................................................... 26
Bảng 1-6. Kết nối portD với các module.................................................................................................... 26
Bảng 1-7. Kết nối portE với các module .................................................................................................... 27
Bảng 1-8. Kết nối portF với các module .................................................................................................... 27
Bảng 1-9. Kết nối portG với các module.................................................................................................... 27

Bảng 5-1. Thiết lập địa chỉ CGRAM ........................................................................................................ 109


Bảng 5-2. Vùng nhớ CGRAM .................................................................................................................. 109
Bảng 5-3. Mã của trái tim .......................................................................................................................... 110

Bảng 6-1. Độ phân giải và thời gian chuyển đổi...................................................................................... 144


Bảng 6-2. Điện áp, dòng tiêu thụ, chu kỳ lấy mẫu của DHT11 .............................................................. 156
Bảng 6-3. Độ phân giải và thời gian chuyển đổi...................................................................................... 157
Bảng 6-4. Độ phân giải và thời gian chuyển đổi...................................................................................... 157
Bảng 6-5. Điện áp, dòng tiêu thụ, chu kỳ lấy mẫu của DHT11 .............................................................. 166
Bảng 6-6. Thông số thời gian của SCK và DOUT .................................................................................. 168
Bảng 6-7. Thông số số lượng xung lựa chọn hệ số khuếch đại .............................................................. 168
Bảng 6-8. Các đặc tính điện quan trọng của HX711 ............................................................................... 169

Bảng 7-1. Các trạng thái điều khiển động cơ bước đủ - cách 1 .............................................................. 180
Bảng 7-2. Các trạng thái điều khiển động cơ bước đủ - cách 2 ............................................................. 181
Bảng 7-3. Các trạng thái điều khiển động cơ nữa bước – cách 1 ........................................................... 181
Bảng 7-4. Các trạng thái điều khiển động cơ nữa bước – cách 2 ........................................................... 181
Bảng 7-5. Các trạng thái điều khiển động cơ DC .................................................................................... 189

Bảng 9-1. Các chân của GLCD ................................................................................................................. 218


Bảng 9-2. Các font chữ 16x16 của các vùng nhớ của GLCD ................................................................. 221
Bảng 9-3. Các font chữ 8x16 của GLCD ................................................................................................. 221
Bảng 9-4. Địa chỉ gởi mã của font 16x16................................................................................................. 222

x Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Bảng 9-5. Tập lệnh điều khiển cơ bản của GLCD ................................................................................... 225
Bảng 9-6. Tập lệnh điều khiển mở rộng của GLCD ................................................................................ 226

Thực hành vi điều khiển PIC xi


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

MỤC LỤC
GIÁO TRÌNH THỰC HÀNH ..................................................................................................................... i
LỜI NÓI ĐẦU ................................................................................................................................................ ii
DANH SÁCH HÌNH .................................................................................................................................... v
DANH SÁCH BẢNG .................................................................................................................................... x
MỤC LỤC .................................................................................................................................................... xii
Chương 1: CẤU HÌNH KÍT THỰC HÀNH VI ĐIỀU KHIỂN ............................................................... 1
1.1 GIỚI THIỆU BỘ KIT THỰC HÀNH ....................................................................................... 2
1.2 SƠ ĐỒ NGUYÊN LÝ KIT VI ĐIỀU KHIỂN .......................................................................... 4
1.2.1 Hệ thống vi điều khiển PIC18F6722 giao tiếp với các module ngoại vi........................ 4
1.2.2 Module 1: Giao tiếp với 32 Led đơn ................................................................................... 6
1.2.3 Module 2: 8 led 7 đoạn ......................................................................................................... 7
1.2.4 Module 3: LCD 20×4 ............................................................................................................ 8
1.2.5 Module 4: GLCD 128×64 ................................................................................................... 10
1.2.6 Module 5: phím đơn và phím ma trận 4×4 ..................................................................... 10
1.2.7 Module 6: thu phát hồng ngoại tạo xung......................................................................... 11
1.2.8 Module 7: giao tiếp relay, buzzer và động cơ ................................................................. 11
1.2.9 Module 8: các module giao tiếp theo chuẩn I2C ............................................................ 15
1.2.10 Module 9: giao tiếp các cảm biến nhiệt, cảm biến khoảng cách, led thu.................... 16
1.2.11 Module 10: giao tiếp led ma trận ...................................................................................... 18
1.2.12 Module 11: giao tiếp máy tính bằng USB qua IC chuyển đổi UART ......................... 19
1.2.13 Module 12: giao tiếp SIM800 ............................................................................................ 20
1.2.14 Module 13: giao tiếp ADC HX711 .................................................................................... 20
1.2.15 Module 14: giao tiếp module Bluetooth HC-05 .............................................................. 21
1.2.16 Module 15: giao tiếp NRF24L01 ....................................................................................... 21
1.2.17 Module 16: giao tiếp RFID RC522 ................................................................................... 21
1.2.18 Module 17: Wifi BLE ESP32............................................................................................. 21
1.2.19 Module 18: module vi điều khiển trung tâm................................................................... 22
1.2.20 Các Module khác: ............................................................................................................... 24
1.2.21 Module vi điều khiển PIC: ................................................................................................. 24
Chương 2: SỬ DỤNG PHẦN MỀM CCS VÀ PITKIT2 ........................................................................ 29
2.1 GIỚI THIỆU PHẦN MỀM CCS ............................................................................................. 30
2.2 COPY PHẦN MỀM CCS, THƯ VIỆN, CODE MẪU .......................................................... 30
2.2.1 Copy phần mềm, thư viện, code mẫu ............................................................................... 30
xii Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
2.2.2 Cài phần mềm CCS............................................................................................................. 30
2.2.3 Cài phần mềm PICKIT2 .................................................................................................... 30
2.2.4 Sử dụng phần mềm PICKIT2 không cần cài .................................................................. 30
2.3 HƯỚNG DẪN SỬ DỤNG PHẦN MỀM CCS ........................................................................ 31
2.3.1 Khởi động phần mềm CCS ................................................................................................ 31
2.3.2 Chỉnh font chữ phần mềm CCS ........................................................................................ 31
2.3.3 Mở code mẫu ........................................................................................................................ 32
2.3.4 Biên dịch chương trình tạo ra file hex ............................................................................. 33
2.4 HƯỚNG DẪN SỬ DỤNG PHẦN MỀM NẠP FILE HEX PICKIT2 ................................. 35
2.4.1 Kết nối cáp USB và mở nguồn cho kit thực hành .......................................................... 35
2.4.2 Mở phần mềm PICKIT2 .................................................................................................... 35
2.4.3 Nạp file hex tự động ............................................................................................................ 36
2.4.4 Quan sát kết quả ở kit thực hành sau khi nạp................................................................ 36
2.4.5 Cách bố trí hai phần mềm ................................................................................................. 36
2.4.6 PICKIT2 tự động nạp file hex đã nạp khi có thay đổi .................................................. 37
2.4.7 Cách xử lý khi nhận chip không đúng ............................................................................. 37
2.4.8 Cách xử lý khi không nhận mạch nạp ............................................................................. 37
2.4.9 Cách xử lý sau khi nạp xong mà vi điều khiển không chạy.......................................... 38
Chương 3: THỰC HÀNH MODULE 32 LED ĐƠN, NÚT NHẤN ĐƠN ........................................... 41
3.1 CÁC CHƯƠNG TRÌNH ĐIỀU KHIỂN 32 LED ĐƠN ........................................................ 42
3.1.1 Mạch giao tiếp vi điều khiển với module 32 led đơn ..................................................... 42
3.1.2 Thư viện khởi tạo và thư viện của module 32 led đơn .................................................. 42
3.1.3 Các chương trình điều khiển 32 led đơn dùng lệnh for ................................................ 44
3.2 ĐIỀU KHIỂN 32 LED ĐƠN VÀ NÚT NHẤN – CÁCH 1 ................................................... 51
3.2.1 Giới thiệu .............................................................................................................................. 51
3.2.2 Mạch điện giao tiếp vi điều khiển với 4 nút nhấn đơn .................................................. 51
3.2.3 Định nghĩa tên các nút nhấn trong thư viện ................................................................... 52
3.2.4 Các chương trình điều khiển dùng các nút nhấn đơn ................................................... 52
3.3 ĐIỀU KHIỂN 32 LED ĐƠN VÀ NÚT NHẤN – CÁCH 2 ................................................... 57
3.3.1 Hiện tượng đáp ứng chậm, chờ nhả phím ....................................................................... 57
3.3.2 Thư viện hàm quét phím .................................................................................................... 59
3.3.3 Giải quyết các vấn đề để được đáp ứng nhanh............................................................... 60
3.3.4 Tối ưu thời gian delay 20ms của hàm chống dội nút nhấn ........................................... 63
3.3.5 Các bài tập mở rộng dùng lệnh if ..................................................................................... 65
3.3.6 Chương trình chạy tự động ............................................................................................... 67
3.4 THƯ VIỆN CHÍNH .................................................................................................................... 68

Thực hành vi điều khiển PIC xiii


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Chương 4: THỰC HÀNH MODULE 8 LED 7 ĐOẠN, COUNTER/TIMER, BÀN PHÍM CẢM
ỨNG TOUCH, ROTARY ENCODER ...................................................................................................... 69
4.1 MẠCH ĐIỆN VÀ THƯ VIỆN MODULE 8 LED 7 ĐOẠN ................................................. 70
4.1.1 Mạch điện giao tiếp vi điều khiển với module 8 led 7 đoạn .......................................... 70
4.1.2 Hàm xuất dữ liệu của module 8 led 7 đoạn ..................................................................... 71
4.2 HIỂN THỊ SỐ TRÊN 8 LED 7 ĐOẠN .................................................................................... 73
4.3 CÀI ĐẶT GIỚI HẠN BẰNG PHÍM ĐƠN ............................................................................. 74
4.4 ĐẾM XUNG DÙNG COUNTER HIỂN THỊ TRÊN LED 7 ĐOẠN .................................. 75
4.4.1 Tóm tắt timer/counter T0 .................................................................................................. 75
4.4.2 Cảm biến thu phát hồng ngoại HY860F .......................................................................... 76
4.4.3 Mạch điện dùng T0 đếm xung ngoại ................................................................................ 77
4.4.4 Các ứng dụng đếm xung ngoại dùng counter T0 ........................................................... 77
4.5 ỨNG DỤNG TIMER CỦA VI ĐIỀU KHIỂN PIC ............................................................... 79
4.5.1 Tóm tắt timer/counter T3 .................................................................................................. 79
4.5.2 Đếm thời gian: giây, phút, giờ báo ngắt dùng timer T3 ................................................ 79
4.6 GIAO TIẾP VỚI BÀN PHÍM CẢM ỨNG CHẠM ............................................................... 85
4.6.1 Giới thiệu module bàn phím cảm ứng ............................................................................. 85
4.6.2 Các thông số cơ bản của bàn phím cảm ứng TTP229 ................................................... 85
4.6.3 Giao tiếp theo chuẩn 2 dây của bàn phím cảm ứng TTP229 ....................................... 86
4.6.4 Các hàm trong thư viện của bàn phím cảm ứng TTP229............................................. 87
4.6.5 Các bài thực hành điều khiển dùng bàn phím cảm ứng TTP229 ................................ 89
4.6.6 Các bài thực hành cài giới hạn bằng bàn phím cảm ứng TTP229 .............................. 91
4.7 GIAO TIẾP BỘ MÃ HÓA QUAY VÒNG ROTARY ENCODER .................................... 94
4.7.1 Tên các chân của bộ mã hóa xoay .................................................................................... 95
4.7.2 Cách thức hoạt động của bộ mã hóa quay ...................................................................... 95
4.7.3 Giao tiếp vi điều khiển với bộ mã hóa xoay vòng........................................................... 96
4.7.4 Thư viện của module mã hóa xoay vòng ......................................................................... 97
4.7.5 Các bài thực hành ứng dụng bộ mã hóa xoay vòng ....................................................... 98
4.8 KẾT HỢP HAI MODULE 32 LED VÀ 8 LED 7 ĐOẠN ..................................................... 99
Chương 5: THỰC HÀNH MODULE LCD 20×4, COUNTER/TIMER, BÀN PHÍM CẢM ỨNG
TOUCH, ROTARY ENCODER, THỜI GIAN THỰC .......................................................................... 101
5.1 LÝ THUYẾT LCD ................................................................................................................... 102
5.2 LCD TRONG KIT THỰC HÀNH VÀ THƯ VIỆN ............................................................ 102
5.2.1 Mạch giao tiếp vi điều khiển với LCD ........................................................................... 102
5.2.2 Thư viện hỗ trợ hàm xuất dữ liệu ra LCD .................................................................... 103
5.2.3 Thư viện LCD .................................................................................................................... 103
5.3 CÁC CHƯƠNG TRÌNH SỬ DỤNG VÙNG NHỚ DDRAM ............................................. 105
xiv Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
5.3.1 Các ứng dụng hiển thị ký tự, dịch chuổi trên LCD ..................................................... 105
5.3.2 Các ứng dụng kết hợp bàn phím cảm ứng và LCD ..................................................... 107
5.3.3 Đếm xung ngoại dùng timer T0 hiển thị trên LCD...................................................... 108
5.4 CÁC ỨNG DỤNG VÙNG NHỚ CGRAM CỦA LCD ........................................................ 109
5.4.1 Vùng nhớ CGRAM ........................................................................................................... 109
5.4.2 Cách tìm mã ký tự mong muốn....................................................................................... 110
5.4.3 Các chương trình ứng dụng các ký tự - tự tạo trên LCD ........................................... 110
5.4.4 Tạo mã 7 đoạn kích thước lớn trên LCD ...................................................................... 111
5.4.5 Các hàm hiển thị số kích thước lớn trên LCD .............................................................. 113
5.4.6 Các bài thực hành hiển thị số to trên LCD ................................................................... 114
5.5 ĐỒNG HỒ THỜI GIAN THỰC DS1307 .............................................................................. 115
5.5.1 IC thời gian thực DS1307 giao tiếp chuẩn I2C ............................................................. 115
5.5.2 Thư viện IC thời gian thực DS1307 giao tiếp chuẩn I2C ............................................ 115
5.5.3 Thực hành đồng hồ thời gian thực IC DS1307 ............................................................. 117
5.6 KẾT HỢP 3 MODULE: 32 LED, 8 LED 7 ĐOẠN, LCD, NÚT NHẤN .......................... 121
Chương 6: THỰC HÀNH CHUYỂN ĐỔI TƯƠNG TỰ SANG SỐ - ADC, CÁC CẢM BIẾN ........ 123
6.1 CHUYỂN ĐỔI TƯƠNG TỰ SANG SỐ CỦA PIC ............................................................. 124
6.2 CÁC CẢM BIẾN TƯƠNG TỰ ............................................................................................... 124
6.2.1 Mạch điện giao tiếp vi điều khiển PIC với các cảm biến tương tự ............................ 124
6.2.2 Tính toán độ phân giải của ADC .................................................................................... 124
6.2.3 Các thông số và hệ số chuyển đổi của cảm biếm nhiệt LM35 .................................... 124
6.2.4 Thư viện của ADC và các cảm biến................................................................................ 125
6.2.5 Thực hành ADC và cảm biến nhiệt LM35 .................................................................... 126
6.2.6 Thực hành Joystick ........................................................................................................... 129
6.3 ĐO KHOẢNG CÁCH DÙNG CẢM BIẾN GP2D12 .......................................................... 131
6.3.1 Cảm biến GP2D12 ............................................................................................................. 131
6.3.2 Các bài đo khoảng cách dùng cảm biến GP2D12 ........................................................ 133
6.4 ĐO KHOẢNG CÁCH DÙNG CẢM BIẾN SIÊU ÂM HC-SR 04..................................... 135
6.4.1 Cảm biến HC-SR 04.......................................................................................................... 135
6.4.2 Cảm biến HC-SR 04 trong kit thực hành ...................................................................... 136
6.4.3 Đo khoảng cách dùng HCSR-04 ..................................................................................... 136
6.5 VI MẠCH ĐO NHIỆT ĐỘ DS18B20 .................................................................................... 139
6.5.1 Vi mạch đo nhiệt độ DS18B20 ......................................................................................... 139
6.5.2 Hình ảnh và tên các chân của vi mạch DS18B20 ......................................................... 140
6.5.3 Sơ đồ khối của vi mạch DS18B20 ................................................................................... 140
6.5.4 Hoạt động của vi mạch cảm biến DS18B20 .................................................................. 140

Thực hành vi điều khiển PIC xv


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
6.5.5 Hoạt động cảnh báo quá nhiệt của vi mạch DS18B20................................................. 141
6.5.6 Cấp nguồn cho vi mạch DS18B20................................................................................... 142
6.5.7 Mã 64 bit của vi mạch DS18B20 ..................................................................................... 142
6.5.8 Bộ nhớ rom của vi mạch DS18B20 ................................................................................. 142
6.5.9 Thanh ghi định cấu hình của vi mạch DS18B20 .......................................................... 143
6.5.10 Trình tự hoạt động của vi mạch DS18B20 .................................................................... 144
6.5.11 Các lệnh hoạt động của vi mạch DS18B20 .................................................................... 144
6.5.12 Các dạng tín hiệu của chuẩn 1 dây ................................................................................. 148
6.5.13 Trình tự khởi động – xung reset và xung hiện diện ..................................................... 148
6.5.15 Mạch điện giao tiếp vi điều khiển với DS18B20 ........................................................... 151
6.5.16 Thư viện DS18B20 ............................................................................................................ 152
6.5.17 Đo nhiệt độ dùng một vi mạch DS18B20 ....................................................................... 153
6.5.18 Đo nhiệt độ dùng hai vi mạch DS18B20 ........................................................................ 155
6.6 VI MẠCH CẢM BIẾN NHIỆT ĐỘ VÀ ĐỘ ẨM DHT11 .................................................. 156
6.6.1 Giới thiệu vi mạch DHT11 ............................................................................................... 156
6.6.2 Các thông số kỹ thuật ....................................................................................................... 158
6.6.3 Kết nối mạch ứng dụng .................................................................................................... 158
6.6.4 Quá trình giao tiếp giữa MCU và DHT11 ..................................................................... 158
6.6.5 Thư viện của DHT11 ........................................................................................................ 160
6.6.6 Các chương trình đo nhiệt độ và độ ẩm của DHT11 ................................................... 162
6.7 VI MẠCH ADC 24 BIT HX711 VÀ CẢM BIẾN LOAD-CELL....................................... 164
6.7.1 Giới thiệu vi mạch HX711 ............................................................................................... 164
6.7.2 Các thông số kỹ thuật ....................................................................................................... 165
6.7.3 Sơ đồ chân HX711 ............................................................................................................. 165
6.7.4 Sơ đồ mạch kết nối với cảm biến Load-cell .................................................................. 167
6.7.5 Giao tiếp đồng bộ của HX711.......................................................................................... 167
6.7.6 Các đặc tính điện quan trọng của HX711 ..................................................................... 169
6.7.7 Module HX711 ................................................................................................................... 170
6.7.8 Cảm biến Load-cell ........................................................................................................... 171
6.7.9 Kết nối cảm biến Load-cell với module HX711 ............................................................ 172
6.7.10 Thư viện của HX711 ......................................................................................................... 173
6.7.11 Các chương trình đo khối lượng dùng cảm biến Load-cell và HX711 ..................... 173
6.8 KẾT HỢP NHIỀU MODULE ................................................................................................ 176
Chương 7: THỰC HÀNH MODULE ĐỘNG CƠ BƯỚC, ĐỘNG CƠ DC VÀ ENCODER, PWM,
ĐIỀU KHIỂN PID ..................................................................................................................................... 177
7.1 ĐIỀU KHIỂN ĐỘNG CƠ BƯỚC .......................................................................................... 178

xvi Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
7.1.1 Giới thiệu động cơ bước ................................................................................................... 178
7.1.2 IC giao tiếp công suất điều khiển L298 .......................................................................... 178
7.1.3 Mạch giao tiếp điều khiển động cơ bước ....................................................................... 179
7.1.4 Mã điều khiển động cơ bước ........................................................................................... 180
7.1.5 Các biến và hàm điều khiển Relay, Triac, Buzzer, động cơ ....................................... 182
7.1.6 Thư viện điều khiển động cơ bước ................................................................................. 182
7.1.7 Các bài thực hành điều khiển động cơ bước................................................................. 183
7.2 ĐIỀU KHIỂN ĐỘNG CƠ DC, ENCODER.......................................................................... 187
7.2.1 Giới thiệu động cơ DC, ENCODER ............................................................................... 187
7.2.2 Mạch giao tiếp điều khiển động cơ DC .......................................................................... 188
7.2.3 Dữ liệu điều khiển động cơ DC ....................................................................................... 189
7.2.4 Thư viện điều khiển động cơ DC .................................................................................... 189
7.2.5 Các bài thực hành điều khiển động cơ DC.................................................................... 190
7.3 ĐIỀU KHIỂN THAY ĐỔI TỐC ĐỘ ĐCDC DÙNG PWM ............................................... 192
7.3.1 Nguyên lý PWM (PULSE WIDTH MODULATION) ................................................. 192
7.3.2 Tính toán điều khiển tốc độ động cơ bằng PWM......................................................... 192
7.3.3 Thư viện PWM .................................................................................................................. 193
7.3.4 Các bài thực hành thay đổi tốc độ động cơ dc bằng PWM ........................................ 194
7.4 ĐIỀU KHIỂN ĐỘNG CƠ SERVO ........................................................................................ 198
7.4.1 Động cơ Servo: ................................................................................................................... 198
7.4.2 Nguyên lý hoạt động của động cơ Servo ........................................................................ 199
7.4.3 Các tín hiệu giao tiếp của động cơ servo ....................................................................... 200
7.4.4 Giao tiếp vi điều khiển với động cơ servo...................................................................... 201
7.4.5 Các chương trình điều khiển động cơ servo ................................................................. 201
7.5 ĐIỀU KHIỂN KẾT HỢP 2 ĐỘNG CƠ BƯỚC VÀ DC ..................................................... 202
7.6 ĐIỀU KHIỂN ỔN ĐỊNH TỐC ĐỘ ĐỘNG CƠ DC ............................................................ 203
7.6.1 Giới thiệu PID .................................................................................................................... 203
7.6.2 Điều khiển động cơ dùng PID ......................................................................................... 203
Chương 8: THỰC HÀNH MODULE LED MA TRẬN 2 MÀU .......................................................... 207
8.1 SƠ ĐỒ MẠCH GIAO TIẾP VI ĐIỀU KHIỂN VỚI LED MA TRẬN ............................ 208
8.2 ĐIỀU KHIỂN LED MA TRẬN THEO CÁCH QUÉT HÀNG ......................................... 208
8.2.1 Mã quét hàng led ma trận ................................................................................................ 208
8.2.2 Thư viện led ma trận quét hàng ...................................................................................... 209
8.2.3 Các chương trình led ma trận quét hàng ...................................................................... 213
Chương 9: THỰC HÀNH MODULE – GLCD 128×64–ADC–DAC PCF8591, EEPROM AT24C256
VÀ CÁC CẢM BIẾN ................................................................................................................................ 217

Thực hành vi điều khiển PIC xvii


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
9.1 LÝ THUYẾT GLCD ................................................................................................................ 218
9.1.1 Giới thiệu GLCD ............................................................................................................... 218
9.1.2 Sơ đồ chân của GLCD ...................................................................................................... 218
9.1.3 IC điều khiển GLCD ST7920 .......................................................................................... 219
9.1.4 Mô tả chức năng ic điều khiển GLCD ST7920 ............................................................. 220
9.1.5 Các lệnh điều khiển GLCD cơ bản................................................................................. 225
9.1.6 Các lệnh điều khiển GLCD mở rộng ............................................................................. 226
9.2 CÁC BÀI THỰC HÀNH HIỂN THỊ TEXT TRÊN GLCD ............................................... 227
9.2.1 Sơ đồ mạch của GLCD ..................................................................................................... 227
9.2.2 Thư viện hàm điều khiển cơ bản của GLCD ................................................................ 227
9.2.3 Các bài thực hành hiển thị ký tự trên GLCD ............................................................... 229
9.3 CÁC BÀI THỰC HÀNH HIỂN THỊ HÌNH ẢNH TRÊN GLCD ..................................... 232
9.3.1 Thư viện và hàm điều khiển liên quan đến hình ảnh của GLCD .............................. 232
9.3.2 Các bài thực hành hiển thị hình ảnh trên GLCD ........................................................ 235
9.4 CÁC BÀI THỰC HÀNH VẼ HÌNH TRÊN GLCD ............................................................ 237
9.4.1 Thư viện “graphics.c”....................................................................................................... 237
9.4.2 Các bài thực hành sử dụng thư viện “graphics.c” ....................................................... 237
9.4.3 Giải mã 7 đoạn số to sử dụng thư viện “graphics.c” ................................................... 241
9.5 GIAO TIẾP BỘ NHỚ EEPROM AT24C256....................................................................... 242
9.5.1 Khảo sát IC nhớ EEPROM AT24C256 ......................................................................... 243
9.5.2 Mạch điện giao tếp với IC nhớ EEPROM AT24C256 ................................................ 246
9.5.3 Thư viện IC nhớ EEPROM AT24Cxx ........................................................................... 246
9.5.4 Các chương trình ghi đọc IC nhớ EEPROM AT24C256 ........................................... 247
9.6 GIAO TIẾP ADC CỦA IC PCF8591 .................................................................................... 250
9.6.1 Giới thiệu IC PCF8591 ..................................................................................................... 250
9.6.2 Cấu hình IC PCF8591 ...................................................................................................... 251
9.6.3 Ứng dụng IC PCF8591 ..................................................................................................... 251
9.6.4 Sơ đồ chân IC PCF8591 ................................................................................................... 251
9.6.5 Sơ đồ khối IC PCF8591 .................................................................................................... 252
9.6.6 Địa chỉ ngoài IC PCF8591 ............................................................................................... 253
9.6.7 Thanh ghi điều khiển của IC PCF8591 ......................................................................... 253
9.6.8 Chuyển đổi D/A của IC PCF8591 ................................................................................... 255
9.6.9 Chuyển đổi A/D của IC PCF8591 ................................................................................... 256
9.6.10 Điện áp tham chiếu của IC PCF8591 ............................................................................. 257
9.6.11 Bộ dao động của IC PCF8591 ......................................................................................... 258
9.6.12 Địa chỉ thanh ghi của IC PCF8591 ................................................................................. 258

xviii Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
9.6.13 Giao tiếp vi điều khiển với IC PCF8591 ........................................................................ 259
9.6.14 Thư viện của IC PCF 8591............................................................................................... 259
9.6.15 Các chương trình giao tiếp IC PCF 8591 ...................................................................... 260
9.7 GIAO TIẾP DAC CỦA IC PCF8591..................................................................................... 262
9.8 GIAO TIẾP CẢM BIẾN CHUYỂN ĐỘNG PIR ................................................................. 263
9.8.1 Khảo sát cảm biến chuyển động PIR ............................................................................. 263
9.8.2 Vi điều khiển giao tiếp với cảm biến PIR ...................................................................... 265
9.8.3 Các chương trình điều khiển dùng cảm biến PIR........................................................ 265
TÀI LIỆU THAM KHẢO....................................................................................................................... 267

Thực hành vi điều khiển PIC xix


Chương 1: CẤU HÌNH KÍT
THỰC HÀNH VI ĐIỀU KHIỂN

1
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
1.1 GIỚI THIỆU BỘ KIT THỰC HÀNH
Chương này giới thiệu bộ kit thực hành vi điều khiển tương đối đầy đủ các yêu cầu phần
cứng như hình 1-1 có thể giúp bạn thực hành và có thể tự nghiên cứu, tự học.

Hình 1-1. Bộ thực hành vi điều khiển


Bộ thực hành vi điều khiển có thể sử dụng cho nhiều loại vi điều khiển bằng cách thay đổi
module vi điều khiển.
Các module thực hành gồm có:
 Các module giao tiếp qua IC mở rộng MBI5026:
 Có 32 led đơn.
 Có 8 led 7 đoạn.
 Có 3 led ma trận 8×8 hai màu xanh và đỏ.
 Có 1 LCD 20×4.
 Có 1 GLCD 128×64.
 Có 2 relay và 2 triac giao tiếp điều khiển tải công suất.
 Có 1 buzzer.
 Các module cảm biến tương tự:
 Có 2 cảm biến nhiệt LM35.
2 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
 Có module Joystick.
 Có cảm biến khoảng cách hồng ngoại.
 Các module cảm biến số:
 Có 2 cảm biến nhiệt theo chuẩn 1 dây DS18B20.
 Có 1 cảm biến nhiệt độ và độ ẩm DHT11 giao tiếp chuẩn 1 dây.
 Có 1 cảm biến PIR nhận biết chuyển động.
 Có 1 cảm biến khoảng cách dùng sóng siêu âm.
 Có 1 led thu sóng hồng ngoại.
 Các module tạo xung cho các counter:
 Có 1 mạch thu phát xung khi có sản phẩm.
 Có 1 module rotary encoder tạo xung 2 kênh A, B và 1 nút nhấn – dự trữ.
 Có 1 encoder gắn với động cơ DC
 Các module giao tiếp nút nhấn:
 Có 4 phím đơn kết nối trực tiếp.
 Có 1 phím reset dùng để reset vi điều khiển: có jump để chọn mức tích cực.
 Có 1 module bàn phím cảm ứng điện dung TTP229 gồm 16 phím giao tiếp nối tiếp
đồng bộ.
 Có 1 cảm biến loadcell và ADC 24 bit HX71.
 Các module điều khiển động cơ:
 Có mạch công suất điều khiển động cơ DC và 1 động cơ DC, có encoder 200 xung.
 Có mạch công suất điều khiển động cơ bước và 1 động cơ bước.
 Có 1 module điều khiển động cơ bước chuyên dùng A4988.
 Có 1 động cơ Servo MG-996R – dự trữ.
 Các module truyền dữ liệu, giao tiếp với vi điều khiển bằng chuẩn I2C:
 Có 1 IC chuyển đổi tín hiệu tương tự sang số (ADC) đa hợp 4 kênh 8 bit. Có 1 bộ
chuyển đổi tín hiệu số sang tín hiệu tương tự (DAC) 8 bit.
 Có 1 IC đồng hồ thời gian thực DS13B07.
 Có 1 IC nhớ EEPROM AT24C64.
 Có 1 module cảm biến 3 trục GY-521.
 Có 1 module cảm biến ánh sáng BH1570.
 Có 1 module cảm biến áp suất BMP 180.
 Có 1 màn hình Oled 128×64, 1,3 inch dự trữ.
 Các module truyền dữ liệu, giao tiếp với vi điều khiển bằng chuẩn UART:
 Có 1 module giao tiếp SIM800/900.
 Có 1 module Bluetooth.
 Có mạch chuyển đổi từ USB sang cổng COM.
 Có 1 socket để gắn module GPS NEO6M.
 Có 1 socket để gắn module Lora.

Thực hành vi điều khiển PIC 3


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
MBI_SDI
RD4 (SDO)
MBI_SCK
RD6 (SCK) MODULE 32
RC5 MBI_OE
LED ĐƠN
RB3 MBI_LE0

MBI_SDI
MBI_SCK
MODULE 8
MBI_OE LED 7 ĐOẠN
MBI_LE1
RF6
MBI_SDI
MBI_SCK
MODULE
MBI_OE
LCD
RG4 MBI_LE3

PIC18F6722 MBI_SDI
MBI_SCK
MBI_OE MODULE
GLCD
MBI_LE4
RF7
MBI_SDI
MBI_SCK MODULE 3
MBI_OE LED MA
MBI_LE2 TRẬN
RF5
MBI_SDI
MODULE
MBI_SCK
BUZZER
MBI_OE RELAY,
MBI_LE5 MOTOR
RF4

Hình 1-2. Sơ đồ khối vi điều khiển PIC giao tiếp với các module ngoại vi
 Có 1 socket để gắn module chuyển đổi UART sang RS485.
 Có 1 module mạch nạp cho các loại vi điều khiển.
 Các module truyền dữ liệu, giao tiếp với vi điều khiển bằng chuẩn SPI:
 Có 1 module RFID RC522
 Có 1 module RF NRF 24L01 – 2.4GHZ
 Có 1 module wifi BLE ESP32 LUA
1.2 SƠ ĐỒ NGUYÊN LÝ KIT VI ĐIỀU KHIỂN
Kit thực hành vi điều khiển có thể sử dụng nhiều loại vi điều khiển khác nhau, tuy nhiên
tài liệu chỉ trình bày cho loại vi điều khiển PIC18F6722.
1.2.1 Hệ thống vi điều khiển PIC18F6722 giao tiếp với các module ngoại vi
4 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Sơ đồ khối của kit dùng vi điều khiển PIC18F6722 giao tiếp với 6 module ngoại vi như
hình 1-2.
Kit vi điều khiển có nhiều module ngoại vi, để có thể giao tiếp hết các module ngoại vi thì
có dùng thêm các IC mở rộng port là MB5026.
Các tín hiệu giao tiếp dùng chung là MBI_SDI, MBI_SCK và MBI_OE.
Hai chân MBI_SDI và MBI_SCK có chức năng truyền dữ liệu nối tiếp đồng bộ từng bit từ
vi điều khiển đến các vi mạch thanh ghi dịch MBI5026.
Chân MBI_SDI là truyền dữ liệu và chân MBI_SCK là truyền xung clock.
Chân MBI_OE là chân điều khiển cho phép/không cho phép module hoạt động.
Ba chân này nối song song đến tất cả các module nên khi gửi dữ liệu ra thì cả 6 module
đều nhận và tương tự khi cho phép hoặc không cho phép cả 6 module.
Chân tín hiệu còn lại là MBI_Lex có chức năng điều khiển IC MBI5026 làm cho 6 module
trở nên độc lập nhau.
Ta cần phải tìm hiểu nguyên lý hoạt động của IC thanh ghi dịch MBI5026.
a. Hoạt động của IC MBI5026
IC MBI50256 là thanh ghi dịch có chức năng chuyển dữ liệu từ nối tiếp sang song song và
nối tiếp để mở rộng port điều khiển.
Chỉ cần 4 tín hiệu giao tiếp với một IC MBI5026 thì ta có 16 port điều khiển mở rộng. Nếu
2 IC thì được 32 port mở rộng, …
Sơ đồ khối của vi mạch MBI5026 và bảng trạng thái hoạt động của IC như hình 1-3.

Hình 1-3. Sơ đồ khối thanh ghi MBI5026


Trong sơ đồ khối của IC có 3 tầng: tầng thanh ghi dịch 16 bit (16 bit shift register), tầng
chốt dự liệu ngõ ra 16 bit (16 bit Output Latch) và tầng thúc ngõ ra 16 bit (16 bit Output Driver).
MBI5026 là thanh ghi dịch 16 bit có thể nhận dòng từ 5mA đến 90mA, có thể thiết lập
dòng bằng điện trở gắn thêm bên ngoài. Áp có thể hoạt động lên đến 36V phù hợp với các tải
công suất như relay, solenoid, …
 Chân SDI là ngõ vào nhận dữ liệu nối tiếp.
 Chân SDO là ngõ ra dùng để kết nối với thanh ghi dịch tiếp theo.
 Chân CLK là ngõ vào dùng nhận xung clock để dịch vào thanh ghi dịch.
Thực hành vi điều khiển PIC 5
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Chân SDI nhận dữ liệu cần dịch vào, chân CLK nhận xung dịch. Mỗi 1 xung CLK thì có
1 bit dữ liệu được dịch vào. Tín hiệu SDO là ngõ ra dùng để nối với IC kế.
 Chân tín hiệu LE dùng để nạp dữ liệu từ tầng thanh ghi dịch sang tầng chốt dữ liệu
ngõ ra.
 Chân tín hiệu OE dùng để điều khiển tầng thúc ngõ ra để xuất tín hiệu ra ngoài.
 Chân tín hiệu R-EXT dùng để giới hạn dòng tải chạy vào, khi dùng thì nối với 1 đầu
của điện trở và đầu còn lại của điện trở nối mass.
 16 tín hiệu ngõ ra out tích cực mức thấp, chỉ nhận dòng vào.
Bảng 1-1. Bảng trạng thái IC MBI5026

b. Hoạt động của vi điều khiển với thanh ghi


Qua khảo sát IC thanh ghi dịch thì khi giao tiếp với vi điều khiển chỉ cần dùng 4 tín hiệu
như đã nêu là: SDI, CLK, LE, OE.
Hoạt động của vi điều khiển đẩy dữ liệu ra thanh ghi dịch như sau:
 Vi điều khiển dịch dữ liệu nối tiếp ra chân SDI và xuất xung nhịp ở chân CLK để
đẩy dữ liệu nối tiếp vào các thanh ghi dịch MBI5026.
 Sau khi dịch xong toàn bộ dữ liệu xong thì vi điều khiển tạo 1 xung LE để nạp dữ
liệu từ thanh ghi dịch sang thanh ghi lưu trữ trong các thanh ghi dịch.
 Vi điều khiển tiến hành điều khiển chân OE sang mức tích cực để cho phép xuất dữ
liệu từ thanh ghi lưu trữ ra ngoài để điều khiển thiết bị.
1.2.2 Module 1: Giao tiếp với 32 Led đơn
Một trong những ứng dụng đơn giản làm quen với lập trình là điều khiển 32 led đơn với
các hiệu ứng quảng cáo từ đơn giản đến phức tạp. Để có thể điều khiển nhiều led sáng thì kit sử
dụng IC thanh ghi dịch dữ liệu từ nối tiếp sang song song để điều khiển led như hình 1-4.
Vi điều khiển giao tiếp với module 32 led thông qua 2 IC thanh ghi dịch MBI5026 bằng 4
tín hiệu MBI_SDI, MBI_SCK, MBI_LE0 và MBI_OE.
IC MBI5026 có 16 ngõ ra sẽ điều khiển 16 led đơn. Hai IC sẽ điều khiển 32 led đơn.
Mức 1 dịch ra, qua cổng đảo của IC MBI thành mức 0 làm led sáng, ngược lại mức 0 làm
led sáng. Mức 1 led sáng, mức 0 led tắt.

6 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 1-4. Sơ đồ nguyên lý module 32 led đơn


1.2.3 Module 2: 8 led 7 đoạn
Led 7 đoạn dùng để hiển thị số trong nhiều ứng dụng như máy đếm sản phẩm, máy đếm
tiền, đèn giao thông, ...
Trong kit này có giao tiếp với 8 led 7 đoạn trực tiếp dùng 4 IC thanh ghi dịch MBI5026 có
sơ đồ như hình 1-5.

Hình 1-5. Sơ đồ nguyên lý module 8 led 7 đoạn

Thực hành vi điều khiển PIC 7


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Vi điều khiển giao tiếp với module 8 led 7 đoạn thông qua 4 IC thanh ghi dịch MBI5026
bằng 4 tín hiệu MBI_SDI, MBI_SCK, MBI_LE1 và MBI_OE.
IC MBI5026 có 16 ngõ ra chia ra làm 2 nhóm điều khiển 2 led 7 đoạn. Bốn IC sẽ điều
khiển 8 led 7 đoạn mắc nối tiếp nhau thông qua các đường truyền SDO và SDI.
Led 7 đoạn sử dụng loại anode chung nên mức 0 led sáng, mức 1 led tắt.
Bảng 1-2. Bảng mã led 7 đoạn loại anode chung
Số hex dp g f e d c b a Mã số hex
0 1 1 0 0 0 0 0 0 0×C0
1 1 1 1 1 1 0 0 1 0×F9
2 1 0 1 0 0 1 0 0 0×A4
3 1 0 1 1 0 0 0 0 0×B0
4 1 0 0 1 1 0 0 1 0×99
5 1 0 0 1 0 0 1 0 0×92
6 1 0 0 0 0 0 1 0 0×82
7 1 1 1 1 1 0 0 0 0×F8
8 1 0 0 0 0 0 0 0 0×80
9 1 0 0 1 0 0 0 0 0×90
A 1 0 0 0 1 0 0 0 0×88
B 1 0 0 0 0 0 1 1 0×83
C 1 1 0 0 0 1 1 0 0×C6
D 1 0 1 0 0 0 0 1 0×A1
E 1 0 0 0 0 1 1 0 0×86
F 1 0 0 0 1 1 1 0 0×8E

1.2.4 Module 3: LCD 20×4


Module LCD dùng để hiển thị nhiều ký tự mã ASCII, kit vi điều khiển có tích hợp LCD
20×4 để có thể hiển thị được 4 hàng và mỗi hàng có 20 ký tự, sơ đồ mạch giao tiếp vi điều khiển
với LCD qua IC thanh ghi dịch MBI5026 có sơ đồ như hình 1-6.
Vi điều khiển giao tiếp với module LCD thông qua IC thanh ghi dịch MBI5026 bằng 4 tín
hiệu MBI_SDI, MBI_SCK, MBI_LE3 và MBI_OE.
IC MBI có 16 ngõ ra kết nối điều khiển LCD như sau:
 Ngõ ra thứ 0 đến bitthứ 7 dùng để giao tiếp dữ liệu với LCD.
 Ngõ ra thứ 8, 9, 10 là các tín hiệu E, RW, RS.
 Ngõ ra thứ 11 có chức năng điều khiển mở nguồn trực tiếp đèn nền. Mức 0 làm cho
đèn nền sáng, mức 1 hoặc trạng thái tổng trở cao làm đèn nền tắt.
 Bit thứ 12 đến 15 giao tiếp với 4 pinheader để có thể giao tiếp điều khiển mở rộng.
 Có thể dùng 2 chân thứ 12 và 13 giao tiếp với mode0 (M0) và mode1 (M1) của
module Lora để cấu hình và cho phép Lora hoạt động. Dùng thêm dây bus 2 nối mặt
bên trong kit hoặc mặt trước. Nên nối bên trong cho đẹp.
8 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 1-6. Sơ đồ giao tiếp LCD 20×4

Hình 1-7. Sơ đồ giao tiếp module GLCD 128×64

Thực hành vi điều khiển PIC 9


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
1.2.5 Module 4: GLCD 128×64
Module GLCD dùng để hiển thị hình ảnh và ký tự, sơ đồ mạch giao tiếp vi điều khiển với
GLCD qua IC MBI5026 có sơ đồ như hình 1-7.
Vi điều khiển giao tiếp với module GLCD thông qua IC thanh ghi dịch MBI5026 bằng 4
tín hiệu MBI_SDI, MBI_SCK, MBI_LE4 và MBI_OE.
MBI có 16 ngõ ra kết nối điều khiển GLCD như sau:
 Ngõ ra từ thứ 0 đến thứ 7 làm 8 bit giao tiếp dữ liệu.
 Hai ngõ ra thứ 8, 9 làm 2 tín hiệu chọn chip CS1, CS2.
 Ba 3 ngõ ra tiếp theo 10, 11, 12 làm 3 bit điều khiển E, R/W, RS.
 Ngõ ra thứ 13, 14, 15 làm các bit điều khiển mở nguồn trực tiếp đèn backlight cho
GLCD khi sử dụng. Mức 0 làm đèn sáng, mức 1 làm led tắt. Chỉ cần 1 bit là mở
được nguồn.
1.2.6 Module 5: phím đơn và phím ma trận 4×4
Để làm quen với cách thức giao tiếp bàn phím thì kit có thiết kế giao tiếp 4 phím nhấn đơn
có sơ đồ nguyên lý như hình 1-8.
Vi điều khiển giao tiếp với module 4 nút nhấn đơn BT0, BT1, BT2, BT3 sử dụng 4 port
IO. Các tín hiệu đều có điện trở kéo lên nguồn, khi không nhấn thì ở mức logic 1, khi nhấn thì
xuống mức logic là 0.

Hình 1-8. Sơ đồ giao tiếp các phím nhấn đơn


Bàn phím ma trận điện dung 4×4 dùng vi mạch chuyên dùng có tên TTP229 giao tiếp với
vi điều khiển thông qua chuẩn nối tiếp đồng bộ có 2 tín hiệu là KP_CK và KP_DT.
Ngoài ra bàn phím còn có 8 tín hiệu ngõ ra từ out1 đến out8 giao tiếp trực tiếp của 8 nút
nhấn và được đặt tên là KP_01 đến KP_08 nhưng do chúng quá nhạy nên không dùng. Nếu dùng
thì phải chống dội thật với thời gian delay lên đến 45ms trở lên.

10 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 1-9. Sơ đồ giao tiếp bàn phím cảm ứng điện dung TTP229
1.2.7 Module 6: thu phát hồng ngoại tạo xung
Kit có tích hợp module thu phát hồng ngoại tạo xung khi có sản phẩm che chắn giữa led
phát và transistor thu. Ngõ ra transistor đưa đến mạch chỉnh dạng sóng dùng 2 cổng đảo Schmitt
Trigger rồi đưa đến timer/counter của vi điều khiển để thực hành các bài đếm xung ngoại dùng
counter. Mỗi sản phẩm đi qua sẽ tạo ra một xung tương ứng.
Sơ đồ mạch như hình 1-10.

Hình 1-10. Sơ đồ mạch module tạo xung


1.2.8 Module 7: giao tiếp relay, buzzer và động cơ
Kit có tích hợp module giao tiếp điều khiển động cơ bước, Triac, Relay, Buzzer thông qua
một IC MBI5026.
Sơ đồ mạch như hình 1-11.
Vi điều khiển giao tiếp với module này thông qua 1 IC thanh ghi dịch MBI5026 bằng 4 tín
hiệu _MBI_SDI, MBI_SCK, MBI_LE5 và MBI_OE.

Thực hành vi điều khiển PIC 11


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 1-11. Sơ đồ giao tiếp IC MBI5026 để điều khiển động cơ, buzzer, …
IC MBI có 16 ngõ ra kết nối điều khiển các thành phần như sau:
 Năm ngõ ra out0, out7, out8, out9, out10 có tên tương ứng là ENAX, IN1X, IN2X,
IN3X, IN4X giao tiếp với IC công suất L298 để điều khiển động cơ bước. Xem hình
1-12.

Hình 1-12. Mạch giao tiếp để điều khiển động cơ bước


 Năm ngõ ra out1, out2, out3, out4, out5 có tên tương ứng là MS1, MS2, MS3, STEP,
DIR giao tiếp với module điều khiển động cơ bước có tên là A4988 có chức năng
điều khiển động cơ bước đa năng. Xem hình 1-13.
 Ngõ ra out6 có tên Servo1 dùng để điều khiển động cơ Servo. Xem hình 1-14.
 Hai ngõ ra out11 và out12 có tên là Triac1 và Triac2 dùng để điều khiển 2 triac.
Xem hình 1-14.

12 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
 Ngõ ra out13 có tên Buzzer dùng để điều khiển Buzzer. Xem hình 1-14.
 Hai ngõ ra out14 và out15 có tên là Relay1 và Relay 2 dùng để điều khiển 2 Relay.
Xem hình 1-15.
Động cơ bước dùng nguồn theo nhiều yêu cầu nên trong sơ đồ sử dụng nguồn điều chỉnh
bằng LM2576-ADJ cho phù hợp với từng loại động cơ bước.

Hình 1-13. Sơ đồ module A4988 điều khiển động cơ bước

Hình 1-14. Sơ đồ điều khiển động cơ Servo, 2 triac, buzzer


Các mức logic điều khiển của Relay, Triac, Buzzer:
 Ngõ ra của IC MBI5026 điều khiển trực tiếp Relay: vi điều khiển xuất ra mức 0 làm
Relay tắt, mức 1 làm Relay đóng.
 Ngõ ra của IC MBI5026 điều khiển trực tiếp Triac: vi điều khiển xuất ra mức 0 làm
Triac tắt, mức 1 làm Triac dẫn.

Thực hành vi điều khiển PIC 13


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
 Ngõ ra của IC MBI5026 điều khiển trực tiếp Buzzer: vi điều khiển xuất ra mức 0
làm buzzer tắt, mức 1 làm buzzer kêu.

Hình 1-15. Sơ đồ mạch của Relay


Chú ý: Trong sơ đồ thì có dùng Relay2 và Triac2 nối với tải là bóng đèn 25W để điều
khiển đèn sáng hay tắt làm gia tăng nhiệt độ cho các cảm biến nhiệt.
Có 4 cảm biến nhiệt được đặt gần bóng đèn để hấp thụ nhiệt.
Ở các bài đo nhiệt độ dùng cảm biến tự động tắt khi quá nhiệt và tự động mở khi nhiệt độ
thấp hơn thì ta sử dụng Relay để điều khiển bóng đèn.
Sơ đồ mạch giao tiếp điều khiển động cơ DC có encoder như hình 1-16.

Hình 1-16. Sơ đồ mạch giao tiếp điều khiển động cơ DC


Mạch giao tiếp dùng IC L298. Hai cặp cầu H mắc song song để tăng khả năng cấp dòng
cho động cơ DC.
Hai ngõ ra nối với động cơ và có 2 đèn để báo hiệu.

14 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Hai tín hiệu điều khiển có tên là PWM1 và PWM2. Tín hiệu cho phép IC L298 nối với
mức 1 để IC ở trạng thái cho phép.
Động cơ có gắn sẵn encoder 200 xung có 2 pha A, B được nối với IC 74HC14 để chỉnh
dạng sóng và đưa đến timer/counter có tên là T1(ENC_A) và T2(ENC_B) để đếm xung phục vụ
cho điều khiển có hồi tiếp. Có 2 led báo hiệu xung của encoder.
1.2.9 Module 8: các module giao tiếp theo chuẩn I2C

Hình 1-17. Sơ đồ nguyên lý module giao tiếp I2C và các cảm biến tương tự
Kit có tích hợp các thiết bị giao tiếp với vi điều khiển theo chuẩn I2C bao gồm: module
oled GLCD (dự trữ), cảm biến ánh sáng BH1750, cảm biến áp suất BME280, cảm biến 3 trục
Thực hành vi điều khiển PIC 15
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
GY-521, IC ADC/DAC PCF8591T, IC thời gian thực DS1307 và IC nhớ Eeprom AT24C64 có
sơ đồ mạch như hình 1-17.
Các tín hiệu của I2C của các module nối với SDA và SCL của vi điều khiển thông qua
jumper JP701. Hai tín hiệu giao tiếp có 2 điện trở kéo lên nguồn.
IC thời gian thực DS1307
IC này có nguồn pin dự phòng để khi mất điện IC vẫn hoạt động. Ngõ ra SQW được nối
với led lên nguồn dùng để báo hiệu xung. Thạch anh sử dụng là 32768Hz.
IC ADC/DAC PCF8591T
IC này có 4 kênh ADC từ AN0 đến AN3 và có DAC 1 kênh. 4 kênh tương tự có tên là
AN0 đến AN3 nối với 2 cảm biến LM35A và LM35B và hai biến trở VRY và VRX của joystick.
Kênh DAC có ngõ ra là AOUT nối với led và có biến trở VR701 để chỉnh độ phân giải cho
khối ADC và DAC. Biến trở nằm bên dưới và đã chỉnh sẵn.
IC nhớ Eeprom AT24C64
IC này là bộ nhớ dạng nối tiếp có dung lượng 64Kbit hay 8 Kbyte.
Các thiết bị còn lại là module.
1.2.10 Module 9: giao tiếp các cảm biến nhiệt, cảm biến khoảng cách, led thu
Cảm biến chuyển động PIR
Kit có tích hợp cảm biến phát hiện người chuyển động PIR và có led báo hiệu dùng để làm
mạch báo trộm nối với chân tín hiệu có tên là PIR.

Hình 1-18. Sơ đồ giao tiếp cảm biến PIR


Vi mạch đo nhiệt độ giao tiếp chuẩn một dây DS18B20
Có 2 vi mạch DS18B20, do có 2 vi mạch nên phân biệt là A và B, có pin-header 4 chân để
có thể nối 1 hoặc 2 cảm biến với 1 chân chung có tên là DS18B20AB. Sơ đồ như hình 1-19.

16 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Hình 1-19. Sơ đồ giao tiếp với 2 vi mạch đo nhiệt DS18B20
Có các bài thực hành cho 2 cảm biến như sau:
Bài thực hành chỉ dùng 1 trong 2 cảm biến: với bài dạng này thì không cần biết và không
cần đọc mã bộ nhớ của cảm biến vì chỉ có 1 cảm biến. Khi thực hành ở dạng này thì dùng 1
jumper nối 1 trong 2 cảm biến (gọi là ON), cái jumper còn lại ở vị trí OFF.
Bài thực hành dùng cả 2 cảm biến: với bài dạng này thì cần phải biết code của bộ nhớ
của 2 cảm biến, khi truy xuất cảm biến nào thì phải gởi địa chỉ của cảm biến đó mới truy xuất
được. Khi thực hành ở dạng này thì cả 2 jumper gắn ở vị trí ON.
Cảm biến nhiệt độ, độ ảm 1 dây DHT11
Có 1 cảm biến nhiệt độ và độ ẩm DHT11. Cảm biến đã được cấp nguồn, tín hiệu giao tiếp
với vi điều khiển có tên là DHT11.

Hình 1-20. Sơ đồ giao tiếp cảm biến DHT11


Cảm biến khoảng cách dùng sóng siêu âm HC-SR04
Có 1 cảm biến khoảng cách dùng sóng siêu âm cho kết quả khoảng cách tỉ lệ với tần số
xung. Cảm biến đã được cấp nguồn, hai tín hiệu còn lại giao tiếp với vi điều khiển có tên là
HCSR04_TRIG và HCSR04_ECHO.

Hình 1-21. Sơ đồ giao tiếp cảm biến siêu âm HC-SR04


Cảm biến khoảng cách dùng sóng hồng ngoại GP2D12
Có 1 cảm biến khoảng cách dùng sóng hồng ngoại GP2D12 tạo ra điện áp phụ thuộc vào
khoảng cách. Cảm biến đã được cấp nguồn có 1 tín hiệu ra là CBKC.

Thực hành vi điều khiển PIC 17


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 1-22. Sơ đồ giao tiếp cảm biến khoảng cách hồng ngoại GP2D12
Led thu IRF

Hình 1-23. Sơ đồ giao tiếp cảm biến DHT11


Có 1 led thu hồng ngoại nhận tín hiệu từ remote để điều khiển từ xa. Led đã được cấp
nguồn, tín hiệu giao tiếp với vi điều khiển có tên là IRF.
1.2.11 Module 10: giao tiếp led ma trận
Một trong những ứng dụng phổ biến trong quảng cáo là thông tin được hiển thị trên led
ma trận, để giúp người học hiểu được nguyên lý điều khiển led ma trận như thế nào thì trong hệ
thống có thiết kế giao tiếp với 3 led ma trận 8x8 hai màu xanh và đỏ.
Sơ đồ nguyên lý trình bày ở hình 1-24.
Mỗi led ma trận 8x8 2 màu có tổng cộng 24 tín hiệu điều khiển gồm 8 tín hiệu anode chung
và 8 tín hiệu cathode chung cho màu đỏ và 8 tín hiệu cathode chung cho màu xanh.
Tín hiệu cathode màu xanh và màu đỏ của mỗi led sẽ do một IC MBI5026 điều khiển, 3
led sẽ dùng 3 IC MBI5026.
Tín hiệu anode chung của 3 led được nối chung với nhau và trong sơ đồ được đặt tên là H0
đến H7. Do sử dụng phương pháp quét nên phải khuếch đại dòng bằng transistor Mosfet AMP
4935, tín hiệu từ vi điều khiển được chuyển từ nối tiếp sang song song lấy ra ở 8 ngõ ra từ out0
đến out7 điều khiển 8 transistor để điều khiển anode của 3 led ma trận.
4 IC MBI5026 có các tín hiệu điều khiển chung là MBI_SCK, MBI_LE và MBI_OE.
Tín hiệu SDO2 từ module 8 led 7 đoạn được mắc nối tiếp với đường dữ liệu SDI của IC
601 thông qua SW601. Tín hiệu ngõ ra SDO_1 nối với SDI của IC602. Tín hiệu ngõ ra SDO_2
của IC602 nối với SDI của IC603. Tín hiệu ngõ ra SDO_3 của IC603 nối với SDI của IC604.

18 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 1-24. Sơ đồ nguyên lý mạch điều khiển 3 led ma trận


1.2.12 Module 11: giao tiếp máy tính bằng USB qua IC chuyển đổi UART
Kit có tích hợp mạch chuyển đổi chuẩn giao tiếp USB thành RS232 do IC PL2303HX để
thực hành các bài truyền dữ liệu giữa máy tính và vi điều khiển, sơ đồ nguyên lý trình bày ở
hình 1-25.
Cổng USB dùng để giao tiếp với máy tính, 2 tín hiệu TXD_USB giao tiếp với vi điều khiển
để thực hành các bài giao tiếp máy tính.

Thực hành vi điều khiển PIC 19


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 1-25. Sơ đồ mạch chuyển đổi giao tiếp UART sang USB
1.2.13 Module 12: giao tiếp SIM800
Kit có tích hợp module SIM800 có sơ đồ giao tiếp như hình 1-26.

Hình 1-26. Sơ đồ mạch giao tiếp với module SIM800


Vi điều khiển giao tiếp với SIM thông qua 3 tín hiệu: RST_SIM, RX_SIM, TX_SIM.
Module Sim800 sử dụng nguồn 4.2V nên phải dùng nguồn riêng để cấp.
1.2.14 Module 13: giao tiếp ADC HX711
Kit có tích hợp module HX711 có sơ đồ giao tiếp như hình 1-27.

Hình 1-27. Sơ đồ mạch giao tiếp với module HX711


20 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Vi điều khiển giao tiếp với module HX711 thông qua 2 tín hiệu: HX711_DT và
HX711_CK, trên bo CPU để ngắn gọn thì rút gọn tên là HXCK và HXDT.
Cảm biến Load-cell 4 dây sẽ nối với 4 ngõ vào E+, E-, A- và A+ tương ứng với 4 đầu dây
đỏ (red), đen (Black), xanh lá (Green) và trắng (White).
1.2.15 Module 14: giao tiếp module Bluetooth HC-05
Kit có tích hợp module Bluetooth HC-05 có sơ đồ giao tiếp như hình 1-28.

Hình 1-28. Sơ đồ mạch giao tiếp với module Bluetooth HC-05


Vi điều khiển giao tiếp với module HC-05 thông qua 2 tín hiệu: RX_BT và TX_BT.
1.2.16 Module 15: giao tiếp NRF24L01
Kit có tích hợp mạch giao tiếp module NRF24L01 có sơ đồ giao tiếp ở hình 1-29.

Hình 1-29. Sơ đồ mạch giao tiếp với module NRF24L01


Vi điều khiển giao tiếp với module NRF24L01 thông qua 3 tín hiệu theo chuẩn SPI: SCK,
MISO và MOSI thông qua SW-NRF.
Ngoài ra còn 1 tín hiệu lựa chọn có tên là NRF_SS dùng để chọn module NRF.
1.2.17 Module 16: giao tiếp RFID RC522
Kit có tích hợp mạch giao tiếp module RFID RC522 có sơ đồ giao tiếp ở hình 1-30.
Vi điều khiển giao tiếp với module RFID RC522 thông qua 3 tín hiệu theo chuẩn SPI:
SCK, MISO và MOSI thông qua SW-RFID.
Ngoài ra còn 1 tín hiệu lựa chọn có tên là RFID_SS dùng để chọn module RFID.
1.2.18 Module 17: Wifi BLE ESP32
Kit có tích hợp mạch module Wifi BLE ESP32 độc lập như hình 1-31.
Module có nguồn cung cấp vào Vin là 5V.

Thực hành vi điều khiển PIC 21


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Các tín hiệu vào ra của module được nối với các pinheader để giao tiếp với các đối tượng
khác khi cần.

Hình 1-30. Sơ đồ mạch giao tiếp với module RFID RC522

Hình 1-31. Sơ đồ mạch module Wifi BLE ESP32


1.2.19 Module 18: module vi điều khiển trung tâm
Kit có module đế có hình dạng giống bo Arduino 2560 để gắn vi điều khiển trung tâm giao
tiếp với các tín hiệu ngoại vi có sơ đồ như hình 1-32.
Hai tín hiệu TX0 và RX0 của bộ UART0 dùng để giao tiếp với các thiết theo chuẩn UART,
nối với Jumper có tên là JP30. Khi muốn kết nối với đối tượng nào thì dùng dây nối.
Hai tín hiệu TX1 và RX1 của bộ UART1 (đối với vi điều khiển có 2 bộ UART) được thiết
kế để giao tiếp với bộ chuyển đổi USB sang UART để giao tiếp với máy tính.
Hai tín hiệu TX2 và RX2 của bộ UART2 (đối với vi điều khiển có 3 bộ UART) được thiết
kế để giao tiếp với module Bluetooth để giao tiếp với các thiết bị khác có dùng Bluetooth.
Hai tín hiệu TX3 và RX3 của bộ UART3 (đối với vi điều khiển có 4 bộ UART) được thiết
kế để giao tiếp với module Sim để giao tiếp điều khiển thiết bị từ xa bằng SMS.

22 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Với module Arduino MEGA2560 R3 có 4 UART sẽ là lựa chọn phù hợp với kit vi điều
khiển.

Hình 1-32. Sơ đồ mạch module đế vi điều khiển dạng Arduino 2560


Hai tín hiệu gai tiếp với các thiết bị ngoại vi theo chuẩn I2C là SDA và SCL.
Tín hiệu BTJ là nút nhấn của Joystick nối với chân D53.
Ba tín hiệu MOSI (chân D51), MISO (chân D50) và SCK (chân D52) là các tín hiệu giao
tiếp với các thiết bị ngoại vi theo chuẩn SPI.
Tín hiệu PHD_0V là tín hiệu phát hiện điểm 0V nối với chân D49.
Tín hiệu T1(ENC_A (chân D47)) là tín hiệu giao tiếp với encoder pha A và T1 có nghĩa là
nối với timer/counter T1.
Tín hiệu T2(ENC_B (chân D42)) là tín hiệu giao tiếp với encoder pha B và T2 có nghĩa là
nối với timer/counter T2.
Ba tín hiệu RTENC_A (chân D45), RTENC_B (chân D43) và RTENC_SW (chân D41) là
các tín hiệu giao tiếp với module Rotary encoder. Do cao quá cấn mica nên chưa gắn.
Thực hành vi điều khiển PIC 23
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Hai tín hiệu RFID_SS (chân D39), RFID_IRQ (chân D37) là các tín hiệu giao tiếp với
module RFID còn lại.
Ba tín hiệu NRF_SS (chân D35), NRF_CSN (chân D33) và NRF_IRQ (chân D31) là các
tín hiệu giao tiếp với module NRF còn lại.
Hai tín hiệu HCSR04_ECHO (chân D29), HCSR04_TRIG (chân D27) là các tín hiệu giao
tiếp với module cảm biến siêu âm HC-SR04.
Hai tín hiệu RS485_RE (chân D25), RS485_DE (chân D23) là các tín hiệu giao tiếp với
module chuyển đổi chuẩn UART sang RS485.
Tám tín hiệu KP_01 đến KP_08 là các tín hiệu của module bàn phím cảm ứng TTP229
tương ứng với các nút nhấn số “0” đến số “8”.
Tín hiệu T0(CBSP) (chân D38) là chân nối với module tạo xung phát hiện sản phẩm.
Tín hiệu Servo2 (chân D28) là chân nối có thể dùng để điều khiển động cơ Servo trực tiếp.
Tín hiệu Servo1 dùng để điều khiển động cơ Servo gián tiếp thông qua IC MBI5026.
Tín hiệu PIR (chân D26) dùng để nhận tín hiệu từ module cảm biến chuyển động PIR.
Hai tín hiệu HX711_DT (chân D24), HX711_CK (chân D22) là các tín hiệu giao tiếp với
mnodule HX711 theo chuẩn USRT.
1.2.20 Các Module khác:
Kit có thiết kế giao tiếp với các module khác như hình 1-33.

Hình 1-33. Sơ đồ mạch các module dạng socket


Các module gồm có: Module GPS, module LORA, module RS485, cảm biến vân tay,
rotary encoder và module chuyển đổi mức logic.
1.2.21 Module vi điều khiển PIC:
24 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Module vi điều khiển PIC dùng PIC18F6722 gắn vào kit làm vi điều khiển trung tâm có
sơ đồ kết nối với các tín hiệu như hình 1-30.
Danh sách các port giao tiếp như bảng sau:
Bảng 1-3. Kết nối portA với các module
TT Port Tín hiệu Tên tín hiệu Thiết bị
1 RA0 AN0 LM35B Cảm biến nhiệt độ LM35
2 RA1 AN1 VRY Joystick
3 RA2 AN2 VRX Joystick
4 RA3 AN3 CBKC Cảm biến khoảng cách GP2D12
5 RA4 I T0(CBSP) Nhận xung từ cảm biến đưa đến counter T0
6 RA5 AN4 LM35A Cảm biến nhiệt độ LM35A

Thực hành vi điều khiển PIC 25


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Hình 1-34. Sơ đồ mạch các module dạng socket
Bảng 1-4. Kết nối portB với các module
TT Port Tín hiệu Tên tín hiệu Thiết bị
1 RB0 I PHD_0V Nhận tín hiệu phát hiện điểm 0V
2 RB1 I RFID_IRQ Nhận tín hiệu yêu cầu ngắt từ RFID
3 RB2 I NRF_IRQ Nhận tín hiệu yêu cầu ngắt từ module NRF
4 RB3 O MBI_LE0 Chân chốt dữ liệu cho module 32 led đơn
5 RB4 I BT2 Chân nối với nút nhấn BT2
6 RB5 I RTENC_A Nối với module Rotary encoder 360 kênh A
7 RB6 I BT0 Chân nối với nút nhấn BT0
8 RB7 I BT3 Chân nối với nút nhấn BT3
Bảng 1-5. Kết nối portC với các module
TT Port Tín hiệu Tên tín hiệu Thiết bị
1 RC0 I T1(ENC_A) Nhận xung pha A từ encoder của động cơ
2 RC1 O PWM2 Tín hiệu PMW1 nối với L298
3 RC2 O PWM1 Tín hiệu PMW2 nối với L298
4 RC3 O SCL Chân cấp xung clock cho các thiết bị chuẩn I2C
5 RC4 IO SDA Giao tiếp truyền dữ liệu với các thiết bị chuẩn I2C
6 RC5 O MBI_OE Điều khiển OE của các IC MBI5026
7 RC6 O TX0 Chân phát dữ liệu của UART0
8 RC7 I RX0 Chân nhật dữ liệu của UART0
Bảng 1-6. Kết nối portD với các module
TT Port Tín hiệu Tên tín hiệu Thiết bị
1 RD0 I HXDT Nối với tín hiệu DT của module HX711
2 RD1 O HXCK Cấp xung clock cho module HX711
3 RD2 O RFID_SS Xuất tín hiệu chọn module RFID
4 RD3 I PIR Nhận tín hiệu từ module cảm biến chuyển động
5 RD4 O MBI_MOSI Chân xuất dữ liệu nối tiếp SPI
6 RD5 I MBI_MISO Chân nhận dữ liệu nối tiếp SPI
7 RD6 O MBI_SCK Chân xuất xung clock cho SPI
8 RD7 O NRF_SS Xuất tín hiệu chọn module NRF

26 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Bảng 1-7. Kết nối portE với các module
TT Port Tín hiệu Tên tín hiệu Thiết bị
1 RE0 I BTJ Nối với nút nhấn của Joystick
2 RE1 I/O AN7 Nối với chân AN7 để dùng thêm
3 RE2 I/O IRF Nối với led thu IRF
4 RE3 I/O NRF_CSN Nối với module NRF
5 RE4 I RTENC_B Nối với module Rotary encoder 360 kênh B
6 RE5 O SERVO2 Nối với động cơ servo
7 RE6 I ECHO Nối với tín hiệu ECHO của cảm biến siêu âm
8 RE7 O TRIG Nối với tín hiệu TRIG của cảm biến siêu âm
Bảng 1-8. Kết nối portF với các module
TT Port Tín hiệu Tên tín hiệu Thiết bị
1 RF0 I RTENC_SW Nối với nút nhấn của Rotary encoder 360
2 RF1 I BT1 Chân nối với nút nhấn BT1
3 RF2 O KP_CK Chân cấp xung cho module TTP229
4 RF3 I KP_DT Chân truyền dữ liệu với module TTP229
5 RF4 O MBI_LE5 Chân chốt dữ liệu cho module relay, …
6 RF5 O MBI_LE2 Chân chốt dữ liệu cho module led ma trận
7 RF6 O MBI_LE1 Chân chốt dữ liệu cho module 8 led 7 đoạn
8 RF7 O MBI_LE4 Chân chốt dữ liệu cho module GLCD
Bảng 1-9. Kết nối portG với các module
TT Port Tín hiệu Tên tín hiệu Thiết bị
1 RG0 O DSD18B20-AB Tín hiệu giao tiếp với DS18B20 A và B
2 RG1 O TX2 Chân phát dữ liệu của UART0
3 RG2 I RX2 Chân nhật dữ liệu của UART0
4 RG3 O MBI_LE3 Chân chốt dữ liệu cho module LCD

Thực hành vi điều khiển PIC 27


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

28 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 2: SỬ DỤNG PHẦN


MỀM CCS VÀ PITKIT2

Thực hành vi điều khiển PIC 29


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
2.1 GIỚI THIỆU PHẦN MỀM CCS
Phần mềm dùng để lập trình cho vi điều khiển PIC có nhiều loại khác nhau, tài liệu này
trình bày cách sử dụng phần mềm CCS.
2.2 COPY PHẦN MỀM CCS, THƯ VIỆN, CODE MẪU
2.2.1 Copy phần mềm, thư viện, code mẫu
Bạn tiến hành copy phần mềm, thư viện và code mẫu vào máy tính của bạn để tiến hành
cài đặt và lập trình.
Chú ý: Giữ nguyên tên các thư mục, copy toàn bộ thư mục sang ổ đĩa nào cũng được nhưng
nếu copy vào thư mục của bạn thì thư mục đó không được đặt tên có dấu tiếng Việt.
2.2.2 Cài phần mềm CCS
Bạn tiến hành cài phần mềm CCS nếu chưa cài. Phần mềm này dùng để viết code lập trình
bằng ngôn ngữ C và biên dịch sang file Hex cho vi điều khiển PIC.
Biểu tượng phần mềm CCS sau khi cài xong xuất hiện trên desktop như hình 2-1.

Hình 2-1. Biểu tượng phần mềm CCS


2.2.3 Cài phần mềm PICKIT2
Kit thực hành dùng vi điều khiển PIC và mạch nạp là PICKIT2 nên phải cài phần mềm này
để tiến hành nạp file Hex của chương trình vào bộ nhớ nội Flash của vi điều khiển để nó thực
hiện chương trình.
Biểu tượng phần mềm PICKIT2 sau khi cài xong xuất hiện trên desktop như hình 2-2.

Hình 2-2. Biểu tượng phần mềm PICKIT2


2.2.4 Sử dụng phần mềm PICKIT2 không cần cài
Khi cài phần mềm PICKIT2 thì phát sinh một số vấn đề như sau:
 Thiếu file “dotnet” hoặc không đúng version dẫn đến cài không được.
 Cài được nhưng không nhận ra chip vi điều khiển PIC ở các máy tính hiệu Dell.
Nếu máy tính bạn gặp một trong hai trường hợp này thì hãy sử dụng trực tiếp phần mềm
PICKIT có trong thư mục mà bạn copy là được.
Nên tạo shortcut ở Destop cho tiện sử dụng.

30 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
2.3 HƯỚNG DẪN SỬ DỤNG PHẦN MỀM CCS
Sau khi cài đặt xong tất cả các phần mềm thì tiến hành sử dụng phần mềm CCS để soạn
thảo và biên dịch một chương trình. Tuy nhiên phần này chúng ta đã làm quen khi học lý thuyết
nên ở đây không trình bày lại vì sẽ mất nhiều thời gian.
Phần này sẽ trình bày cách thức thực hiện nhanh chóng hiệu quả hơn.
2.3.1 Khởi động phần mềm CCS
Tiến hành khởi động phần mềm CCS, giao diện sau khi khởi động như hình 2-3. Giao diện
lần đầu trống rỗng.

Hình 2-3. Giao diện phần mềm CCS


2.3.2 Chỉnh font chữ phần mềm CCS
Phần mềm CCS chọn kích thước font chữ mặc nhiên là 10. Kích thước này khá nhỏ nên
phải thay đổi sang kích thước khoảng 16 hoặc 18 để nhìn rõ và phát hiện nhanh các lỗi sai nếu
có. Cách thực hiện theo các bước 1, 2, 3, 4 trong hình 2-4.

Thực hành vi điều khiển PIC 31


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Hình 2-4. Chỉnh kích thước font của phần mềm CCS
2.3.3 Mở code mẫu
Trong thư mục mà bạn copy thì có thư mục dùng để lưu các thư viện và bài thực hành và
có bài thực hành mẫu có tên là “bai_201_4led_chop_tat”.
Tiến hành chọn biểu tượng “File”, rồi chọn mục “Open” và chọn “Source File” theo thứ tự
1, 2, 3 như trong hình 2-5.

Hình 2-5. Trình tự mở file nguồn c


Khi đó xuất hiện giao diện chỉ đến thư mục mặc nhiên, bạn hãy trỏ đến thư mục như hình
2-6. Tiến hành chọn file “bai_201_4led_chop_tat”.

Hình 2-6. Thư mục chứa thư viện và file code mẫu
Kết quả giao diện như hình 2-7.

32 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 2-7. Giao diện phần mềm CCS với code mẫu
2.3.4 Biên dịch chương trình tạo ra file hex
Code mẫu đã được viết đúng, công việc tiếp theo là tiến hành biên dịch sang file hex.
Còn ý nghĩa của từng hàng lệnh nếu bạn chưa rõ thì sẽ giải thích ở phần sau.
Hãy chọn tab “Compile” và chọn biểu tượng “Compile” như hình 2-8.

Hình 2-8. Giao diện phần mềm CCS với code mẫu
Khi đó quá trình biên dịch sẽ xảy ra và xuất hiện giao diện như hình 2-9.

Thực hành vi điều khiển PIC 33


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 2-9. Giao diện đang biên dịch với code mẫu
Kết quả biên dịch hoàn tất và không có lỗi. Đồng thời cung cấp thêm thông tin tài nguyên
bộ nhớ RAM và ROM mà code mẫu này dùng.
Ngoài ra, sau khi biên dịch sẽ xuất hiện của sổ thông báo kết quả biên dịch như hình 2-10.

Hình 2-10. Màn hình thông báo kết quả biên dịch thành công
Nếu sai cú pháp thì biên dịch không thành công, phải hiệu chỉnh cho hết lỗi.
Kết quả của việc biên dịch thành công là tạo ra file Hex tương ứng như trong hình 2-11.

Hình 2-11. Kết quả tạo ra file Hex tương ứng


Chú ý: Nếu còn lỗi thì sẽ không tạo ra file hex.
34 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
2.4 HƯỚNG DẪN SỬ DỤNG PHẦN MỀM NẠP FILE HEX PICKIT2
Chức năng của phần mềm PICKIT2 là điều khiển mạch nạp file Hex vào bộ nhớ Flash của
vi điều khiển PIC. Trình tự thực hiện theo các bước sau.
2.4.1 Kết nối cáp USB và mở nguồn cho kit thực hành
Hãy tiến hành kết nối cáp USB của kit thực hành với máy tính. Hãy mở nguồn cho kit thực
hành để mọi thứ sẵn sàng trước khi khởi động phần mềm PICKIT2.
2.4.2 Mở phần mềm PICKIT2
Khởi động phần mềm PICKIT2 và kết quả giao diện như hình 2-12.

Hình 2-12. Giao diện phần mềm nạp PICKIT2


Trong giao diện có 2 thông tin quan trọng là thông báo nhận diện nhận diện được mạch
nạp (số 2) và nhận diện được vi điều khiển “PIC18F4550” (số 1).

Thực hành vi điều khiển PIC 35


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
2.4.3 Nạp file hex tự động
Có nhiều cách nạp file Hex và đơn giản nhất là chọn chế độ tự động nhập file hex và tự
động nạp bằng cách chọn biểu tượng “Auto Import Hex + Write Device” (số 3).
Khi đó giao diện mở file hex xuất hiện, tiến hành trỏ đến đường dẫn lưu file hex cần nạp
như hình 2-13 và chọn “Open” thì quá trình nạp diễn ra.

Hình 2-13. Giao diện mở file hex của code mẫu để nạp
Kết quả thông báo nạp thành công như hình 2-14.

Hình 2-14. PICKIT2 thông báo nạp thành công


2.4.4 Quan sát kết quả ở kit thực hành sau khi nạp
Sau khi phần mềm PICKIT2 nạp xong file hex thì vi điều khiển sẽ tự động thực hiện
chương trình mới vừa nạp.
Với code mẫu này thì sẽ làm 4 led đơn chớp tắt là đúng. Đến đây mọi thứ cơ bản đã xong,
tuy nhiên để làm việc hiệu quả thì cần phải thực hiện thêm một vài yêu cầu.
2.4.5 Cách bố trí hai phần mềm
Có 2 phần mềm đang dùng để lập trình và nạp là CCS và PICKIT2, theo kinh nghiệm cá
nhân thì các bạn nên bố trí 2 phần mềm như hình 2-15 thì làm việc hiệu quả nhất.
Các bạn có thể thực hiện theo cách khác nhưng mất nhiều thời gian cho các thao tác chuyển
đổi giữa hai phần mềm.
Trong quá trình thực hành thì không nên đóng phần mềm nào cả nhất là phần mềm PICKIT
vì khi đóng và khởi động lại mất nhiều thời gian.

36 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
2.4.6 PICKIT2 tự động nạp file hex đã nạp khi có thay đổi
Sau khi chọn chế độ nạp tự động thì mọi thứ đã xong. Tuy nhiên nếu bạn thay đổi file
nguồn ví dụ bạn muốn thay đổi thông số delay 100 thành 200 thì bạn tiến hành thay đổi, sau đó
phải biên dịch lại file nguồn.
Khi đó sẽ tạo ra file hex mới thì phần mềm PICKIT2 sẽ phát hiện và nó sẽ tự động nạp lại
file hex mới này vào vi điều khiển. Bạn phải biết điều này để không cần phải nạp thêm không
cần thiết, làm giảm số lần nạp của vi điều khiển.
Bạn có thể trải nghiệm điều này, khi bạn thay đổi và bấm Compile ở phần mềm CCS thì
bạn sẽ nhìn thấy phần mềm PICKIT2 sẽ tự động nạp.

Hình 2-15. Bố trí 2 phần mềm để dễ thao tác


2.4.7 Cách xử lý khi nhận chip không đúng
Nếu nhận diện mạch nạp mà nhận diện vi điều khiển không đúng mã thì có thể chọn sai
mã thì tiến hành như sau:
Chọn tab “Programmer”, bỏ mục chọn linh kiện bằng tay “Manual Device Select” như
hình 2-16.
Tiếp theo chọn tab “Device Family”, rồi mục “PIC18F” để nhận diện chip như hình 2-17.
Nếu vẫn không được thì có thể chip vi điều khiển hư thì yêu cầu thay vi điều khiển khác.
2.4.8 Cách xử lý khi không nhận mạch nạp
Khi khởi động phần mềm PICKIT2 mà thông báo xuất hiện như hình 2-18.

Thực hành vi điều khiển PIC 37


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Nguyên nhân thì có thể do chưa gắn cáp hoặc chưa mở nguồn, … bạn hãy tiến hành gắn
cáp, mở nguồn, … rồi chọn tab “Tools” và chọn mục “Check Communication” để phần mềm
tiến hành kiểm tra kết nối lại. Không cần đóng và mở lại phần mềm, mất nhiều thời gian.

Hình 2-16. Giao diện phần mềm nạp PICKIT2

Hình 2-17. Giao diện phần mềm nạp PICKIT2

Hình 2-18. Giao diện phần mềm không nhận ra mạch nạp
2.4.9 Cách xử lý sau khi nạp xong mà vi điều khiển không chạy
Với bài code mẫu này thì sau khi nạp xong thì vi điều khiển sẽ làm 4 led đơn chớp tắt.
Nếu 4 led không chớp tắt thì chỉ có một nguyên nhân duy nhất là phần mềm PICKIT2 đang
chọn chế độ reset vi điều khiển.
Tiến hành chọn mục “Programmer”, bỏ dấu tick đang chọn chế độ “Hold Device in Reset”
như hình 2-19.
38 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 2-19. Chọn Check Communication


Khi đó cho phép vi điều khiển thực hiện điều khiển 4 led chớp tắt.
Phần mềm nạp PICKIT2 về cơ bản đến đây lả đủ dùng, nhiều chức năng khác khi nào cần
thì sẽ trình bày tiếp.
Chương 2 cơ bản đến đây là kết thúc. Bạn hãy đóng file “bai_201_4led_chop_tat” lại và
tiến hành mở bài “bai_301_8led_chop_tat” để bắt đầu thực hành cho chương 3.

Thực hành vi điều khiển PIC 39


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

40 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 3: THỰC HÀNH


MODULE 32 LED ĐƠN, NÚT
NHẤN ĐƠN

Thực hành vi điều khiển PIC 41


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
3.1 CÁC CHƯƠNG TRÌNH ĐIỀU KHIỂN 32 LED ĐƠN
3.1.1 Mạch giao tiếp vi điều khiển với module 32 led đơn
Phần này thực hành các bài giao tiếp với 32 led đơn từ các bài đơn giản đến các bài phức
tạp và tổng hợp nhiều bài lại với nhau.
Mạch điện giao tiếp vi điều khiển với module 32 led đơn như hình 3-1.

Hình 3-1. Sơ đồ nguyên lý giao tiếp vi điều khiển với module 32 led đơn
Trong mạch sử dụng 2 IC thanh ghi MBI5026 để mở rộng port điều khiển 32 led đơn.
Phần vi điều khiển giao tiếp với IC thanh ghi dịch
Có 4 tín hiệu điều khiển là:
 MBI_SDI dùng để dịch dữ liệu nối tiếp.
 MBI_SCK dùng để cấp xung clock.
 MBI_LE0 dùng để nạp dữ liệu song song từ thanh ghi dịch sang thanh ghi lưu trữ.
 MBI_OE dùng để cho phép xuất dữ liệu.
Phần IC thanh ghi dịch giao tiếp với 32 led
Mỗi IC thanh ghi dịch MBI5026 có 16 bit kết nối với 16 led, 2 IC điều khiển được 32 led.
Số lượng byte dữ liệu điều khiển module 32 led là 4 byte hay 2 word.
Khả năng mở rộng
Trong kit thực hành dùng 2 IC để điều khiển 32 led, sau này các ứng dụng thực tế cần
nhiều led hơn thì bạn kết nối thêm IC thanh ghi nối tiếp vào một cách dễ dàng nhưng nếu có
nhiều IC thanh ghi dịch thì phải tính toán fan-out cho phù hợp.
3.1.2 Thư viện khởi tạo và thư viện của module 32 led đơn
Để giúp bạn viết code đơn giản nên một số hàm thư viện đã được viết sẵn lưu trong các
file thư viện. Phần này trình bày một số hàm chính có liên quan.
Hàm 301: Khởi tạo port.
void set_up_port()
{
set_tris_a(0xff); set_tris_b(0b11010000);
42 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
set_tris_c(0b11000001); output_high(mbi_oe);

set_tris_d(0b00001000); set_tris_e(0b01011111);
set_tris_f(0b00000111); set_tris_g(0x16);

output_low(mbi_le0); output_low(mbi_le1);
output_low(mbi_le2); output_low(mbi_le3);
output_low(mbi_le4); output_low(mbi_le5);

rbdc=0;
xoa_tat_ca_cac_module();
output_low(mbi_oe); output_high(rfid_ss);
output_high(nrf_ss);
setup_spi2(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H);
khoi_tao_cac_bien();

setup_adc(adc_clock_div_32);
setup_adc_ports(an0_to_an4|vss_vdd );
}
Khi bắt đầu lập trình thì trong chương trình chính phải gọi hàm khởi tạo này để khởi tạo
định hướng vào ra cho các port, truyền dữ liệu SPI. Tắt relay, triac, buzzer và các động cơ. Khởi
tạo các kênh ADC nối với các cảm biến tương tự.
Hàm 302: Xuất dữ liệu 1 word ra các IC thanh ghi dịch.
void xuat_1word(usi16 x)
{
spi_write2(x>>8); spi_write2(x);
}
Gửi dữ liệu byte cao của biến x theo chuẩn SPI2, tương tự cho byte thấp.
Hàm 303: Xuất dữ liệu 2 word ra module 32 led đơn.
void xuat_32led_don_2word(usi16 wld1, wld0)
{
xuat_1word(wld1); xuat_1word(wld0);
output_high(mbi_le0); output_low(mbi_le0);
}
Gọi hai hàm xuất dữ liệu 2 word ra 2 IC MBI 5026. Hai lệnh tiếp theo tạo xung chốt để
nạp dữ liệu từ tầng thanh ghi dịch sang tầng lưu trữ và xuất ra điều khiển led.
Hàm 304: Xuất dữ liệu 1 double word ra module 32 led đơn.
void xuat_32led_don_1dw(usi32 dwld)
{
unsigned int16 wd1,wd0;
wd1 = dwld>>16; wd0 = dwld;
xuat_32led_don_2word(wd1,wd0);
}
Tách dữ liệu double word thành 2 word và gọi hàm xuất dữ liệu 2 word.
Hàm 305: Xuất dữ liệu 4 byte ra module 32 led đơn.
Thực hành vi điều khiển PIC 43
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
void xuat_32led_don_4byte(usi8 bld3,bld2,bld1,bld0)
{
spi_write2(bld3); spi_write2(bld2);
spi_write2(bld1); spi_write2(bld0);
output_high(mbi_le0); output_low(mbi_le0);
}
Hàm 306: Xuất dữ liệu 1 byte ra module 32 led đơn. Ba byte còn lại là 0.
void xuat_32led_don_1byte(usi8 b0)
{
xuat_32led_don_4byte(0,0,0,b0);
}

3.1.3 Các chương trình điều khiển 32 led đơn dùng lệnh for
Phần này thực hành các bài điều khiển led dùng vòng lặp for, các chương trình đơn giản
dễ hiểu. Các bài thực hành từ chương này trở đi theo cách lập trình dùng chương trình con để dễ
dàng sử dụng lại.
Chú ý: Cách đặt tên bài và hàm có mối liên hệ với nhau để dễ quản lý.
Bài mẫu 301. Chương trình điều khiển 8 led chớp tắt với thời gian delay tùy ý.
Lưu tên file “bai_301_32led_chop_tat”.
a. Mục đích: Biết lập trình điều khiển led 8 đơn chớp tắt.
b. Lưu đồ, giải thuật: Rất đơn giản, gửi dữ liệu là 8 led tắt, delay, gửi dữ liệu làm 8 led
sáng, delay rồi lặp lại.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void b301_8led_chop_tat(usi16 dl)
{
xuat_32led_don_4byte(0,0,0,0); delay_ms(dl);
xuat_32led_don_4byte(0,0,0,0xff); delay_ms(dl);
}
void main()
{
set_up_port();
while(true)
{
b301_8led_chop_tat(100);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Có 8 led chớp tắt là đúng.
f. Giải thích: Có 1 hàm con có chức năng chớp tắt 8 led và thời gian delay là “dl”.
Chương trình chính gọi hàm con và cho tham số delay là 100ms. Tham số này có thể
thay đổi: lớn thì chớp tắt chậm, nhỏ thì nhanh.

44 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Bài tập 302. Hãy viết chương trình điều khiển 16 led chớp tắt, thời gian delay tùy ý.
Lưu tên file “bai_302_16led_chop_tat”.
Cách thực hiện nhanh chóng là lấy bài 301 save as thành bài 302 rồi hiệu chỉnh code.

Bài tập 303. Hãy viết chương trình điều khiển 32 led chớp tắt, thời gian delay tùy ý.
Lưu tên file “bai_303_32led_chop_tat”.

Bài mẫu 304. Chương trình điều khiển 16 led phải sáng dần và tắt dần phải sang trái.
Lưu tên file “bai_304_16led_phai_std_pst”, thời gian delay tùy ý.
a. Mục đích: Biết viết chương trình điều khiển 16 led phải sáng tắt dần phải sang trái ở
dạng chương trình con.
b. Lưu đồ, giải thuật: Thực hiện vòng lặp dịch bit ‘1’ vào từ bên phải sẽ làm 16 led sáng
dần lên. Sau đó thực hiện vòng lặp dịch bit ‘0’ vào từ bên phải sẽ làm 16 led tắt dần.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void b304_16led_phai_std_pst(usi16 dl)
{
usi8 i; usi16 LP;
LP = 0;
for(i=0;i<16;i++)
{
LP = (LP<<1)+1;
xuat_32led_don_2word(0,LP);
delay_ms(dl);
}
for(i=0;i<16;i++)
{
LP = (LP<<1);
xuat_32led_don_2word(0,LP);
delay_ms(dl);
}
}

void main()
{
set_up_port();
while(true)
{
b304_16led_phai_std_pst(40);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: 16 led bên phải sẽ sáng dần rồi tắt dần tử phải sang trái.

Thực hành vi điều khiển PIC 45


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Bài mẫu 305. Chương trình điều khiển 16 led trái sáng dần và tắt dần trái sang phải
với thời gian delay tùy chọn.
Lưu tên file “bai_305_16led_trai_std_tsp”.
a. Mục đích: Biết cách thay đổi cho 16 led trái chiều ngược lại.
b. Lưu đồ, giải thuật: Giống bài 304 chỉ khác là chiều ngược lại.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void b305_16led_trai_std_tsp(usi16 dl)
{
usi8 i; usi16 LT;
LT = 0;
for(i=0;i<16;i++)
{
LT = (LT>>1)+0x8000;
xuat_32led_don_2word(LT,0);
delay_ms(dl);
}
for(i=0;i<16;i++)
{
LT = (LT>>1);
xuat_32led_don_2word(LT,0);
delay_ms(dl);
}
}

void main()
{
set_up_port();
while(true)
{
b305_16led_trai_std_tsp(40);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: 16 led bên trái sáng dần rồi tắt dần từ trái sang phải.
f. Giải thích: Giống bài 304 nhưng chiều dịch từ trái sang phải. Để đẩy số 1 vào từ bên
trái của dữ liệu 16 bit thì phải cộng với số nhị phân: 1000_0000_0000_0000b =
0×8000.

Bài tập 306. Hãy viết chương trình điều khiển 32 led sáng tắt dần từ ngoài.
Lưu tên file “bai_306_32led_std_tnv”, thời gian delay tùy ý.

46 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Bài tập 307. Hãy viết chương trình điều khiển 32 led sáng tắt dần từ trong ra.
Lưu tên file “bai_307_32led_std_ttr”, thời gian delay tùy ý.

Bài mẫu 308. Chương trình điều khiển 32 led sáng dần và tắt dần phải sang trái.
Lưu tên file “bai_308_32led_std_pst”, thời gian delay tùy ý.
a. Mục đích: Biết cách viết chương trình điều khiển 32 led sáng tắt dần phải sang trái.
b. Lưu đồ, giải thuật: Giống bài 304, chỉ khác là mở rộng thành 32 led.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void b308_32led_std_pst(usi16 dl)
{
usi8 i; usi32 x;
x = 0;
for(i=0;i<32;i++)
{
x = (x << 1)+1;
xuat_32led_don_1dw(x);
delay_ms(dl);
}
for(i=0;i<32;i++)
{
x = (x << 1);
xuat_32led_don_1dw(x);
delay_ms(dl);
}
}
void main()
{
set_up_port();

while(true)
{
b308_32led_std_pst(40);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: 32 led sẽ sáng dần rồi tắt dần từ phải sang trái.

Bài tập 309. Hãy viết chương trình điều khiển 32 led sáng tắt dần trái sang phải.
Lưu tên file “bai_309_32led_std_tsp”, thời gian delay tùy ý.

Bài mẫu 310. Hãy viết chương trình điều khiển 32 LED tổng hợp 8 yêu cầu gồm:
1. 32 led chớp tắt 5 lần. Hàm con đã viết ở bài 303.

Thực hành vi điều khiển PIC 47


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
2. 32 led sáng dần và tắt dần phải sang trái 2 lần. Hàm con đã viết ở bài 308.
3. 32 led chớp tắt 5 lần. Lặp lại yêu cầu 1.
4. 32 led sáng dần và tắt dần trái sang phải 2 lần. Hàm con đã viết ở bài 309.
5. 32 led chớp tắt 5 lần. Lặp lại yêu cầu 1.
6. 32 led sáng dần và tắt dần từ ngoài vào 2 lần. Hàm con đã viết ở bài 306.
7. 32 led chớp tắt 5 lần. Lặp lại yêu cầu 1.
8. 32 led sáng dần và tắt dần trừ trong ra 2 lần. Hàm con đã viết ở bài 307.
Lưu tên file “bai_310_32led_tong_hop”.
a. Mục đích: Biết cách tổng hợp và sử dụng lại các chương trình con đã viết.
b. Lưu đồ, giải thuật: Viết thêm các hàm cho phép thực hiện nhiều lần để gọi lại các
hàm con đã viết ở các bài 306, 307, 308 và 309.
c. Chương trình: Có 5 hàm đã viết ở các bài trước thì hãy coy sang bài này.
#include <tv_kit_vdk_18f6722_all.c>

void b303_32led_chop_tat(usi16 dl)


{
xuat_32led_don_4byte(0,0,0,0);
delay_ms(dl);
xuat_32led_don_4byte(0xff,0xff,0xff,0xff);
delay_ms(dl);
}

void b306_32led_std_tnv(usi16 dl)


{
usi8 i; usi16 LT,LP;
LT = 0; LP = 0;
for(i=0;i<16;i++)
{
LT = (LT>>1)+0x8000;
LP = (LP<<1)+0x0001;
xuat_32led_don_2word(LT,LP);
delay_ms(dl);
}
for(i=0;i<16;i++)
{
LT = (LT>>1);
LP = (LP<<1);
xuat_32led_don_2word(LT,LP);
delay_ms(dl);
}
}

void b307_32led_std_ttr(usi16 dl)


{
usi8 i; usi16 LT,LP;

48 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
LT = 0; LP = 0;
for(i=0;i<16;i++)
{
LT = (LT<<1)+0x0001;
LP = (LP>>1)+0x8000;
xuat_32led_don_2word(LT,LP);
delay_ms(dl);
}
for(i=0;i<16;i++)
{
LT = (LT<<1);
LP = (LP>>1);
xuat_32led_don_2word(LT,LP);
delay_ms(dl);
}
}

void b308_32led_std_pst(usi16 dl)


{
usi8 i; usi32 x;
x = 0;
for(i=0;i<32;i++)
{
x = (x << 1)+1;
xuat_32led_don_1dw(x);
delay_ms(dl);
}
for(i=0;i<32;i++)
{
x = (x << 1);
xuat_32led_don_1dw(x);
delay_ms(dl);
}
}

void b309_32led_std_tsp(usi16 dl)


{
usi8 i; usi32 x;
x = 0;
for(i=0;i<32;i++)
{
x = (x>>1) + 0x80000000;
xuat_32led_don_1dw(x);
delay_ms(dl);
}
for(i=0;i<32;i++)
{
x = (x>>1);
xuat_32led_don_1dw(x);
delay_ms(dl);
Thực hành vi điều khiển PIC 49
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
}
}

void h310_32led_chop_tat_nlan(int8 n,usi16 dl)


{
for(int8 j=0;j<n;j++)
b303_32led_chop_tat(dl);
}

void h310_32led_std_pst_nlan(int8 n,usi16 dl)


{
for(int8 j=0;j<n;j++)
b308_32led_std_pst(dl);
}

void h310_32led_std_tsp_nlan(int8 n,usi16 dl)


{
for(int8 j=0;j<n;j++)
b309_32led_std_tsp(dl);
}

void h310_32led_std_tnv_nlan(int8 n,usi16 dl)


{
for(int8 j=0;j<n;j++)
b306_32led_std_tnv(dl);
}

void h310_32led_std_ttr_nlan(int8 n,usi16 dl)


{
for(int8 j=0;j<n;j++)
b307_32led_std_ttr(dl);
}

void main()
{
set_up_port();
while(true)
{
h310_32led_chop_tat_nlan(5,100);
h310_32led_std_pst_nlan(2,20);
h310_32led_chop_tat_nlan(5,100);
h310_32led_std_tsp_nlan(2,20);
h310_32led_chop_tat_nlan(5,100);
h310_32led_std_tnv_nlan(2,20);
h310_32led_chop_tat_nlan(5,100);
h310_32led_std_ttr_nlan(2,20);
}
}
d. Tiến hành biên dịch và nạp.

50 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
e. Quan sát kết quả: Các chương trình chạy đúng theo yêu cầu.

Bài tập 311. Hãy vẽ lưu đồ và viết chương trình điều khiển 32 led sáng dồn phải sang
trái. Lưu tên file “bai_311_32led_sd_pst”, thời gian delay tùy ý.

Bài tập 312. Hãy vẽ lưu đồ và viết chương trình điều khiển 32 led sáng dồn trái sang
phải. Lưu tên file “bai_312_32led_sd_tsp”, thời gian delay tùy ý.

Bài tập 313. Hãy vẽ lưu đồ và viết chương trình điều khiển 32 led sáng dồn từ ngoài
vào. Lưu tên file “bai_313_32led_sd_tnv”, thời gian delay tùy ý.

Bài tập 314. Hãy vẽ lưu đồ và viết chương trình điều khiển 32 led sáng dồn từ trong
ra. Lưu tên file “bai_314_32led_sd_ttr”, thời gian delay tùy ý.

Bài tập 315. Hãy vẽ lưu đồ và viết chương trình điều khiển 32 led sáng hết rồi lần lượt
có 1 điểm sáng bên phải dịch phải mất dần cho đến khi tất cả các led dịch hết.
Lưu tên file “bai_315_32led_1dsp_mp”, thời gian delay tùy ý.

Bài tập 316. Hãy vẽ lưu đồ và viết chương trình điều khiển 32 led sáng hết rồi lần lượt
có 1 điểm sáng bên trái dịch trái mất dần cho đến khi tất cả các led dịch hết.
Lưu tên file “bai_316_32led_1dst_mp”, thời gian delay tùy ý.

3.2 ĐIỀU KHIỂN 32 LED ĐƠN VÀ NÚT NHẤN – CÁCH 1


3.2.1 Giới thiệu
Nút nhấn, bàn phím dùng để giao tiếp giữa con người và mạch điện tử để điều khiển, ví
dụ: bàn phím máy tính, bàn phím điện thoại, bàn phím máy bán xăng dầu dùng nhập số tiền cần
bán, số lít cần bán … máy giặt tự động có bàn phím để chỉnh chế độ giặt, chọn mực nước …
Có 2 dạng giao tiếp vi điều khiển với bàn phím, nút nhấn:
 Hệ thống ít phím: ví dụ điều khiển động cơ bằng 3 phím: Start, stop, inv, đồng hồ
có 3 đến 4 phím để chỉnh thời gian.
 Hệ thống nhiều phím: bàn phím máy tính, bàn phím điện thoại, …
3.2.2 Mạch điện giao tiếp vi điều khiển với 4 nút nhấn đơn
Phần này thực hành các bài giao tiếp vi điều khiển với 4 nút nhấn đơn để thực hiện các yêu
cầu điều khiển như điều khiển led tắt mở, điều khiển đảo chiều led và các ứng dụng sau này đều
có liên quan đến nút nhấn.
Mạch điện giao tiếp vi điều khiển với các nút nhấn như hình 3-2.
Vi điều khiển dùng 4 bit của các port để giao tiếp với 4 nút nhấn đơn.
Thực hành vi điều khiển PIC 51
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Các nút nhấn bình thường hở nên trạng thái tín hiệu ở mức logic ‘1’, khi nhấn thì ngắn
mạch nối mass làm mức logic về ‘0’. Khi nhả phím thì về lại bình thường mức logic ‘1’.
Để kiểm tra có nhấn hay không thì ta kiểm tra trạng thái nếu bằng ‘1’ thì không nhấn phím,
bằng ‘0’ thì có nhấn.

Hình 3-2. Sơ đồ giao tiếp vi điều khiển với 4 nút nhấn đơn
3.2.3 Định nghĩa tên các nút nhấn trong thư viện
Kit thực hành có 4 nút nhấn đơn là BT0 đến BT3 kết nối trực tiếp với 4 bit của các port.
#define bt0 pin_b6
#define bt1 pin_f1
#define bt2 pin_b4
#define bt3 pin_b7

#define on bt0
#define off bt1
#define inv bt2

#define up bt0
#define mod bt1
#define dw bt2
#define clr bt3

#define stop bt3


#define on1 bt0
#define off1 bt1
#define on2 bt2
#define off2 bt3
3.2.4 Các chương trình điều khiển dùng các nút nhấn đơn
Các chương trình có dùng các nút nhấn được trình bày từ đơn giản đến phức tạp.

52 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Bài mẫu 321. Chương trình điều khiển 8 LED bằng 2 nút ON và OFF. Khi có điện thì
led tắt, khi nhấn ON thì 8 led sáng, khi nhấn OFF thì 8 led tắt.
Lưu tên file “bai_321_on_off_8led”.
a. Mục đích: Biết lập trình kiểm tra nút nhấn và điều khiển đơn giản nhất.
b. Lưu đồ, giải thuật: Tắt 8 led, chờ nhấn ON: nếu có thì cho 8 led sáng, chờ nhấn OFF:
nếu có thì lặp lại từ đầu.
BEGIN

Tắt 8 led

Nhấn ON
S
Đ
Sáng 8 led

Nhấn OFF
S
Đ
END

Hình 3-3. Lưu đồ điều khiển 8 led sáng tắt bằng 2 nút ON và OFF
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void main()
{
set_up_port();
while(true)
{
while(input(ON));
xuat_32led_don_4byte(0,0,0,0xff);
while(input(Off));
xuat_32led_don_4byte(0,0,0,0);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Nhấn nút ON sẽ làm 8 led sáng, nhấn nút OFF sẽ làm 8 led tắt.
f. Tham khảo thêm cách viết dùng lệnh if:
#include <tv_kit_vdk_18f6722_all.c>
void main()
{

Thực hành vi điều khiển PIC 53


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
set_up_port();
xuat_32led_don_4byte(0,0,0,0);
while(true)
{
if(!input(on))
xuat_32led_don_4byte(0,0,0,0xff);

else if(!input(off))
xuat_32led_don_4byte(0,0,0,0);
}
}
g. Sự khác biệt của 2 chương trình dùng lệnh while và if: Cả 2 bài này đều có kết quả
điều khiển như nhau nhưng nếu hệ thống điều khiển thêm nhiều yêu cầu điều khiển
khác sẽ thấy được sự khác biệt: Nếu dùng lệnh while thì sẽ không đáp ứng được các
yêu cầu khác. Còn nếu dùng lệnh if thì đáp ứng được các yêu cầu khác. Tùy theo yêu
cầu mà chúng ta có thể dùng cho phù hợp.

Bài mẫu 322. Chương trình điều khiển 32 LED bằng 3 nút ON, OFF, INV. Khi có điện
thì 8 led tắt, khi nhấn ON thì 4 led sáng, khi nhấn INV thì 4 led sáng thành tắt, 4 led tắt
thành sáng. Khi nhấn OFF thì tất cả 8 led tắt.
Lưu tên file “bai_322_on_off_inv_8led”.
a. Mục đích: Thấy hiện tượng dội và tốc độ xử lý nhanh của vi điều khiển gây ra cho
nút nhấn INV làm mạch hoạt động không chính xác.
b. Lưu đồ, giải thuật: Xem hình.
BEGIN

Tắt 8 led

Nhấn ON
S
Đ
Sáng 4 led, tắt 4 led

Nhấn OFF Nhấn INV


S S
Đ Đ

Đảo trạng thái của 8 led


END

Hình 3-4. Lưu đồ điều khiển 8 led sáng tắt bằng 2 nút ON, OFF và INV
54 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
unsigned int8 y;
void main()
{
set_up_port();
y=0;
xuat_32led_don_4byte(0,0,0,0);
while(true)
{
while(input(on));
y=0x0f;
xuat_32led_don_4byte(0,0,0,y);
do
{
if (!input(inv))
{
y=~y;
xuat_32led_don_4byte(0,0,0,y);
}
}while(input(off));
xuat_32led_don_4byte(0,0,0,0);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Nhấn ON làm 4 led sáng, nhấn INV thì đảo 4 sáng thành tắt, 4 tắt
thành sáng. Nhấn OFF thì tắt led.
Trong chương trình này khi chạy thực tế thì có vấn đề cho phím INV: ta nhấn phím INV
nhanh thì trạng thái đảo của led không thể đảo chiều một cách chính xác, ổn định mà lúc được
lúc không.
Có 2 nguyên nhân: Do bị dội phím và do tốc độ của vi điều khiển quá nhanh 200ns cho 1
lệnh. Khi ta nhấn đảo chiều thì thời gian nhấn phím dài hàng mili giây đến hàng giây, nên vi
điều khiển thực hiện đảo led liên tục cho đến khi ta nhả phím thì không thể xác định trạng thái
chính xác được.
Để điều khiển chính xác thì phải chống dội phím nhấn, rồi xử lý chức năng và kiểm tra
buông phím cho trường hợp nhấn nhả và delay cho trường hợp nhấn giữ.
Dội phím xảy ra khoảng 20ms và sau đó ổn định.
Trong bài điều khiển chỉ có phím INV gây ra ảnh hưởng nên lưu đồ và chương trình xử lý
phần chống dội và chờ buông phím INV theo sau.

Bài mẫu 323. Chương trình điều khiển 8 LED bằng 3 nút ON, OFF, INV. Khi có điện
thì 8 led tắt, khi nhấn ON thì 4 led sáng, khi nhấn OFF thì led tắt, khi nhấn INV thì 4 led
sáng thành tắt, 4 led tắt thành sáng, có chống dội phím và chờ nhả phím.
Lưu tên file “bai_323_on_off_inv_cd_8led”.

Thực hành vi điều khiển PIC 55


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
a. Mục đích: Biết cách lập trình chống dội cho nút nhấn và chờ nhả phím.
b. Lưu đồ chống dội của phím INV: kiểm tra nếu không nhấn INV thì thoát. Nếu có
nhấn thì delay 20ms để qua khỏi thời gian dội. Sau đó kiểm tra phím lần 2.
Nếu không còn nhấn thì thoát. Nếu còn thì tiến hành xử lý chức năng của phím.

BEGIN Xử lý phím INV

Tắt 8 led Nhấn INV


S
Đ

Nhấn ON Delay 20ms


S
Đ
Sáng 4 led, tắt 4 led Nhấn INV
S
Đ
Nhấn OFF Xử lý phím INV Xử lý chức năng
S
Đ
Nhả INV
S
END Đ

END

Hình 3-5. Lưu đồ điều khiển 8 led bằng ON, OFF và INV – có chống dội
Tiếp theo để giảm ảnh hưởng tốc độ xử lý của vi điều khiển nên thêm lệnh chờ nhả phím
cho trường hợp nhấn – nhả. Thêm delay cho trường hợp nhấn – giữ cho những ứng dụng có thực
hiện có tính liên tục.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
unsigned int8 y;

void phim_inv()
{
if (!input(inv))
{
delay_ms(20);
{
if (!input(inv))
{
y=~y;
xuat_32led_don_4byte(0,0,0,y);
while(!input(inv));
}
}

56 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
}
}

void main()
{
set_up_port();
y=0x00;
while(true)
{
while(input(on));
y=0x0f;
xuat_32led_don_4byte(0,0,0,y);
do
{
phim_inv();
}
while(input(off));
xuat_32led_don_4byte(0,0,0,0);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Giống bài 322 nhưng khi nhấn INV thì mạch hoạt động đảo chiều
sáng tắt một cách ổn định và chính xác.

Bài tập 324. Dùng vi điều khiển giao tiếp với 16 led đơn và 3 nút nhấn được đặt tên là
UP, DW, CLR. Khi cấp điện thì 16 led tắt, khi nhấn UP thì led sáng dần lên từ phải sang
trái – mỗi lần nhấn thì 1 led sáng, khi nhấn DW thì led tắt dần theo chiều ngược lại, khi
nhấn CLR thì xóa hết.
Lưu tên file “bai_324_up_dw_clr_16led”.

Bài tập 325. Giống bài 324 nhưng nút nhấn CLR có thêm chức năng đảo chiều sáng
và tắt của led: ví dụ khi nhấn UP thì sáng dần từng led từ phải sang trái, thì sau khi nhấn
CLR thì khi nhấn UP led sẽ sáng từng led theo chiều từ trái sang phải, tương tự cho nút
nhấn DW.
Lưu tên file “bai_325_up_dw_clr_16led_dao_chieu”.

3.3 ĐIỀU KHIỂN 32 LED ĐƠN VÀ NÚT NHẤN – CÁCH 2


3.3.1 Hiện tượng đáp ứng chậm, chờ nhả phím
Ở phần trước chúng ta đã thực hành điều khiển 32 led đơn với nhiều chương trình và cũng
đã sử dụng phím nhấn để điều khiển.
Phần này sẽ thực hành bài điều khiển để chứng minh đáp ứng chậm của các bài có giao
tiếp với phím nhấn.

Thực hành vi điều khiển PIC 57


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài mẫu 326. Viết chương trình thực hiện 3 yêu cầu: Yêu cầu 0: 32 led tắt. Yêu cầu
1: 32 led sáng tắt dần phải sang trái. Yêu cầu 2: 32 led sáng tắt dần trái sang phải. Dùng
phím UP là BT0 để chuyển đổi các yêu cầu theo thứ tự 0, 1, 2. Dùng phím DW là BT1
để chuyển đổi các yêu cầu theo thứ tự 2, 1, 0. Mặc nhiên ban đầu thực hiện yêu cầu 0.
Lưu tên file “bai_326_32led_3y_cau_up_dw”.
Mục đích: Thấy hiện tượng đáp ứng phím nhấn chậm khi thực hiện các yêu cầu điều
a.
khiển dùng vòng lặp for.
b. Lưu đồ, giải thuật: Dùng biến thứ tự chương trình: khi bằng 0 thì yêu cầu 0 thực hiện,
bằng 1 thì yêu cầu 1 thực hiện, ... Phím UP làm tăng, phím DW làm giảm thứ tự.
c. Chương trình: Hai hàm std_pst và std_tsp đã có nên copy sang.
#include <tv_kit_vdk_18f6722_all.c>
usi8 tt_ct;
void b308_32led_std_pst(usi16 dl)
{
usi8 i; usi32 x;
x = 0;
for(i=0;i<32;i++)
{
x = (x << 1)+1;
xuat_32led_don_1dw(x);
delay_ms(dl);
}
for(i=0;i<32;i++)
{
x = (x << 1);
xuat_32led_don_1dw(x);
delay_ms(dl);
}
}

void b309_32led_std_tsp(usi16 dl)


{
usi8 i; usi32 x;
x = 0;
for(i=0;i<32;i++)
{
x = (x>>1) + 0x80000000;
xuat_32led_don_1dw(x);
delay_ms(dl);
}
for(i=0;i<32;i++)
{
x = (x>>1);

58 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
xuat_32led_don_1dw(x);
delay_ms(dl);
}
}

void b326_32led_std_pst_tsp_tat_3bt()
{
if(phim_bt0_c1(c_ktnp,0)==co_nhan)
{
if(tt_ct<2) tt_ct++;
}
if(phim_bt1_c1(c_ktnp,0)==co_nhan)
{
if(tt_ct>0) tt_ct--;
}
if(tt_ct==0) xuat_32led_don_1dw(0);
if(tt_ct==1) b308_32led_std_pst(200);
if(tt_ct==2) b309_32led_std_tsp(200);
}

void main()
{
set_up_port();
tt_ct=0;
while(true)
{
b326_32led_std_pst_tsp_tat_3bt();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Nhấn các nút để thực hiện các yêu cầu.
f. Nhận xét: Khi 32 led đang tắt thì ta nhấn nút bt0 hoặc bt1 để thực hiện chương trình
sáng tắt dần tương ứng sẽ chạy ngay sau nhấn phím.
Khi đã chạy chương trình điều khiển 32 led sáng tắt dần thì việc nhấn phím để chọn
yêu cầu khác chỉ có tác dụng khi chương trình đang chạy kết thúc chu kỳ. Còn khi
đang thực hiện thì ta nhấn không có tác dụng.
g. Kết luận: Bài này tồn tại vấn đề là đáp ứng phím nhấn quá chậm.
h. Nguyên nhân: Do chu kỳ thực hiện dùng vòng lặp for cho sáng dần rồi tắt dần là
64×200ms = 12,800ms = 12,8s nên gây ra đáp ứng chậm khi nhấn phím. Phần tiếp
theo trình bày cách khắc phục hai vấn đề trên.

3.3.2 Thư viện hàm quét phím

Thực hành vi điều khiển PIC 59


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Trong bài 326 có sử dụng hàm quét phím “phim_bt0_c1(c_ktnp,0)” nằm trong file
thư viện “tv_03_18f6722_key”.
a. Các định nghĩa cho các trạng thái của nút nhấn
#define co_nhan 1
#define khong_nhan 0
#define c_ktnp 1 //co kiem tra nha phim
#define k_ktnp 0 //khong kiem tra nha phim
Nếu có nhấn thì trả về “có nhấn” tương đương mức ‘1’. Nếu không nhấn thì trả về “không
nhấn” tương đương mức ‘0’.
Nếu có kiểm tra nhả phím thì tương đương mức ‘1’. Nếu không thì tương đương mức ‘0’.
b. Hàm 309: Kiểm tra phím nhấn BT0, trả về kết quả có nhấn hoặc không nhấn.
int1 phim_bt0_c1(int1 ktnp,usi16 dl)
{
if(!input(bt0))
{
delay_ms(20);
if(!input(bt0))
{
if(ktnp) while(!input(bt0));
delay_ms(dl);
return co_nhan;
}
return khong_nhan;
}
return khong_nhan;
}
Giải thích: Hàm này là hàm mở rộng chống dội phím INV của bài 323. Mở rộng thêm
thuộc tính là tùy ý chọn có hoặc không kiểm tra nhả phím tùy thuộc vào biến “ktnp” và thuộc
tính có delay hay không.
Thuộc tính thứ nhất để phục vụ cho chức năng nhấn và nhả phím giống phím INV của bài
323 đã thực hành. Thuộc tính thứ hai để phục vụ cho chức năng nhấn và giữ dùng để tăng hay
giảm một biến nào đó, ví dụ như nút tăng volum của Tivi. Vì khoảng điều chỉnh rộng nên dùng
chế độ nhấn phím và giữ là phù hợp để chỉnh đúng giá trị mong muốn. Ở chế độ này thì phải bỏ
qua việc kiểm tra nhả phím và phải có delay để điều chỉnh tộc độ thay đổi cho phù hợp.
Tóm tắt: Hàm này đáp ứng được 1 trong 2 yêu cầu: Nhấn nhả và nhấn giữ.
Tương tự cho các phím BT1, BT2 và BT3.

3.3.3 Giải quyết các vấn đề để được đáp ứng nhanh


Ở bài trên đã phân tích nguyên nhân đáp ứng chậm khi nhấn phím là do các chương trình
điều khiển có các vòng lặp for và phải chờ cho chúng thực hiện xong vòng lặp.
Có nhiều cách khắc phục nhưng tài liệu này trình bày cho bạn cách tối ưu nhất là các
chương trình điều khiển 32 led sáng tắt dần không dùng vòng lặp for mà thay bằng lệnh if.

60 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Với yêu cầu điều khiển 32 led sáng dần rồi tắt dần đã viết dùng vòng lặp for và khi được
gọi thì nó thực hiện 1 chu kỳ điều khiển gồm 64 lần mới xong để quay về. Bây giờ ta thay đổi
sang giải thuật khác sao cho mỗi khi được gọi thì nó thực hiện 1 chu kỳ điều khiển chỉ bằng 1/64
thì đã quay về và sau đó khi được gọi thì nó làm tiếp 1/64 rồi lại quay về và cứ thế.
Với bài 331 thì chu kỳ thực hiện của yêu cầu sáng dần rồi tắt dần đã tính là 12,8s thì cũng
yêu cầu đó với giải thuật khác này thì chu kỳ thực hiện là 1/64=0,2ms. Chính vì thế khi nhấn
phím thì nó đáp ứng ngay. Việc thực hiện chi tiết thông qua bài 332.
Vấn đề nhả phím mới chạy thì ta chọn chế độ không kiểm tra nhả phím là xong.

Bài mẫu 327. Giống bài 331 nhưng giải quyết các vấn đề để đáp ứng nhanh.
Lưu tên file “bai_327_32led_tat_std_pst_tsp_3btn_nhanh”.
a. Mục đích: Biết lập trình vòng lặp dùng lệnh if thay cho vòng lặp for để đáp ứng nhanh
các yêu cầu điều khiển khác.
b. Lưu đồ, giải thuật: Xem hình.
Sang_tat_dan_pst_32led()

Dem_led<32 Dem_led<64
S S
Đ Đ
Xuất biến Y ra led đơn, delay, Xuất biến Y ra led đơn, delay,
dịch mức 1 vào Y từ bên phải, dịch mức 0 vào Y từ bên phải,

Dem_led = 0
Dem_led = Dem_led + 1
Y=0

end

Hình 3-6. Điều khiển 32 led sáng tắt dần từ phải sang trái dùng lệnh if
Các yêu cầu điều khiển kiểu khác cũng có thể thực hiện giống như lưu đồ trên.
c. Chương trình con “bai_327_tv”:
usi8 ttl,tt_ct;
usi32 x;
void h327_reset_tang_tcttd_if()
{
ttl=0; x=0;
}

void h327_32led_std_tsp_if()
{
if(ttl<32)
{

Thực hành vi điều khiển PIC 61


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
x=(x>>1)+0x80000000;
xuat_32led_don_1dw(x);
ttl++;
}
else if(ttl<64)
{
x=(x>>1);
xuat_32led_don_1dw(x);
ttl++;
}
else h327_reset_tang_tcttd_if();
}

void h327_32led_std_pst_if()
{
if(ttl<32)
{
x=(x<<1)+1;
xuat_32led_don_1dw(x);
ttl++;
}
else if(ttl<64)
{
x=(x<<1);
xuat_32led_don_1dw(x);
ttl++;
}
else h327_reset_tang_tcttd_if();
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_327_tv.c>

void b327_32led_std_pst_tsp_tat_3bt_if()
{
if(phim_bt0_c1(c_ktnp,0)==co_nhan)
{
if(tt_ct<2)
{
tt_ct++;
h327_reset_tang_tcttd_if();
}
}
if(phim_bt1_c1(c_ktnp,0)==co_nhan)
{

62 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
if(tt_ct>0)
{
tt_ct--;
h327_reset_tang_tcttd_if();
}
}
}

void main()
{
set_up_port();
tt_ct=0;
h327_reset_tang_tcttd_if();
while(true)
{
b327_32led_std_pst_tsp_tat_3bt_if();
if(tt_ct==0) xuat_32led_don_1dw(0);
if(tt_ct==1) h327_32led_std_pst_if();
if(tt_ct==2) h327_32led_std_tsp_if();
delay_ms(200);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Nhấn các nút để thực hiện các yêu cầu và mạch đáp ứng ngay nhưng
sau khi nhấn thì phải nhả phím thì mới thực hiện yêu cầu tiếp theo.

3.3.4 Tối ưu thời gian delay 20ms của hàm chống dội nút nhấn
Ở các hàm kiểm tra nếu có phím nhấn thì phải delay 20ms để qua khoảng thời gian dội
phím sẽ làm chậm quá trình xử lý các yêu cầu khác một cách đáng kể.
Để giải quyết vấn đề này là ta chia nhỏ quá trình kiểm tra phím thành 40 lần, mỗi lần chỉ
delay 500µs rồi thoát về thực hiện các yêu cầu khác của chương trình chính và sau đó quay lại
kiểm tra tiếp. Nếu phím vẫn còn nhấn trong 40 lần kiểm tra tương đương 20ms thì xem như có
nhấn phím. Nếu các yêu cầu khác mất nhiều thời gian thì nên giảm số lần nhỏ hơn 40.
Cách này được xem như là cách thứ 2.
Các chương trình giống nhau cho các phím nhưng chỉ trình bày phím bt0.
int1 phim_bt0_c2(usi16 dl)
{
if (!input(bt0))
{
dl_btn++; delay_us(500);
if(dl_btn>=dl)
{
dl_btn=0;

Thực hành vi điều khiển PIC 63


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
return co_nhan;
}
else return khong_nhan;
}
else return khong_nhan;
}
Giải thích: Hàm có 1 thông số chính là số lần kiểm tra và cũng có thể xem là delay.
Giả sử hàm gọi cho dl = 40. Cho dl_btn = 0. Nếu có nhấn phím thì dl_btn tăng lên
1. So sánh chưa bằng dl thì thoát và xem như không nhấn phím. Sau đó hàm được
gọi lại lần 2 và cứ thế cho đến khi đủ 40 lần thì xem như có phím nhấn.

Bài mẫu 328. Giống bài 327, chỉ khác là dùng hàm kiểm tra phím nhấn theo cách 2.
Lưu tên file “bai_328_32led_3y_cau_up_dw_if_c2”.
a. Mục đích: Giống bài 327, chỉ khác là dùng hàm kiểm tra phím nhấn theo cách 2.
b. Lưu đồ, giải thuật: Giống bài 327
c. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_327_tv.c>

void b328_32led_std_pst_tsp_tat_3bt_if()
{
if(phim_bt0_c2(2)==co_nhan)
{
if(tt_ct<2)
{
tt_ct++;
h327_reset_tang_tcttd_if();
}
}
if(phim_bt1_c2(2)==co_nhan)
{
if(tt_ct>0)
{
tt_ct--;
h327_reset_tang_tcttd_if();
}
}
}

void main()
{
set_up_port();
tt_ct=0;

64 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
h327_reset_tang_tcttd_if();
while(true)
{
b328_32led_std_pst_tsp_tat_3bt_if();
if(tt_ct==0) xuat_32led_don_1dw(0);
if(tt_ct==1) h327_32led_std_pst_if();
if(tt_ct==2) h327_32led_std_tsp_if();
delay_ms(200);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Nhấn các nút để thực hiện các yêu cầu và mạch đáp ứng ngay và
khi thấy yêu cầu mong muốn đang thực hiện thì phải nhả phím ngay, nếu không thì
sẽ chuyển tiếp đến yêu cầu tiếp theo vì đang dùng ở chế độ nhấn giữ.
3.3.5 Các bài tập mở rộng dùng lệnh if
Khi làm nên vẽ sơ đồ khối hệ thống nếu có, phân tích đề bài, phân tích dữ liệu điều khiển,
tìm mối liên hệ và xây dựng lưu đồ, cuối cùng là viết code.
Các bài tập này khá nhiều bạn nên làm ở nhà, làm xong khi thực hành thì nạp vào để kiểm
tra đúng sai. Mục đích để các bạn rèn luyện và phát triển khả năng lập trình.
Bài tập 329. Hãy viết thêm vào bài 328 yêu cầu thứ (4) là điều khiển 16 led trái và 16
led phải sáng tắt dần từ phải sang trái song song, yêu cầu thứ (5) giống thứ 4 nhưng chiều
từ trái sang phải, thời gian trễ là 30ms.
Lưu tên file “bai_329_32led_5yeu_cau_2btn_c2”.

Bài tập 330. Giống bài 329 nhưng 4 yêu cầu (2), (3), (4) (5) được viết chung lại thành
1 hàm có thêm 1 thông số chọn chiều (dir) có giá trị 0, 1, 2, 3 để chọn 4 chiều tương ứng
4 yêu cầu. Số thứ tự các yêu cầu vẫn không đổi.
Lưu tên file “bai_330_32led_6yeu_cau_3btn_ct”.

Bài tập 331. Hãy viết thêm vào bài 330 yêu cầu thứ (6) là điều khiển 32 led sáng dồn
phải sang trái và yêu cầu thứ (7) là sáng dồn trái sang phải dùng lệnh if với thời gian trễ
là 10ms.
Lưu tên file “bai_331_32led_8yeu_cau_3btn_ct”.

Bài tập 332. Hãy viết thêm vào bài 331 yêu cầu thứ (8) là điều khiển 32 led sáng dồn
từ ngoài vào, yêu cầu thứ (9) là sáng dồn từ trong ra, yêu cầu thứ (10) là điều khiển 16
led trái và 16 led phải sáng dồn phải sang trái song song, yêu cầu thứ (11) giống thứ (10)
nhưng từ trái sang phải dùng lệnh if với thời gian trễ là 10ms.
Lưu tên file “bai_332_32led_8yeu_cau_3btn_ct”.

Thực hành vi điều khiển PIC 65


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Bài tập 333. Hãy viết thêm vào bài 332 yêu cầu thứ (12) là điều khiển 32 led sáng hết
rồi điểm sáng thứ nhất bên phải dịch phải mất dần, tương tự cho điểm sáng thứ 2, thứ
3, … cho đến điểm sáng cuối cùng. Yêu cầu thứ (13) giống (12) nhưng dịch trái mất dần,
dùng lệnh if với thời gian trễ là 10ms.
Lưu tên file “bai_333_32led_14yeu_cau_3btn_ct”.

Bài tập 334. Hãy viết thêm vào bài 333 yêu cầu thứ (14) là điều khiển 32 led sáng hết
rồi có 2 điểm sáng dịch từ vào giữ mất dần, yêu cầu thứ (15) có 2 điểm sáng dịch ra mất
dần, yêu cầu thứ (16) là điều khiển 2 nhóm 16 led sáng hết có 2 điểm sáng dịch phải mất
dần, yêu cầu thứ (17) giống (16) nhưng dịch trái mất dần, dùng lệnh if với thời gian trễ là
10ms.
Lưu tên file “bai_334_32led_18yeu_cau_3btn_ct”.

Bài tập 335. Hãy viết thêm vào bài 334 yêu cầu thứ (18) đến (33) là điều khiển 32 led
có k điểm sáng dịch trái, k có giá trị từ 1 đến 8 tương ứng 1 đến 16 led sáng.
Ví dụ cho k bằng 4 thì có 4 điểm sáng dịch trái: ban đầu 32 led tắt. Dịch trái 1 bit lần
1: 1 điểm sáng xuất hiện bên phải. Dịch trái 1 bit lần 2: thêm 1 điểm sáng xuất hiện bên
phải là 2 led, tương tự lần 3 thì 3 led sáng, lần 4 thì 4 led sáng. Đến đây đã đủ 4 led sáng
và 32 lần dịch tiếp theo sẽ dịch 4 điểm sáng này sang trái cho đến khi mất dần hết rồi lặp
lại. Tương tự cho các giá trị khác của k. Dùng lệnh if với thời gian trễ là 20ms.
Lưu tên file “bai_335_32led_34yeu_cau_3btn_ct”.

Bài tập 336. Hãy viết thêm vào bài 335 yêu cầu thứ (34) đến (49) là điều khiển 32 led
có k điểm sáng dịch trái, k có giá trị từ 1 đến 8 tương ứng 1 đến 16 led sáng.
Ví dụ cho k bằng 4 thì có 4 điểm sáng dịch trái: ban đầu 32 led tắt. Dịch trái 1 bit lần
1: 1 điểm sáng xuất hiện bên phải. Dịch trái 1 bit lần 2: thêm 1 điểm sáng xuất hiện bên
phải là 2 led, tương tự lần 3 thì 3 led sáng, lần 4 thì 4 led sáng. Đến đây đã đủ 4 led sáng
và 32 lần dịch tiếp theo sẽ dịch 4 điểm sáng này sang trái cho đến khi mất dần hết rồi lặp
lại. Tương tự cho các giá trị khác của k. Dùng lệnh if với thời gian trễ là 20ms.
Lưu tên file “bai_336_32led_50yeu_cau_3btn_ct”.

Bài tập 337. Hãy viết thêm vào bài 336 yêu cầu thứ (50) đến (81) là điều khiển 32 led
chia thành 2 nhóm 16 led trái và 16 led phải, có k điểm sáng dịch vào, dịch ra, dịch trái,
dịch phải – 4 chiều, k có giá trị từ 1 đến 8 tương ứng 1 đến 8 led sáng.
Lưu tên file “bai_337_32led_82yeu_cau_3btn_ct”.

66 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
3.3.6 Chương trình chạy tự động
Phần này thực hành điều khiển 32 led chạy tự động.
Bài mẫu 338. Chạy tự động 4 yêu cầu. Yêu cầu 0: 32 led std_pst. Yêu cầu 1: 32 led
std_tsp. Yêu cầu 2: 32 led std_tnv. Yêu cầu 3: 32 led std_ttr. Tất cả đều dùng lệnh if.
Sau khi nạp thì yêu cầu (0) chạy, sau đó chuyển sang yêu cầu (1), xong (1) thì sang (2),
xong (2) thì sang (3), xong (3) thì trở lại (1).
Lưu tên file “bai_338_32led_chay_td_4yc”.
a. Mục đích: Biết viết chương trình chạy 4 yêu cầu điều khiển 32 led chạy tự động.
b. Lưu đồ, giải thuật: Viết 4 yêu cầu trên đều dùng lệnh if dựa vào giải thuật của bài
327. Dùng 1 biến đếm thứ tự chương trình tăng từ 0 đến 3 để chọn lần lượt các yêu
cầu:
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <chuong3_32led_if_no_delay.c>
void main()
{
set_up_port();
while(true)
{
b338_32led_4yc_tu_dong_if();
delay_ms(20);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Các yêu cầu sẽ được thực hiện.
f. Giải thích: Các yêu cầu đã được viết sẵn trong thư viện nên ở đây chỉ gọi ra dùng.
Hãy xem các hàm trong thư viện.

Bài tập 339. Hãy viết chương trình thực hiện 82 yêu cầu giống bài 344 nhưng chạy tự
động từ thứ (0) đến (81).
Lưu tên file “bai_339_32led_chay_td_82yc”.
a. Mục đích: Biết viết chương trình chạy 82 yêu cầu điều khiển 32 led chạy tự động.
b. Lưu đồ, giải thuật: Giống bài 338, chỉ thêm vào các yêu cầu khác:
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <chuong3_32led_if_no_delay.c>
void main()
{
set_up_port();
while(true)

Thực hành vi điều khiển PIC 67


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
{
b339_32led_tong_hop_tu_dong_if();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Có 82 yêu cầu sẽ được thực hiện lần lượt.

3.4 THƯ VIỆN CHÍNH


Trong tất cả bài thực hành luôn có khai báo sử dụng thư viện sau:
#include <tv_kit_vdk_18f6722_all.c>
Đây là thư viện chính, chứa nhiều thư viện con như sau:
#include <tv_01_18f6722_define.c>
#include <tv_02_18f6722_mbi.c>
#include <tv_03_18f6722_key.c>
//!#include <chuong3_32led_key.c>
#include <math.h>

#include <tv_04_18f6722_8led_7doan.c>
#include <tv_05_18f6722_lcd.c>
#include <tv_06_18f6722_adc.c>
#include <tv_ds18b20.c>
#include <tv_dht11.c>
#include <tv_rotary_encoder.c>

//!#include <tv_oled_ssd1306.c>
#include <tv_HX711.c>
Các bạn có thể xem chi tiết từng thư viện.
Còn nhiều thông tin trong các thư viện, do quá nhiều nên không trình bày hết, bạn có thể
xem trong từng file.

68 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 4: THỰC HÀNH


MODULE 8 LED 7 ĐOẠN,
COUNTER/TIMER, BÀN PHÍM
CẢM ỨNG TOUCH, ROTARY
ENCODER

Thực hành vi điều khiển PIC 69


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
4.1 MẠCH ĐIỆN VÀ THƯ VIỆN MODULE 8 LED 7 ĐOẠN
4.1.1 Mạch điện giao tiếp vi điều khiển với module 8 led 7 đoạn
Phần này thực hành các bài giao tiếp với 8 led 7 đoạn để thực hiện các bài đếm thời gian,
đếm sản phẩm, hiển thị các thông tin là các số thập phân.
Mạch điện giao tiếp vi điều khiển với module 8 led 7 đoạn như hình 4-1.

Hình 4-1. Sơ đồ nguyên lý giao tiếp vi điều khiển với module 4 led 7 đoạn
Trong mạch sử dụng 4 IC thanh ghi MBI5026 để mở rộng port điều khiển 8 led 7 đoạn.
Phần vi điều khiển PIC giao tiếp với IC thanh ghi dịch
Có 4 tín hiệu điều khiển là:
 MBI_SDI dùng để dịch dữ liệu vào nối tiếp.
 MBI_SCK dùng để cấp xung clock.
 MBI_LE1 dùng điều khiển nạp dữ liệu song song.
 MBI_OE dùng để cho phép xuất dữ liệu.
Phần IC thanh ghi dịch giao tiếp với 4 led 7 đoạn
Mỗi IC MBI526 có 16 bit kết nối với 2 led 7 đoạn, 4 IC điều khiển được 8 led 7 đoạn.
Số lượng byte dữ liệu điều khiển module 8 led 7 đoạn là 4 word.
Khả năng mở rộng
Trong kit thực hành dùng 4 IC để điều khiển 8 led, sau này các ứng dụng thực tế cần nhiều
led hơn thì bạn cứ kết nối thêm IC thanh ghi nối tiếp vào một cách dễ dàng.
70 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
4.1.2 Hàm xuất dữ liệu của module 8 led 7 đoạn
Phần này trình bày các hàm xuất dữ liệu và các hàm giải mã của module 8 led 7 đoạn. Các
hàm lưu trong file “tv_04_18f6722_8led_7doan”.
a. Định nghĩa: Mảng chứa dữ liệu hiển thị của module 8 led 7 đoạn.
usi8 led_7d[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
b. Hàm 401: Xuất dữ liệu 8 byte dữ liệu của mảng led_7d ra 8 led.
void xuat_8led_7doan()
{
si8 i;
for(i=7;i>-1;i--) spi_write2(~led_7d[i]);
output_high(mbi_le1); output_low(mbi_le1);
}
Hàm này gửi 8 phần tử của mảng ra 4 IC theo chuẩn nối tiếp SPI.
c. Hàm 402: Giải mã 2 số hex tùy chọn vị trí hiển thị và số vô nghĩa.
void giaima_bcd_2so_vitri_vn(usi8 x,y, int1 xvn)
{
led_7d[y] = ma7doan[x%16];
led_7d[y+1] = ma7doan[x/16];
if(xvn==true)
{
if (led_7d[y+1]==maso0) led_7d[y+1]=0xff;
}
}
Giải mã biến x thành 2 số BCD, vị trí lưu là y và tùy chọn xóa vô nghĩa hoặc không. Hàm
này dùng để chia tách hiển thị 2 số BCD hoặc số thập lục phân và tùy chọn xóa vô nghĩa.
d. Hàm 403: Giải mã 2 số BCD tùy chọn vị trí hiển thị và số vô nghĩa.
void giaima_bin_2so_vitri_vn(usi8 x,y, int1 xvn)
{
led_7d[y] = ma7doan[x%10];
led_7d[y+1] = ma7doan[x/10%10];
if(xvn==true)
{
if (led_7d[y+1]==maso0) led_7d[y+1]=0xff;
}
}
e. Hàm 404: Giải mã 3 số BCD tùy chọn vị trí hiển thị và số vô nghĩa.
void giaima_bin_3so_vitri_vn(usi16 x, usi8 y, int1 xvn)
{
led_7d[y] = ma7doan[x%10];
led_7d[y+1] = ma7doan[x/10%10];
led_7d[y+2] = ma7doan[x/100%10];
if(xvn==true)
Thực hành vi điều khiển PIC 71
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
{
if (led_7d[y+2]==maso0)
{
led_7d[y+2]=0xff;
if (led_7d[y+1]==maso0) led_7d[y+1]=0xff;
}
}
}
f. Hàm 405: Giải mã 5 số BCD tùy chọn vị trí hiển thị và số vô nghĩa.
void giaima_bin_4so_vitri_vn(usi16 x, usi8 y, int1 xvn)
{
led_7d[y] = ma7doan[x%10];
led_7d[y+1] = ma7doan[x/10%10];
led_7d[y+2] = ma7doan[x/100%10];
led_7d[y+3] = ma7doan[x/1000%10];
if(xvn==true)
{
if (led_7d[y+3]==maso0)
{
led_7d[y+3]=0xff;
if (led_7d[y+2]==maso0)
{
led_7d[y+2]=0xff;
if (led_7d[y+1]==maso0) led_7d[y+1]=0xff;
}
}
}
}
Giải mã 7 đoạn 4 số chục và đơn vị của biến x, vị trí lưu là y và tùy chọn xóa vô nghĩa.
g. Hàm 406: Giải mã 5 số BCD tùy chọn vị trí hiển thị và số vô nghĩa.
void giaima_bin_5so_vitri_vn(usi16 x, usi8 y, int1 xvn)
{
led_7d[y] = ma7doan[x%10];
led_7d[y+1] = ma7doan[x/10%10];
led_7d[y+2] = ma7doan[x/100%10];
led_7d[y+3] = ma7doan[x/1000%10];
led_7d[y+4] = ma7doan[x/1000%10];
if(xvn==true)
{
if (led_7d[y+4]==maso0)
{
led_7d[y+4]=0xff;
if (led_7d[y+3]==maso0)
{

72 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
led_7d[y+3]=0xff;
if (led_7d[y+2]==maso0)
{
led_7d[y+2]=0xff;
if (led_7d[y+1]==maso0) led_7d[y+1]=0xff;
}
}
}
}
}

4.2 HIỂN THỊ SỐ TRÊN 8 LED 7 ĐOẠN


Phần này thực hành các bài hiển thị trên 8 led 7 đoạn đơn giản.
Bài mẫu 401. Viết chương trình hiển thị 8 số từ 0 đến 7 trên 8 led 7 đoạn.
Lưu tên file “bai_401_hienthi_8so”.
a. Mục đích: Biết sử dụng hàm điều khiển 8 led 7 đoạn hiển thị 8 số.
b. Lưu đồ, giải thuật: Giải mã 7 đoạn cho các số từ 0 đến 7 và gọi hàm xuất ra 8 led.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void b401_hien_thi_8so_8l7d()
{
led_7d[7]=ma7doan[7];
led_7d[6]=ma7doan[6];
led_7d[5]=ma7doan[5];
led_7d[4]=ma7doan[4];
led_7d[3]=ma7doan[3];
led_7d[2]=ma7doan[2];
led_7d[1]=ma7doan[1];
led_7d[0]=ma7doan[0];
xuat_8led_7doan();
}

void main()
{
set_up_port();
while(true)
{
b401_hien_thi_8so_8l7d(); while(true);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: 8 led sáng từ số 0 đến 7.

Thực hành vi điều khiển PIC 73


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài tập 402. Hãy viết lưu đồ và trình điều khiển 8 LED 7 đoạn hiển thị 8 số từ 0 đến
7: sáng 1 giây, tắt 1 giây.
Lưu tên file là “bai_402_8so_chop_tat”.

Bài tập 403. Hãy viết lưu đồ và trình điều khiển 8 LED 7 đoạn hiển thị 8 số từ 0 đến 7
một giây, sau đó hiển thị 8 số từ 8 đến F một giây, rồi lặp lại.
Lưu tên file là “bai_403_16so_luan_phien”.

Bài tập 404. Hãy viết lưu đồ và trình điều khiển 8 LED 7 đoạn theo yêu cầu: chuỗi
“CAFE-COCA-COLA” dịch từ phải sang trái từng ký tự, ban đầu tắt hết, delay tùy ý.
Lưu tên file là “bai_404_chuoi_std_pst”.

4.3 CÀI ĐẶT GIỚI HẠN BẰNG PHÍM ĐƠN


Phần này thực hành các bài cài các giới hạn phục vụ cho các ứng dụng khác như cài đặt
nhiệt độ báo động, cài thời gian định thời, cài số lượng sản phẩm, … bằng các phím đơn như
UP và DW.
Bài mẫu 406. Chương trình cài giới hạn từ 0 đến 99 dùng 2 nút UP và DW và cuộn
tròn, dùng chế độ nhấn và giữ để tăng hoặc giảm, có xóa vô nghĩa. Giá trị ban đầu là 50,
hiển thị trên 2 led 7 đoạn ở 2 led 7, 6
Lưu tên file là “bai_406_cai_gh_0_99_2bt_up_dw”.
a.Mục đích: Biết cách lập trình cài giới hạn bằng 2 nút nhấn UP và DW hiển thị trên 2
led 7 đoạn.
b. Lưu đồ, giải thuật: Tạo biến lưu giá trị 50. Giải mã hiển thị, kiểm tra nếu nhấn phím
UP thì tăng giá trị trong giới hạn, tương tự cho phím DW. Delay để làm giảm tốc độ.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
signed int8 g_han;
void b406_hienthi_4led7doan()
{
giaima_bin_2so_vitri_vn(g_han,6,kx_vn);
xuat_8led_7doan();
}

void b406_up_dw_g_han()
{
if(phim_up_c2(150)==co_nhan)
{
if(g_han<99)
{
g_han++;
b406_hienthi_4led7doan();
74 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
}
}
if(phim_dw_c2(150)==co_nhan)
{
if(g_han>0)
{
g_han--;
b406_hienthi_4led7doan();
}
}
}

void main()
{
set_up_port();
g_han = 50;
b406_hienthi_4led7doan();
while(true)
{
b406_up_dw_g_han();
}
}
a. Tiến hành biên dịch và nạp.
b. Quan sát kết quả: Ban đầu hiển thị giá trị 50: khi nhấn UP và giữ thì giá trị tăng, nhấn
DW và giữ thì giá trị giảm. Do chỉ chỉnh giới hạn và không thực hiện yêu cầu điều
khiển nào khác nên khi gọi hàm chống dội phím theo cách 2 thì tham số truyền 150 là
phù hợp.

Bài tập 407. Chương trình cài giới hạn từ 0 đến 99 dùng 2 nút UPC và UPD. UPC:
chỉnh hàng chục và UPD: chỉnh hàng đơn vị và cuộn tròn, dùng chế độ nhấn và giữ, có
xóa vô nghĩa. Giá trị mặc nhiên ban đầu là 50.
Lưu tên file là “bai_407_cai_gh_0_99_2bt_up”.

4.4 ĐẾM XUNG DÙNG COUNTER HIỂN THỊ TRÊN LED 7 ĐOẠN
Vi điều khiển PIC 18F6722 có 5 timer T0, T1, T2, T3 và T4.
T0, T1, T3 là timer/counter 16 bit, cả 3 đều có bộ chia trước. T2, T4 là timer 8 bit có bộ
chia trước và chia sau phục vụ cho các ứng dụng đặc biệt.
4.4.1 Tóm tắt timer/counter T0
Phần này thực hiện đếm xung ngoại dùng timer T0 vì nguồn xung từ cảm biến trên bộ thí
nghiệm đã cấp cho Timer T0 nên ta chỉ khảo sát timer T0.
Vi điều khiển PIC 18F6722 có timer T0 có thể hoạt động ở 2 chế độ 8 bit hoặc 16 bit. Chế
độ 8 bit thì giống họ vi điều khiển PIC16.

Thực hành vi điều khiển PIC 75


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Về nguyên lý thì những gì của timer T0 ở họ PIC16 thì đều có thể thực hiện ở họ PIC18.
Phần này không trình bày chi tiết mà chỉ tóm tắt.
Sơ đồ khối timer T0 hoạt động ở chế độ 8 bit như hình 4-2 và 16 bit ở hình 4-3.

Hình 4-2. Sơ đồ khối timer T0: chế độ 8 bit

Hình 4-3. Sơ đồ khối timer T0: chế độ 16 bit


Các lệnh liên quan đến timer được trình bày ở tài liệu lý thuyết, các bit điều khiển liên quan
đến timer thì có thể xem thêm trong thư viện 18F6722.h.
4.4.2 Cảm biến thu phát hồng ngoại HY860F
Để đếm xung ngoại thì nguồn xung đếm có thể tạo ra ở nhiều dạng khác nhau, nhưng trong
bộ thí nghiệm thì sử dụng led thu phát hồng ngoại để nhận biết một sản phẩm đi qua để nó gần
với thực tế ứng dụng bên ngoài.

Hình 4-4. Hình ảnh led thu phát HY860F và sơ đồ nguyên lý


BTN sử dụng led thu phát HY860F có hình dạng và sơ đồ nguyên lý như hình 4-4.
Có 1 led phát ra ánh sáng hồng ngoại và 1 transistor thu.
76 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Trong các robot có các động cơ và có gắn encoder thì có sử dụng dạng cảm biến này.
4.4.3 Mạch điện dùng T0 đếm xung ngoại
Khi sử dụng HY860F thì ta phải kết nối thêm điện trở và IC như hình 4-5.

Hình 4-5. Sơ đồ nguyên lý module thu phát hồng ngoại tạo xung
Led phát sẽ nối với điện trở lên nguồn 5V để led luôn hoạt động phát ra ánh sáng hồng
ngoại. Transistor có ngõ ra nối với điện trở và nối lên nguồn, đóng vai trò là điện trở tải để lấy
tín hiệu.
Tín hiệu ngõ ra được nối với 2 cổng not của IC 74HC14 có chức năng đệm và schmitt
trigger sửa dạng xung cho vuông và sau đó có thể đưa trực tiếp đến ngõ vào counter.
Khi không có sản phẩm nào che giữa led phát và led thu thì transistor được phân cực và
ngõ ra transistor bằng 0, qua 2 cổng not thì cũng bằng 0.
Khi bạn che ánh sáng giữa led phát và transistor thì transistor tắt, ngõ ra lên 1, qua 2 cổng
Not cũng bằng 1.
Mỗi lần 1 sản phẩm đi qua thì tạo ra 1 xung, xung sẽ đưa đến counter để đếm và hiển thị
trên led.
4.4.4 Các ứng dụng đếm xung ngoại dùng counter T0
Phần này thực hành các bài đếm xung ngoại dùng counter T0 và hiển thị kết quả đếm trên
module 8 led 7 đoạn.
Bài mẫu 411. Chương trình đếm sản phẩm hiển thị trên 4 led 7 đoạn dùng counter T0,
giới hạn đếm từ 0 đến 50. Khi bằng 50 thì quay về 0. Chỉ cập nhật khi kết đếm khác với
kết quả đang hiển thị. Buzzer kêu bip khi kết thúc 1 chu kỳ đếm. Giới hạn 50 hiển thị ở 2
led 7, 6. Giá trị đếm T0 hiển thị ở 2 led 1, 0. Có xóa vô nghĩa.
Lưu tên file là “bai_411_t0_dem_xung ”.
a.Mục đích: Biết lập trình đếm xung ngoại dùng counter T0, hiển thị led 7 đoạn.
b.Lưu đồ, giải thuật: Khởi tạo port, timer T0 ở chế độ counter, đọc giá trị T0 đem giải
mã, hiển thị và xử lý giới hạn.
c. Chương trình con “bai_411_t0_tv”:
unsigned int8 t0, t0_tam,g_han;
void b411_hienthi_4led7doan()
{
giaima_bin_2so_vitri_vn(t0,0,kx_vn);
Thực hành vi điều khiển PIC 77
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
giaima_bin_2so_vitri_vn(g_han,6,kx_vn);
xuat_8led_7doan();
}

void b411_dem_sp_t0()
{
t0 = get_timer0();
if(t0_tam!=t0)
{
t0_tam = t0;
b411_hienthi_4led7doan();
if (t0>=g_han)
{
set_timer0(0);
buzzer_on_off(300);
}
}
}
d. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_411_t0_tv.c>

void main()
{
set_up_port();
setup_timer_0(t0_ext_l_to_h|t0_div_1);
set_timer0(0); t0_tam = 1; g_han=50;
while(true)
{
b411_dem_sp_t0();
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Dùng giấy che giữa led phát và led thu thì mạch cảm biến hồng
ngoại sẽ tạo ra xung, kết quả giá trị trên led sẽ tăng lên 1.
g. Yêu cầu mở rộng: (1). Muốn đếm từ 0 đến 300 thì thay đổi như thế nào? (2). Muốn
thay đổi hệ số chia là 2 hoặc 4 thì làm như thế nào? (3). Muốn thay đổi mức tích cực
của xung vào thì làm như thế nào?
Bài tập 412. Giống bài 411 nhưng có thêm 2 nút nhấn điều khiển Run, Stop. Sau khi
nạp hoặc nhấn Stop thì counter ngừng đếm, có xung cũng không đếm, 16 led đơn phải
tắt. Khi nhấn Run thì cho phép đếm khi có xung, 16 led đơn phải sáng. Gợi ý: sử dụng
chế độ cho phép hoặc không cho phép của timer T0.
Lưu tên file là “bai_412_dem_xung_t0_stop_run_32led”.

78 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Bài tập 413. Giống bài 412 nhưng có thêm nút nhấn UD có chức năng chọn chế độ
hiển thị đếm lên hoặc đếm xuống. Khi hiển thị đếm lên thì 16 led đơn trái: 8 sáng, 8 tắt.
Khi hiển thị đếm xuống thì 16 led đơn trái: 8 tắt, 8 sáng.
Lưu tên file là “bai_413_dem_xung_t0_stop_run_ud_32led”.

Bài tập 414. Kết hợp bài 412 với bài 406 để thay đổi giới hạn bằng 2 nút nhấn. Giới
hạn mặc nhiên ban đầu là 50.
Lưu tên file là “bai_414_dem_xung_t0_stop_run_32led_gh”.

4.5 ỨNG DỤNG TIMER CỦA VI ĐIỀU KHIỂN PIC


Phần này thực hành các bài định thời dùng timer để đếm thời gian giây phút giờ hiển thị
trên module 8 led 7 đoạn.
Sử dụng timer T3 định thời báo ngắt để đếm chính xác về thời gian.
4.5.1 Tóm tắt timer/counter T3
Để đếm chính xác thì ta giao công việc đó cho timer đếm xung nội với các chu xung nội là
hằng số nên ổn định, chính xác. Khi đó nhiệm vụ của vi điều khiển bây giờ kiểm tra xem đủ thời
gian 1 giây chưa, nếu chưa thì chờ, nếu đủ thì tăng giây và kiểm tra giới hạn.
Do có sử dụng timer T3 nên phần này có trình bày lại sơ đồ của timer T3 như hình 4-6.

Hình 4-6. Sơ đồ khối của timer T3 giống T1


4.5.2 Đếm thời gian: giây, phút, giờ báo ngắt dùng timer T3

Bài mẫu 415. Chương trình đếm giây chính xác dùng timer T3 tạo ngắt.
Hiển thị trên 8 led 7 đoạn: giây ở 2 led thứ 1, 0.
Lưu tên file “bai_415_dem_giay_t3”.
a. Mục đích: Biết sử dụng timer T3 định thời và ngắt để đếm giây chính xác.
b. Lưu đồi, giải thuật: Dùng timer T3 đếm thời gian 0,1 giây thì báo ngắt để tăng biến
đếm ngắt. Khi biến đếm ngắt bằng 10 thì tương đương 1 giây.

Thực hành vi điều khiển PIC 79


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Tiến hành tăng và xử lý giây rồi giải mã hiển thị.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
signed int8 bdn,giay;

#int_timer3
void timer3_ct_con_ngat()
{
bdn++;
set_timer3(3036);
}

void h415_dem_giay_timer3()
{
if (bdn>=10)
{
bdn = bdn - 10;
if (giay<59) giay++;
else giay=0;
giaima_bin_2so_vitri_vn(giay,0,kx_vn);
xuat_8led_7doan();
}
}

void main()
{
set_up_port();
enable_interrupts(global);
enable_interrupts(int_timer3);
setup_timer_3(t3_internal|t3_div_by_8);
set_timer3(3036);
bdn=0; giay=0;
while(true)
{
h415_dem_giay_timer3();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Giây sẽ đếm chính xác hiển thị trên 2 led 7 đoạn.
f. Tính toán về tần số:
Tần số cấp cho timer: Thạch anh cấp cho vi điều khiển có tần số 20MHz qua bộ chia 4
còn 5MHz để cấp cho các timer. Xung này qua bộ chia trước có hệ số chia là 8 nên tần số còn
lại là 5MHz/8 = 0.625MHz hay bằng 625,000Hz.

80 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Tần số 625,000Hz có nghĩa là trong thời gian 1 giây sẽ có 625,000 xung hay đếm 625,000
xung sẽ tương đường 1 giây.
Dùng timer 16 bit: Sử dụng timer đếm từ 0 đến khi bằng 625,000 xung thì sẽ được 1 giây.
Do timer là 16 bit, giới hạn đếm lớn nhất là 65,536 xung nên không đáp ứng được.
Giải pháp: Cho timer đếm nhiều lần. Để dễ tính toán nên ta cho timer đếm 62,500 xung
và đếm 10 lần thì sẽ được 625,000 xung tương đương 1 giây.
Để tự động đếm 10 lần thì ta thiết lập cho timer bắt đầu đếm từ (65,536-62,500=3,036) cho
đến khi timer tràn thì được 62,500 xung. Cho phép timer ngắt để tăng biến đếm ngắt và tự động
thực hiện chu kỳ đếm tiếp theo.
Trong chương trình chính chỉ cần kiểm tra biến đếm ngắt đúng bằng 10 là bằng 1 giây.
g. Yêu cầu thay đổi: (1). Muốn đếm 100ms thì thay đổi như thế nào? (2). Muốn đếm
10ms thì làm như thế nào? (3). Muốn 1ms thì làm như thế nào?

Bài tập 416. Chương trình đếm phút giây chính xác dùng timer T3 tạo ngắt.
Hiển thị trên 8 led 7 đoạn: phút ở 2 led thứ 4, 3 và giây ở 2 led thứ 1, 0.
Lưu tên file “bai_416_dem_phut_giay_t3”.

Bài tập 417. Chương trình đếm giờ phút giây chính xác dùng timer T3 tạo ngắt. Hiển
thị trên 8 led 7 đoạn: giờ ở 2 led thứ 7, 6, phút ở 2 led thứ 4, 3 và giây ở 2 led thứ 1, 0.
Lưu tên file “bai_417_dem_gio_phut_giay_t3”.

Bài mẫu 418. Chương trình đếm giờ phút giây chính xác dùng timer T3 tạo ngắt.
Hiển thị trên 8 led 7 đoạn: giờ ở 2 led thứ 7, 6, phút ở 2 led thứ 4, 3 và giây ở 2 led thứ
1, 0. Có thêm 3 nút UP, DW và MOD để chỉnh thời gian. Nút MOD chọn lần lượt 4 chế
độ: (0) là không cho chỉnh, (1) cho chỉnh giờ, (2) cho chỉnh phút, (3) cho chỉnh giây.
Khi cho chỉnh: nhấn và giữ nút UP sẽ chỉnh tăng, nhấn và giữ nút DW sẽ chỉnh giảm,
cuộn tròn giá trị. Sau một thời gian nếu không chỉnh tăng hay giảm thì sẽ tự thoát khỏi
chế độ chỉnh.
Lưu tên file “bai_418_gio_phut_giay_3key_t3”.
a.Mục đích: Biết thêm cách lập trình để chỉnh thời gian.
b.Lưu đồ, giải thuật: Sử dụng timer để định thời 0.1 giây và báo ngắt giống các bài
trước. Thêm biến giá trị mode và khi nhấn phím mod thì thay đổi giá trị mode để
chọn đối tượng cần chỉnh. Nhấn phím UP hoặc DW để thay đổi đối tượng đang chọn.
c. Chương trình con “bai_418_gio_phut_giay_3key_tv.c”.
signed int8 bdn,giay,phut,gio;
signed int8 gt_mod,tg_chinh;
#int_timer3
void timer3_ct_con_ngat()
{

Thực hành vi điều khiển PIC 81


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
bdn++;
set_timer3(3036);
}

void h418_gpg_khoi_tao_ngat_timer3()
{
enable_interrupts(global);
enable_interrupts(int_timer3);
setup_timer_3(t3_internal|t3_div_by_8);
set_timer3(3036);
bdn=0; giay=0; phut=0;
}

void h418_gpg_hien_thi_binh_thuong()
{
giaima_bin_2so_vitri_vn(giay,0,kx_vn);
giaima_bin_2so_vitri_vn(phut,3,kx_vn);
giaima_bin_2so_vitri_vn(gio,6,kx_vn);
xuat_8led_7doan();
}

void h418_gpg_hien_thi_chop_tat()
{
if(bdn==0)
h418_gpg_hien_thi_binh_thuong();
if(bdn==5)
{
if((gt_mod==1)&&(input(bt0))&&(input(bt1)))
{
led_7d[7]=0xff; led_7d[6]=0xff;
}
if((gt_mod==2)&&(input(bt0))&&(input(bt1)))
{
led_7d[4]=0xff; led_7d[3]=0xff;
}
if((gt_mod==3)&&(input(bt0))&&(input(bt0)))
{
led_7d[1]=0xff; led_7d[0]=0xff;
}
xuat_8led_7doan();
}
}

void h418_gpg_tang_theo_bdn()
{
if (giay<59) giay++;
82 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
else
{
giay =0;
if(phut<59) phut++;
else
{
phut=0;
if(gio<24) gio++;
else gio=0;
}
}
}

void h418_gpg_phim_mod(usi16 dl_mod)


{
if(phim_mode_c2(dl_mod)==co_nhan)
{
if (gt_mod>=3) gt_mod=0;
else
{
gt_mod++; tg_chinh = 0;
}
h418_gpg_hien_thi_binh_thuong();
}
}

void h418_gpg_chinh_tang()
{
switch (gt_mod)
{
case 1: if (gio==23) gio=0;
else gio++;
break;
case 2: if (phut==59) phut=0;
else phut++;
break;
case 3: if (giay==59) giay=0;
else giay++;
break;
default: break;
}
}

void h418_gpg_chinh_giam()
{
switch (gt_mod)
Thực hành vi điều khiển PIC 83
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
{
case 1: if (gio==0) gio=23;
else gio--;
break;
case 2: if (phut==0) phut=59;
else phut--;
break;
case 3: if (giay==0) giay=59;
else giay--;
break;
default: break;
}
}

void h418_gpg_phim_up(usi8 dl_ud)


{
if(phim_up_c2(dl_ud)==co_nhan)
{
h418_gpg_chinh_tang();
h418_gpg_hien_thi_binh_thuong();
tg_chinh = 0;
}
}

void h418_gpg_phim_dw(usi8 dl_ud)


{
if(phim_dw_c2(dl_ud)==co_nhan)
{
h418_gpg_chinh_giam();
h418_gpg_hien_thi_binh_thuong();
tg_chinh = 0;
}
}

void b418_gpg_3bt(usi16 dl_mod,usi8 dl_ud)


{
if (bdn>=10)
{
bdn = bdn - 10;
h418_gpg_tang_theo_bdn();
h418_gpg_hien_thi_chop_tat();
if((tg_chinh>20)&&(gt_mod != 0)) gt_mod = 0;
else tg_chinh++;
}
else
{
84 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
h418_gpg_phim_mod(dl_mod);
h418_gpg_phim_up(dl_ud);
h418_gpg_phim_dw(dl_ud);
h418_gpg_hien_thi_chop_tat();
}
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_418_gio_phut_giay_3key_tv.c>

void main()
{
set_up_port();
h418_gpg_khoi_tao_ngat_timer3();
while(true)
{
b418_gpg_3bt(400,250);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Giờ phút giây đếm bắt đầu từ 00. Tiến hành nhấn phím MOD để
chọn chỉnh giờ, khi đó giờ chớp tắt, nhấp phím UP để tăng giờ hoặc nhấn DW để
giảm giờ cho đến giá trị mong muốn. Tương tự có thể chọn chỉnh phút và giây.
Khi chọn mà không chỉnh thì sau 20 giây thì sẽ tự động thoát khỏi chế độ chỉnh.
Bài này dùng hàm kiểm tra phím nhấn theo cách 2 mới thực hiện tốt, không làm chậm
quá trình đếm giây khi còn nhấn phím.

4.6 GIAO TIẾP VỚI BÀN PHÍM CẢM ỨNG CHẠM


Phần này thực hành giao tiếp với bàn phím cảm ứng chạm.
4.6.1 Giới thiệu module bàn phím cảm ứng
Module bàn phím cảm ứng sử dụng IC TTP được thiết kế có nhiều dạng như hình theo sau:
dạng 16 phím sử dụng chip TTP229, dạng 8 phím dùng chip TTP226 và dạng 4 phím dùng
TTP224 để phục vụ đa dạng cho người dùng, xem hình 4-7.
4.6.2 Các thông số cơ bản của bàn phím cảm ứng TTP229
Bộ thực hàng dùng module 16 phím dùng IC TTP229 phần này tóm lượt các thông số cần
thiết để sử dụng bàn phím này.
Nguồn điện áp hoạt động: 2V4 đến 5V5 – đã có mạch ổn áp bên trong.
Dòng hoạt động ở nhiều chế độ như tối đa là 2,5µA.
Sau khi cấp nguồn thì sau khoảng 0.5 giây thì mạch ổn định và cho phép hoạt động.
Độ nhạy có thể điều chỉnh bởi các tụ điện bên ngoài từ 1 đến 50pF.

Thực hành vi điều khiển PIC 85


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 4-7. Các dạng module bàn phím cảm ứng


Có khả năng giao tiếp trực tiếp chỉ sử dụng 8 phím từ 1 đến 8, tương ứng với 8 ngõ ra out1
đến out8. Bình thường ở mức logic 1, khi chạm xuống mức 0.
Có khả giao tiếp nối tiếp theo chuẩn 2 dây và chuẩn I2C. Tùy chọn chế độ sử dụng 8 phím
hoặc 16 phím bằng jumper thứ 2 ở hàng thứ 2, bên phải sang. Ngoài ra còn có tùy chọn chế độ
đơn phím hoặc chế độ đa phím như hình 4-8.

Hình 4-8. Chọn chế độ 8/16 phím, đơn phím hay đa phím
4.6.3 Giao tiếp theo chuẩn 2 dây của bàn phím cảm ứng TTP229
Bộ thực hành vi điều khiển được thiết kế giao tiếp theo dạng trực tiếp cho 1 số phím và
theo chuẩn 2 dây nối tiếp. Dạng trực tiếp thì giống như nút nhấn đơn đã thực hành ở chương 3
và đã viết ở dạng hàm con.
Phần này trình bày giao tiếp nối tiếp 2 dây chế độ 16 phím có dạng sóng như hình 4-9.
Chuẩn giao tiếp 2 dây: thì IC TTP229 sẽ nhận clock xung vào ở chân SCL và sẽ xuất dữ
liệu ra ở chân SDO.
Ban đầu 2 tín hiệu đều ở mức 1.

86 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Khi có chạm phím thì TTP229 sẽ điều khiển chân SDO tạo xung âm, có độ rộng là “DV”
theo hình và có giá trị khoảng 93µs.
Sau đó thiết bị chủ tạo xung clock ở chân SCL và TTP229 sẽ tiến hành gửi dữ liệu ra để
chủ nhận.

Hình 4-9. Giản đồ thời gian chế độ 16 phím


Với chế độ 16 phím thì cần 16 xung clock và TTP229 sẽ gửi 16 bit dữ liệu từ D0 đến D15.
16 phím tương ứng với 16 bit, phím nào nhấn thì bit dữ liệu tương ứng lên mức 1, ngược
lại thì ở mức 0. Tần số xung clock nằm trong giới hạn từ 1KHz đến 512kHz.
Còn nhiều giản đồ thời gian cho các chế độ khác và cả chế độ giao tiếp I2C. Hãy xem
datasheet để biết chi tiết. Phần này chỉ trình bày các nội dung cần thiết cho bài thực.
4.6.4 Các hàm trong thư viện của bàn phím cảm ứng TTP229
Trong thư viện “tv_pic_key.c” đã hỗ trợ 3 hàm giao tiếp với bàn phím cảm ứng TTP229
theo chuẩn nối tiếp 2 dây được đặt tên là “KP_CK” và “KP_DT”.
a. Hàm 407: Hàm đọc bàn phím TTP229.
unsigned int8 key_tip229()
{
unsigned int8 i,key=0;
{
for(i=1;i<17;i++)
{
output_low(kp_ck); delay_us(70);
if (!input(kp_dt)) key = i;
output_high(kp_ck); delay_us(70);
}
return key;
}
}
Giải thích: Ban đầu gán biến key bằng 0. Thực hiện vòng lặp for để đọc 16 bit mã từ D0 đến
D15 của 16 phím. Do tên của 16 phím là từ 1 đến 16 nên vòng lặp for cũng chạy
từ 1 đến 16 tương ứng.
Lệnh thứ nhất trong vòng lặp for làm tín hiệu KP_CK xuống mức 0. Delay 70µs.
Lệnh if sẽ tiến hành đọc giá trị của tín hiệu KP_DT và so sánh với logic 0. Nếu
đúng là đã chạm phím thì gán mã của phím đó chính là giá trị của biến i cho biến
key.
Lệnh thứ ba nâng tín hiệu KP_CK lên mức 1 để hoàn thành 1 chu kỳ đọc 1 bit.
Delay 70µs.

Thực hành vi điều khiển PIC 87


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Làm cho đến khi kết thúc vòng lặp để đọc đủ 16 bit của 16 phím. Cuối cùng trả về
kết quả “key”.
Nếu không chạm phím nào thì giá trị trả về bằng 0, nếu có chạm 1 phím bất kỳ thì
trả về đúng số thứ tự ứng với tên của phím.
b. Hàm 408: Hàm chống nhạy của bàn phím TTP229 theo cách 1.
unsigned int8 key_tip229_cdoi()
{
unsigned int8 key1,key;
key = key_tip229();
if((key>0)&&(key<17))
{
delay_ms(45);
key1=key_tip229();
if(key1==key) return key;
else return 0xff;
}
else return 0xff;
}
Giải thích:Gọi hàm đọc mã phím gán cho biến key.
Nếu có nhấn thì delay 45ms rồi gọi hàm đọc mã phím gán cho biến key1.
Nếu mã phím key bằng key1 thì xem như chấp nhận có nhấn phím và mã phím trả
về là key. Những trường hợp còn lại xem như không có nhấn phím hay nhiễu hay
do cảm ứng nhạy và kết quả trả về 0×FF. Con số 45 là do thực nghiệm mà có.
c. Hàm 409: Hàm chống nhạy của bàn phím TTP229 theo cách 2.
Ở cách trên thì hàm delay 45ms làm mất nhiều thời gian khi có nhấn phím. Nếu các yêu
cầu khác cần thực hiện liên tục thì cách này sẽ làm gián đoạn đáng kể. Phần tiếp theo sẽ trình
bày cách thứ 2 tốt hơn.
Cách 2 này thực hiện theo nguyên lý giống nút nhấn đơn ở phần trước: thực hiện nhiều lần,
mỗi lần chỉ mất hơn 1ms và thực hiện cho đủ 45 lần.
unsigned int8 dl_tip=0;
unsigned int8 key_tip229_cdoi_c2(usi8 dl)
{
unsigned int8 key;
key = key_tip229();
if((key>0)&&(key<17))
{
delay_ms(1);
dl_tip++;
if(dl_tip>dl)
{
dl_tip=0;
return key;
}

88 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
else return 0xff;
}
else return 0xff;
}
Giải thích: Mỗi lần được gọi thì hàm đọc mã phím gán cho biến key.
Nếu có nhấn thì delay 1ms, tăng biến “dl_tip” và so sánh nếu còn nhỏ hơn “dl”:
nếu chưa lớn hơn thì xem như chưa có nhấn phím. Ngược lại thì xem như có nhấn
phím và xóa biến “dl_tip” về 0 và trả về mã phím nhấn là “key”.

4.6.5 Các bài thực hành điều khiển dùng bàn phím cảm ứng TTP229

Bài mẫu 421. Viết chương trình đọc bàn phím touch hiển thị mã phím trên 5 led đơn
và giải mã hiển thị trên 2 led 7 đoạn thứ 1, 0.
Lưu tên file “bai_421_touch_ma_phim”.
Mục đích: Biết đọc mã phím của bàn phím cảm ứng TTP229.
a.
Lưu đồ, giải thuật: Đọc mã phím so sánh nằm trong giới hạn 16 phím thì xem như có
b.
phím nhấn thì tiến hành xuất ra led đơn và giải mã xuất ra led 7 đoạn.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
unsigned int8 mp8;

void b421_ttp229_doc_16phim()
{
mp8 = key_tip229_cdoi_c2(10);
if((mp8>0)&&(mp8<17))
{
xuat_32led_don_4byte(0,0,0,mp8);
giaima_bin_2so_vitri_vn(mp8,0,kx_vn);
xuat_8led_7doan();
}
}

void main()
{
set_up_port();
while(true)
{
b421_ttp229_doc_16phim();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Tiến hành chạm phím và quan sát kết quả trên led đơn và 7 đoạn.
Thực hành vi điều khiển PIC 89
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
f. Hãy cho biết tại sao không hiển thị ra 4 led đơn mà phải là 5 led đơn?

Bài tập 422. Hãy viết chương trình đọc bàn phím touch và hiển thị mã phím trên 1 led
7 đoạn thứ 0: các phím từ 1 đến 9 thì vẫn hiển thị tương ứng 1 đến 9, phím 10 đến 15 thì
hiển thị tương ứng A đến F, phím 16 thì hiển thị số 0.
Lưu tên file “bai_422_touch_ma_phim_hex”.

Bài mẫu 423. Hãy viết chương trình đọc bàn phím touch và hiển thị mã phím trên 8
led 7 đoạn dịch trái: khi nhấn thì phím sẽ xuất hiển ở led thứ 0 và các số trước đó dịch
sang trái 1 led. Ban đầu 8 led tắt. Thêm delay 500ms giữa 2 lần nhấn để giảm tốc độ.
Lưu tên file “bai_423_touch_ma_phim_dich_trai”.
Mục đích: Biết dữ liệu dịch trái mảng chứa mã 7 đoạn khi nhấn phím.
a.
Lưu đồ, giải thuật: Tạo mảng có 8 phần tử hiển thị trên 8 led tương ứng. Gọi hàm
b.
quét phím: nếu có nhấn thì dịch mảng sang trái 1 phần tử, giải mã hiển thị mã phím
mới và lưu vào phần tử cuối cùng bên phải – chính là phần tử thứ 7.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
unsigned int8 mp8;

void h423_dpst_8led_7doan()
{
for(int i=7; i>0; i--)
led_7d[i] = led_7d[i-1];
}

void b423_doc_16phim_single_dpst_8led()
{
mp8 = key_tip229_cdoi_c2(10);
if((mp8>0)&&(mp8<17))
{
h423_dpst_8led_7doan();
led_7d[0] = ma7doan[mp8%16];
xuat_8led_7doan();
delay_ms(500);
}
}

void main()
{
set_up_port();
while(true)
{

90 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
b423_doc_16phim_single_dpst_8led();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Nhấn các phím sẽ thấy chúng dịch vào từ phải sang trái.
f. Giải thích: Hàm đọc mã phím touch và nếu có nhấn phím thì gọi hàm dịch mảng 8
phần tử sang trái 1 vị trí. Giải mã 7 đoạn lưu vào phần tử thứ 0, xuất ra 8 led và delay
50ms để giảm tốc độ nhấn phím. Có thể thay đổi delay.

Bài tập 424. Hãy viết chương trình giống bài 423 nhưng theo chiều dịch từ trái sang
phải. Bài 423 xem như chọn lối vào phải, bài 424 xem như chọn lối vào trái.
Lưu tên file “bai_424_touch_ma_phim_dich_phai”.

Bài tập 425. Hãy viết chương trình giống bài 423 nhưng chỉ dịch các phím số từ 0 đến
9. Các phím còn lại làm phím chức năng: Phím 10 khi nhấn thì không cho dịch nữa, phím
11 khi nhấn thì cho phép dịch tiếp, phím 12 thì xóa hết và tắt, phím 13 thì undo 4 cấp,
phím 15 redo lại sau khi nhấn undo. Dùng thêm 32 led đơn để chỉ thị các chế độ.
Lưu tên file “bai_425_touch_ma_phim_dich_undo”.

Bài tập 426. Hãy viết chương trình điều khiển 8 led đơn từ 0 đến 7 theo yêu cầu:
Các phím từ 1 đến 8 sẽ làm 8 led sáng, các phím từ 8 đến 16 thì làm tắt 8 led.
Xem như 1 cặp phím điều khiển ON/OFF 1 led, 8 cặp cho 8 led độc lập nhau.
Lưu tên file “bai_426_touch_on_off_8led”.

Bài tập 427. Hãy viết chương trình điều khiển 16 led đơn từ 0 đến 15 theo yêu cầu:
Phím 1 điều khiển ON/OFF led LD0, … tương tự cho 15 phím còn lại.
Lưu tên file “bai_427_touch_on_off_16led”.

4.6.6 Các bài thực hành cài giới hạn bằng bàn phím cảm ứng TTP229

Bài mẫu 428. Hãy viết chương trình định thời 2 số có cài bằng bàn phím touch.
Có 1 mạch đếm giây từ 00 đến 99 hiển thị ở 2 led 7, 6. Ban đầu hiển thị số 00.
Thời gian cài đặt hiển thị ở 2 led 1, 0. Ban đầu hiển thị số 00.
Chức năng các phím: Dùng các phím từ “0” đến “9” để nhập thời gian cài đặt 2 số
trong phạm vi từ 05 dến 99 lối vào phải.
Phím “10” khi nhấn thì không cho thay đổi và nếu số cài nhỏ hơn 5 thì tự động cho
bằng 5 và cho mạch đếm giây bắt đầu đếm từ 00, nếu 32 led đơn tắt thì tắt.
Thực hành vi điều khiển PIC 91
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Khi giá trị đếm giây bằng giá trị cài thì 32 led đơn sáng – mạch đếm giây ngừng.
Phím “11” có chức năng tắt 32 led đơn.
Phím “12” có chức năng hủy quá trình đang đếm sau khi nhấn phím “10”.
Các phím còn lại không quan tâm.
Lưu tên file “bai_428_touch_dinh_thoi_2so”.
a. Mục đích: Biết lập trình cho một hệ thống định thời nhỏ.
b. Lưu đồ giải thuật:
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
usi8 mp8,giay,giay_cai,bdn;
int1 tt_ena_dis=0, tt_on_off=0;

#int_timer3
void timer3_ct_con_ngat()
{
bdn++;
set_timer3(3036);
}

void timer3_xung_noi_on(int1 tt)


{
setup_timer_3(t3_internal|t3_div_by_8);
if(tt==true) set_timer3(3036);
}

void timer3_xung_noi_off(int1 tt)


{
setup_timer_3(t3_disabled);
if(tt==true) set_timer3(3036);
}

void h428_dem_giay_dinh_thoi_timer3()
{
if(tt_on_off==tt_on)
{
if (bdn>=10)
{
bdn = 0;
giay++;
}
if((giay==giay_cai)&&(tt_on_off==tt_on))
{
sang_32led();

92 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
tt_on_off = tt_off;
tt_ena_dis = disable;
timer3_xung_noi_off(no_reset);
buzzer_on_off(200);
}
}
}

void h428_hien_thi_dinh_thoi_giay_2so()
{
led_7d[1] = ma7doan[bcd_8led[1]];
led_7d[0] = ma7doan[bcd_8led[0]];
giaima_bin_2so_vitri_vn(giay,6,kx_vn);
xuat_8led_7doan();
}

void h428_cai_giay_dinh_thoi_2so()
{
mp8 = key_tip229_cdoi_c2(10);
if((mp8>0)&&(mp8<17))
{
mp8 = mp8%16;
if((mp8<10)&&(tt_ena_dis!=enable))
{
bcd_8led[1] = bcd_8led[0];
bcd_8led[0] = mp8;
delay_ms(200);
}
else if(mp8==10)
{
tt_on_off = tt_on;
tt_ena_dis = enable;
giay_cai=bcd_8led[1]*10 +bcd_8led[0];
if(giay_cai<5)
{
giay_cai = 5;
bcd_8led[1]=0; bcd_8led[0]=5;
}
giay=0;
tat_32led();
timer3_xung_noi_on(co_reset);
}
else if(mp8==11) tat_32led();
else if(mp8==12)
{
tt_on_off = tt_off;
Thực hành vi điều khiển PIC 93
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
tt_ena_dis = disable;
timer3_xung_noi_off(no_reset);
giay=0;
}
}
}

void b428_dinh_thoi_giay_2so()
{
h428_cai_giay_dinh_thoi_2so();
h428_dem_giay_dinh_thoi_timer3();
h428_hien_thi_dinh_thoi_giay_2so();
}

void main()
{
set_up_port();
enable_interrupts(global);
enable_interrupts(int_timer3);
bdn=0; giay=0;
while(true)
{
b428_dinh_thoi_giay_2so();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Nhập giây cài từ các phím số 0 đến 9. Sau đó nhấn phím 10 để bắt
đầu đếm giây cho đến khi bằng gây cài thì đếm giây ngừng và 32 led đơn sáng. Có
thể nhập lại thời gian cài khác.

Bài tập 429. Hãy viết chương trình giống bài 438 nhưng đếm và cài đều là 3 số.
Lưu tên file “bai_429_touch_dinh_thoi_3so”.

Bài tập 430. Giống bài 414 nhưng dùng bàn phím cảm ứng để thay đổi giới hạn. Giới
hạn mặc nhiên ban đầu là 50. Thay phím đơn Stop bằng phím A và phím đơn Run bằng
phím D.
Lưu tên file là “bai_430_dem_xung_t0_stop_run_32led_gh_touch”.

4.7 GIAO TIẾP BỘ MÃ HÓA QUAY VÒNG ROTARY ENCODER


Bộ mã hóa vòng quay là một loại cảm biến vị trí chuyển đổi vị trí góc (quay) của núm xoay
thành tín hiệu đầu ra được sử dụng để xác định hướng xoay của núm.

94 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Do tính mạnh mẽ và khả năng kiểm soát kỹ thuật số tốt, chúng được sử dụng trong nhiều
ứng dụng bao gồm robot, máy CNC và máy in.
Có hai loại bộ mã hóa quay - tuyệt đối và tăng dần.
Bộ mã hóa tuyệt đối cung cấp cho chúng ta vị trí chính xác của núm theo độ trong khi bộ
mã hóa tăng dần báo cáo số gia tăng mà trục đã di chuyển.
Bộ mã hóa quay được sử dụng trong hướng dẫn này thuộc loại tăng dần.
Bộ mã hóa quay là loại tương đương kỹ thuật số hiện đại của chiết áp và linh hoạt hơn so
với chiết áp. Chúng hoàn toàn có thể quay mà không có điểm dừng trong khi chiết áp chỉ có thể
quay khoảng 3/4 vòng tròn.
Chiết áp là tốt nhất trong những trường hợp ta cần biết vị trí chính xác của núm vặn. Tuy
nhiên, các bộ mã hóa quay là tốt nhất trong các tình huống mà ta cần biết sự thay đổi vị trí thay
vì vị trí chính xác.
4.7.1 Tên các chân của bộ mã hóa xoay
Hình ảnh bộ mã hóa xoay với tên các tín hiệu như hình 4-10.

Hình 4-10. Bộ mã hóa xoay vòng và tên các tín hiệu


GND là chân nối mass. VCC là điện áp cung cấp dương, thường là 3,3 hoặc 5V.
SW là ngõ ra của công tắc nút nhấn: khi không nhấn thì ở mức ‘1’. Khi nhấn thì nối GND
nên xuống mức ‘0’.
Chú ý: Một số bộ mã hóa chưa hàn điện trở kéo lên cho nút nhấn thì bạn phải hàn thêm
mới sử dụng được.
CLK là xung ngõ ra để xác định lượng quay. Mỗi lần xoay núm bằng một lần tách (giống
nhấp chuột) theo một trong hai hướng, ngõ ra ‘CLK’ sẽ trải qua một chu kỳ là ‘1’ rồi xuống ‘0’.
DT giống như ngõ ra CLK, nhưng nó trễ hơn CLK do lệch pha 90°. Ngõ ra này có thể được
sử dụng để xác định hướng quay.
Chú ý: Ngõ ra CLK còn được gọi là ngõ ra A và DT còn được gọi là ngõ ra B.
4.7.2 Cách thức hoạt động của bộ mã hóa quay
Bên trong bộ mã hóa thì cả ba tín hiệu A, B và SW được nối lên nguồn Vcc qua điện trở
10kΩ – giống như điện trở kéo lên của nút nhấn bình thường.
Trong đó SW thì hoạt động giống nút nhấn: khi không nhấn thì ở mức logic ‘1’. Khi nhấn
thì nối GND nên xuống mức logic ‘0’.
Thực hành vi điều khiển PIC 95
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Còn 2 tín hiệu A và B thì hoạt động theo cơ chế khác là bên trong còn có một đĩa có rãnh
có chức năng khi xoay đĩa thì làm cho 2 tín hiệu A và B nối GND ở 1 vị trí và sau đó nếu xoay
đĩa sang vị trí còn lại thì chúng lại hở ra – tương ứng với nút nhấn có nhấn và không nhấn. Chúng
cũng tạo ra mức logic ‘1’ và ‘0’ giống nhau nhưng một cái nhấn và 1 cái thì xoay.
Có thể nói ngắn gọn là khi xoay thì làm 2 tín hiệu A và B lần lượt nối GND là C. Xem hình
4-11. Đĩa xoay và khoảng cách vị trí thiết kế làm 2 tín hiệu A và B lệch nhau 90°. Đây được gọi
là mã hóa cầu phương.
Khi bạn xoay núm theo chiều kim đồng hồ, chân A kết nối đầu tiên, tiếp theo là chân B.
Khi bạn xoay núm ngược chiều kim đồng hồ, chốt B kết nối đầu tiên, tiếp theo là chốt A.

Hình 4-11. Bộ mã hóa xoay vòng


Bằng cách theo dõi thời điểm mỗi chân kết nối và ngắt kết nối với GND, chúng ta có thể
sử dụng những thay đổi tín hiệu này để xác định núm xoay đang được xoay theo hướng nào.
Bạn có thể làm điều này bằng cách đơn giản quan sát trạng thái của B khi A thay đổi trạng
thái. Khi A thay đổi trạng thái:
Nếu B! = A, thì núm xoay đã được xoay theo chiều kim đồng hồ. Xem hình 4-12.

Hình 4-12. Dạng sóng theo chiều kim đồng hồ - chiều thuận
Nếu B = A thì núm xoay ngược chiều kim đồng hồ. Xem hình 4-13.

Hình 4-13. Dạng sóng ngược chiều kim đồng hồ - chiều nghịch
4.7.3 Giao tiếp vi điều khiển với bộ mã hóa xoay vòng
96 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Trong bộ kit thực hành thì vi điều khiển giao tiếp với module này bằng 3 port.
Tín hiệu A, B và SW nối với pin_b5, pin_e4 và pin_f0.
4.7.4 Thư viện của module mã hóa xoay vòng
Trong thư viện “tv_01_18f6722_define” đã định nghĩa các port giao tiếp với 3 tín hiệu của
bộ mã hóa xoay vòng.
a. Các định nghĩa: Các tên của module mã hóa xoay vòng.
#define rtenc_a pin_b5
#define rtenc_b pin_e4
#define rtenc_sw pin_f0
Trong thư viện “tv_rotary_encoder.c” có khai báo các biến và các hàm.
b. Hàm 410: Biến vị trí, vị trí trước và vị trí hiện tại.
signed int8 rti;
signed int8 vt_tr=0,vt_ht=5;
c. Hàm 411: Hàm xác định vị trí.
void vitri_rotary_360()
{
if((input(rtenc_a)==0)&&(input(rtenc_b)==0)) vt_ht=0;
else if((input(rtenc_a)==1)&&(input(rtenc_b)==0)) vt_ht=1;
else if((input(rtenc_a)==1)&&(input(rtenc_b)==1)) vt_ht=2;
else if((input(rtenc_a)==0)&&(input(rtenc_b)==1)) vt_ht=3;
}
Giải thích:Hàm có chức năng xác định 4 trạng thái của bộ mã hóa xoay và gán giá trị vị trí
hiện tại tương ứng.
d. Hàm 412: Hàm xác định chiều xoay và giá trị thay đổi trong giới hạn.
void doc_rotary_360(signed int8 ght, signed int8 ghd)
{
vitri_rotary_360();
if(vt_tr==0)
{
if(vt_ht==1) rti++;
else if(vt_ht==3) rti--;
}
else if(vt_tr==1)
{
if(vt_ht==2) rti++;
else if(vt_ht==0) rti--;
}
else if(vt_tr==2)
{
if(vt_ht==3) rti++;
else if(vt_ht==1) rti--;
}
else if(vt_tr==3)
{
Thực hành vi điều khiển PIC 97
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
if(vt_ht==0) rti++;
else if(vt_ht==2) rti--;
}
vt_tr=vt_ht;
if(rti>ght) rti = ght;
if((rti)<(ghd)) rti = ghd;
}
Giải thích: Đọc vị trí hiện tại, so sánh với vị trí trước đó để xác định chiều tăng hay giảm, cập
nhật vị trí mới, so sánh giới hạn biên trên và biên dưới.

4.7.5 Các bài thực hành ứng dụng bộ mã hóa xoay vòng

Bài mẫu 431. Viết chương trình đọc vị trí của bộ mã hóa xoay hiển thị trên các led 7
đoạn trong phạm vi từ [+100,-100].
Lưu tên file “bai_431_rotary_vitri_7doan”.
a. Mục đích: Biết đọc vị trí của bộ mã hóa xoay và hiển thị giá trị xoay thay đổi theo
chiều tăng giảm và giới hạn thay đổi.
b. Lưu đồ, giải thuật: Căn cứ vào dạng xung để biết chiều xoay tăng giảm.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void hien_thi_7doan()
{
signed int8 rti_t;
if(rti<0)
{
rti_t = (-rti); led_7d[3] = 0xbf;
}
else
{
rti_t = rti; led_7d[3] = 0xb9;
}
giaima_bin_3so_vitri_vn(rti_t,0,cx_vn);
led_7d[7] = ma7doan[vt_ht];
led_7d[5] = ma7doan[vt_tr];
xuat_8led_7doan();
}

void main()
{
set_up_port();
rti=0;
hien_thi_7doan();
vitri_rotary_360();
vt_tr=vt_ht;
hien_thi_7doan();

98 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
while(true)
{
doc_rotary_360(100,-100);
hien_thi_7doan();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Tiến hành xoay RT theo chiều kim đồng hồ và quan sát kết quả trên
led 7 đoạn tăng theo chiều dương. Xoay ngược thì giảm theo chiều âm. Giới hạn 100.

Bài tập 432. Hãy viết chương trình điều khiển 32 led đơn: khi xoay theo chiều thuận
thì 32 led std pst, khi sáng hết và nếu xoay tiếp thì tắt dần. Tương tự thì xoay chiều nghịch
thì làm 32 led std_tsp.
Lưu tên file “bai_432_rotary_std_32led”.

4.8 KẾT HỢP HAI MODULE 32 LED VÀ 8 LED 7 ĐOẠN


Phần này thực hành kết hợp 2 module gồm module 32 led đơn và 8 led 7 đoạn.
Bài mẫu 433. Tổng hợp các bài: vừa đếm thời gian giờ phút giây hiển thị 8 led 7 đoạn,
vừa điều khiển 32 led đơn sáng 82 yêu cầu tự động.
Có thêm 3 nút UP, DW và MOD để chỉnh thời gian.
Lưu tên file “bai_433_tong_hop_module_1_2”.
a. Mục đích: Biết kết hợp các module 32 led đơn, 8 led 7 đoạn, các nút nhấn.
b. Lưu đồ, giải thuật: Kết hợp 2 module với các yêu cầu đã thực hiện.
c. Các chương trình con: Hàm thực hiện đồng hồ và tổng hợp điều khiển 32 led đã có.
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <chuong3_32led_if_no_delay.c>
#include <bai_418_gio_phut_giay_3key_tv.c>

void main()
{
set_up_port();
h418_gpg_khoi_tao_ngat_timer3();
while(true)
{
b418_gpg_3bt(30,30);
b339_32led_tong_hop_tu_dong_if();
delay_ms(20);
}
}
e. Tiến hành biên dịch và nạp.
Thực hành vi điều khiển PIC 99
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
f. Quan sát kết quả: Vừa đếm giờ phút giây có thể chỉnh được và điều khiển 32 led đúng
82 yêu cầu. Để chỉnh được thời gian của đồng hồ thì phải giảm thời gian của phím
mod và phím UP và Dw xuống để đáp ứng nhanh vì bài này vi điều khiển phải thực
hiện thêm các yêu cầu điều khiển 32 led.

100 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 5: THỰC HÀNH


MODULE LCD 20×4,
COUNTER/TIMER, BÀN PHÍM
CẢM ỨNG TOUCH, ROTARY
ENCODER, THỜI GIAN THỰC

Thực hành vi điều khiển PIC 101


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
5.1 LÝ THUYẾT LCD
Đã trình bày ở sách lý thuyết vi điều khiển nên không trình bày lại.
5.2 LCD TRONG KIT THỰC HÀNH VÀ THƯ VIỆN
5.2.1 Mạch giao tiếp vi điều khiển với LCD
Trong phần này sẽ trình bày phần giao tiếp vi điều khiển với LCD như hình 5-1.

Hình 5-1. Giao tiếp vi điều khiển với LCD qua thanh ghi dịch MBI5026
Bộ thực hành sử dụng IC thanh ghi MBI5026 để mở rộng port điều khiển LCD.
Phần vi điều khiển PIC giao tiếp với IC thanh ghi dịch MBI5026:
Có 4 tín hiệu điều khiển là:
 MBI_SDI dùng để dịch dữ liệu nối tiếp.
 MBI_SCK dùng để cấp xung clock.
 MBI_LE3 điều khiển nạp dữ liệu song song từ TG dịch sang TG lưu trữ.
 MBI_OE dùng để cho phép xuất dữ liệu.
Hai tín hiệu MBI_SDI và MBI_SCK nối với IC thông qua 2 jumper đã được gắn sẵn đề
phòng khi có vấn đề về phần cứng thì cách ly để tìm hư hỏng.
Có 1 SW2 để cấp nguồn cho LCD, SW đã chuyển sang vị trí ON để cấp nguồn.
Phần IC thanh ghi dịch MBI5026 giao tiếp với LCD:
Có 16 tín hiệu ngõ ra với các chức năng như sau:
 Từ out0 đến out7: giao tiếp với bus 8 dữ liệu của LCD theo chế độ 8 bit (vẫn có thể
thực hành được chế độ 4 bit).

102 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
 Ba tín hiệu out8, out9, out10: làm các tín hiệu điều khiển LCD tương ứng với E,
RW và RS.
 Tín hiệu out11: làm tín hiệu cho phép tắt mở đèn nền để tiết kiệm nguồn năng lượng
(P) và tăng tuổi thọ của đèn nền khi không sử dụng. Mức logic 0 làm đèn nền sáng,
mức 1 hoặc khi ngõ ra ở trạng thái tổng trở cao thì đèn nền tắt.
 Bốn tín hiệu còn lại nối với pinheader. Hai bit 12 và 13 nối với M0 và M1 của Lora.
5.2.2 Thư viện hỗ trợ hàm xuất dữ liệu ra LCD
Trong thư viện trên đã viết hàm xuất dữ liệu 2 byte ra IC MBI 5026 điều khiển LCD.
a. Hàm 501: Hàm xuất 2 byte ra module LCD.
void xuat_lcd(usi8 ctrl,db)
{
spi_write2(~ctrl); spi_write2(~db);
output_high(mbi_le3); output_low(mbi_le3);
}

5.2.3 Thư viện LCD


a. Định nghĩa các port: Khai báo và định nghĩa các bit điều khiển của LCD:
unsigned int8 lcd_ctrl = 0xff;
#bit lcd_p = lcd_ctrl.3
#bit lcd_rs = lcd_ctrl.2
#bit lcd_rw = lcd_ctrl.1
#bit lcd_e = lcd_ctrl.0
b. Định nghĩa các lệnh: Định nghĩa lệnh các lệnh của LCD.
#define lcd_clear_display 0x01
#define lcd_cursor_home 0x02

#define lcd_fs_function_set 0x20 //constant


#define fs_8bit 0x10
#define fs_2line 0x08
#define fs_5x10 0x04

#define lcd_dc_display_control 0x08 //constant


#define dc_display_on 0x04
#define dc_cursor_on 0x02
#define dc_blink_on 0x01

#define lcd_em_entry_mode 0x04 //constant


#define em_shift_inc 0x01
#define em_left 0x02

#define lcd_cd_cursor_display 0x10 //constant

Thực hành vi điều khiển PIC 103


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
#define cd_display_move 0x08
#define cd_move_right 0x04

#define lcd_ddram_addr 0x80


#define lcd_cgram_addr 0x40
c. Hàm 502: Hàm xuất 8 bit db ra module LCD:
void lcd_xuat_8bit(int8 db)
{
lcd_e=1; xuat_lcd(lcd_ctrl,db); delay_us(20);
lcd_e=0; xuat_lcd(lcd_ctrl,db);
}
d. Hàm 503: Hàm gửi mã lệnh ra điều khiển LCD:
void lcd_command(int8 db)
{
lcd_rs = 0; lcd_xuat_8bit(db);
}
e. Hàm 504: Hàm gửi dữ liệu ra LCD để hiển thị:
void lcd_data(int8 db)
{
lcd_rs = 1; lcd_xuat_8bit(db);
}
f. Hàm 505: Hàm khởi tạo LCD:
void lcd_setup()
{
lcd_e = 0; lcd_rw = 0;
lcd_rs = 1; lcd_p = 0;
lcd_command(lcd_fs_function_set|fs_8bit|fs_2line|fs_5x8);
delay_us(40);
lcd_command(lcd_dc_display_control|dc_display_on);
delay_us(40);
lcd_command(lcd_clear_display);
delay_ms(2);
lcd_command(lcd_em_entry_mode|em_left);
delay_us(40);
}
g. Hàm 506: Hàm di chuyển con trỏ đến tọa độ (x,y) trên LCD:
void lcd_goto_xy(si8 x,si8 y)
{
const unsigned int8 lcd_vitri[]={0x80,0xc0,0x94,0xd4};
lcd_command(lcd_vitri[x]+y);
}
Với LCD 20×4 thì tọa độ theo hàng bây giờ là từ 0 đến 3, cột từ 0 đến 19.
104 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
h. Hàm 507: Hàm mở đèn backlight:
void lcd_back_light_on()
{
lcd_p = 0; xuat_lcd(lcd_ctrl,0x00);
}
i. Hàm 508: Hàm tắt đèn backlight:
void lcd_back_light_off()
{
lcd_p = 1; xuat_lcd(lcd_ctrl,0x00);
}

5.3 CÁC CHƯƠNG TRÌNH SỬ DỤNG VÙNG NHỚ DDRAM


Trong LCD có 2 vùng nhớ thì phần này sử dụng vùng nhớ DDRAM, phần sau sẽ dùng
vùng nhớ CGRAM còn lại.
5.3.1 Các ứng dụng hiển thị ký tự, dịch chuổi trên LCD
Bài mẫu 501. Chương trình điều khiển LCD 20×4 hiển thị 4 hàng kí tự. Bạn có thể
thay đổi nội dung hiển thị tùy thích nhưng chỉ trong phạm vi 20 ký tự cho mỗi hàng.
Lưu tên file “bai_501_lcd_ht_4hang”.
a.Mục đích: Biết khởi tạo LCD, biết hiển thị chuỗi ký tự trên các hàng của LCD.
b.Lưu đồ, giải thuật: Khởi tạo LCD, thiết lập địa chỉ hàng 0, gửi chuổi dữ liệu ra hàng
0 để hiển thị, tương tự cho 3 hàng còn lại.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void b501_lcd_hien_thi_chuoi()
{
unsigned char hang0[]={"BO THUC HANH VDK MCU"};
unsigned char hang1[]={"PIC 18F6722/ARDUINO "};
unsigned char hang2[]={"NGUYEN DINH PHU SPKT"};
unsigned char hang3[]={"LIEN HE: 0903982443"};
unsigned int8 i;
lcd_goto_xy(0,0);
for (i=0;i<20;i++) lcd_data(hang0[i]);
lcd_goto_xy(1,0);
for (i=0;i<20;i++) lcd_data(hang1[i]);

lcd_puts(2,0,hang2);
lcd_puts(3,0,hang3);
}

void main()
{

Thực hành vi điều khiển PIC 105


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
set_up_port();
lcd_setup();
while(true)
{
b501_lcd_hien_thi_chuoi();
while(true);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Hiển thị nội dung 4 hàng đã khai báo trong chương trình.

Bài mẫu 502. Chương trình hiển thị 2 chuỗi ở hàng 0 và 1, sau đó dịch trái với thời
gian trễ giây.
Lưu tên file “bai_502_lcd_ht_2hang_dich_trai”.
a.Mục đích: Biết dịch chuỗi ký tự trên các hàng của LCD.
b.Lưu đồ, giải thuật: Khởi tạo LCD, hiển thị 2 hàng 0 và 1. Sau đó tiến hành gọi hàm
điều khiển cursor display của LCD or thêm lựa chọn “cd_move_left”
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void main()
{
set_up_port();
lcd_setup();
lcd_goto_xy(0,0);
lcd_data("khoa dien - dien tu ");
lcd_goto_xy(1,0);
lcd_data("bm dientucong nghiep");
delay_ms(1000);
while(true)
{
lcd_command(lcd_shift_left);
delay_ms(1000);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Hiển thị 2 hàng chuỗi và sau đó dịch chuyển xuống hai hàng dưới
rồi dịch lại 2 hàng trên.

Bài tập 503. Hãy viết chương trình hiển thị 4 hàng thông tin tùy ý.
Khi nhấn BT0 thì chỉ nội dung của hàng thứ 0 dịch trái cuộn tròn. Khi nhấn BT1 thì
ngừng. Nhấn BT2 thì dịch phải cuộn tròn.
Các hàng còn lại đứng yên. Thời gian delay 1s.

106 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Lưu tên file “bai_503_lcd_hang0_dich_trai_phai_3btn”.

Bài tập 504. Hãy viết chương trình hiển thị 4 hàng thông tin tùy ý.
Khi nhấn BT0 lần 1 thì chỉ nội dung của hàng thứ 0 dịch trái cuộn tròn. Khi nhấn lần
2 thì ngừng. Khi nhấn lần 3 thì dịch phải cuộn tròn. Khi nhấn lần 4 thì ngừng. Lần 5 lặp
lại của lần 1.
Các hàng còn lại đứng yên. Thời gian delay 1s.
Lưu tên file “bai_504_lcd_hang0_dich_trai_phai_1btn”.

5.3.2 Các ứng dụng kết hợp bàn phím cảm ứng và LCD
Phần này thực hành các bài kết hợp LCD và bàn phím cảm ứng để cài giới hạn.
Bài tập 505. Hãy viết chương trình có chức năng khi nhấn phím bất kỳ của bàn phím
cảm ứng thì mã phím đó xuất hiện tại tận cùng bên phải của hàng 1, các ký tự đã nhấn sẽ
dịch sang trái. Các ký tự hàng còn lại không thay đổi. Giống các bài 423.
Hàng 0 hiển thị thông tin : “hay nhan phim bat ky”
Lưu tên file là “bai_505_lcd_ touch_dich_hang1”
a. Mục đích: Biết kết hợp bàn phím ma trận với LCD.
b. Lưu đồ, giải thuật: Quét bàn phím, nếu có thì tiến hành dịch mảng hàng 1 sang trái 1
vị trí, giải mã ASCII của mã phím nhấn và lưu vào phần tử cuối của mảng.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
unsigned int8 hang1[20];
unsigned int8 mp,i;
void xoa_hang_1()
{
for(i=0;i<20;i++) hang1[i]=" ";
}
void lcd_dich_ht_mp()
{
for(i=0;i<19;i++) hang1[i]=hang1[i+1];
mp = mp%16;
if(mp<10) hang1[19]=(mp+0x30);
else hang1[19]=(mp+0x37);
lcd_goto_xy(1,0);
for (i=0;i<20;i++) lcd_data(hang1[i]);
}

void main()
{
set_up_port();
lcd_setup();
Thực hành vi điều khiển PIC 107
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
lcd_goto_xy(0,0);
lcd_data("hay nhan phim bat ky");
xoa_hang_1();
while(true)
{
mp = key_tip229_cdoi_c2(10);
if(mp!=0xff)
{
lcd_dich_ht_mp();
delay_ms(200); //de giam toc do
}
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Hãy tiến hành nhấn phím thì sẽ xuất hiện ở hàng 1 và các ký tự
trước đó dịch sang trái là đúng.
f. Giải thích chương trình: tại sao cộng 0x30 và 0x37?

Bài tập 506. Hãy viết chương trình có chức năng khi mới cấp điện thì 3 hàng 1, 2, 3
hiển thị ký tự trắng, khi nhấn phím bất kỳ của bàn phím ma trận 4x4 thì mã phím đó xuất
hiện tại tận cùng bên phải của hàng 1, nhấn nửa thì dịch sang trái, cho đến khi được 20
kí tự mà nhấn nửa thì xuống hàng 2, khi đủ 20 ký tự thì dịch xuống hàng 3.
Hàng 0 hiển thị thông tin: “ hay nhan phim bat ky”
Lưu tên file là “bai_506_lcd_mtp4x4_dich_3hang_123”

Bài tập 507. Hãy viết chương trình có chức năng hiển thị 3 hàng thông tin bên dưới.
Trong đó XX là thời gian cài đặt 2 số từ 0 đến 59 bằng các phím số từ 0 đến 9 của bàn
phím ma trận. Khi nhấn phím A thì 32 led đơn nếu chưa tắt thì tắt, thời gian đếm giây YY
bắt đầu từ 0 cho đến khi bằng XX thì 32 led sáng, buzzer kêu đúng 5 giây rồi tắt. Nhấn
phím C để tắt 32 led. Khi đang đếm mà nhấn phím B thì ngừng, nhấn lại để đếm tiếp.
Phím E thì xóa YY về 0 và ngừng. Trong quá trình đang đếm thì không cho thay đổi giá
trị XX. Khi buzzer kêu thì ZZZ sẽ hiển thị chữ “ ON”, khi buzzer hết kêu thì hiển thị chữ
“OFF”.
Hàng 0 hiển thị thông tin : “Dieu Khien Buz: ZZZ”
Hàng 1 hiển thị thông tin : “Thoi gian cai: XX”
Hàng 2 hiển thị thông tin : “Thoi gian dem: YY”
Lưu tên file là “bai_507_lcd_mtp4x4_buzzer_on_off”

5.3.3 Đếm xung ngoại dùng timer T0 hiển thị trên LCD

108 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Do đếm xung và cài giới hạn đã làm và hiển thị trên led 7 đoạn nên phần này là các bài tập
vận dụng để mở rộng thêm phần hiển thị trên LCD.
Bài tập 508. Hãy viết chương trình đếm sản phẩm dùng counter T0 hiển thị trên module
8 led 7 đoạn và hiển thị trên LCD 20×4 ở hàng thứ 1, giới hạn đếm từ 00 đến 50. Mở
rộng của bài 411, thêm phần hiển thị trên LCD.
Lưu tên file là “bai_508_lcd_8l7d_dem_sp_t0”

Bài tập 509. Hãy hiệu chỉnh bài 412 thêm phần hiển thị trên LCD.
Hàng 0 hiển thị giá trị cài, hàng 1 hiển thị giá trị đếm.
Lưu tên file là “bai_509_lcd_8l7d_dem_sp_t0_ud”

5.4 CÁC ỨNG DỤNG VÙNG NHỚ CGRAM CỦA LCD


5.4.1 Vùng nhớ CGRAM
Ở mục trước ta đã sử dụng LCD có chức năng hiển thị các ký tự hoặc các chuỗi ký tự thì
các ký tự đó thuộc mã ASCII và đã tạo sẵn trong chip điều khiển LCD, bạn chỉ cần gởi đúng mã
ASCII thì ký tự đó sẽ được hiển thị.
Phần này chúng ta sẽ sử dụng vùng nhớ còn lại là CGRAM mà nhà chế tạo LCD dành cho
người dùng tự thiết lập các ký tự mong muốn.
Trong bảng tập lệnh thì có lệnh thiết lập địa chỉ CGRAM có dạng bảng như sau:
Bảng 5-1. Thiết lập địa chỉ CGRAM
D7 D6 D5 D4 D3 D2 D1 D0 HEX
0 1 A5 A4 A3 A2 A1 A0
0 1 0 0 0 0 0 0 0×40 Địa chỉ đầu
0 1 … … … … … …
0 1 1 1 1 1 1 1 0×7F Địa chỉ cuối

Vùng nhớ CGRAM này có địa chỉ từ 0×40 đến 0×7F cho phép lưu 64 byte dữ liệu.
Mỗi ký tự hiển thị trên LCD là một ma trận gồm 8 byte nên vùng nhớ CGRAM cho phép
lưu được 8 ký tự.
Bảng 5-2. Vùng nhớ CGRAM
Vùng thứ Địa chỉ cuối B7 B6 B5 B4 B3 B2 B1 B0 Địa chỉ đầu Địa chỉ ký tự
0 0×47 Vùng nhớ 8 byte để lưu ký tự tự tạo 0×40 0
1 0×4F 0×48 1
2 0×57 0×50 2
3 0×5F 0×58 3
4 0×67 0×60 4
5 0×6F 0×68 5
6 0×77 0×70 6
7 0×7F 0×78 7

Thực hành vi điều khiển PIC 109


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
5.4.2 Cách tìm mã ký tự mong muốn
Mỗi ký tự là một ma trận điểm 5×8 như bảng theo sau, muốn điểm nào sáng thì bit trong ô
đó bằng 1, với hình trái tim thì byte thứ 0 là 0×0A – tính theo hàng ngang, tương tự cho các hàng
còn lại.
Bảng 5-3. Mã của trái tim
BIT
BYTE 4 3 2 1 0 HEX
0 X X 0×0A
1 X X X 0×15
2 X X 0×11
3 X X 0×11
4 X X 0×0A
5 X 0×04
6 0×00
7 0×00
Cách để hiển thị trái tim:
 Khai báo mảng lưu 8 byte mã của trái tim.
 Khởi tạo địa chỉ bắt đầu của 1 trong 8 vùng ví dụ chọn 0×40 để lưu dữ liệu vào vùng
nhớ CGRAM từ 0×40 đến 0×47.
 Copy 8 byte dữ liệu của trái tim vào vùng nhớ CGRAM từ 0×40 đến 0×47.
 Gọi lệnh hiển thị ký tự thứ 0.
5.4.3 Các chương trình ứng dụng các ký tự - tự tạo trên LCD

Bài mẫu 511. Chương trình hiển thị ký tự hay biểu tượng tự tạo trên LCD.
Hàng 0 hiển thị thông tin: “ HIEN THI TRAI TIM ”.
Lưu tên file “bai_511_lcd_cgram_trai_tim”.
Mục đích: Biết lập trình hiển thị các ký tự mong muốn.
a.
Lưu đồ, giải thuật: Khai báo mảng của ký tự trái tim, khởi tạo LCD, copy mảng mã
b.
trái tim từ vi điều khiển sang vùng nhớ CGRAM của LCD, gọi mã của trái tim.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
const unsigned char
hang2[]={0x0a,0x15,0x11,0x11,0x0a,0x04,0,0};
signed int8 i;

void main()
{
set_up_port();
lcd_setup();
lcd_goto_xy(0,0);
110 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
lcd_data(" hien thi trai tim ");

lcd_command(0x40);
for(i=0;i<8;i++) lcd_data(hang2[i]);
lcd_goto_xy(1,0); lcd_data(0);
while(true);
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Hiển thị trái tim ở đầu hàng 1 là đúng.

5.4.4 Tạo mã 7 đoạn kích thước lớn trên LCD


Bước 1: xây dựng mã cho các đoạn
Để tạo các số từ 0 đến 9 để hiển thị lớn hơn ký tự bình thường cho dễ nhìn thì cách tạo ra
gần giống mã của led 7 đoạn. Các đoạn được đánh tên tương ứng là a, b, c, d, e, f, g, i
Đoạn f(0) Đoạn a(1) Đoạn b(2) Đoạn d(3)

Đoạn e(4) Đoạn c(5) Đoạn g+d(6) Đoạn I(7)

Hình 5-2. Hình ảnh các đoạn cho số lớn trên LCD
Các con số thứ tự đi kèm là trình tự khai báo trong mảng.
Mã hex của các đoạn tương ứng:

Thực hành vi điều khiển PIC 111


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Đoạn f(0) Đoạn a(1) Đoạn b(2) Đoạn d(3)
0x07 0x1F 0x1C 0x00
0x0F 0x1F 0x1E 0x00
0x1F 0x1F 0x1F 0x00
0x1F 0x00 0x1F 0x00
0x1F 0x00 0x1F 0x00
0x1F 0x00 0x1F 0x1F
0x1F 0x00 0x1F 0x1F
0x1F 0x00 0x1F 0x1F

Đoạn e(4) Đoạn c(5) Đoạn g+d(6) Đoạn I(7)

0x1F 0x1F 0x1F 0x1F


0x1F 0x1F 0x1F 0x1F
0x1F 0x1F 0x1F 0x1F
0x1F 0x1F 0x00 0x1F
0x1F 0x1F 0x00 0x1F
0x1F 0x1F 0x00 0x1F
0x0F 0x1E 0x1F 0x1F
0x07 0x1C 0x1F 0x1F

Hình 5-3. Tìm mã của các đoạn cho số lớn trên LCD
Bước 2: Kết hợp các đoạn để xây dựng các con số từ 0 đến 9
Để sáng con số lớn thì ta kết hợp các đoạn để được các con số từ 0 đến 9, mỗi con số sẽ
chiếm 6 vị trí như sau:

Hình 5-4. Hình ảnh các số lớn từ 0 đến 9 trên LCD


Để thuận tiện cho tạo dữ liệu và lập trình thì các đoạn được tính theo thứ tự: f, a, b, c, d, e,
f, hoặc g+d.
Mỗi ký tự số lớn sẽ sử dụng 6 ký tự bình thường, khi tính thì tính 3 ký tự hàng thứ nhất
trước rồi đến 3 ký tự hàng thứ 2 và khi lập trình cũng vậy.
Mã số 0 gồm các đoạn: f, a, b, e, d, c sáng, tương ứng với các số là: 0, 1, 2, 4, 3, 5.

112 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Mã số 1 gồm các đoạn: a, b, ‘ ’, d, i, d, sáng, tương ứng với các số là: 1, 2, 32, 3, 7, 3.
Mã số 2 gồm các đoạn: g+d, g+d, b, e, d, d sáng, tương ứng với các số là: 6, 6, 2, 4, 3, 3.
Mã số 3 gồm các đoạn: g+d, g+d, b, d, d, c sáng, tương ứng với các số là: 6, 6, 2, 3, 3, 5.
Mã số 4 gồm các đoạn: i, d, i, 0, 0, i sáng, tương ứng với các số là: 7, 3, 7, 32, 32, 7.
Mã số 5 gồm các đoạn: i, g+d, g+d, d, d, c sáng, tương ứng với các số là: 7, 6, 6, 3, 3, 5.
Mã số 6 gồm các đoạn: f, g+d, g+d, e, d, c sáng, tương ứng với các số là: 0, 6, 6, 4, 3, 5.
Mã số 7 gồm các đoạn: a, a, i, 0, 0, i sáng, tương ứng với các số là: 1, 1, 7, 32, 32, 7.
Mã số 8 gồm các đoạn: f, g+d, b, e, d, c sáng, tương ứng với các số là: 0, 6, 2, 4, 3, 5.
Mã số 9 gồm các đoạn: f, g+d, b, d, d, c sáng, tương ứng với các số là: 0, 6, 2, 3, 3, 5.
Có 1 số led hiển thị khoảng trắng có mã là 0×20 hay 32.
5.4.5 Các hàm hiển thị số kích thước lớn trên LCD
a. Khai báo mảng 2 chiều: Cho 10 số, mỗi số 6 đoạn.
const unsigned char lcd_so_x[10][6] ={
0,1,2,4,3,5, // so 0
1,2,32,3,7,3, // so 1
6,6,2,4,3,3, // so 2
6,6,2,3,3,5, // so 3
7,3,7,32,32,7, // so 4
7,6,6,3,3,5, // so 5
0,6,6,4,3,5, // so 6
1,1,7,32,32,7, // so 7
0,6,2,4,3,5, // so 8
0,6,2,3,3,5}; // so 9
b. Khai báo mảng 8 đoạn: Mỗi đoạn 8 byte, 8 đoạn thì tổng là 64 byte.
const unsigned char lcd_ma_8doan[] = {
0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, //doan f - 0
0x1f,0x1f,0x1f,0x00,0x00,0x00,0x00,0x00, //doan a - 1
0x1c,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, //doan b - 2
0x00,0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f, //doan d - 3
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07, //doan e - 4
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1e,0x1c, //doan c - 5
0x1f,0x1f,0x1f,0x00,0x00,0x00,0x1f,0x1f, //doan g+d-6
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f}; //doan i -7
c. Hàm 508: Copy mã 8 đoạn vào CGRAM của LCD.
void lcd_khoi_tao_cgram_so_to()
{
lcd_command(lcd_cgram_addr);
for (i=0;i<64;i++)
{ lcd_data(lcd_ma_8doan[i]); }
}
d. Hàm 509: Hiển thị số to trên LCD ở hàng x và cột y.
Thực hành vi điều khiển PIC 113
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
void lcd_hien_thi_so_to(si8 so, x, y)
{
lcd_goto_xy(x,y);
for (i=0;i<6;i++)
{
if(i==3) lcd_goto_xy(x+1,y);
lcd_data(lcd_so_x[so][i]);
}
}
e. Hàm 510: Xóa số to đang hiển thị trên LCD ở hàng x và cột y.
void lcd_xoa_so_to(si8 x, y)
{
lcd_goto_xy(x,y);
for (i=0;i<6;i++)
{
if (i==3) lcd_goto_xy(x+1,y);
lcd_data(' ');
}
}
f. Hàm 51x: Còn rất nhiều hàm giải mã 2 số, 3 số, … số nhỏ, số to của LCD.

5.4.6 Các bài thực hành hiển thị số to trên LCD

Bài mẫu 512. Chương trình hiển thị ký tự số 0 lớn trên LCD.
Lưu tên file “bai_512_lcd_lcd_so_to_0”.
Mục đích: Biết lập trình hiển thị số to có kích thước lớn trên màn hình LCD.
a.
Lưu đồ, giải thuật: Khai báo mảng 8 đoạn, khởi tạo LCD, copy mảng 8 đoạn từ vi
b.
điều khiển sang vùng nhớ CGRAM của LCD, gọi hiển thị số 0 to.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
void main()
{
set_up_port();
lcd_setup();
lcd_goto_xy(0,0);
lcd_data("hien thi so 0 hang 3");

lcd_khoi_tao_cgram_so_to();
lcd_hien_thi_so_to(0,2,0);
while(true);
}

114 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Hiển thị chuỗi thông tin và số 0 to trên LCD.

Bài tập 513. Hãy viết chương trình hiển thị số 0123 lớn trên LCD.
Lưu tên file “bai_513_lcd_cgram_so_to_0123”.

Bài tập 514. Hãy hiệu chỉnh bài 508 phần hiển thị sản phẩm số to trên LCD.
Lưu tên file “bai_514_lcd_cgram_dsp_t0_so_to”.

Bài tập 515. Giống bài 514 nhưng chu kỳ đếm thứ nhất số nhỏ, chu kỳ thứ hai số to và
lặp lại. Giảm giới hạn đếm xuống ví dụ là 15 để thay đổi cho nhanh.
Lưu tên file “bai_515_lcd_cgram_dsp_t0_so_to_nho”.

Bài tập 516. Thêm vào bài 515: Chu kỳ đếm thứ 3 thì hàng chục số nhỏ, đơn vị số to.
Chu kỳ thứ 4 thì hàng chục số to, đơn vị số nhỏ và lặp lại.
Lưu tên file “bai_516_lcd_cgram_dsp_t0_4mod_so_to_nho”.

5.5 ĐỒNG HỒ THỜI GIAN THỰC DS1307


Ở bài 418 đồng hồ số giờ phút giây có 3 nút nhấn dùng timer tuy hoạt động chính xác, có
thể điều chỉnh được giờ phút giây nhưng có một vấn đề là khi mất điện rồi có điện trở lại thì hệ
thống sẽ hoạt động không đúng thời gian thực, muốn chạy đúng thì phải chỉnh lại.
Để khắc phục khi mất và có điện lại thì đồng hồ vẫn chạy đúng không cần chỉnh lại thì giải
pháp là phải có nguồn dự phòng cấp cho hệ thống. Nhưng cấp cho cả hệ thống thì cần nguồn dự
phòng lớn do vi điều khiển cùng các led sẽ tiêu thụ dòng lớn. Để giảm bớt công suất nguồn dự
phòng thì sử dụng các IC đồng hồ thời gian thực chuyên dùng và nguồn dự phòng chỉ cấp cho
IC này để khi mất điện thì IC này vẫn hoạt động đếm thời gian chính xác.
Một ưu điểm khác của IC thời gian thực là nó hoạt động đếm thời gian chính xác, vi điều
khiển chỉ cần đọc các dữ liệu thời gian từ IC này, đem hiển thị và điều khiển. Làm đơn giản
chương trình điều khiển, không cần lo tính toán thời gian chính xác, …
Nguồn dự phòng thường dùng là pin CMOS 3V3.
5.5.1 IC thời gian thực DS1307 giao tiếp chuẩn I2C
Có rất nhiều IC thời gian thực, Kit thực hành sử dụng IC DS1307 và tài liệu lý thuyết có
trình bày về IC này và chuẩn giao tiếp I2C, nếu bạn quên hoặc chưa rõ thì hãy xem lại.
5.5.2 Thư viện IC thời gian thực DS1307 giao tiếp chuẩn I2C
Thư viện được lưu với tên là “tv_05_i2c_ds13_pcf” có nhiều hàm hỗ trợ.
a. Định nghĩa: Có 2 địa chỉ gồm đọc và địa chỉ ghi.
#define ds13_addr_wr 0xd0

Thực hành vi điều khiển PIC 115


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
#define ds13_addr_rd 0xd1
b. Khai báo mảng: Có 2 mảng có 9 phần tử để lưu dữ liệu đọc và ghi.
usi8 time_w[9]={0x30,0x09,0x20,0x01,0x20,0x09,0x20,0x90,0x95};
usi8 time_r[9]={0x30,0x30,0x10,0x08,0x20,0x02,0x20,0x90,0x96};
#define giay_ds time_r[0]
#define phut_ds time_r[1]
#define gio_ds time_r[2]
#define ma_qd time_w[8]
#define ma_ds time_r[8]
Mảng ghi dùng để lưu các biến thời gian để cài đặt lần đầu hoặc khi sai mã quy định.
Mảng đọc dùng để lưu các biến thời gian đọc từ IC thời gian thực.
Các định nghĩa với tên mới để lập trình cho gọn và dễ hiểu.
c. Hàm 515: Cập nhật thời gian từ mảng ghi hay mảng đọc.
void ds1307_cap_nhat_time(int1 sel)
{
usi8 i;
i2c_start();
i2c_write(ds13_addr_wr);
i2c_write(0x00);
for(i=0;i<9;i++)
{
if(sel) i2c_write(time_w[i]);
else i2c_write(time_r[i]);
}
i2c_stop();
}
d. Hàm 516: Đọc thời gian từ DS1307 lưu vào mảng đọc.
void ds1307_doc_time(usi8 j)
{
usi8 i;
i2c_start();
i2c_write(ds13_addr_wr);
i2c_write(0x00);
i2c_start();

i2c_write(ds13_addr_rd);
for(i=0;i<j;i++) time_r[i]=i2c_read();

i = i2c_read(0); //not ack, don't care i


i2c_stop();
}
a. Hàm 517: Kiểm tra mã quy định và mã lưu trong IC DS1307.
void ds1307_kiem_tra_ma()
{
ds1307_doc_time(9);
if(ma_qd!=ma_ds)

116 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
{
ds1307_cap_nhat_time(1);
}
}

5.5.3 Thực hành đồng hồ thời gian thực IC DS1307


Phần này sẽ thực hành các bài thực hành đọc thời gian thực, cài đặt lại thời gian nếu sai,
chỉnh thời gian bằng các nút nhấn MOD, UP và DW, … hiển thị trên 8 led 7 đoạn và LCD.
Bài mẫu 518. Đồng hồ thời gian thực dùng IC DS1307 hiển thị giờ phút giây trên 8
led 7 đoạn.
Lưu tên file là “bai_518_clock_ds1307_8l7d”.
a.Mục đích: Biết lập trình đọc và hiển thị thời gian thực DS1307 theo chuẩn I2C.
b.Lưu đồ, giải thuật: Đọc thời gian thực, so sánh mã quy định, nếu sai thì khởi tạo thời
gian mặc nhiên, nếu đúng mã thì giải mã hiển thị thời gian đọc và lặp lại.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
usi8 giay_tam;
void h518_gpg_hien_thi_binh_thuong()
{
giaima_bcd_2so_vitri_vn(giay_ds,0,kx_vn);
giaima_bcd_2so_vitri_vn(phut_ds,3,kx_vn);
giaima_bcd_2so_vitri_vn(gio_ds,6,kx_vn);
xuat_8led_7doan();
}

void main()
{
set_up_port();
ds1307_kiem_tra_ma();
while(true)
{
ds1307_doc_time(8);
if(giay_tam!=giay_ds)
{
giay_tam=giay_ds;
h518_gpg_hien_thi_binh_thuong();
}
delay_ms(500);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Đồng hồ hiển thị giờ phút giây trên 8 led. Nếu sai thời gian thực thì
hãy hiệu chỉnh lại các thông số cho đúng và thay đổi mã để cập nhật tự động. Khi đã
Thực hành vi điều khiển PIC 117
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
đếm đúng rồi thì bạn hãy nhớ thời gian đang đếm và tắt nguồn kit thực hành, sau vài
giây thì mở lại thì đồng hồ vận tiếp tục đếm là kit và chương trình hdong tốt. Nếu
chạy lại giờ cài đặt từ đầu thì xem lại chương trình và nguồn pin cấp cho IC.

Bài tập 519. Hãy hiệu chỉnh lại bài 518 sao cho có thể chọn hiển thị giờ phút giây hoặc
ngày tháng năm và thứ bằng nút nhấn bt3. Bình thường hiển thị “giờ phút giây”, nhấn bt3
lần 1 thì chuyển sang hiển thị “ngày tháng năm”, nhấn bt3 lần 2 thì chuyển sang hiển thị
“thu ”, nhấn bt3 lần 3 thì trở lại “giờ phút giây”.
Lưu tên file là “ bai_519_clock_ds1307_8l7d_full”.

Bài mẫu 520. Chương trình đổng hồ số thời gian thực dùng IC DS1307, hiển thị trên
8 led 7 đoạn và trên LCD 20×4. Mở rộng bài 518, thêm phần hiển thị giờ phút giây số to,
ngày tháng năm số nhỏ và thứ là text trên LCD.
Lưu tên file “bai_520_ds1307_clock_8l7d_lcd”.
a. Mục đích: Giống bài 518, chỉ khác là hiển thị đầy đủ giờ phút giây, ngày tháng năm
và thứ trên LCD.
b. Lưu đồ, giải thuật: Đã trình bày ở bài 518, chỉ thêm phần hiển thị trên LCD.
c. Chương trình con: “bai_520_ds1307_tv”
void ds1307_hthi_text_lcd()
{
lcd_goto_xy(0,0);
lcd_data("CLOCK DS1307 ");
}

void ds1307_hthi_thu_lcd()
{
lcd_goto_xy(3,0);
switch (time_r[3])
{
case 1: lcd_data("Sunday: "); break;
case 2: lcd_data("Monday: "); break;
case 3: lcd_data("Tuesday: "); break;
case 4: lcd_data("Wednesday:"); break;
case 5: lcd_data("Thursday: "); break;
case 6: lcd_data("Friday: "); break;
case 7: lcd_data("Saturday: "); break;
default: break;
}
}

void ds1307_hthi_ntn_lcd()
{
lcd_hthi_byte(time_r[4],3,12);
lcd_data("-");

118 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
lcd_hthi_byte(time_r[5],3,15);
lcd_data("-");
lcd_hthi_byte(time_r[6],3,18);
}

void ds1307_hthi_giay_lcd_soto()
{
lcd_hien_thi_so_to(giay_ds/16,1,14);
lcd_hien_thi_so_to(giay_ds%16,1,17);
}

void ds1307_hthi_phut_lcd_soto()
{
lcd_hien_thi_so_to(phut_ds/16,1,7);
lcd_hien_thi_so_to(phut_ds%16,1,10);
}

void ds1307_hthi_gio_lcd_soto()
{
lcd_hien_thi_so_to(gio_ds/16,1,0);
lcd_hien_thi_so_to(gio_ds%16,1,3);
}

void ds1307_hthi_lcd_soto()
{
ds1307_hthi_giay_lcd_soto();
if(giay_ds==0)
{
ds1307_hthi_phut_lcd_soto();
if(phut_ds==0)
{
ds1307_hthi_gio_lcd_soto();
if(gio_ds==0)
{
ds1307_hthi_ntn_lcd();
ds1307_hthi_thu_lcd();
}
}
}
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_520_clock_ds1307_8l7d_lcd_tv.c>
usi8 giay_tam;

void h518_gpg_hien_thi_binh_thuong()
{
giaima_bcd_2so_vitri_vn(giay_ds,0,kx_vn);

Thực hành vi điều khiển PIC 119


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
giaima_bcd_2so_vitri_vn(phut_ds,3,kx_vn);
giaima_bcd_2so_vitri_vn(gio_ds,6,kx_vn);
xuat_8led_7doan();
}

void main()
{
set_up_port();
ds1307_kiem_tra_ma();

lcd_setup();
lcd_khoi_tao_cgram_so_to();
lcd_goto_xy(0,0);
ds1307_hthi_text_lcd();
ds1307_hthi_thu_lcd();
ds1307_hthi_giay_lcd_soto();
ds1307_hthi_phut_lcd_soto();
ds1307_hthi_gio_lcd_soto();
ds1307_hthi_ntn_lcd();

while(true)
{
ds1307_doc_time(8);
if(giay_tam!=giay_ds)
{
giay_tam=giay_ds;
h518_gpg_hien_thi_binh_thuong();
ds1307_hthi_lcd_soto();
}
delay_ms(500);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Giờ phút giây, ngày tháng năm và thứ hiển thị thêm trên LCD.

Bài tập 521. Giống bài 520 có thêm 3 nút mod, up và dw để chỉnh thời gian.
Lưu tên file “bai_521_clock_ds1307_lcd_3key”.

Bài tập 522. Giống bài 521 thêm chức năng reng chuông giờ học, với yêu cầu như sau:
Các thông số reng chuông (dùng buzzer thay cho chuông):
07-00-00 reng 3 hồi chuông. 07-50-00 reng 1 hồi chuông.
08-40-00 reng 1 hồi chuông. 08-50-00 reng 2 hồi chuông.

120 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Nên thêm 1 trang hiển thị để cài đặt các thông số thời gian hẹn reng chuông. Dùng btn3
để chuyển trang. Reng 1 hồi chuông đúng giờ phút và giây bằng 00 thì mở chuông, đến
02: thì tắt chuông. Nếu 2 hồi thì khi giây bằng 04 mở chuông lần 2, đến 06 tắt chuông.
Nếu 3 hồi thì mở rộng thêm.
Lưu tên file “bai_522_clock_ds1307_lcd_chuong_alarm”.
Chú ý: Các thông số thời gian bạn có thể thay đổi ngắn để không phải chờ đợi quá lâu
như sau: 07-00-00. 07-02-00. 07-04-00. 07-06-00.
Bạn có thể thêm nhiều mốc thời gian để reng chuông, có thể thay đổi nhiều hồi reng
chuông khác nhau.

5.6 KẾT HỢP 3 MODULE: 32 LED, 8 LED 7 ĐOẠN, LCD, NÚT NHẤN
Phần này thực hành kết hợp các module để thấy được khả năng kết hợp và mở rộng.
Bài mẫu 525. Kết hợp các module: đếm xung ngoại dùng T0 hiển thị trên led 7 đoạn,
đồng hồ thời gian thực hiển thị trên LCD, vừa điều khiển 32 led đơn sáng 82 yêu cầu tự
động và đếm xung ngoại hiển thị số to trên LCD.
Lưu tên file “bai_525_th_lcd_8l7d_32led_t0_t3_ds13”.
a. Mục đích: Biết kết hợp 32 led đơn, 8 led 7 đoạn, nút nhấn, LCD, timer và counter.
b. Lưu đồ, giải thuật: Chỉ tổng hợp các bài đã thực hành.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <chuong3_32led_if_no_delay.c>
#include <bai_520_clock_ds1307_8l7d_lcd_tv.c>
#include <bai_411_t0_tv.c>
usi8 giay_tam;

void main()
{
set_up_port();
ds1307_kiem_tra_ma();

lcd_setup();
lcd_khoi_tao_cgram_so_to();
lcd_goto_xy(0,0);
ds1307_hthi_text_lcd();
ds1307_hthi_thu_lcd();
ds1307_hthi_giay_lcd_soto();
ds1307_hthi_phut_lcd_soto();
ds1307_hthi_gio_lcd_soto();
ds1307_hthi_ntn_lcd();

setup_timer_0(t0_ext_l_to_h|t0_div_1);

Thực hành vi điều khiển PIC 121


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
set_timer0(0); t0_tam = 1; g_han=50;
while(true)
{
ds1307_doc_time(8);
if(giay_tam!=giay_ds)
{
giay_tam=giay_ds;
ds1307_hthi_lcd_soto();
}
b339_32led_tong_hop_tu_dong_if();
b411_dem_sp_t0();
delay_ms(20);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Vừa đếm giờ phút giây có thể chỉnh được hiển thị trên 8 led 7 đoạn,
đếm sản phẩm số to hiển thị trên LCD và điều khiển 32 led đúng 4 yêu cầu.

Bài tập 526. Hãy mở rộng bài 525 thêm nút nhấn MOD1, MODE2, UP và DW để
chỉnh giới hạn và thời gian.
Lưu tên file “bai_526_th_lcd_8l7d_32led_t0_t3_ds13”.

122 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 6: THỰC
HÀNH
CHUYỂN ĐỔI TƯƠNG TỰ
SANG SỐ - ADC, CÁC CẢM
BIẾN

Thực hành vi điều khiển PIC 123


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
6.1 CHUYỂN ĐỔI TƯƠNG TỰ SANG SỐ CỦA PIC
Vi điều khiển PIC có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số ADC 10 bit đa hợp
nhiều kênh tùy thuộc vào từng loại vi điều khiển cụ thể, PIC18F6722 có 13 kênh. Mạch ADC
dùng cho các ứng dụng giao tiếp với tín hiệu tương tự có thể nhận từ các cảm biến như cảm biến
nhiệt độ LM35, cảm biến áp suất, cảm biến độ ẩm, cảm biến khoảng cách, …
Phần ADC của PIC về cơ bản đã học ở lý thuyết nên không trình bày lại.
6.2 CÁC CẢM BIẾN TƯƠNG TỰ
6.2.1 Mạch điện giao tiếp vi điều khiển PIC với các cảm biến tương tự
Các cảm biến tương tự gồm có 2 cảm biến nhiệt LM35, một cảm biến khoảng cách và 2
biến trở của Joystick. Mạch điện giao tiếp vi điều khiển với các cảm biến đã trình bày hình 1-17
và 1-22 của chương 1.
6.2.2 Tính toán độ phân giải của ADC
Độ phân giải ADC tổng quát được tính theo công thức:
VREF   VREF  VREF   VREF 
SS ADC  
210  1 1023
Thông số 210 là do ADC 10 bit.
Giá trị điện áp tham chiếu Verf+ và Vref- có nhiều cách để nối với nhiều nguồn khác nhau.
 Có thể nối với nguồn tham chiếu ở bên trong: Vref+ nối VDD bằng 5V và Vref-
nối GND. Khi đó độ phân giải là
VREF   VREF  5000mV
SS    4,887mV  5mV
210  1 1023
Cách này có ưu điểm đơn giản, không tốn port IO. Khuyết điểm là độ phân giải cố định.
Kit thực hành chọn cách này.
6.2.3 Các thông số và hệ số chuyển đổi của cảm biếm nhiệt LM35
Cảm biến LM35 có nhiều loại: LM35C và LM35D: loại LM35C thì tầm đo từ -40ºC đến
110 ºC và LM35D thì tầm đo từ 0ºC đến 100 ºC. Dòng tiêu thụ của cảm biến với nguồn cung
cấp 5VDC là 50µA.
Cảm biến LM35 hoạt động với điện áp từ +35V đến 4V.
Điện áp ra thay đổi 10mV cho 1 độ C.
Điện áp ngõ ra từ +6V đến – 1V.
Dòng điện ngõ ra 10mA.
Hình dạng bên ngoài và tên các tín hiệu
 Hình dạng bên ngoài và tên các tín hiệu như hình 6-1.
Hệ số chuyển đổi tuyến tính khi nhiệt độ thay đổi 1ºC thì điện áp ra thay đổi 10mV.
Độ phân giải của ADC là 5mV không tương thích với hệ số chuyển đổi của cảm biến LM35
bằng 10mV, tỉ lệ chênh lệch là:
10mV
 2,046
4,887mV
Để có kết quả hiển thị đúng thì lấy kết quả chuyển đổi chia cho tỉ lệ chênh lệch.
124 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 6-1. Hình ảnh cảm biến LM35CZ


6.2.4 Thư viện của ADC và các cảm biến
Bộ thực hành có 5 cảm biến tương tự và nối với 5 kênh AN0 đến AN4 là cố định nên phần
khởi tạo cho ADC đã được thực hiện trong hàm “set_up_port()”, kênh được chọn mặc nhiên là
kênh thứ 0.
a. Các định nghĩa: Định nghĩa các kênh ADC nối với các cảm biến.
#define chan_lm35a 4
#define chan_lm35b 0
#define chan_js_vrx 1
#define chan_js_vry 2
#define chan_cbkc 3
Giải thích:
Cảm biến LM35-A và LM35-B nối đến kênh (channel) ADC thứ 4 và thứ 0.
Biến trở trục x và trục y của Joystick nối đến kênh ADC thứ 1 và thứ 2.
Cảm biến khoảng cách nối đến kênh ADC thứ 3.
b. Hàm 601: So sánh nhiệt độ ngưỡng trên và dưới để mở đèn gia nhiệt và báo động.
#define nd_tren 35
#define nd_duoi 33
int1 ttqn=0;
void so_sanh_nd_dk_buzzer(usi16 nd)
{
if((nd>nd_tren)&&(ttqn==0))
{
ttqn = 1;
buzzer_on();
triac_1_off();
}
else if((nd<nd_tren)&&(ttqn==1))
{
ttqn = 0;
buzzer_off();
}
else if((nd<nd_duoi)&&(ttqn==0)) triac_1_on();
}

Thực hành vi điều khiển PIC 125


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
c. Hàm 602: Hàm chọn kênh ADC cần chuyển đổi và đọc kết quả chuyển đổi.
float h601_adc_read(usi8 solan, chan)
{
float kq_adc; usi8 i;
set_adc_channel(chan);
delay_us(20);
kq_adc = 0;
for(i=0;i<solan;i++)
{
kq_adc = kq_adc + read_adc();
}
kq_adc = kq_adc/solan;
return kq_adc;
}
Giải thích:
Hàm nhận số lần chuyển đổi trung bình và kênh cần chuyển đổi.
Tiến hành chọn kênh, delay chờ ổn định và tiến hành vòng lặp for để ra lệnh
chuyển đổi và đọc kết. Sau đó chia lấy giá trị trung bình và trả kết quả.
d. Hàm 603: Hàm tách số thực thành số nguyên và thập phân 2 số lẻ
usi16 so_ng,so_tp;
void float_to_ng_2so_tp(float st)
{
so_ng = st/1; //nguyen
st = st-so_ng; //tphan
st = st*100;
so_tp = st/1;
}
Giải thích: Hàm nhận số thực rồi chia lấy phần nguyên và lấy phần thập phân 2 số lẻ.
6.2.5 Thực hành ADC và cảm biến nhiệt LM35
Các cảm biến LM35-A và LM35-B chuyển đổi nhiệt độ thành tín hiệu điện, trong bộ thực
hành thì các cảm biến nhiệt được đặt bên trong để gần bóng đèn tròn để có thể điều khiển thay
đổi nhiệt độ.
Khi đèn sáng thì làm gia tăng nhiệt độ giúp bạn quan sát kết quả đo, khi đèn tắt thì nhiệt
độ giảm dần cho đến khi bằng nhiệt độ môi trường.
Để mở đèn thì dùng Triac thứ 1 nằm bên dưới, các relay và triac còn lại chưa dùng đến.
Dự định triac thứ 2 dùng để điều khiển quạt tản nhiệt làm giảm nhiệt độ xuống cho nhanh.

Bài mẫu 601. Đo nhiệt độ trung bình 100 lần từ cảm biến LM35A. Hiển thị phần
nguyên 2 số: trên 2 led 7 đoạn thứ 0, 1 và hiển thị số to trên LCD ở bên trái hàng 1, 2.
Hiển thị 2 số lẻ số nhỏ nằm kế số to sau dấu chấm thập phân. Tự động mở đèn gia tăng
nhiệt độ khi nhiệt độ đo nhỏ hơn 31ºC và tắt đèn khi lớn hơn 34ºC. Buzzer kêu khi nhiệt
độ lớn hơn 34ºC và tắt buzzer khi nhỏ hơn 34ºC. Có nút BT3 để tắt buzzer.

126 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Giới hạn nhiệt độ 34 và 31 có thể thay đổi cho phù hợp với nhiệt độ môi trường sao
cho khả năng tăng giảm được và thực hiện một cách nhanh chóng để không mất nhiều
thời gian chờ đợi.
Hàng 0 hiển thị “LM35A” ở bên trái.
Lưu tên file “bai_601_lm35a_lcd_7doan_den_buz_bt3”.
a.Mục đích: Biết dùng cảm biến nhiệt LM35A, điều khiển ADC, đo trung bình, hiển
thị nhiệt độ trên 8 led 7 đoạn và trên LCD.
b. Lưu đồ, giải thuật: Khởi tạo ADC, chọn kênh, đọc và cộng dồn kết quả đo nhiều lần,
chia trung bình, chia cho lệch độ phân giải, giải mã hiển thị.
c. Chương trình con “bai_601_lm35a_tv”:
unsigned int16 lm35a_ng,lm35a_tp,lm35a_ngt=0;

void h601_adc_lm35a_doc_xuly(usi8 slan)


{
float lm35a;
lm35a=h601_adc_read(slan,chan_lm35a);
lm35a = lm35a/2.046;
float_to_ng_2so_tp(lm35a);
lm35a_ng = so_ng;
lm35a_tp = so_tp;
}

void h601_adc_lm35a_ht_lcd(usi8 x,y,int1 ht_lcd,ht_tp)


{
if(lm35a_ngt!=lm35a_ng)
{
lm35a_ngt=lm35a_ng;
if(ht_lcd)lcd_gm_ht_2so_to_xvn(lm35a_ng,x,y,kx_vn);
}
if(ht_tp) lcd_hien_thi_2so_tp_nho(lm35a_tp,x,y+6);
}

void h601_adc_lm35a_ht_7doan(usi8 z,int1 ht_l7d)


{
if(ht_l7d)
{
giaima_bin_2so_vitri_vn(lm35a_ng,z,kx_vn);
xuat_8led_7doan();
}
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#define solan 100

Thực hành vi điều khiển PIC 127


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
#include <bai_601_lm35a_tv.c>

void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();

lcd_goto_xy(0,0);
lcd_data("LM35A");
while(true)
{
h601_adc_lm35a_doc_xuly(solan);
h601_adc_lm35a_ht_lcd(1,0,1,1);
h601_adc_lm35a_ht_7doan(6,1);
delay_ms(200);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: xem nhiệt độ đo hiển thị trên led 7 đoạn và trên LCD đúng bằng
nhiệt độ môi trường thì chương trình đã viết đúng.
g. Giải thích:
Gọi hàm chuyển đổi ở trên với biến “solan” và chọn kênh của cảm biến LM35A,
trả về kết quả sau khi chuyển đổi gán cho biến “lm35a”. Chia cho hệ số chênh lệch
độ phân giải. Gọi hàm tách phần nguyên và phần thập phân.
Nếu phần nguyên thay đổi so với trước đó thì tiến hành cập nhật cho biến tạm, giải
mã hiển thị số to trên LCD và hiển thị luôn số thập phân nếu các bit tương ứng
cho phép theo các tọa độ trên LCD và led 7 đoạn. Hiển thị thêm trên led 7 đoạn.

Bài tập 602. Giống bài 601 nhưng dùng cảm biến LM35B. Hiển thị phần nguyên 2 số:
trên 2 led 7 đoạn thứ 3, 2 và hiển thị số to trên LCD ở bên phải hàng 1, 2. Hiển thị 2 số lẻ
số nhỏ nằm kế số to sau dấu chấm thập phân.
Hàng 0 hiển thị “LM35B” ở bên phải.
Lưu tên file “bai_602_lcd_7doan_lm35b_den_buz_bt3”.

Bài tập 603. Kết hợp 2 bài bài 601 và 602 nhưng đo trung bình 50 lần.
Điều khiển đèn chỉ khi nhiệt độ cả 2 lớn hơn 34ºC hoặc nhỏ hơn 31ºC.
Lưu tên file “bai_603_lcd_7doan_lm35a_b_den_buz_bt3”.

128 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Bài tập 604. Giống bài 603 nhưng hiển thị thêm nhiệt độ trên và dưới ở hàng 3. Có
thêm nút BT0 để chỉnh nhiệt độ so sánh trên tăng 1 đơn vị, trong phạm vi +5 và cuộn
tròn. Tương tự cho BT1 chỉnh nhiệt độ ngưỡng dưới.
Lưu tên file “bai_604_lcd_7doan_lm35a_b_den_buz_3bt”.

6.2.6 Thực hành Joystick


Joystick có 2 biến trở xoay cho hai hướng nam bắc và đông tây. Khi không làm lệch
Joystick thì 2 biến trở nằm ở vị trí chính giữa và khi làm lệch thì sẽ làm thay đổi giá trị của biến
trở. Xem hình để biết giá trị tại 8 hướng khác nhau, ngoài ra còn có 1 switch on/off.

Hình 6-2. Hình ảnh Joystick


Joystick có 5 tín hiệu giao tiếp gồm 2 tín hiệu nguồn cung cấp 5V, 2 tín hiệu dạng tương
tự của 2 biến trở và 1 tín hiệu của switch.
Ứng dụng của Joystick dùng để điều khiển hoặc di chuyển, thay đổi vị trí một đối tượng
nào đó như động cơ hoặc xe.
Phần thực hành này chỉ trình bày cách giao tiếp, đọc giá trị của Joystick và sau đó là phần
ứng dụng.
Bài mẫu 605. Đọc giá trị trung bình 20 lần 2 biến trở của Joystick. Hiển thị phần
nguyên trên led 7 đoạn và LCD số to.
Hiển thị thêm các thông tin phụ “Joystick”, “VRX” và “VRY”trên LCD.
Lưu tên file “bai_605_joystick_lcd_7doan”.
a. Mục đích: Chuyển đổi ADC 2 kênh nối với Joystick hiển thị led 7 đoạn và LCD.
b. Lưu đồ, giải thuật: Giống bài đo nhiệt độ.
c. Chương trình con “bai_605_joystick_tv”:
unsigned int16 vrx,vry,vrx_t=0,vry_t=0;
void b605_adc_joystick()
{
Thực hành vi điều khiển PIC 129
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
float jx,jy;
jx = h601_adc_read(20,1);
float_to_ng_2so_tp(jx);
vrx = so_ng;

jy = h601_adc_read(20,2);
float_to_ng_2so_tp(jy);
vry = so_ng;
}

void b605_joystick_ht_7doan()
{
giaima_bin_4so_vitri_vn(vrx,4,cx_vn);
giaima_bin_4so_vitri_vn(vry,0,cx_vn);
xuat_8led_7doan();
}

void b605_joystick_ht_lcd()
{
if(vrx_t!=vrx)
{
vrx_t=vrx;
lcd_gm_ht_4so_to_xvn(vrx,0,8,cx_vn);
}
if(vry_t!=vry)
{
vry_t=vry;
lcd_gm_ht_4so_to_xvn(vry,2,8,cx_vn);
}
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_605_joystick_tv.c>

void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();

lcd_goto_xy(0,0);
lcd_data("JOYSTICK");
lcd_goto_xy(1,4);
lcd_data("VRX:");
lcd_goto_xy(3,4);

130 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
lcd_data("VRY:");
while(true)
{
b605_adc_joystick();
b605_joystick_ht_7doan();
b605_joystick_ht_lcd();
delay_ms(200);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Giá trị 2 biến trở của joystick hiển thị trên 8 led 7 đoạn và trên
LCD. Giá trị hiển thị bình thường tại tâm là 512, 512 cho cả 2 biến trở. Tuy nhiên giá
trị thực tế có sai số nên có thể lệch đi một ít.

Bài mẫu 606. Thêm vào bài 605 là dùng nút nhấn của Joystick để điều khiển tắt mở 16
led đơn.
Lưu tên file “bai_606_lcd_7doan_joystick_16led_btn”.

Bài tập 607. Kết hợp 2 bài 603 và 605: đo nhiệt độ dùng 2 cảm biến LM35 chỉ hiển thị
trên LCD, đọc giá trị 2 biến trở của Joystick hiển thị trên 8 led 7 đoạn.
Tổng hợp và hiệu chỉnh hai bài đã làm.
Lưu tên file “bai_607_lcd_7doan_joystick_lm35”.

Bài tập 608. Giống bài 607 nhưng nhiệt độ dùng 2 cảm biến LM35 hiển thị ở hàng 0
và 1, giá trị 2 biến trở của Joystick hiển thị ở hàng 2 và 3. Bố trí cho hợp lý.
Lưu tên file “bai_608_lcd_7doan_joystick_lm35”.

6.3 ĐO KHOẢNG CÁCH DÙNG CẢM BIẾN GP2D12


6.3.1 Cảm biến GP2D12
Phần này thực hành ADC và cảm biến khoảng cách GP2D12 của Sharp.
Tính chất của cảm biến GP2D12
 Tín hiệu ra là điện áp tương tự. Chu kỳ mỗi xung cho Led là 32ms.
 Thời gian đáp ứng trung bình là 39ms. Thời gian khởi động là 44ms
 Dòng tiêu thụ là 33mA.
 Phát hiện khoảng cách khu vực trong phạm vi 70cm.
Hình dạng bên ngoài và tên các tín hiệu
 Hình dạng bên ngoài và tên các tín hiệu như hình 6-3.
Điện áp hoạt động của cảm biến GP2D12:

Thực hành vi điều khiển PIC 131


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 6-3. Hình cảm biến GP2D12 và sơ đồ khối bên trong

Hình 6-4. Dạng sóng của cảm biến khoảng cách GP2D12

Hình 6-5. Đồ thị chuyển đổi của cảm biến khoảng cách GP2D12

132 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

 Điện áp nguồn cung cấp Vcc từ 4,5V đến 5,5V


 Điệp áp tín hiệu ra Vo từ -0,3V đến (Vcc + 0,3V) phụ thuộc vào khoảng cách.
 Nhiệt độ làm việc từ -10 đến 60ºC
Dạng sóng hoạt động của cảm biến GP2D12:
 Hình 6-4 trình bày dạng sóng của các lần đo của cảm biến:
Sơ đồ khối bên trong như hình 6-4:
Quan sát dạng sóng ta thấy mỗi chu kỳ chuyển đổi tối đa là 38,3ms.
Chu kỳ đầu tiên khi cấp điện thì ngõ ra chưa ổn định nên bỏ.
Đồ thị chuyển đổi của cảm biến GP2D12:
 Hình 6-7 trình bày đồ thị chuyển đổi của cảm biến.
6.3.2 Các bài đo khoảng cách dùng cảm biến GP2D12
Bài mẫu 609. Giống bài 605 chỉ khác là đo khoảng cách dùng cảm biến GP2D12 hiển
thị ở hàng 2 và 3 của LCD.
Lưu tên file “bai_609_gp2d12_lcd_do_kcach”.
a.Mục đích: Chuyển đổi ADC kênh khoảng cách hồng ngoại.
b.Lưu đồ, giải thuật: Chuyển đổi tín hiệu tương tự của cảm biến khoảng cách GP2D12
và tính toán hiển thị trên led 7 doạn và LCD.
c. Chương trình con “bai_609_gp2d12_tv”:
void h609_lcd_cbkc_gp2d12()
{
lcd_goto_xy(0,0);
lcd_data("Cam bien do khoang ");
lcd_goto_xy(1,0);
lcd_data("SHARP GP2D12:10-80cm");
}
void b609_adc_cbkc_gp2d12(usi8 sl, int1 http)
{
float kc;
usi16 kc_ng,kc_tp,kc_t;
kc=h601_adc_read(sl,chan_cbkc);
kc = pow(4277/kc,1.106);
if(kc>80) kc=80;

float_to_ng_2so_tp(kc);
kc_ng = so_ng;
kc_tp = so_tp;
if(kc_t!=kc_ng)
{
kc_t=kc_ng;
lcd_gm_ht_2so_to_xvn(kc_ng,2,0,kx_vn);
Thực hành vi điều khiển PIC 133
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
giaima_bin_2so_vitri_vn(kc_ng,3,cx_vn);
xuat_8led_7doan();
}
if(http) lcd_hien_thi_2so_tp_nho(kc_tp,3,6);
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_609_gp2d12_tv.c>
void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();
h609_lcd_cbkc_gp2d12();
while(true)
{
b609_adc_cbkc_gp2d12(10,1);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Bạn hãy dùng tay để gần cảm biến GP2D12 và xem giá trị khoảng
cách từ cảm biến đến tay của bạn hiển thị trên LCD theo đơn vị cm.

Bài tập 610. Giống bài 609 chỉ khác là tính diện tích hình chữ nhật dùng cảm biến
GP2D12. Bạn để tay ở vị trí nào đó trước cảm biến ví dụ là 12,5 (cm) hiển thị ở hàng 1,
xong nhấn bt0 để lưu giá trị này và xem như là chiều dài D. Tiếp theo cảm biến sẽ đo tiếp
và hiển thị ở hàng 2. Bạn cũng để tay trước cảm biến ví dụ là 20cm, xong bạn nhấn bt1
để lưu giá trị này và xem như là chiều rộng R. Bạn nhấn bt2 thì sẽ hiển thị diện tích hình
chữ nhật ở hàng 3. Nhấn bt3 thí xóa hết và bắt đầu lại từ đầu.
Lưu tên file “bai_610_gp2d12_tinh_dtich”.

Bài tập 611. Giống bài 609 chỉ khác là điều khiển 32 sáng tắt dần phải sang trái nhanh
chậm theo khoảng cách. Lấy giá trị đo được làm thời gian delay ví dụ khoảng cách là
75cm thì thời gian delay là 75ms. Giải thuật lập trình làm sao cho đáp ứng nhanh tất cả
các yêu cầu.
Lưu tên file “bai_611_gp2d12_dk_32led_std”.

Bài tập 612. Giống bài 609 chỉ khác là thêm phần điều khiển buzzer báo động như sau:
khi khoảng cách từ 70 đến 80cm thì tắt buzzer. Từ 60 đến 69cm thì buzzer kêu 1s tắt 7
giây, lặp lại. Từ 50 đến 59cm thì buzzer kêu 1s tắt 6 giây, lặp lại. Từ 40 đến 49cm thì
buzzer kêu 1s tắt 5 giây, lặp lại. Từ 30 đến 39cm thì buzzer kêu 1s tắt 4 giây, lặp lại. Từ
134 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
20 đến 29cm thì buzzer kêu 1s tắt 3 giây, lặp lại. Từ 10 đến 19cm thì buzzer kêu 1s tắt 2
giây, lặp lại. Giải thuật lập trình làm sao cho đáp ứng nhanh tất cả các yêu cầu.
Lưu tên file “bai_612_lcd_gp2d12_dk_td_buzzer”.

6.4 ĐO KHOẢNG CÁCH DÙNG CẢM BIẾN SIÊU ÂM HC-SR 04


6.4.1 Cảm biến HC-SR 04
Phần này thực hành cảm biến siêu âm HC-SR 04.
Tính chất của cảm biến HC-SR 04
 Điện áp nguồn cung cấp 5V DC. Dòng tính < 2mA
 Góc có hiệu lực < 15º. Khoảng cách đo từ 2cm đến 500cm
 Độ phân giải 0.3 cm
Hình dạng bên ngoài và tên các tín hiệu
 Hình dạng bên ngoài và góc phát sóng như hình 6-6:

Hình 6-6. Hình cảm biến siêu âm và góc phát thu sóng
Cảm biến HC-SR 04 có 4 chân: chân cấp nguồn Vcc, chân kích (trigger), chân nhận tín
hiệu dội (echo) và chân GND.
Sau này có loại HC-SR 05 có thêm 1 tín hiệu out.
Giản đồ thời gian các tín hiệu:
Để đo khoảng cách dùng cảm biến siêu âm thì hệ thống điều khiển phải kích tín hiệu chân
trigger tạo ra 1 xung có mức logic 1 tối thiểu là 10µs. Tín hiệu tương thích chuẩn TTL. Sau đó
thì mạch cảm biến sẽ tạo ra một chuỗi 8 xung phát ra ở biến tử phát, sau khi gặp vật cản nằm
trong giới hạn đo thì sóng sẽ phản xạ về và tín hiệu echo lên mức 1 với thời gian ở mức 1 tỷ lệ
thuận với khoảng cách đo.
Hệ thống phải đo thời gian tín hiệu echo ở mức logic 1 theo đơn vị thời gian là µs, lấy thời
gian đo được chia cho 58 sẽ được khoảng cách cần đo theo đơn vị cm, chia cho 148 sẽ được
khoảng cách theo đơn vị inch – các hệ số này do nhà cung cấp cho chúng ta – dựa vào tốc độ
sóng phát đi và phản xạ về.

Thực hành vi điều khiển PIC 135


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 6-7. Giản đồ thời gian của cảm biến HC-SR04


6.4.2 Cảm biến HC-SR 04 trong kit thực hành
Trong kit thực hành có gắn 1 cảm biến HC-SR 04 có sơ đồ kết nối như hình 6-8.

Hình 6-8. Sơ đồ nguyên lý cảm biến khoảng cách siêu âm


Cảm biến siêu âm đã cấp nguồn, chân tín hiệu HCSR04_TRIG nối trực tiếp đến chân RE7
và chân HCSR04_ECHO nối với chân RE6.
6.4.3 Đo khoảng cách dùng HCSR-04
Bài mẫu 613. Đo khoảng cách dùng cảm biến khoảng cách siêu âm HC-SR 04 hiển thị
trên LCD.
Lưu tên file “bai_613_hcsr_04_lcd_do_kcach”.
a.Mục đích: Đo khoảng cách dùng cảm biến siêu âm HCSR04, hiển thị trên LCD.
b.Lưu đồ, giải thuật: Tạo xung trigger, chờ xung echo lên mức 1 thì cho timer đếm xung
1µs cho đến khi xung echo về mức 0 thì ngừng timer – theo đúng dạng sóng. Lấy số
xung đếm được của timer chính là thời gian xung echo ở mức 1 chia cho hệ số để
được khoảng cách, rồi hiển thị.
c. Chương trình con “bai_613_hcsr04_tv”:
float kcs;
void h613_lcd_hien_thi_hcsr04()
{
136 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
lcd_goto_xy(2,14);
lcd_data("HCSR04");
}
void h613_tao_xung_trigger()
{
output_high(trig);
delay_us(20);
output_low(trig);

set_timer3(0);
while(!(input(echo)));
setup_timer_3(t3_internal|t3_div_by_8);

while(input(echo));
setup_timer_3(t3_disabled);
kcs = get_timer3();
}

void b613_cbkc_hc04()
{
usi16 kc_ng,kc_tp,kc_t;

h613_tao_xung_trigger();
kcs=kcs*1.6;
kcs=(kcs/58);

float_to_ng_2so_tp(kcs);
kc_ng = so_ng;
kc_tp = so_tp;
if(kc_t!=kc_ng)
{
kc_t=kc_ng;
lcd_gm_ht_2so_to_xvn(kc_ng,2,0,kx_vn);
giaima_bin_2so_vitri_vn(kc_ng,3,cx_vn);
xuat_8led_7doan();
}
lcd_hien_thi_2so_tp_nho(kc_tp,3,6);
}
a. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_613_hcsr04_tv.c>

void main()
{
set_up_port();

Thực hành vi điều khiển PIC 137


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
lcd_setup();
lcd_khoi_tao_cgram_so_to();
h613_lcd_hien_thi_hcsr04();
while(true)
{
b613_cbkc_hc04();
}
}
b. Tiến hành biên dịch và nạp.
c. Quan sát kết quả: Bạn để tay hoặc sách học che cảm biến siêu âm và dịch chuyển tay
ra xa và đồng thời quan sát kết quả trên led đơn tương ứng với khoảng cách đo được,
phạm vi đo khoảng 400cm.
d. Giải thích: Hàm có chức năng tạo xung trigger, reset timer, chờ xung echo lên mức
1, cho timer đếm với hệ số chia là 8. Chờ xung xuống mức 0, ngừng timer và đọc kết
quả.
Tần số thạch anh là 20Mhz, qua bộ chia 4 của hệ thống còn 5Mhz, qua bộ chia 8 của
timer còn 0,625Mhz tương ứng với chu lỳ là 1,6µs đưa vào timer để đếm. Kết quả
đếm nhân với 1.6 để được lượng thời gian µs. Chia cho 58 để được kết quả là cm.
Xử lý kết quả hiển thị phần nguyên và thập phân.

Bài tập 614. Kết hợp 2 bài: 613: đo khoảng cách dùng HCSR-04 và 609 đo khoảng
cách dùng GP2D12 hiển thị trên LCD. Hàng 0, 1 cho GP2D12, hàng 2, 3 cho HCSR04.
Lưu tên file “bai_614_lcd_hcsr_04_gp2d2_do_kcach”.

Bài tập 615. Tổng hợp các yêu cầu:


Yêu cầu 1: Đo nhiệt độ của 2 cảm biến LM35-A và LM35-B và hiển thị trên LCD và
trên 8 led 7 đoạn.
Yêu cầu 2: Đọc giá 2 biến trở của Joystick và hiển thị trên LCD và trên 8 led 7 đoạn.
Yêu cầu 3: Đo khoảng cách dùng HCSR-04 và GP2D12 và hiển thị trên LCD và trên
8 led 7 đoạn.
Có 3 nút nhấn BT1, BT2 và BT3 để chọn 3 yêu cầu trên.
Lưu tên file “bai_615_tong_hop_lm35_joy_hcsr_gp2d12_btn”.

Bài tập 616. Giống bài 615 nhưng mỗi yêu cầu thực hiện trong 10 giây sau đó tự động
chuyển sang yêu cầu kế. Bắt đầu từ yêu cầu 1. Hiển thị đếm 10 giây ở vị trí nào còn trống
trên LCD hoặc ở led đơn.
Lưu tên file “bai_616_tong_hop_lm35_joy_hcsr_gp2d12_auto”.

138 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
6.5 VI MẠCH ĐO NHIỆT ĐỘ DS18B20
6.5.1 Vi mạch đo nhiệt độ DS18B20
Ở phần trước chúng ta đã sử dụng cảm biến nhiệt là LM35 và bộ chuyển đổi ADC để
chuyển đổi điện áp tương tự thành tín hiệu số. Ở phần này chúng ta sẽ nghiên cứu và sử dụng vi
mạch chuyên dùng để đo nhiệt độ, nó tích hợp bên trong cảm biến nhiệt độ, bộ chuyển đổi ADC,
bộ điều khiển hay vi điều khiển nhỏ.
Độ phân giải, hệ số chuyển đổi đã được thiết kế tương thích và chỉ có một tín hiệu giao
tiếp với các vi điều khiển khác để nhận lệnh điều khiển và gửi giá trị nhiệt độ chuyển đổi. Chuẩn
này còn được gọi là một dây hay one wire
Các thông tin của vi mạch như sau:
 Chỉ sử dụng một dây giao tiếp.
 Mỗi vi mạch DS18B20 đều có mã 64bit lưu trong bộ nhớ ROM.
 Phần cứng đơn giản vì chỉ dùng một dây không cần dùng thêm vi mạch ADC rất
thích hợp cho vi điều khiển không tích hợp ADC.
 Có thể cấp nguồn từ đường tín hiệu, điện áp từ 3V-5.5V.
 Tầm đo từ -55ºC đến +125ºC (-67ºF đến +257ºF).
 Sai số 0.5ºC cho tầm đo từ -10ºC đến +85ºC.
 Có thể chọn độ phân giải bằng phần mềm từ 9 đến 12 bit.
 Thời gian chuyển đổi lớn nhất cho 12bit là 750ms.
 Có thể cài đặt nhiệt độ cảnh báo lưu vào bộ nhớ ROM.
 Bộ cảnh báo luôn thăm dò để gởi lệnh đến thiết bị khi nhiệt độ vượt qua giới hạn
cho phép.
 Vi mạch này có nhiều dạng chân: loại 3 chân, 8 chân, hay loại dán.
 Vi mạch được ứng dụng rộng rãi trong kiểm soát nhiệt độ: hệ thống công nghiệp,
sản phẩm hàng tiêu dùng, nhiệt kế hay bất kỳ một hệ thống cảm biến nhiệt nào.

Hình 6-9. Các dạng đóng gói của vi mạch DS18B20


Thực hành vi điều khiển PIC 139
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
6.5.2 Hình ảnh và tên các chân của vi mạch DS18B20
Các hình dạng khác nhau của vi mạch DS18B20 như hình 6-9.
6.5.3 Sơ đồ khối của vi mạch DS18B20
Vi mạch DS18B20 có sơ đồ khối như hình 6-10.

Hình 6-10. Sơ đồ khối của vi mạch DS18B20


Các khối bao gồm:
 Khối mạch nguồn cấp cho các khối bên trong hoạt động lấy từ nguồn bên ngoài.
 Khối bộ nhớ ROM 64 bit và port 1 dây.
 Khối điều khiển logic bộ nhớ.
 Khối scratchpad liên kết với các khối cảm biến nhiệt độ, khối lưu nhiệt độ byte cao
TH và byte thấp TL để báo động quá nhiệt, khối thanh ghi định cấu hình và bộ kiểm
tra mã dùng chuẩn CRC.
Bộ nhớ ROM lưu trữ mã 64 bit duy nhất của cảm biến.
Vùng nhớ scratchpad có 2 byte thanh ghi dùng để lưu trữ dữ liệu số là nhiệt độ từ cảm biến.
Ngoài ra còn có 2 thanh ghi lưu nhiệt độ ngưỡng dưới và ngưỡng trên để so sánh với nhiệt độ
đo và cảnh báo khi vượt quá giới hạn cài đặt, tên 2 thanh ghi là TL và TH.
Thanh ghi định cấu hình cho phép người dùng thiết lập độ phân giải chuyển đổi từ nhiệt
độ sang dữ liệu số là 9, 10, 11 hoặc 12 bit. Giá trị thanh ghi định cấu hình và T H, TL còn được
lưu vào bộ nhớ không bay hơi (EEPROM) nên dữ liệu vẫn còn khi mất điện.
6.5.4 Hoạt động của vi mạch cảm biến DS18B20
Chức năng chính của DS18B20 là cảm biến nhiệt độ chuyển đổi trực tiếp sang dữ liệu số.
Độ phân giải của cảm biến có thể định cấu hình là 9, 10, 11 hoặc 12 bit tương ứng với hệ số
chuyển đổi theo thứ tự là 0,5ºC, 0,25ºC, 0,125ºC và 0,0625ºC. Độ phân giải mặc nhiên khi cấp
điện là 12bit.
Khi cấp điện thì vi mạch cảm biến DS18B20 ở trạng thái nghỉ để giảm công suất tiêu thụ.
Để bắt đầu quá trình chuyển đổi tương tự sang số của nhiệt độ đo thì thiết bị chủ phải cấp phát

140 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
lệnh chuyển đổi (Convert_T có mã là 44H). Sau khi chuyển đổi xong thì dữ liệu nhiệt độ lưu
vào 2 thanh ghi nhiệt độ trong vùng nhớ scratchpad và cảm biến trở lại trạng thái nghỉ.
Nếu cảm biến cấp nguồn bên ngoài thì thiết bị chủ có thể phát các khe thời gian đọc sau
khi cấp phát lệnh chuyển đổi nhiệt độ (Convert_T) để kiểm tra cảm biến chuyển đổi xong chưa:
nếu cảm biến đáp ứng bằng cách phát bit có mức logic 0 thì quá trình chuyển đổi đang xảy ra,
nếu phát bit có mức logic 1 thì quá trình chuyển đổi đã kết thúc.
Nếu cảm biến cấp nguồn thông qua chân tín hiệu thì thực hiện kiểm tra theo cách khác.
Dữ liệu nhiệt độ thuộc theo hệ số Celsius, nếu muốn theo hệ số Fahrenheit thì phải thực
hiện chuyển đổi. Dữ liệu nhiệt độ lưu trữ ở dạng số bù 2 số có dấu 16 bit trong thanh ghi như
hình 6-11.

Hình 6-11. Cấu trúc 2 thanh ghi lưu nhiệt độ của vi mạch DS18B20
Các bit dấu (S) có giá trị là 0 nếu là số dương và bằng 1 nếu là số âm.
Nếu cấu hình ở độ phân giải 12 bit thì tất cả các bit trong thanh ghi đều lưu dữ liệu.
Nếu cảm biến cấu hình ở độ phân giải 11 bit thì bỏ bit thứ 0 (BIT 0).
Nếu cảm biến cấu hình ở độ phân giải 10 bit thì bỏ 2 bit thứ 1 và 0 (BIT 1, 0).
Nếu cảm biến cấu hình ở độ phân giải 9 bit thì bỏ 3 bit thứ 2, 1 và 0 (BIT 2, 1, 0).
6.5.5 Hoạt động cảnh báo quá nhiệt của vi mạch DS18B20
Sau khi vi mạch DS18B20 thực hiện xong chuyển đổi nhiệt độ thì giá trị nhiệt độ được so
sánh với các giá trị nhiệt độ ngưỡng dưới và ngưỡng trên do người dùng thiết lập trong 2 thanh
ghi TH và TL – có cấu trúc như hình 6-12.

Hình 6-12. Cấu trúc 2 thanh ghi lưu nhiệt độ báo động của vi mạch DS18B20
Bit S là bit dấu để thiết lập giá trị dương và âm. Giá trị lưu trong 2 thanh ghi TH và TL
không bị mất khi mất điện do có lưu trong bộ nhớ EEPROM. Có thể đọc giá trị của 2 thanh ghi
TH và TL chính là byte thứ 2 và thứ 3 trong vùng nhớ scratchpad.
Chỉ có các bit từ bit thứ 11 đến bit thứ 4 (phần nguyên) của 2 thanh ghi nhiệt độ được dùng
để so sánh với giá trị lưu trong 2 thanh ghi TH và TL.
Nếu nhiệt độ đo thấp hơn hoặc bằng giá trị lưu trong thanh ghi TL hoặc cao hơn hoặc bằng
giá trị lưu trong thanh ghi TH thì cờ báo động quá nhiệt trong vi mạch DS18B20 sẽ lên 1. Cờ

Thực hành vi điều khiển PIC 141


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
báo động được cập nhật ở mỗi đo nên nếu có báo động ở lần đo này thì cờ sẽ bị xóa sau khi thực
hiện lần chuyển đổi tiếp theo.
Thiết bị chủ có thể kiểm tra trạng thái cờ của vi mạch DS18B20 nối với bus bằng cách phát
lệnh tìm báo động (Alarm search có mã là ECH). Bất kỳ vi mạch DS18B20 nào có cờ báo động
tích cực sẽ đáp ứng lệnh báo động nên thiết bị chủ có thể xác định chính xác vi mạch DS18B20
nào đã xảy ra báo động.
6.5.6 Cấp nguồn cho vi mạch DS18B20
Vi mạch DS18B20 có 2 kiểu cấp nguồn như hình 6-13.

Hình 6-13. Sơ đồ cấp nguồn cho vi mạch DS18B20


Hình trên thì chân cấp nguồn là chân tín hiệu dùng thêm 1 transistor FET, hình bên dưới
sử dụng nguồn cấp đúng chân nguồn VDD.
6.5.7 Mã 64 bit của vi mạch DS18B20
Mỗi vi mạch DS18B20 có mã duy nhất là 64 bit như hình 6-14.

Hình 6-14. Cấu trúc mã 64 bit của vi mạch DS18B20


Trong cấu trúc 64 bit thì 8 bit thấp luôn bằng 28H. 48 bit tiếp theo là mã duy nhất. 8 bit
cuối cùng là kiểm tra mã thừa tuần hoàn (CRC cyclic redundancy check) được tính toán từ 56
bit. Bộ mã 64 bit lưu trong ROM và khối điều khiển ROM cho phép vi mạch DS18B20 hoạt
động như thiết bị 1 dây.
6.5.8 Bộ nhớ rom của vi mạch DS18B20
Bộ nhớ ROM của vi mạch DS18B20 có tổ chức như hình 6-15.

142 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 6-15. Tổ chức bộ nhớ ROM của vi mạch DS18B20


Bộ nhớ của vi mạch DS18b20 bao gồm bộ nhớ SRAM scratchpad và bộ nhớ EEPROM có
thể xem là các thanh ghi dùng để lưu trữ giá trị nhiệt độ để so sánh báo động quá nhiệt – hai
thanh ghi có tên là TH và TL, một thanh ghi định cấu hình. Nếu chức năng lưu nhiệt độ báo động
không được sử dụng thì 2 thanh ghi này có thể dùng để lưu dữ liệu như các ô nhớ thông dụng.
Byte thứ 0 và thứ 1 dùng để lưu nhiệt độ chuyển đổi và theo thứ tự là byte thấp và byte
cao, hai byte này chỉ cho phép đọc.
Byte thứ 2 và thứ 3 dùng để lưu nhiệt độ báo động và theo thứ tự là byte thấp và byte cao.
Byte thứ 4 là thanh ghi định cấu hình.
Byte thứ 5, 6, 7 phục vụ cho hoạt động bên trong của cảm biến.
Byte thứ 8 là byte kiểm tra cho tất cả các byte từ thứ 0 đến 7 của vùng nhớ này.
Dữ liệu ghi vào byte 2, 3 và byte 4 của vùng nhớ bằng lệnh Write Scratchpad (4EH), dữ
liệu gởi đến DS18B20 theo trình tự bắt đầu với bit có trọng số nhỏ nhất LSB của byte thứ 2 rồi
đến byte 3 và byte 4.
Để kiểm tra dữ liệu lưu vào có đúng không thì tiến hành đọc lại bằng lệnh Read Scratchpad
(BEH). Khi đọc vùng nhớ Scratchpad thì bit dữ liệu sẽ bắt đầu với bit có trọng số nhỏ nhất của
byte thứ 0.
Để truyền giá trị cho thanh ghi TH, TL và thanh ghi định cấu hình từ vùng nhớ Scratchpad
vào bộ nhớ EEPROM thì phải dùng lệnh Copy Scratchpad (48H).
Dữ liệu trong thanh ghi của vùng nhớ EEPROM không bị mất khi mất điện, khi có điện thì
dữ liệu trong bộ nhớ EEPROM sẽ nạp vào vùng nhớ Scratchpad đúng với các giá trị và thanh
ghi đã thiết lập.
6.5.9 Thanh ghi định cấu hình của vi mạch DS18B20
Byte thứ 4 của vùng nhớ Scratchpad của vi mạch DS18b20 là thanh ghi định cấu hình có
cấu trúc như hình 6-16. Thanh ghi này cho phép thiết lập độ phân giải chuyển đổi của cảm biến
bằng 2 bit có tên là R1 và R0. Hai bit sẽ cho phép thiết lập 4 hệ số chuyển đổi 9 bit đến 12 bit
và thời gian chuyển đổi tương ứng như bảng 6-1.

Thực hành vi điều khiển PIC 143


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 6-16. Byte thanh ghi điều khiển của vi mạch DS18B20
Bảng 6-1. Độ phân giải và thời gian chuyển đổi

6.5.10 Trình tự hoạt động của vi mạch DS18B20


Trình tự để truy xuất vi mạch DS18B20 như sau:
 Bước 1: khởi động.
 Bước 2: lệnh truy xuất ROM.
 Bước 3: lệnh chức năng DS18B20.
Khởi động: tất cả các giao tiếp với bus 1 dây đều phải bắt đầu với trình tự động. Trình tự
khởi động bao gồm 1 xung reset được phát bởi thiết bị chủ và tiếp theo là xung của thiết bị tớ
hay của vi mạch DS18B20. Chức năng của xung reset có chức năng kiểm tra thiết bị tớ là cảm
biến có nối với bus hay không, nếu có thì thiết bị tớ là cảm biến sẽ trả lời bằng cách tạo ra 1
xung tương ứng – quá trình này còn gọi là kiểm tra sự hiện diện của cảm biến.
Thời gian xung kiểm tra của thiết bị chủ và tớ đều phải tuân thủ theo quy định về thời gian
rất chính xác, nếu sai thì mạch sẽ không hoạt động đúng hay dữ liệu nhận về và gởi đi sẽ sai.
6.5.11 Các lệnh hoạt động của vi mạch DS18B20
a. Các lệnh liên quan đến bộ nhớ rom
Sau khi thiết bị chủ kiểm tra sự hiện diện thì lệnh tiếp theo là phát các lệnh đọc ROM. Các
lệnh này hoạt động dựa trên bộ mã 64 bit duy nhất lưu trong ROM của mỗi thiết bị và cho phép
thiết bị chủ truy xuất tới 1 thiết bị tớ duy nhất nếu có nhiều thiết bị tớ là nối chung với nhau.
Lệnh ROM cũng cho biết có bao nhiêu thiết bị tớ và loại thiết bị hiện diện nối với bus hoặc
thiết bị nào đã có báo động quá nhiệt.
Có 5 lệnh ROM, mỗi lệnh 8 bit, lưu đồ hoạt động ROM được trình bày như hình 6-17.
1. Lệnh tìm ROM – Search ROM (mã lệnh là F0H)
Khi hệ thống được cấp điện thì thiết bị chủ tiến hành nhận dạng mã ROM của tất cả các
thiết bị tớ nối với bus, kết quả của nhận dạng này cho phép thiết bị chủ xác định số lượng thiết
bị tớ và loại thiết bị. Thiết bị chủ đọc mã ROM thông qua quá trình thử và loại – quá trình này
yêu cầu thiết bị chủ thực hiện chu kỳ lệnh Search ROM nhiều lần để nhận dạng tất cả các thiết
bị tớ.

144 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 6-17. Lưu đồ các lệnh liên quan đến ROM của cảm biến DS18B20

Thực hành vi điều khiển PIC 145


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Sau khi thực hiện xong chu kỳ lệnh tìm ROM thì thiết bị chủ phải trở lại bước 1 để khởi
tạo lại khi thực hiện truy xuất thiết bị tớ.
2. Lệnh đọc ROM – Read ROM (mã lệnh là 33H)
Lệnh đọc ROM chỉ có thể được khi chỉ có 1 thiết bị tớ nối với bus. Lệnh này cho phép thiết
bị chủ đọc mã ROM 64 bit của thiết bị tớ mà không cần thực hiện lệnh tìm ROM. Nếu lệnh này
được sử dụng khi có nhiều thiết bị tớ nối với bus thì dữ liệu sẽ bị sai vì tất cả các thiết bị tớ đều
đáp ứng cùng 1 lúc.
3. Lệnh tương thích ROM – Match ROM (mã lệnh là 55H)
Lệnh tương thích ROM theo sau là mã 64 bit của ROM sẽ cho phép thiết bị chủ định địa
chỉ của thiết bị tớ đúng với địa chỉ đó có nối với bus. Chỉ có thiết bị tớ tương thích với địa chỉ
64 bit của ROM sẽ đáp ứng với các lệnh yêu cầu từ thiết bị chủ, tất cả các thiết bị còn lại trên
bus sẽ đợi cho đến khi có xung reset tiếp theo.
4. Lệnh bỏ qua đọc ROM – Skip ROM (mã lệnh là CCH)
Thiết bị chủ dùng lệnh skip ROM để định địa chỉ cho tất cả các thiết bị trên bus cùng 1 lúc
mà không cần gởi bất kỳ thông tin nào về code của ROM. Ví dụ thiết bị chủ có thể ra lệnh cho
tất cả các thiết bị tớ có trên bus thực hiện chuyển đổi nhiệt độ cùng 1 lúc bằng cách thực hiện
lệnh Skip ROM và theo sau là lệnh chuyển đổi Convert T (44H).
5. Lệnh tìm báo động – Alarm Search (mã lệnh là ECH)
Hoạt động của lệnh này giống như hoạt động của lệnh tìm ROM chỉ ngoại trừ là thiết bị tớ
có cờ báo động tích cực sẽ đáp ứng.
Lệnh này cho phép thiết bị chủ xác định nếu bất kỳ thiết bị tớ DS18B20 nào đã xảy ra điều
kiện báo động trong quá trình chuyển đổi nhiệt độ gần nhất.
Sau khi thực hiện xong lệnh tìm báo động thì thiết bị chủ phải trở lại bước 1 để khởi động.
Lệnh tương thích ROM theo sau là mã 64 bit của ROM sẽ cho phép thiết bị chủ định địa
chỉ của thiết bị tớ đúng với địa chỉ đó có nối với bus. Chỉ có thiết bị tớ tương thích với địa chỉ
64 bit của ROM sẽ đáp ứng với các lệnh yêu cầu từ thiết bị chủ, tất cả các thiết bị còn lại trên
bus sẽ đợi cho đến khi có xung reset tiếp theo.
b. Lệnh chức năng của DS18B20
Sau khi thiết bị chủ thực hiện lệnh về ROM để xác định địa chỉ vi mạch DS18B20 thì việc
tiếp theo là thiết bị chủ có thể thực hiện các lệnh chức năng của DS18B20.
Các lệnh này cho phép thiết bị chủ ghi và đọc bộ nhớ Scratchpad của DS18B20, bắt đầu
thực hiện quá trình chuyển đổi và xác định chế độ nguồn cung cấp.
Các lệnh chức năng của DS18B20 được tóm tắt ở bảng theo sau và minh họa bằng lưu đồ
như hình 6-18.
1. Lệnh chuyển đổi – Convert T (mã lệnh là 44H)
Lệnh này khởi động quá trình chuyển đổi duy nhất. Theo sau lệnh này thì kết quả nhiệt độ
sau khi chuyển đổi được lưu vào 2 thanh ghi 2 byte nằm trong bộ nhớ Scratchpad và DS18B20
trở lại trạng thái chờ công suất thấp.
Nếu thiết bị đang sử dụng nguồn cung cấp thông qua chân tín hiệu thì trong khoảng 10µs
(lớn nhất) sau khi thực hiện lệnh thì thiết bị chủ cho phép kéo lên cho bus nhanh trong khoảng
thời gian chuyển đổi trình bày trong phần nguồn cung cấp.

146 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 6-18. Lưu đồ của các lệnh chức năng của DS18B20

Thực hành vi điều khiển PIC 147


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Nếu thiết bị đang sử dụng nguồn cung cấp bên ngoài thì thiết bị chủ có thể thực hiện lệnh
đọc theo sau khi thực hiện chuyển đổi Convert T và DS18B20 sẽ đáp ứng bằng cách phát mức
logic 0 trong quá trình chuyển đổi và phát mức logic 1 khi quá trình chuyển đổi kết thúc.
2. Lệnh copy vùng nhớ Scratchpad – Copy Scratchpad (mã lệnh là 48H)
Lệnh này copy nội dung các thanh ghi TH, TL và thanh ghi định cấu hình của vùng nhớ
SRAM Scratchpad (byte thứ 2, 3 và 4) vào bộ nhớ EEPROM.
3. Lệnh gọi lại – RECALL E2(mã lệnh là B8H)
Lệnh này nạp lại các giá trị báo động quá nhiệt (T= và TL) và dữ liệu định cấu hình từ bộ
nhớ EEPROM sang bộ nhớ Scratchpad tương ứng.
Thiết bị chủ có thể cấp phát lệnh đọc theo sau lệnh Recall E2 và cảm biến DS18B20 sẽ xác
định trạng thái của lệnh Recall bằng cách phát mức logic 0 trong quá trình thực hiện lệnh Recall
và phát mức logic 1 khi quá trình thực hiện lệnh recall hoàn tất.
Lệnh recall được thực hiện tự động khi cảm biến được cấp điện nên dữ liệu có hiệu lực
trong bộ nhớ Scratchpad ngay khi thiết bị được cấp điện.
4. Lệnh đọc nguồn cung cấp – READ POWER SUPPLY (mã lệnh là B4H)
Thiết bị chủ cấp phát lệnh này theo sau khoảng thời gian đọc để xác định xem có bất kỳ
cảm biến DS18B20 nào sử dùng nguồn cung cấp bằng đường tín hiệu.
Trong khoảng thời gian đọc nếu thiết bị dùng nguồn cung cấp là dây tín hiệu thì sẽ kéo bus
xuống mức logic 0, nếu sử dụng nguồn bên ngoài thì bus vẫn ở mức logic 1.
5. Lệnh ghi dữ liệu vào bộ nhớ Scratchpad – WRITE SCRATCHPAD (mã lệnh là 4EH)
Lệnh này cho phép thiết bị chủ ghi 3 byte dữ liệu vào vùng nhớ scratchpad. Byte dữ liệu
thứ 1 sẽ ghi vào thanh ghi TH (là byte thứ 2 của vùng nhớ Scratchpad), byte thứ 2 ghi vào thanh
ghi TL (byte 3) và byte thứ 3 ghi vào thanh ghi định cấu hình (byte 4). Khi truyền thì byte có
trọng số nhỏ nhất LSB được truyền đi đầu tiên. Tất cả các byte phải được ghi trước khi thiết bị
chủ phát lệnh reset hoặc dữ liệu có thể bị ngắt.
6. Lệnh đọc dữ liệu bộ nhớ Scratchpad – READ SCRATCHPAD (mã lệnh là BEH)
Lệnh này cho phép thiết bị chủ đọc nội dung của vùng nhớ Scratchpad. Khi truyền dữ liệu
thì bắt đầu với bit LSB của byte thứ 0 và tiếp tục cho đến byte thứ 9. Thiết bị chủ có thể phát
lệnh reset để chấm dứt quá trình đọc bất kỳ lúc nào nếu chỉ đọc một phần dữ liệu của bộ nhớ
Scratchpad.
6.5.12 Các dạng tín hiệu của chuẩn 1 dây
Vi mạch DS18B20 dùng chuẩn truyền dữ liệu một dây. Có nhiều loại tín hiệu được định
nghĩa bởi chuẩn này: xung reset, xung hiện diện, ghi mức logic 0, ghi mức logic 1, đọc mức
logic 0, đọc mức logic 1. Thiết bị chủ khởi động tất cả các tín hiệu này sau khi chấp nhận xung
hiện diện.
6.5.13 Trình tự khởi động – xung reset và xung hiện diện
Tất cả các giao tiếp với DS18B20 bắt đầu với trình tự khởi động bao gồm xung reset từ
thiết bị chủ theo sau là xung hiện diện của cảm biến DS18B20. Trình tự này được minh họa như
hình 6-19.

148 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 6-19. Dạng sóng của xung reset và xung hiện diện
Khi DS18B20 gởi xung hiện diện để đáp ứng xung reset thì đồng thời xác định với thiết bị
chủ là cảm biến sẵn sàng hoạt động.
Trong quá trình khởi động thì thiết bị chủ (hoạt động ở chế độ phát TX) tạo xung reset bằng
cách kéo tín hiệu bus xuống mức thấp trong khoảng thời gian tối thiểu là 470µs. Sau đó thiết bị
chủ thả nỗi tín hiệu bus và hoạt động ở chế độ nhận (hoạt động ở chế độ nhận R X) để trao quyền
điều khiển cho cảm biến DS18B20.
Khi thả nỗi thì điện trở kéo lên sẽ kéo bus về mức logic 1. Khi DS18B20 phát hiện cạnh
lên của xung thì nó sẽ đợi từ 15µs đến 60µs và sau đó phát đi 1 xung hiện diện bằng cách kéo
bus xuống mức logic 0 trong khoảng thời gian từ 60µs đến 240µs.
6.5.14 Các khe thời gian đọc/ghi
Thiết bị chủ ghi dữ liệu vào DS18B20 trong các khe thời gian ghi và đọc dữ liệu từ
DS18B20 trong các khe thời gian đọc. Một bit dữ liệu được phát lên bus trong 1 khe thời gian.
Khe thời gian ghi
Có 2 loại khe thời gian ghi là: khe thời gian ghi mức 1 (ghi dữ liệu mức 1 vào DS18B20)
và khe thời gian ghi mức 0 (ghi dữ liệu mức 0 vào cảm biến DS18B20). Tất cả các khe thời gian
có lượng thời gian tối thiểu là 60µs và thời gian tín hiệu khôi phục lại từ mức 0 về mức 1 do
điện trở kéo lên tối thiểu là 1 µs.
Cả 2 khe thời gian ghi dữ liệu mức logic 1 và 0 đều được khởi động bởi thiết bị chủ kéo
bus xuống mức 0 như hình 6-20.
Để tạo ra khe thời ghi dữ liệu mức logic 1 thì sau khi phát xung kéo bus xuống mức 0 thì
thiết bị chủ phải thã nổi bus trong vòng 15µs. Khi thã nổi bus thì điện trở kéo lên sẽ kéo bus về
mức 1.
Để tạo ra khe thời ghi dữ liệu mức logic 0 thì sau khi phát xung kéo bus xuống mức 0 thì
thiết bị chủ tiếp tục giữ bus ở mức 0 trong suốt khe thời gian (ít nhất là 60µs).
DS18B20 sẽ lấy mẫu từ bus với các khoảng thời gian kéo dài từ 15µs đến 60µs sau khi
khởi động khe thời gian ghi.
Nếu bus ở mức cao trong suốt thời gian lấy mẫu thì mức 1 sẽ được ghi vào DS18B20, nếu
ở mức 0 thì mức 0 được ghi vào.
Khe thời gian đọc

Thực hành vi điều khiển PIC 149


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
DS18B20 chỉ có thể truyền dữ liệu đến thiết bị chủ khi thiết bị chủ phát lệnh đọc các khe
thời gian. Do đó thiết bị chủ phải tạo các khe thời gian đọc ngay sau khi phát lệnh đọc bộ nhớ
Scratchpad hoặc lệnh đọc nguồn cung cấp [B4H], khi đó DS18B20 có thể cung cấp dữ liệu yêu
cầu.

Hình 6-20. Dạng sóng khe thời gian đọc/ghi


Tất cả các khe thời gian đọc có lượng thời gian tối thiểu là 60µs và thời gian khôi phục tối
thiểu là 1µs giữa 2 khe thời gian.
Khe thời đọc dữ liệu bắt đầu bởi thiết bị chủ bằng cách kéo bus xuống mức 0 trong khoảng
thời gian tối thiểu là 1µs và sau đó là thả nỗi bus – xem hình 6-23.
Sau khi thiết bị chủ khởi tạo xong khe thời gian đọc thì DS18B20 sẽ bắt đầu truyền mức 1
hoặc mức 0 lên bus.

Hình 6-21. Chi tiết dạng sóng khe thời gian đọc mức 1 của thiết bị chủ
DS18B20 truyền mức 1 bằng cách để bus trở về mức 1 và truyền mức 0 thì kéo bus ở luôn
mức 0. Khi đang truyền mức 0, DS18B20 sẽ thả nỗi bus khi gần kết thúc khe thời gian và bus
sẽ được kéo lên mức 1 bởi điện trở kéo lên.
150 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Ngõ ra dữ liệu từ DS18B20 có hiệu lực trong vòng 15 µs tính từ khi có cạnh xuống của
xung khởi tạo khe thời gian đọc. Do đó thiết bị chủ phải thả nỗi bus và sau đó tiến hành lấy mẫu
trạng thái bus trong vòng 15 µs tính từ lúc bắt đầu khe thời gian.
Hình 6-21 minh họa tổng thời gian TINIT, TRC và TSAMPLE phải nhỏ hơn 15µs đối với khe
thời gian đọc.
Hình 6-22 minh họa các giới hạn thời gian lớn nhất bằng cách giữ TINIT và TRC càng nhỏ
có thể có và định vị thời gian lấy mẫu của thiết bị chủ trong khe thời gian đọc hướng về điểm
gần kết thúc chu kỳ khe thời gian.

Hình 6-22. Thu ngắn các khoảng thời gian


6.5.15 Mạch điện giao tiếp vi điều khiển với DS18B20
Mạch điện giao tiếp vi điều khiển với DS18B20 như hình 6-23.
Trong sơ đồ mạch thì có 2 cảm biến: DS18B20A và DS18B20B nối với port RG0 thông
qua jumper.
Khi sử dụng thì cảm biến nào thì phải nối jumper JP501 của cảm biến đó.
Có các bài thực hành cho 2 cảm biến như sau:
Bài thực hành chỉ dùng 1 trong 2 DS18B20: với bài dạng này thì không cần biết và không
cần đọc code của bộ nhớ của cảm biến vì chỉ có 1 cảm biến. Khi dùng thì nối 1 jumper, 1 jumper
còn lại hở.
Bài thực hành dùng cả 2 DS18B20: với bài dạng này thì cần phải biết code của bộ nhớ
của 2 cảm biến, khi truy xuất cảm biến nào thì phải gởi địa chỉ của cảm biến đó mới truy xuất
được. Khi dùng thì cả 2 jumper đều nối. Dạng bài này phức tạp hơn dạng trên.

Hình 6-23. Mạch đo nhiệt độ dùng 2 DS18B20


Thực hành vi điều khiển PIC 151
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
6.5.16 Thư viện DS18B20
a. Các định nghĩa: Định nghĩa chân IO của vi điều khiển giao tiếp với DS18B20.
#define touch_pin pin_g0
#include <touch.c>
#define search_rom 0xf0
#define read_rom 0x33
#define match_rom 0x55
#define skip_rom 0xcc
#define alarm_search 0xec
#define read_scratchpad 0xbe
#define write_scratchpad 0x4e
#define copy_scratchpad 0x48
#define convert_t 0x44
Khai báo thư viện giao tiếp 1 dây và định nghĩa các lệnh của vi mạch DS18B20.
b. Hàm 604: Thông báo không có vi mạch DS18B20.
void ds18b20_no_ds18b()
{
lcd_goto_xy(0,0);
lcd_data("NO DS18B20");
}
c. Hàm 605: Khởi tạo vi mạch DS18B20 và ra lệnh chuyển đổi nhiệt độ.
void ds18b20_khoi_tao()
{
touch_present();
touch_write_byte(skip_rom);
touch_write_byte(write_scratchpad);
touch_write_byte(0x0);
touch_write_byte(0x0);
touch_write_byte(0x7f); //12 bit

touch_present();
touch_write_byte(skip_rom);
touch_write_byte(convert_t);
}
c. Hàm 606: Hàm đọc nhiệt độ từ DS18B20, trả về giá trị nhiệt 16 bit.
unsigned int16 ds18b20_read_temp()
{
unsigned int8 bl,bh;
unsigned int16 w;
touch_write_byte(skip_rom);
touch_write_byte(read_scratchpad);
bl = touch_read_byte();
bh = touch_read_byte();
152 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
w = make16(bh,bl);

touch_present();
touch_write_byte(skip_rom);
touch_write_byte(convert_t);
return w;
}
d. Hàm 607: Hàm đọc mã Rom của vi mạch DS18B20, hiển thị tại hàng x, cột y.
void ds18b20_doc_rom(usi8 x,y)
{
unsigned int8 rom_code[8];
unsigned int8 xh,xl;
signed int8 i;
if(touch_present())
{
touch_write_byte(read_rom);

for(i=0;i<8;i++)
rom_code[i] = touch_read_byte();

lcd_goto_xy(x,y);
for(i=7;i>-1;i--)
{
xh=rom_code[i]/16;
if(xh>9) xh=xh+0x37;
else xh=xh+0x30;
xl=rom_code[i]%16;
if(xl>9) xl=xl+0x37;
else xl=xl+0x30;

lcd_data(xh);
lcd_data(xl);
}
}
else ds18b20_no_ds18b();
}
Giải thích: Gọi hàm kiểm tra hiện diện, gửi lệnh đọc Rom rồi tiến hành đọc 8 byte mã.
Sau đó tiến hành hiển thị 8 byte trên LCD tại tọa độ (x,y).

6.5.17 Đo nhiệt độ dùng một vi mạch DS18B20


Phần này thực hành các bài đo nhiệt độ giao tiếp dùng một vi mạch DS18B20. Chú ý chỉ
kết nối một vi mạch đến vi điều khiển, hở jumper của vi mạch còn lại.

Thực hành vi điều khiển PIC 153


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài mẫu 617. Chương trình đọc nhiệt độ từ một vi mạch DS18B20 hiển thị phần
nguyên và 3 số thập phân bên trái LCD. Đọc mã rom 64 bit hiển thị trên LCD
Cấu hình chế độ ADC 12 bit.
Điều khiển đèn gia tăng nhiệt, buzzer và nút BT3 giống bài 601.
Lưu tên file “bai_617_ds18b20_lcd_7doan_den_buz_rom”.
Mục đích: Biết lập trình khởi tạo và đọc nhiệt độ từ vi mạch DS18B20 và xử lý kết
a.
quả đo hiển thị trên led 7 đoạn, LCD.
b. Lưu đồ, giải thuật: Khởi tạo DS18B20, đọc nhiệt độ, ra lệch chuyển đổi và xử lý kết
quả hiển thị, thực hiện các yêu cầu khác nếu có xong quay lại đọc nhiệt độ và lặp lại.
c. Chương trình con “bai_617_ds18b20_tv”:
unsigned int8 ds18a_ng, ds18a_ngt=0;
unsigned int16 ds18a_w,ds18a_tp,ds18a_tpt=50;

void h617_ds18b20a_ht_lcd()
{
if(ds18a_ngt!=ds18a_ng)
{
ds18a_ngt=ds18a_ng;
lcd_gm_ht_2so_to_xvn(ds18a_ng,2,0,kx_vn);
lcd_data(".");
}
if(ds18a_tpt!=ds18a_tp)
{
ds18a_tpt=ds18a_tp;
lcd_gm_ht_4so_nho_xvn(ds18a_tp*625,3,7,kx_vn);
}
}

void h617_ds18b20a_ht_7doan()
{
led_7d[7]=0xff;
giaima_bin_2so_vitri_vn(ds18a_ng,5,kx_vn);
led_7d[4]=0x9c;
giaima_bin_2so_vitri_vn((ds18a_tp*625)/100,2,kx_vn);
xuat_8led_7doan();
}

void b617_ds18b20_doc_nhiet_do()
{
if(touch_present())
{
ds18a_w = ds18b20_read_temp();
ds18a_ng = ds18a_w>>4;
ds18a_tp = ds18a_w & 0x000f;
154 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

h617_ds18b20a_ht_lcd();
h617_ds18b20a_ht_7doan();
}
else ds18b20_no_ds18b();
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_617_ds18b20_tv.c>

void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();
lcd_goto_xy(0,0);
lcd_data("DS18B20");
ds18b20_khoi_tao();
while(true)
{
b617_ds18b20_doc_nhiet_do();
so_sanh_nd_dk_buzzer(ds18a_ng);
delay_ms(200);
if(!input(bt3)) buzzer_off();
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Sẽ hiển thị nhiệt độ môi trường và mở đèn để gia tăng nhiệt độ.
Hiển thị mã ROM của vi mạch DS18B20 trên LCD ở hàng 1 với byte cuối cùng là
28. Khi quá 34ºC thì đèn tắt, buzzer kêu, nhấn BT3 để tắt buzzer.
Hãy ghi lại mã ROM của vi mạch DS18b20 thứ nhất (A). Đảo 2 Jumper rồi cũng ghi
lại mã ROM của vi mạch DS18b20 thứ hai (B).

Bài tập 618. Giống bài 617 nhưng hiển thị thêm nhiệt độ so sánh trên và dưới ở cuối
hàng 2 và 3. Có thêm nút BT0 để chỉnh nhiệt độ so sánh trên tăng 1 đơn vị, trong phạm
vi +5 và cuộn tròn. Tương tự cho BT1 chỉnh nhiệt độ dưới.
Lưu tên file “bai_618_ds18b20_lcd_7doan_den_buz_rom_3bt”.

6.5.18 Đo nhiệt độ dùng hai vi mạch DS18B20


Phần này thực hành các bài đo nhiệt độ giao tiếp dùng một vi mạch DS18B20. Chú ý chỉ
kết nối một vi mạch đến vi điều khiển, hở jumper của vi mạch còn lại.

Thực hành vi điều khiển PIC 155


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài tập 619. Chương trình: Đọc nhiệt độ từ vi mạch DS18B20-A hiển thị phần nguyên
và 3 số thập phân bên trái LCD. Đọc nhiệt độ từ vi mạch DS18B20-B hiển thị phần
nguyên và 3 số thập phân bên phải LCD.
Điều khiển đèn gia tăng nhiệt, buzzer và nút BT3 giống bài 601. So sánh nhiệt độ của
cả 2 lớn hơn hoặc nhỏ hơn.
Lưu tên file “bai_619_ds18b20_a_b_lcd_7doan_den_buz”.

Bài tập 620. Tổng hợp các yêu cầu: thêm vào bài 615 yêu cầu thứ 4
Yêu cầu 4: Đo nhiệt độ dùng DS18B20 và hiển thị trên LCD và trên 8 led 7 đoạn.
Thêm nút nhấn BT0 để chọn yêu cầu thứ 4.
Lưu tên file “bai_620_tong_hop_lm35_joy_hcsr_gp2d12_ds18_btn”.

Bài tập 621. Giống bài 620 nhưng mỗi yêu cầu thực hiện trong 10 giây sau đó tự động
chuyển sang yêu cầu kế. Bắt đầu từ yêu cầu 1. Hiển thị đếm 10 giây ở vị trí nào còn trống
trên LCD hoặc ở led đơn.
Lưu tên file “bai_621_tong_hop_lm35_joy_hcsr_gp2d12_ds18_auto”.

6.6 VI MẠCH CẢM BIẾN NHIỆT ĐỘ VÀ ĐỘ ẨM DHT11


6.6.1 Giới thiệu vi mạch DHT11
Vi mạch cảm biến nhiệt độ và độ ẩm DHT11 có cấu trúc gồm có cảm biến nhiệt độ và cảm
biến độ ẩm phức tạp với đầu ra tín hiệu số đã hiệu chuẩn. Bằng cách sử dụng thu nhận tín hiệu
số và công nghệ cảm biến nhiệt độ và độ ẩm, đảm bảo độ tin cậy cao và ổn định.

Hình 6-24. Hình dạng cảm biến DHT11


Vi mạch bao gồm: thành phần đo độ ẩm kiểu điện trở và thành phần đo nhiệt độ NTC, kết
nối với bộ vi điều khiển 8 bit có hiệu suất cao, mang lại chất lượng tuyệt vời, đáp ứng nhanh,
khả năng chống nhiễu và hiệu quả chi phí.
Bảng 6-2. Điện áp, dòng tiêu thụ, chu kỳ lấy mẫu của DHT11

156 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Bảng 6-3. Độ phân giải và thời gian chuyển đổi

Bảng 6-4. Độ phân giải và thời gian chuyển đổi

Thực hành vi điều khiển PIC 157


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Mỗi vi mạch DHT11 được hiệu chuẩn nghiêm ngặt trong phòng thí nghiệm. Các hệ số hiệu
chuẩn được lưu trữ dưới dạng các chương trình trong bộ nhớ OTP, được sử dụng bởi quá trình
phát hiện tín hiệu bên trong của cảm biến.
DHT11 được đóng gói và có 4 chân nằm trong 1 hàng, thuận tiện để kết nối và dễ dàng
đóng gói theo yêu cầu của người dùng. Xem hình 6-24.
Giao tiếp một dây làm cho hệ thống nhanh và dễ dàng, kích thước nhỏ, tiêu thụ điện năng
thấp và truyền tín hiệu lên đến 20 mét nên DHT11 trở thành sự lựa chọn tốt nhất cho các ứng
dụng khác nhau.
6.6.2 Các thông số kỹ thuật
Bảng 6-2 cho biết tầm điện áp làm việc, dòng tiêu thụ, chu kỳ lấy mẫu.
Bảng 6-3 cho biết tầm đo độ ẩm và nhiệt độ, sai số, độ phân giải và dạng đóng gói.
Bảng 6-4 cho biết thêm các thông số thời gian, tầm đo ở các nhiệt độ khác nhau, …
6.6.3 Kết nối mạch ứng dụng
Sơ đồ mạch kết nối cảm biến DHT11 với MCU có sơ đồ khối như hình 6-25.

Hình 6-25. Sơ kết nối MCU với cảm biến DHT11


Khi cáp kết nối ngắn hơn 20 mét, nên sử dụng điện trở kéo lên 5K, khi cáp kết nối dài hơn
20 mét, hãy chọn một điện trở kéo lên thích hợp.
6.6.4 Quá trình giao tiếp giữa MCU và DHT11
Định dạng dữ liệu một dây được sử dụng để giao tiếp và đồng bộ hóa giữa MCU và DHT11.
Dữ liệu bao gồm các phần thập phân và tích phân. Truyền dữ liệu đầy đủ là 40 bit và cảm
biến DHT11 sẽ gửi dữ liệu bắt đầu bằng bit MSB.
Định dạng dữ liệu: Dữ liệu độ ẩm phần nguyên 8 bit + Dữ liệu độ ẩm phần thập phân 8
bit + Dữ liệu nhiệt độ phần nguyên 8 bit + Dữ liệu nhiệt phần thập phân 8 bit + dữ liệu tổng
kiểm tra 8 bit.
Nếu việc truyền dữ liệu là đúng thì dữ liệu tổng của 4 byte đầu phải bằng dữ liệu tổng kiểm
tra. Byte1 + Byte2 + Byte3 + Byte4 = Byte5 (Checksum). Xem hình 6-26.
a. Quá trình giao tiếp tổng quan
Khi MCU gửi tín hiệu bắt đầu (Start) thì DHT11 sẽ chuyển từ chế độ ngủ sang chế độ chạy,
chờ MCU hoàn thành tín hiệu bắt đầu.

158 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Sau khi hoàn thành, DHT11 sẽ gửi tín hiệu phản hồi của dữ liệu 40 bit bao gồm thông tin
về độ ẩm và nhiệt độ tương đối về MCU.

Hình 6-26. Định dạng 5 byte của DHT11 gửi đến MCU
Không có tín hiệu bắt đầu từ MCU thì DHT11 sẽ không đưa ra tín hiệu phản hồi cho MCU.
Sau khi dữ liệu được thu thập thì DHT11 sẽ chuyển sang chế độ ngủ cho đến khi nhận
được tín hiệu bắt đầu từ MCU.
b. MCU gửi tín hiệu Start đến DHT11
Mức logic tự do của bus giao tiếp thường ở mức điện áp cao.
Khi giao tiếp giữa MCU và DHT11 bắt đầu, bên MCU sẽ điều khiển bus giao tiếp dữ liệu
từ mức ‘1’ xuống mức ‘0’ và kéo dài ít nhất 18ms để đảm bảo DHT11 phát hiện tín hiệu này
của MCU, sau đó MCU sẽ thả nỗi bus và “điện trở kéo lên” sẽ làm tín hiệu lên mức ‘1’ trong
khoảng 20-40µs, trong khoảng thời gian này MCU sẽ đợi đáp ứng từ DHT11. Xem hình 6-27.

Hình 6-27. Biểu đồ thời gian tín hiệu Start của MCU và đáp ứng của DHT11
c. DHT11 đáp ứng lại MCU
Khi DHT11 phát hiện tín hiệu bắt đầu, nó sẽ phản hồi bằng cách kéo tín hiệu bus từ ‘1’
xuống ‘0’, tín hiệu này kéo dài 80µs. Sau đó, DHT11 kéo bus lên mức ‘1’ và duy trì khoảng
80µs để chuẩn bị cho quá trình DHT gửi dữ liệu. Xem hình 7-28.
d. DHT11 gửi dữ liệu 40 bit cho MCU

Thực hành vi điều khiển PIC 159


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Khi DHT gửi dữ liệu tới MCU, mọi bit dữ liệu luôn bắt đầu với bit ‘0’ kéo dài đúng 50µs
và sao đó kéo tín hiệu bus lên mức ‘1’ và căn cứ vào độ dài thời gian của tín hiệu để xác định
xem bit dữ liệu là "0" hay "1".
Nếu thời gian ở mức ‘1’ nằm trong khoảng từ 26-28µs thì xem như gửi bit ‘0’, hình 6-28.

Hình 6-28. Biểu đồ thời gian DHT11 gửi dữ liệu bit ‘0’
Nếu thời gian ở mức ‘1’ nằm trong khoảng 70µs thì xem như gửi bit ‘1’, hình 6-29.

Hình 6-29. Biểu đồ thời gian DHT11 gửi dữ liệu bit ‘1’
Thời gian DHT11 gửi bit ‘0’ và bit ‘1’ không đều nhau.

Hình 6-30. Biểu đồ thời gian của 1 chu kỳ giao tiếp giữa MCU và DHT11
Giải pháp cho MCU để biết mức dữ liệu bit ‘0’ và bit ‘1’: MCU sẽ đếm thời gian theo đơn
vị µs bắt đầu từ khi tín hiệu lên mức ‘1’ cho đến khi tín hiệu xuống mức ‘0’ thì ngừng đếm và
giả sử đếm được Cµs. Lấy C so sánh với M: nếu nhỏ hơn M thì xem như đó là bit ‘0’, ngược lại
là bit ‘1’. M có thể là 40 cho đến 60 đều được.
6.6.5 Thư viện của DHT11
160 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Phần này trình bày các thư viện của DHT11.
a. Các định nghĩa: Các lệnh.
#define dht11_pin_low() output_drive(dht11); output_low(dht11)
#define dht11_pin_high() output_drive(dht11); output_high(dht11)
#define dht11_pin_float() output_float(dht11)
#define dht11_pin_read() input_state(dht11)
Giải thích: Định nghĩa các lệnh để điều khiển chân giao tiếp của vi điều khiển với DHT11.
b. Hàm 608: Tạo trạng thái “start”.
void dht11_start()
{
dht11_pin_low();
delay_ms(18);
dht11_pin_high();
dht11_pin_float();
delay_us(40);
}
c. Hàm 609: Kiểm tra đáp ứng từ DHT11.
int1 dht11_check_response()
{
unsigned int8 cnt=0;
int1 tt=1, tt1=1;
do
{
if(dht11_pin_read()==0) cnt++;
else tt=0;
}while ((cnt<200)&&(tt==1));

cnt=0; tt1=1;
do
{
if(dht11_pin_read()==1) cnt++;
else tt1=0;
}while ((cnt<200)&&(tt1==1));
return tt;
}
Giải thích: Hàm có 2 vòng lặp do while.
Vòng lặp thứ nhất chờ bus lên mức 1: hàm chỉ thoát khi bus giao tiếp lên mức 1
thì xem như có DHT11 hoặc khi biến đếm cnt bằng 200 thì xem như không có
DHT11.
Vòng lặp thứ hai chờ bus xuống mức 0: hàm chỉ thoát khi bus giao tiếp xuống mức
0 thì xem như có DHT11 hoặc khi biến đếm cnt bằng 200 thì xem như không có
DHT11.

Thực hành vi điều khiển PIC 161


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Kết quả trả về là trạng thái tt của lần đầu tương ứng với mức logic 0 nếu có DHT11,
ngược lại thì không có DHT11.
d. Hàm 610: Đọc 1 byte dữ liệu từ DHT11.
unsigned int8 dht11_read()
{
unsigned int8 kq,j;
for(j=0;j<8;j++)
{
while(!dht11_pin_read()); //doi het muc 0
delay_us(40);
if(dht11_pin_read()==1)
{
kq = (kq<<1)+1;
delay_us(30); //bit 1 thi them delay
}
else kq = kq<<1;
}
return kq;
}
Giải thích: Vòng lặp for chạy 8 lần để đọc 8 bit. Lệnh while có chức năng đợi tín hiệu hết
mức 0. Delay 40µs. Kiểm tra nếu tín hiệu bus mức 1 thì thì xem như nhận bit 1: tiến hành dịch
bit 1 vào và delay thêm 30µs cho đủ thời gian của bit 1, ngược lại thì xem như nhận bit 0.
e. Hàm 611: Thông báo không có DHT11.
void hien_thi_no_dht11()
{
lcd_goto_xy(0,0);
lcd_data("NO DHT11");
}
f. Hàm 612: Thông báo đọc sai dữ liệu từ DHT11.
void hien_thi_sai_dht11()
{
lcd_goto_xy(0,0);
lcd_data("SAI CHECKSUM");
}

6.6.6 Các chương trình đo nhiệt độ và độ ẩm của DHT11


Phần này thực hành các bài đọc nhiệt độ và độ ẩm từ DHT11.

Bài mẫu 622. Chương trình đọc nhiệt độ và độ ẩm từ vi mạch DHT11 hiển thị trên led
7 đoạn và LCD.
Lưu tên file “bai_622_dht11_lcd_7doan”.

162 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
a.Mục đích: Biết lập trình khởi tạo, đọc nhiệt độ, độ ẩm từ vi mạch DHT11.
b.Lưu đồ, giải thuật: Khởi tạo DHT11, kiểm tra sự hiện diện của DHT11 nếu có thì đọc
độ ẩm và nhiệt độ, hiển thị kết quả đo, nếu không có DHT11 thì thông báo.
c. Chương trình con “bai_622_dht11_tv”:
unsigned int8 ds18a_ng, ds18a_ngt=0;
unsigned int16 ds18a_w,ds18a_tp,ds18a_tpt=50;

void h617_ds18b20a_ht_lcd()
{
if(ds18a_ngt!=ds18a_ng)
{
ds18a_ngt=ds18a_ng;
lcd_gm_ht_2so_to_xvn(ds18a_ng,2,0,kx_vn);
lcd_data(".");
}
if(ds18a_tpt!=ds18a_tp)
{
ds18a_tpt=ds18a_tp;
lcd_gm_ht_4so_nho_xvn(ds18a_tp*625,3,7,kx_vn);
}
}

void h617_ds18b20a_ht_7doan()
{
led_7d[7]=0xff;
giaima_bin_2so_vitri_vn(ds18a_ng,5,kx_vn);
led_7d[4]=0x9c;
giaima_bin_2so_vitri_vn((ds18a_tp*625)/100,2,kx_vn);
xuat_8led_7doan();
}

void b617_ds18b20_doc_nhiet_do()
{
if(touch_present())
{
ds18a_w = ds18b20_read_temp();
ds18a_ng = ds18a_w>>4;
ds18a_tp = ds18a_w & 0x000f;

h617_ds18b20a_ht_lcd();
h617_ds18b20a_ht_7doan();
}
else ds18b20_no_ds18b();
}
d. Chương trình chính:
Thực hành vi điều khiển PIC 163
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_622_dht11_tv.c>

void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();
lcd_goto_xy(0,1);
lcd_data("HUMI");
lcd_goto_xy(0,8);
lcd_data("DHT11");
lcd_goto_xy(0,15);
lcd_data("TEMP");
lcd_goto_xy(1,7);
lcd_data("CHECK");
lcd_goto_xy(2,9);
lcd_data("SUM");

while(true)
{
b621_dht11_read_temp_humi();
delay_ms(200);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Giá trị độ ẩm và nhiệt độ sẽ hiển thị trên 6 led chính giữa của
module 8 led và 5 byte đọc về cùng byte tính toán để so sánh hiện thị trên LCD.

Bài tập 623. Tổng hợp các yêu cầu: thêm vào bài 619 yêu cầu thứ 5
Yêu cầu 5: Đo nhiệt độ và độ ẩm dùng DHT11 hiển thị trên LCD và led 7 đoạn.
Dùng nút nhấn BT0 làm nút UP và BT1 làm nút DW để chọn 5 yêu cầu.
Lưu tên file “bai_623_th_lm35_joy_hcsr_gp2d12_ds18_dht11_btn”.

Bài tập 624. Giống bài 620 nhưng mỗi yêu cầu thực hiện trong 10 giây sau đó tự động
chuyển sang yêu cầu kế. Bắt đầu từ yêu cầu 1. Hiển thị đếm 10 giây ở vị trí nào còn trống
trên LCD hoặc ở led đơn.
Lưu tên file “bai_624_th_lm35_joy_hcsr_gp2d12_ds18_dht11_auto”.

6.7 VI MẠCH ADC 24 BIT HX711 VÀ CẢM BIẾN LOAD-CELL


6.7.1 Giới thiệu vi mạch HX711

164 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Dựa vào công nghệ được cấp bằng sáng chế của Avia Semiconductor, HX711 là bộ chuyển
đổi tương tự sang số 24 bit chính xác được thiết kế để sản xuất cân nặng và các ứng dụng điều
khiển trong công nghiệp để giao tiếp trực tiếp với cảm biến cầu điện trở.
Bộ ghép kênh ngõ vào chọn ngõ vào Kênh A hoặc ngõ vào vi sai B đưa mạch đến khuếch
đại có thể lập trình (PGA Programmable Gain Amplifier) có độ nhiễu thấp.
Kênh A có thể lập trình với hệ số khuếch đại là 128 hoặc 64 tương ứng với điện áp ngõ
vào vi sai toàn giai lần lượt là ± 20mV hoặc ± 40Mv khi nguồn cung cấp là 5V được cấp cho
chân nguồn tương tự AVDD
Kênh B có mức tăng cố định là 32.
Bên trong chip có mạch ổn áp để cấp cho khối ADC và cảm biến.
Có nguồn xung đồng hồ linh hoạt, có thể lấy từ nguồn xung đồng hồ bên ngoài, hoặc lấy
từ dao động thạch anh, hoặc bộ dao động trên chip mà không yêu cầu thêm bất kỳ thành phần
bên ngoài. Mạch reset đơn giản hóa quá trình khởi tạo giao tiếp dạng số.
Không có lệnh lập trình nào cả cho các thanh ghi bên trong HX711. Tất cả các điều khiển
cho HX711 đều thông qua các chân.
6.7.2 Các thông số kỹ thuật
Các thông số cấu hình của HX711
 Có hai kênh đầu vào vi sai có thể lựa chọn
 Có bộ PGA bên trong chip với độ nhiễu thấp và hệ số khuếch đại có thể lựa chọn là
32, 64 và 128
 Có nguồn ổn bên trong để cấp cho loadcell và mạch ADC
 Có mạch dao động bên trong chip nên không yêu cầu thêm mạch bên ngoài nhưng
cần dùng tinh thể thạch anh bên ngoài tùy chọn tần số.
 Có mạch reset tích hợp bên trong chip.
 Điều khiển số đơn giản và giao diện nối tiếp: điều khiển số thông qua chân giao
tiếp, không cần lập trình.
 Có thể lựa chọn tốc độ truyền dữ liệu giao tiếp đầu ra 10SPS hoặc 80SPS.
 Dòng tiêu thụ gồm chế độ hoạt động và tiết kiệm: hoạt động bình thường < 1.5mA
và chế độ tiết kiệm < 1uA.
 Điện áp cung cấp cho chip hoạt động: 2.6 ~ 5.5V
 Phạm vi nhiệt độ hoạt động: -40 ~ + 85 ℃
6.7.3 Sơ đồ chân HX711
Sơ đồ chân HX711 như hình 6-31, chip đóng gói theo chuẩn SOP-16L.

Thực hành vi điều khiển PIC 165


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 6-31. Sơ kết đồ chân IC HX711


Bảng chi tiết tên, chức năng các chân:
Bảng 6-5. Điện áp, dòng tiêu thụ, chu kỳ lấy mẫu của DHT11
Thứ tự Tên Chức năng Mô tả
chân
1. VSUP Nguồn Nguồn cung cấp từ 2.7V ~ 5.5V
2. BASE Ngõ ra Ngõ ra điều khiển mạch ổn áp
tương tự (NC khi không dùng)
3. AVDD Nguồn Nguồn cung cấp cho khối ADC từ 2.7V ~ 5.5V
4. VFB Ngõ vào Ngõ vào điều khiển mạch ổn áp
tương tự (nối với AGND khi không dùng)
5. AGND Nối mass Nối mass cho mạch tương tự
6. VBG Ngõ ra Ngõ ra tham chiếu bypass
tương tự
7. INA- Ngõ vào Ngõ vào âm kênh A
tương tự
8. INA+ Ngõ vào Ngõ vào dương kênh A
tương tự
9. INB- Ngõ vào Ngõ vào âm kênh B
tương tự
10. INB+ Ngõ vào Ngõ vào dương kênh B
tương tự
11. PD_SCK Ngõ vào Điều khiển chế độ tiết kiệm công suất (tích cực mức cao)
dạng số và ngõ vào nhận xung đồng hồ nối tiếp
12. DOUT Ngõ ra dạng Ngõ xuất dữ liệu nối tiếp
số

166 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
13. XO Ngõ IO dạng Nối với tụ thạch anh (NC khi không dùng)
số
14. XI Ngõ vào Nối với tụ thạch anh (NC khi không dùng)
dạng số
15. RATE Ngõ vào Điều khiển chọn tốc độ truyền dữ liệu: mức 0 thì chọn
dạng số 10Hz, mức 1 thì chọn 80Hz.
16. DVDD Nguồn cung cấp số từ 2.6V ~ 5.5V
Các ngõ vào tương tự
Ngõ vào vi sai kênh A được thiết kế để giao tiếp trực tiếp với ngõ ra vi sai của cầu điện trở
cảm biến. Nó có thể lập trình với hệ số khuếch đại là 128 hoặc 64.
Hệ số khuếch đại lớn nhất được dùng để tương thích với tín hiệu ngõ ra nhỏ nhất từ cảm
biến. Khi nguồn cung cấp được cấp là 5V cho chân AVDD, các hệ số khuếch đại này tương ứng
với điện áp ngõ vào vi sai là ±20mV hoặc ±40mV.
Ngõ vào vi sai kênh B có độ lợi cố định là 32. Dãy điện áp ngõ vào toàn giai là ±80mV khi
nguồn cấp cho AVDD là 5V.
6.7.4 Sơ đồ mạch kết nối với cảm biến Load-cell
Sơ đồ mạch kết nối cảm biến Load-cell với vi mạch HX711 có sơ đồ khối như hình 6-32.

Hình 6-32. Sơ kết nối HX711 với cảm biến Load-cell


Cảm biến Load-cell là một mạch cầu Wheastone có 4 đầu dây giao tiếp.
Bên trong vi mạch HX711 có một mạch đa hợp, tín hiệu được chọn sẽ đưa qua mạch
khuếch đại với hệ số khuếch đại có thể lập trình để lựa chọn là 32/64/128.
Sau đó tín hiệu sẽ đưa đến mạch ADC 24 bit. Kết quả số sẽ đưa qua mạch giao tiếp số để
giao tiếp với các vi điều khiển theo chuẩn nối tiếp đồng bộ gồm 2 đường: dữ liệu và xung clock.
Các khối còn lại là bộ dao động, khối ổn áp, khối tham chiếu để hỗ trợ cho khối ADC.
6.7.5 Giao tiếp đồng bộ của HX711
Thực hành vi điều khiển PIC 167
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Các chân SCK và DOUT được dùng để trao đổi dữ liệu, lựa chọn ngõ vào, lựa chọn hệ số
KĐ và điều khiển chế độ tiết kiệm công suất nguồn.

Hình 6-33. Biểu đồ thời gian một chu kỳ chuyển đổi của HX711
Khi dữ liệu ra chưa sẵn sàng cho trao đổi thì chân DOUT ở mức 1. Chân SCK sẽ mức 0.
Khi chân DOUT về mức 0 thì có nghĩa là dữ liệu đã sẵn sàng.
Bằng cách cấp từ 25 đến 27 xung ở chân SCK thì dữ liệu sẽ dịch ra từ chân DOUT.
Mỗi xung SCK thì dịch 1 bit dữ liệu và bắt đầu với bit đầu tiên là MSB và truyền cho hết
24 bit. Ở xung SCK thứ 25 thì chân DOUT sẽ trở lại mức 1.
Dạng sóng hoạt động của mạch như hình 6-33.
Bảng các thông số thời gian của SCK và DOUT.
Bảng 6-6. Thông số thời gian của SCK và DOUT
Thứ Ký Chú ý Tối Trung Tối Đơn
tự hiệu thiểu bình đa vị
1. T1 DOUT ở mức 0 đến khi có cạnh lên 0.1 µs
của SCK
2. T2 Cạnh lên của DOUT 0.1 µs
3. T3 Thời gian SCK ở mức 1 0.2 1 50 µs
4. T4 Thời gian SCK ở mức 0 0.2 1 µs
Lựa chọn hệ số KĐ và kênh ngõ vào thì được điều khiển bởi số lượng xung SCK, hãy xem
bảng 3. Khi số lượng xung SCK không được nhỏ hơn 25 và nhiều hơn 27 nằm trong một chu kỳ
chuyển đổi để tránh gây ra lỗi truyền dữ liệu nối tiếp.
Bảng 6-7. Thông số số lượng xung lựa chọn hệ số khuếch đại
Thứ tự Số lượng xung SCK Kênh ngõ vào Hệ số KĐ
1. 25 A 128
2. 26 B 32

168 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
3. 27 A 64
Chế độ Reset và tiết kiệm công suất
Khi chip được cấp nguồn bên ngoài thì mạch nguồn bên trong chip và mạch reset sẽ tiến
hành reset chip.
Ngõ vào SCK được dùng để điều khiển vào chế độ tiết kiệm công suất cho HX711.
Khi chân SCK ở mức 0 thì chip hoạt động bình thường.
Khi chân SCK thay đổi từ mức 0 lên mức 1 và duy trì ở mức 1 dài hơn 60µs thì khi đó
HX711 sẽ vào chế độ ngủ để tiết kiệm công suất. Xem hình 6-34.

Hình 6-34. Biểu đồ thời gian vào chế độ ngủ của HX711
Khi đó mạch nguồn ổn áp bên trong chip được dùng cho HX711 và chuyển đổi bên ngoài
sẽ chuyển sang chế độ công suất thấp.
Khi SCK trở lại mức 0 thì chip sẽ được reset và trở lại chế độ hoạt động bình thường.
Sau khi reset hoặc sau khi thoát khỏi chế độ ngủ thì ngõ vào mặc nhiên được chọn là kênh
A và hệ số KĐ là 128.
6.7.6 Các đặc tính điện quan trọng của HX711
Để sử dụng HX711 thì phải tham khảo bảng các đặc tính điện quan trọng.
Bảng 6-8. Các đặc tính điện quan trọng của HX711
Thứ Thông số Chú ý Tối thiểu Trung bình Tối đa Đơn
tự vị
1. Dãy điện áp ngõ V(imp) – ±0.5 (AVDD/GAIN) V
vào vi sai toàn V(inn)
giai đo
2. Ngõ vào ở chế AGND+1.2 AGND-1.3 V
độ chung
3. Tốc độ dữ liệu Dao động nội, 10 HZ
ngõ ra RATE = 0
4. Dao động nội, 80 HZ
RATE = 1

Thực hành vi điều khiển PIC 169


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
5. Dao động fclk/1,105,920 HZ
ngoại, RATE
=0
6. Dao động fclk/138,420 HZ
ngoại, RATE
=1
7. Mã hóa dữ liệu ở định dạng 800000H 7FFFFFH Số
ra bù 2 hex
8. Thời gian thiết RATE = 0 400 ms
lập ngõ ra
9. RATE = 1 50 ms
10. Trôi lệch ngõ HSKĐ= 128 0.2 mV
vào
11. HSKĐ= 64 0.4 mV
12. Nhiễu ngõ vào HSKĐ= 128 50 nV(r
RATE = 0 ms)
13. HSKĐ= 128 90 nV(r
RATE = 1 ms)
14. Trôi do nhiệt độ Lệch ngõ vào ±6 nV/º
HSKĐ= 128 C
RATE = 0
15. HSKĐ= 128 ±6 ppm/º
RATE = 1 C
16. Độ lợi chế độ HSKĐ= 128 100 DB
chung ngõ vào RATE = 0
17. Độ lợi điện áp HSKĐ= 128 100 DB
cung cấp RATE = 0
18. Thạch anh bên 1 11,0592 20 MHz
ngoài

6.7.7 Module HX711


Để tiện lợi cho người dùng thì người ta đã chế tạo ra module HX711 kết nối theo sơ đồ
nguyên lý như hình 6-34 có hình dạng như hình 6-35.
Có 6 chân giao tiếp với các tín hiệu tương tự gồm E+, E-, A-, A+, B- và B+.
Bên còn lại có 4 chân gồm 2 chân cấp nguồn 5V và 2 chân giao tiếp số là DT (là chân
DOUT) và SCK (là chân PD_SCK).

170 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 6-35. Module HX711


6.7.8 Cảm biến Load-cell
Là cảm biến dạng strain – gauge có chức năng thay đổi giá trị điện trở theo lực tác động
lên nó làm nó biến dạng. Hình ảnh của cảm biến, cách tính giá trị điện trở và điện trở thay đổi
khi cảm biến chịu tác động của lực nén và lực kéo dãn như hình 6-36.
Cảm biến strain-gauge thường gắn vào mạch cầu điện trở Wheatstone để chuyển đổi sự
thay đổi của điện trở thành sự thay đổi của điện áp như hình 6-37.

Hình 6-36. Cảm biến Strain-gauge


Khi cầu cân bằng thì điện áp V bằng 0.
Khi có lực tác động làm điện trở của strain-gauge thay đổi, làm xuất hiện điện áp tỷ lệ với
lực tác động.

Thực hành vi điều khiển PIC 171


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 6-37. Cảm biến Strain-gauge nối vào cầu Wheatstone

Hình 6-38. Kết nối cảm biến Load-cell với module HX711
Giá trị điện trở thay đổi rất nhỏ hàng µV nên cần phải có mạch khuếch đại thật tốt và ổn
định và mạch ADC với độ phân giải cao 24 bit để chuyển đổi. Module Hx711 chuyên dùng để
đáp ứng công việc này.
6.7.9 Kết nối cảm biến Load-cell với module HX711

172 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Cảm biến Load-cell có 4 đầu dây ra được phân biệt bằng chuẩn 4 màu: đỏ (RED), đen
(BLACK), trắng (WHITE) và xanh lá (GREEN) sẽ được kết nối với 4 tín hiệu E+. E-, A- và A+
tương ứng như hình 6-38.
6.7.10 Thư viện của HX711
Phần này trình bày các thư viện của HX711.
a. Các định nghĩa: Định nghĩa 2 tín hiệu giao tiếp.
#define hx_dt pin_d0
#define hx_ck pin_d1
b. Hàm 613: Hàm đọc kết quả chuyển đổi từ HX711.
unsigned int16 hx711_read()
{
signed int32 kq=0;
unsigned int8 i;
output_low(hx_ck);
while(input(hx_dt));
for (i=0;i<24;i++)
{
output_high(hx_ck);
kq=kq<<1;
output_low(hx_ck);
if(input(hx_dt)) kq++;
}
output_high(hx_ck);
kq=kq^0x800000;
output_low(hx_ck);

//xuat_32led_don_1dw(kq);
kq = (8262712-kq)/180;
if(kq<0) kq = 0;
return(kq);
}
Giải thích: Hàm được viết dựa vào dạng sóng đã trình bày ở trên.
Cho tín hiệu hx_ck xuống mức 0, chờ tín hiệu hx_dt xuống mức 0.
Thực hiện vòng lặp for 24 lần để đọc 24 bit.
Đưa xung hx_ck về mức 1. Đưa xung hx_ck về mức 0.
Có nghĩa là tạo xung thứ 25. Cuối cùng là cân chỉnh kết quả theo quả cân mẫu.
Hằng số chia 8262712 và 180 tùy thuộc vào từng loại load-cell khác nhau.

6.7.11 Các chương trình đo khối lượng dùng cảm biến Load-cell và HX711
Phần này thực hành các bài cân khối lượng dùng cảm biến Load-cell và module HX711.

Thực hành vi điều khiển PIC 173


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài mẫu 625. Chương trình cân khối lượng dùng cảm biến Load-cell và module
HX711, hiển thị kết quả cân trên LCD, led 7 đoạn. Dữ liệu 24 bit hiển thị ở 32 led đơn.
Lưu tên file “bai_625_hx711_lcd_7doan_load_cell”.
Mục đích: Biết lập trình giao tiếp với module HX711 để đọc khối lượng từ cảm biến
a.
Load-cell và hiển thị trên LCD và led 7 đoạn.
b. Lưu đồ, giải thuật: Khởi tạo port, LCD, tiến hành đọc kết quả chuyển đổi nhiều lần,
tính trung bình và hiển thị.
c. Chương trình con “bai_625_hx711_tv”:
void b621_dht11_read_temp_humi()
{
usi8 hum_bl,hum_bh,tem_bl,tem_bh,sum, sum_ss;
usi8 hum_bht,tem_bht;
int1 presence;

dht11_start();
presence = dht11_check_response();
if(!presence==true)
{
hum_bh = dht11_read();
hum_bl = dht11_read();
tem_bh = dht11_read();
tem_bl = dht11_read();
sum = dht11_read();
sum_ss = hum_bh+hum_bl+tem_bh+tem_bl;
if(sum==sum_ss)
{
giaima_bin_2so_vitri_vn(hum_BH,5,kx_vn);
led_7d[4]=0xbf;
led_7d[3]=0xbf;
giaima_bin_2so_vitri_vn(tem_bh,1,cx_vn);
xuat_8led_7doan();

if(hum_bht!=hum_bh)
{
hum_bht=hum_bh;
lcd_gm_ht_2so_to_xvn(hum_bh,1,0,kx_vn);
}
if(tem_bht!=tem_bh)
{
tem_bht=tem_bh;
lcd_gm_ht_2so_to_xvn(tem_bh,1,14,kx_vn);
}
lcd_hthi_byte(hum_bh,3,0);
lcd_hthi_byte(hum_bl,3,3);

174 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
lcd_hthi_byte(tem_bh,3,6);
lcd_hthi_byte(tem_bh,3,9);
lcd_hthi_byte(sum,3,12);

lcd_goto_xy(3,15);lcd_data("(");
lcd_hthi_byte(sum_ss,3,16);
lcd_goto_xy(3,18);lcd_data(")");
}
else hien_thi_sai_dht11();
}
else hien_thi_no_dht11();
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <bai_625_hx711_tv.c>

void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();

lcd_goto_xy(0,0);
lcd_data("HX711: LOAD-CELL");

while(true)
{
b625_hx711_read();
b625_hx711_hien_thi();
b625_joystick_ht_7doan();
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Nếu chưa cân chỉnh thì tiến hành cân chỉnh, nếu đã cân chỉnh thì
khi chưa có vật cần cân thì hiển thị số 0. Khi có vật thì sẽ hiển thị đúng khối lượng
vật cần cân. Có thể có sai số và có thể dao động xung quanh giá trị đo.

Bài tập 626. Giống bài 625 nhưng dùng thêm các nút nhấn UP và DW để cân chỉnh
giá trị chuẩn và hiển thị giá trị cân chỉnh trên LCD.
Lưu tên file “bai_626_hx711_lcd_7doan_load_cell_btn”.

Thực hành vi điều khiển PIC 175


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài tập 627. Lập trình thực hiện cân khối lượng và tính tiền theo khối lượng. Giá tiền
cho 1 gam được nhập từ bàn phím ma trận hiển thị ở hàng 0. Khối lượng cân được hiển
thị số to ở hàng 1 và 2. Giá tiền tính theo khối lượng được tính và hiển thị ở hàng 3.
Lưu tên file “bai_627_hx711_lcd_7doan_load_cell_btn”.

Bài tập 628. Tổng hợp các yêu cầu: thêm vào bài 622 yêu cầu thứ 6
Yêu cầu 6: Đo khối lượng hiển thị trên LCD và led 7 đoạn.
Lưu tên file “bai_628_tong_hop_7cb_btn”.

Bài tập 629. Giống bài 628 nhưng mỗi yêu cầu thực hiện trong 10 giây sau đó tự động
chuyển sang yêu cầu kế. Bắt đầu từ yêu cầu 1. Hiển thị đếm 10 giây ở vị trí nào còn trống
trên LCD hoặc ở led đơn.
Lưu tên file “bai_629_tong_hop_7cb_auto”.

6.8 KẾT HỢP NHIỀU MODULE


Phần này tiếp tục kết hợp thêm các cảm biến vào các bài đã kết hợp ở chương 5.
Bài tập 631. Module 32 led đơn chạy 82 yêu cầu tự động. Module 8 led 7 đoạn hiển
thị giờ phút giây đọc từ DS1307. Module LCD hiển thị 5 giá trị đo của 5 cảm biến dạng
số nhỏ, hiển thị đếm sản phẩm dùng timer T0, bố trí hiển thị cho hợp lý.
Chú ý: chuyển đổi ADC nên giảm số lần đo trung bình còn 1 đến 5 để thời gian điều
khiển các yêu cầu khác.
Lưu tên file “bai_631_tong_hop”.

176 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 7: THỰC HÀNH


MODULE ĐỘNG CƠ BƯỚC,
ĐỘNG CƠ DC VÀ ENCODER,
PWM, ĐIỀU KHIỂN PID

Thực hành vi điều khiển PIC 177


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
7.1 ĐIỀU KHIỂN ĐỘNG CƠ BƯỚC
7.1.1 Giới thiệu động cơ bước
Động cơ bước có hình ảnh minh họa và sơ đồ nguyên lý như hình 7-1.

Hình 7-1. Động cơ bước và sơ đồ nguyên lý


Động cơ bước có nhiều loại và nhiều cách điều khiển tùy thuộc vào các ứng dụng cụ thể,
trong kit thực hành có trang bị 1 motor bước để các bạn thực hành.
Trong hình 7-1, động cơ bước có 6 đầu dây: 1a, 2a và 1b, 2b và 2 đầu dây chung là a và b.
Động cơ bước có nhiều ứng dụng trong thực tế ví dụ như ổ đĩa máy tính sử dụng động cơ
bước để di chuyển đầu đọc từ rãnh này sang rãnh kế, phạm vi di chuyển ngắn, còn động cơ DC
quay với tốc độ cao thì rất khó để điều khiển. Trong ổ đĩa thì động cơ DC quay với tốc độ 5400
vòng trên 1 phút để quay đĩa.
7.1.2 IC giao tiếp công suất điều khiển L298
Các động cơ bước có nhiều chủng loại tùy thuộc vào ứng dụng, trong bộ thí nghiệm sử
dụng động cơ bước có dòng là 1A. Vi điều khiển không thể trực tiếp điều khiển được mà phải
dùng IC chuyên dùng để điều khiển là L298. Hình ảnh IC và sơ đồ nguyên lý bên trong như hình
7-2.
Bên trong IC có các cổng logic và 2 cặp cầu H chuyên dùng để điều khiển động cơ DC và
có thể điều khiển được 2 động cơ DC hoặc 1 động cơ bước.
IC L298 có 2 điện áp: điện áp cấp cho các transistor để điều khiển động cơ có thể hoạt
động tối đa lên đến 46V, khi sử dụng động cơ có nguồn cung cấp bao nhiêu thì ta cấp đúng bấy
nhiêu, ví dụ động cơ dùng nguồn 24V thì ta cấp nguồn 24V, điện áp thứ hai là cấp cho các cổng
logic theo chuẩn TTL hoạt động bình thường là 5V DC.
Sơ đồ mạch điều khiển động cơ bước như hình 7-3.
Trong hình có 2 IC L298 và L297 dùng để điều khiển động cơ bước. Bạn chỉ quan sát phần
IC L298 có 4 ngõ ra điều khiển 4 đầu dây của động cơ bước. 8 diode dùng để bảo vệ các transistor
giải phóng năng lượng của cuộn dây về nguồn.
IC L297 chuyên để điều khiển động cơ bước nhưng trong bộ thí nghiệm không sử dụng
nên không đề cập.

178 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 7-2. Hình dạng và sơ đồ nguyên lý IC L298

Hình 7-3. IC L298 điều khiển 1 động cơ bước


7.1.3 Mạch giao tiếp điều khiển động cơ bước
Sơ đồ mạch giao tiếp với động cơ bước của kit thực hành như hình 7-4.
Trong mạch sử dụng một IC thanh ghi MBI5026 để mở rộng port điều khiển động cơ bước,
Relay, Buzzer và Triac.
Năm tín hiệu vào ENAX, IN1X, IN2X, IN3X, IN4X của IC802 – L298 nối với 5 tín hiệu
ngõ ra out của IC MBI5026.
Bốn ngõ ra OUT1, OUT2, OUT3, OUT4 sẽ nối với 4 đầu dây của động cơ bước, hai đầu
dây chung nối lên nguồn cấp cho động cơ. Có 8 diode dùng để bảo vệ các transistor bên trong
IC L298.

Thực hành vi điều khiển PIC 179


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 7-4. Mạch giao tiếp động cơ bước


7.1.4 Mã điều khiển động cơ bước
Dữ liệu điều khiển động cơ bước từ vi điều khiển sẽ gởi ra thanh ghi dịch, dữ liệu từ thanh
ghi dịch sẽ đưa đến IC công suất L298 để điều khiển động cơ bước.
Có 2 loại dữ liệu điều khiển động cơ bước: điều khiển bước đủ (full step) và nữa bước
(half step) được trình bày trong các bảng theo sau.
Do MBI5026 có ngõ ra đảo nên dữ liệu được trong bảng ở trạng thái đã bị đảo.
Bảng 7-1. Các trạng thái điều khiển động cơ bước đủ - cách 1
SỐ NHỊ PHÂN 16 BIT – ĐÃ BỊ ĐẢO DO IC MBI 5026 SỐ HEX
TT Out IN4 IN3 IN2 IN1 ENA
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 X X X X 1 Ngừng
2 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0×0700
3 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0×0680
4 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0×0580
5 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0×0380
180 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Có thể đấu nối dây các pha không theo đúng trình tự ở bảng trên thì có thể đổi thứ tự mã
như bảng sau:
Bảng 7-2. Các trạng thái điều khiển động cơ bước đủ - cách 2
SỐ NHỊ PHÂN 16 BIT – ĐÃ BỊ ĐẢO DO IC MBI 5026 SỐ HEX
Out IN4 IN3 IN2 IN1 ENA
TT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 X X X X 1 Ngừng
2 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0×0700
3 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0×0580
4 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0×0680
5 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0×0380
Khi muốn điều khiển động cơ bước quay thì bit ENA phải bằng 0, 4 bit còn lại sẽ có giá
trị như trong bảng cột số hex.
Nếu gởi 4 mã theo thứ tự từ trên xuống thì động cơ bước sẽ quay theo chiều kim đồng hồ,
nếu gởi ngược lại thứ tự từ dưới lên thì động cơ sẽ quay ngược chiều kim đồng hồ.
Bảng 7-3. Các trạng thái điều khiển động cơ nữa bước – cách 1
SỐ NHỊ PHÂN 16 BIT– ĐÃ BỊ ĐẢO DO IC MBI 5026 SỐ HEX
Out IN4 IN3 IN2 IN1 ENA
TT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 X X X X 0 Ngừng
2 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0×0700
3 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0×0600
4 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0×0680
5 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0×0480
6 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0×0580
7 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0×0180
8 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0×0380
9 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0×0300
Có thể đấu nối dây các pha không theo đúng trình tự thì có thể đổi thứ tự mã như sau:
Bảng 7-4. Các trạng thái điều khiển động cơ nữa bước – cách 2
SỐ NHỊ PHÂN 16 BIT– ĐÃ BỊ ĐẢO DO IC MBI 5026 SỐ HEX
Out IN4 IN3 IN2 IN1 ENA
TT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 X X X X 0 Ngừng
2 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0×0700
3 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0×0500
4 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0×0580
5 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0×0480
6 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0×0680
7 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0×0280
8 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0×0380
9 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0×0300

Thực hành vi điều khiển PIC 181


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
7.1.5 Các biến và hàm điều khiển Relay, Triac, Buzzer, động cơ
a. Khai báo và định nghĩa: Biến điều khiển động cơ bước, động cơ dc, triac và relay.
unsigned int16 rbdc = 0;
#bit step_motor_enable = rbdc.0
#bit ms1 = rbdc.1
#bit ms2 = rbdc.2
#bit ms3 = rbdc.3
#bit step = rbdc.4
#bit dir = rbdc.5
#bit servo1 = rbdc.6

#bit step_motor_in1 = rbdc.7


#bit step_motor_in2 = rbdc.8
#bit step_motor_in3 = rbdc.9
#bit step_motor_in4 = rbdc.10

#bit triac_1 = rbdc.11 //1=on,0=off


#bit triac_2 = rbdc.12 //1=on,0=off
#bit buzzer = rbdc.13 //1=on,0=off
#bit relay_1 = rbdc.14 //1=on,0=off
#bit relay_2 = rbdc.15 //1=on,0=off
b. Hàm 701: Buzzer on: buzzer sẽ kêu
void buzzer_on()
{
buzzer=1; xuat_rbdc();
}
c. Hàm 702: Buzzer off: tắt buzzer
void buzzer_off()
{
buzzer=0; xuat_rbdc();
}
d. Hàm 703: Triac 1 on: đèn tròn AC sáng
void triac_1_on()
{
triac_1=1; xuat_rbdc();
}
e. Hàm 704: Triac 1 on: đèn tròn AC sáng
void triac_1_off()
{
triac_1=0; xuat_rbdc();
}
Còn nhiều hàm khác, hãy xem thêm trong thư viện.
7.1.6 Thư viện điều khiển động cơ bước
Thư viện của động cơ bước là “tv_07_18f6722_step_motor” cung cấp các hàm rất thuận tiện
cho bạn lập trình điều khiển.

182 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
a. Khai báo: Mảng chứa mã điều khiển bước đủ và nửa bước, các biến điều khiển.
unsigned int16 stepmotor_fs[]= {0x0700,0x0680,0x0580,0x0380};
unsigned int16 stepmotor_hs[]=
{0x0380,0x0300,0x0600,0x0000,0x0400,0x0480,0x0580,0x0780};

unsigned int8 stepmotor_i=0, stepmotor_delay;


int1 stepmotor_tn=0,stepmotor_onoff=0;
int1 stepmotor_fh=1;
Biến cho phép ĐCB chạy hay ngừng, chạy thuận hay nghịch, chạy bước đủ hay nửa bước.
b. Hàm 705: Điều khiển ĐCB quay thuận hoặc nghịch bước đủ.
void step_motor_run_tn_fs()
{
rbdc=rbdc & 0xf87f;
rbdc=rbdc|stepmotor_fs[stepmotor_i];
xuat_rbdc();
if(stepmotor_tn) stepmotor_i++; //thuan
else stepmotor_i--; //nghich
stepmotor_i = stepmotor_i & 0x03;
}
c. Hàm 706: Điều khiển ĐCB quay thuận hoặc nghịch nửa bước.
void step_motor_run_tn_hs()
{
rbdc=rbdc & 0xf87f;
rbdc=rbdc|stepmotor_hs[stepmotor_i];
xuat_rbdc();
if(stepmotor_tn) stepmotor_i++; //thuan
else stepmotor_i--; //nghich
stepmotor_i = stepmotor_i & 0x07;
}
d. Hàm 707: Điều khiển ĐCB ngừng.
void step_motor_stop()
{
rbdc=rbdc & 0xf87f;
xuat_rbdc();
}
e. Hàm 708: Điều khiển ĐCB chạy bước đủ hay nửa bước.
void step_motor_run_fs_hs()
{
if(stepmotor_fh) step_motor_run_tn_fs();
else step_motor_run_tn_hs();
}
7.1.7 Các bài thực hành điều khiển động cơ bước

Thực hành vi điều khiển PIC 183


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài mẫu 701. Chương trình điều khiển động cơ bước bước đủ bằng 3 nút: ON, OFF,
INV. Khi nhấn ON thì động cơ quay theo chiều kim đồng hồ.
Khi nhấn INV thì động cơ đảo chiều đang quay, nếu động cơ ngừng thì phím này không
có tác dụng. Dùng 16 led để báo trạng thái quay thuận, nghịch.
Khi nhấn OFF thì động cơ ngừng..
Lưu tên file là “bai_701_step_motor_on_off_inv”
a.Mục đích: Biết lập trình điều khiển động cơ bước bằng 3 nút nhấn ON, OFF, INV.
b.Lưu đồ, giải thuật: Nút ON và OFF điều khiển bit on/off. Nút INV thay đổi trạng
thái bit thuận nghịch. Khi On và thuận thì xuất mã điều khiển thứ nhất ra điều khiển
động cơ bước để quay phải 1 bước, delay 20ms, tương tự xuất mã điều khiển thứ
hai, thứ 3, thứ 4 và lặp lại và động cơ quay thuận mãi.
c. Chương trình con “bai_801_step_motor_tv”:
unsigned int8 y=0;
void step_motor_on_off_inv()
{
if(!input(on))
{
stepmotor_onoff=1;
xuat_32led_don_4byte(0,0,y,~y);
}
else
if(!input(off))
{
stepmotor_onoff=0;
xuat_32led_don_4byte(0,0,0,0);
step_motor_stop();
}
else if(phim_inv_c2(20))
{
stepmotor_tn=~stepmotor_tn;
y = ~y;
xuat_32led_don_4byte(0,0,y,~y);
}
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_07_18f6722_step_motor.c>
#include <bai_701_step_motor_tv.c>
void main()
{
set_up_port();
stepmotor_delay=20;
stepmotor_tn = 1;

184 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
stepmotor_fh = 1;
while(true)
{
step_motor_on_off_inv();
if(stepmotor_onoff)
{
step_motor_run_fs_hs();
delay_ms(stepmotor_delay);
}
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Sau khi nạp xong thì nhấn nút ON động cơ sẽ quay thuận, nhấn
INV thì động cơ đảo chiều, nhấn OFF sẽ ngừng động cơ. Có thể điều chỉnh thời gian
delay giữa 2 lần gởi để thay đổi tốc độ động cơ, nếu thời gian ngắn quá thì động cơ
có thể đứng yên vì không đáp ứng được.

Bài mẫu 702. Giống bài 801 nhưng thêm phần hiển thị số bước trên 8 led 7 đoạn. Nếu
quay bước đủ thì 1 vòng là 200 bước.
Lưu tên file là “bai_702_step_motor_on_off_inv_hthi_sb”
a. Mục đích: Biết điều khiển động cơ bước bằng 3 nút nhấn và hiển thị số bước.
b. Lưu đồ, giải thuật: Giống bài 701, chỉ thêm phần hiển thị số bước. Mỗi lần quay một
bước thì tăng số bước lên 1 rồi giải mã hiển thị.
c. Chương trình:
#include <tv_kit_vdk_18f4550_all.c>
#include <tv_08_step_motor.c>
#include <bai_801_step_motor_on_off_inv_tv.c>
unsigned int16 sb;
void hthi_sobuoc_7doan()
{
md4l7d_giaima_4so_vitri_vn(sb,3,cx_vn);
xuat_4led_7doan_4so();
}
void main()
{
set_up_port_ic_chot();
stepmotor_delay=20;
stepmotor_tn = 1;
stepmotor_fh = 1;
sb=0;
hthi_sobuoc_7doan();
while(true)
{
step_motor_on_off_inv();

Thực hành vi điều khiển PIC 185


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
if(stepmotor_onoff)
{
step_motor_run_fs_hs();
sb++;
hthi_sobuoc_7doan();
delay_ms(stepmotor_delay);
}
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Giống bài 701, thêm phần hiển thị số bước trên 8 led 7 đoạn.

Bài tập 703. Hãy viết chương trình điều khiển động cơ bước giống bài 704 nhưng 3
led 7 đoạn (2,1,0) hiển thị số bước của 1 vòng, 2 led (5,4) còn lại hiển thị số vòng.
Lưu tên file là “bai_703_step_motor_on_off_inv_hthi_sb_sv”

Bài tập 704. Hãy viết chương trình điều khiển động cơ bước có thể thay đổi tốc độ
bằng 3 nút điều khiển: UP, DW, INV, STOP.
Khi nhấn UP thì động cơ quay và tăng tốc.
Khi nhấn DW thì động cơ quay và giảm tốc.
Chiều quay tùy thuộc vào phím INV.
Có 3 led 7 đoạn (2,1,0) hiển thị số bước, 2 led (5,4) hiển thị thời gian delay, led 7 hiển
thị số cấp từ 0 đến 9. Cấp 0 thì ngừng. Cấp 1 đến cấp 9: tương ứng với các khoảng thời
gian delay: 45, 40, 35, 30, 25, 20, 15, 10, 5 ms.
Lưu tên file là “bai_704_step_motor_up_dw_inv_stop_sb_sc_tg”

Bài tập 705. Hãy viết chương trình điều khiển động cơ quay theo số vòng được đặt
trước dùng bàn phím cảm ứng, dùng các phím số từ 0 đến 9 để nhập số vòng, để đơn giản
chỉ nhập 1 con số hiển thị ở 1 led 7 đoạn. Nhấn phím D thì động cơ quay thuận và số
vòng giảm dần đến khi bằng 0 thì ngừng. Khi chạy thì không cho phép nhập.
Lưu tên file là “bai_705_step_motor_touch_1so”

Bài tập 706. Hãy mở rộng bài trên là nhập được 2 số và thêm phím E cho phép chạy
ngược.
Lưu tên file là “bai_706_step_motor_touch_2so”

Bài tập 707. Điều khiển động cơ bước quay thuận hoặc ngược bằng cách dùng bộ mã
hóa xoay vòng (RT). Ban đầu sau khi nạp hoặc cấp điện hoặc bị reset thì hiển thị cấp 0.
Khi xoay phải RT thì động cơ quay thuận tăng tốc dần đến tối đa là +9 là lớn nhất.
Xoay ngược về từ +9 đến 0 thì động cơ giảm tốc dần cho đến khi bằng 0 thì ngừng.
186 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Khi xoay trái RT thì động cơ quay ngược tăng tốc dần đến tối đa là -9 là lớn nhất. Xoay
ngược về từ -9 đến 0 thì động cơ giảm tốc dần cho đến khi bằng 0 thì ngừng.
Dùng thêm nút nhấn của RT làm nút Stop: khi nhấn thì động cơ ngừng.
Số cấp điều khiển hiển thị trên 1 led 7 đoạn. Thời gian delay giống bài trên hiển thị
trên 2 led 7 đoạn.
Có 8 led đơn bên trái báo trạng thái ngừng: tắt, chạy: sáng. Quay thuận: 8 led sáng, 8
led tắt, quay ngược: 8 led tắt, 8 led sáng của 16 led bên trái.
Lưu tên file là “bai_707_step_motor_tn_td_rotary”

Bài tập 708. Hãy hiệu chỉnh lại bài 703 thêm BT3 để chọn khiển động cơ quay bước
đủ hay nữa bước, ban đầu quay bước đủ.
Lưu tên file là “bai_703_step_motor_on_off_inv_hthi_sb_sv_fh_bt3”

7.2 ĐIỀU KHIỂN ĐỘNG CƠ DC, ENCODER


7.2.1 Giới thiệu động cơ DC, ENCODER
Động cơ DC và encoder có hình ảnh như hình 7-5.

Hình 7-5. Động cơ DC trong BTN và encoder


Động cơ DC có nhiều loại, trong kit thực hành có trang bị 1 động cơ DC dùng nguồn 24V,
dòng 1A, có encoder gắn vào trục động cơ tạo ra 45 hoặc 200 xung cho 1 vòng quay để các bạn
thực hành điều khiển. Tuy nhiên sau này không còn loại có gắn encode vì hết hàng.
Loại encoder trong BTN này đơn giản cho các ứng dụng không cần xác định chiều, loại
encoder có 2 đầu dây ra A và B dùng để xác định chiều của động cơ, A lên mức logic 1 nhanh
hơn B thì động cơ quay thuận và ngược lại khi đảo chiều thì B lên mức 1 nhanh hơn A.
Sơ đồ mạch điều khiển 1 động cơ dùng L298 và các trạng thái điều khiển như hình 7-6.
Hãy quan sát hình và bảng trạng thái bạn sẽ biết được nguyên lý điều khiển động cơ DC.

Thực hành vi điều khiển PIC 187


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Nếu chỉ dùng một IC L298 điều khiển một động cơ DC thì dư một cầu H, để tránh lãng phí
và tăng khả năng cấp dòng nên thì khi đó và ta sử dụng hai cầu H mắc song – song để điều khiển
một động cơ DC như hình 7-7.

Hình 7-6. IC L298 điều khiển 1 động cơ DC dùng 1 cầu H

Hình 7-7. IC L298 điều khiển 1 động cơ DC dùng 2 cầu H


Trong bộ thực hành thì dùng theo cách này.
7.2.2 Mạch giao tiếp điều khiển động cơ DC
Sơ đồ mạch giao tiếp với động cơ DC như hình 7-8.
Tín hiệu ENA của IC801 – L298 đã nối lên nguồn Vcc nên luôn ở chế độ cho phép.
188 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
IC L298 có thể điều khiển được 2 động cơ DC nhưng kit thực hành chỉ có 1 động cơ nên
2 mạch điều khiển động cơ được nối song – song để tăng khả năng chịu dòng.
Trong sơ đồ mạch thì 2 cặp ngõ vào input1, input4 và input2, input3 nối với nhau. Hai cặp
tín hiệu ngõ vào này sẽ nối trực tiếp với 2 chân PWM1 và PWM2 của vi điều khiển.
Tương tự ngõ ra cũng nối với nhau chỉ còn 2 ngõ ra nối với động cơ DC.

Hình 7-8. Mạch giao tiếp động cơ bước và động cơ DC


7.2.3 Dữ liệu điều khiển động cơ DC
Do chân ENA đã nối lên mức 1 nên đã cho phép, các tín hiệu điều khiển còn lại phụ thuộc
vào 2 tín hiệu PMW1 (input1) và PMW2 (input2).
Bảng 7-5. Các trạng thái điều khiển động cơ DC
TT INPUT1 INPUT2 TRẠNG THÁI ĐỘNG CƠ
1 0 0 NGỪNG
2 1 1
3 1 0 QUAY THUẬN
4 0 1 QUAY NGHỊCH
Có 2 trạng thái ngừng, 1 trạng thái quay thuận và 1 trạng thái quay ngịch.
7.2.4 Thư viện điều khiển động cơ DC
a. Hàm 709: Điều khiển ĐCDC quay thuận.
int1 dcmotor_tn = 0, dcmotor_onoff=0;
void dc_motor_quay_thuan()
{
output_high(pin_c1);
output_low(pin_c2);
}
b. Hàm 710: Điều khiển ĐCDC quay nghịch.
void dc_motor_quay_nghich()
{
output_low(pin_c1);
output_high(pin_c2);

Thực hành vi điều khiển PIC 189


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
}
c. Hàm 711: Điều khiển ĐCDC ngừng.
void dc_motor_stop()
{
output_low(pin_c1);
output_low(pin_c2);
}
d. Hàm 712: Điều khiển ĐCDC quay thuận hoặc nghịch hoặc ngừng.
void dc_motor_run()
{
if (dcmotor_onoff==1)
{
if (dcmotor_tn) dc_motor_quay_thuan();
else dc_motor_quay_nghich();
}
else dc_motor_stop();
}
7.2.5 Các bài thực hành điều khiển động cơ DC
Bài mẫu 711. Chương trình điều khiển động cơ có 3 nút điều khiển: ON, OFF, INV.
Khi nhấn INV thì đảo chiều động cơ đang quay, trình tự thực hiện: tiến hành kiểm tra
động cơ nếu đang quay thì ngừng 1 giây sau đó mới đảo chiều, nếu động cơ đang ngừng
thì nhấn đảo chiều không có tác dụng.
Có led đơn báo trạng thái ngừng, quay thuận, quay ngược.
Lưu tên file là “bai_711_dc_motor_on_off_inv”
a.Mục đích: Biết điều khiển ĐCDC chạy thuận nghịch bằng 3 nút nhấn.
b.Lưu đồ, giải thuật: Nhấn ON thì cho động cơ quay thuận, nhấn INV thì cho động cơ
ngừng, rồi cho chạy nghịch, nhấn OFF thì cho động cơ ngừng.
c. Chương trình con “bai_711_dc_motor_on_off_inv_tv”:
unsigned int8 y=0;
void dc_motor_on_off_inv()
{
if(!input(on))
{
dcmotor_onoff=1;
dc_motor_run();
xuat_32led_don_4byte(0,0,y,~y);
}
else
if(!input(off))
{
dcmotor_onoff=0;
dc_motor_run();
xuat_32led_don_4byte(0,0,0,0);

190 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
}
else if(phim_inv_c2(50))
{
dc_motor_stop();
y = ~y;
xuat_32led_don_4byte(0,0,y,~y);
delay_ms(500);
dcmotor_tn=~dcmotor_tn;
dc_motor_run();
}
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_07_18f6722_dc_motor.c>
#include <bai_711_dc_motor_on_off_inv_tv.c>
void main()
{
set_up_port();
dc_motor_stop();
while(true)
{
dc_motor_on_off_inv();
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Sau khi nạp xong thì nhấn nút ON động cơ sẽ quay thuận, nhấn
OFF sẽ ngừng động cơ, nhấn INV thì động cơ ngừng rồi sau đó đảo chiều. Trong
chương trình có gởi dữ liệu điều khiển động cơ ra 32 led đơn để bạn có thể nhìn thấy.
Động cơ chạy với tốc độ cực đại.

Bài tập 712. Hãy viết chương trình điều khiển động cơ DC gồm nút nhấn ON và OFF,
kết hợp bài đếm giây chính xác hiển thị trên 2 led 7 đoạn. Khi nhấn ON và giây nằm trong
khoảng từ 05 đến 25 thì động cơ quay thuận, từ 35 đến đến 55 thì quay nghịch, các khoảng
còn lại thì động cơ ngừng. Khi nhấn OFF thì động cơ ngừng.
Lưu tên file là “bai_712_dc_motor_on_off_tn_theo_giay”.

Bài tập 713. Hãy viết chương trình điều khiển động cơ bước và DC gồm 3 nút nhấn
ON, OFF và INV. Khi nhấn ON thì cả 2 động cơ quay thuận. Nhấn INV thì cả 2 đảo
chiều. Khi nhấn OFF thì cả 2 động cơ ngừng. Chính là kết hợp bài 701 và 711.
Lưu tên file là “bai_713_step_dc_motor_on_off_inv”.

Thực hành vi điều khiển PIC 191


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
7.3 ĐIỀU KHIỂN THAY ĐỔI TỐC ĐỘ ĐCDC DÙNG PWM
7.3.1 Nguyên lý PWM (PULSE WIDTH MODULATION)
Đã trình bày ở giáo trình lý thuyết.
7.3.2 Tính toán điều khiển tốc độ động cơ bằng PWM
Phần này trình bày cách chọn chu kỳ, tính toán các thông số cho phù hợp để điều khiển
thay đổi tốc độ động cơ DC dựa vào phần cứng đã thiết kế của BTN.
Cho tần số tụ thạch anh BTN đang dùng là 20MHz.
Cho chu kỳ PWM là 0.8ms.
Hãy tính toán các thông số để điều khiển tốc độ của động cơ từ tốc độ thấp nhất đến tốc độ
nhanh nhất.
Tính toán:
Tần số thạch anh vi điều khiển sử dụng: f OSC  20 MHz
1 1
nên chu kỳ là: TOSC    0,5S  50ns
FOSC 20MHz
Tính chu kỳ PWM: PERIODPWM  [( PR 2)  1] * 4 * TOSC * PVTMR2  0.8mS  800 ,000 ns

Chỉ biết được TOSC  50 ns còn các thông số PR 2, PVTMR2 thì chưa biết.
Phải chọn 1 thông số và tính thông số còn lại: chú ý PR 2 có giá trị 8 bit từ 0 đến 255, còn
PVTMR 2 có 3 giá trị là chia 1, chia 4 và chia 16.

Chọn hệ số chia lớn nhất là 16 hay PVTMR2  16


Khi đó tìm giá trị còn lại PR 2 :
PERIODPWM 800,000ns
[( PR2)  1]    250
4 * TOSC * PVTMR2 4 * 50ns *16
Vậy PR 2  249 .
Gán giá trị 249 và hệ số chia trước cho timer T2 thì ta phải sử dụng Lệnh khởi tạo cho
timer 2 là:
setup_timer_2(T2_DIV_BY_16, 249, 1)
Tính hệ số chu kỳ (duty):
Hệ số chu kỳ thay đổi sẽ làm giá trị trung bình của tín hiệu thay đổi, hệ số chu kỳ nhỏ nhất
là bằng 0 khi đó tín hiệu ra CCPx ở mức 0, hệ số chu kỳ tăng làm tín hiệu xuất hiện và giá trị
trung bình tăng, hệ số chu kỳ lớn nhất bằng chu kỳ của PWM.
Cho hệ số chu kỳ bằng chu kỳ để tính toán giới hạn hệ số chu kỳ:
DUTY _ CYCLE PWM  PERIODPWM _ MAX
Ta có công thức: DUTY _ CYCLE PWM  (CCPRxL : CCPxCON  5 : 4 ) * TOSC * PVTMR2

Ta tìm giá trị lớn nhất của CCPRxL : CCPxCON  5 : 4  .

192 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
DUTY _ CYCLEPWM _ MAX PERIODPWM
Suy ra: (CCPRxL : CCPxCON  5 : 4 )  
TOSC * PVTMR2 TOSC * PVTMR2
PERIODPWM 800,000ns
(CCPRxL : CCPxCON  5 : 4 )    1000
TOSC * PVTMR2 50ns *16
Vậy giới hạn của hệ số chu kỳ là từ 0 đến 1000 đối với các thông số đã cho.
Nếu số cấp điều khiển là 10 cấp thì giá trị cho mỗi cấp là 100.
Nếu số cấp điều khiển là 20 cấp thì giá trị cho mỗi cấp là 50.
Nếu số cấp điều khiển là 50 cấp thì giá trị cho mỗi cấp là 20.
Tùy theo yêu cầu mà bạn tính toán được giá trị thay đổi cho mỗi cấp.
7.3.3 Thư viện PWM
Thư viện PWM điều khiển động cơ DC (ĐCDC) là “tv_08_dc_motor” chứa các hàm:
a. Hàm 713: Thiết lập khối CCP1 để điều khiển ĐCDC quay thuận.
unsigned int16 pwm_duty;
void dc_motor_ktao_ccp1_thuan()
{
setup_ccp2(ccp_off);
setup_ccp1(ccp_pwm);
}
b. Hàm 714: Thiết lập khối CCP1 để điều khiển ĐCDC quay nghịch.
void dc_motor_ktao_ccp2_nghich()
{
setup_ccp1(ccp_off);
setup_ccp2(ccp_pwm);
}
c. Hàm 715: Thiết lập khối CCP1 hoặc CCP2 để điều khiển quay thuận hoặc nghịch.
void dc_motor_ktao_ccpx()
{
if(dcmotor_tn) dc_motor_ktao_ccp1_thuan();
else dc_motor_ktao_ccp2_nghich();
}
d. Hàm 716: Thiết lập hệ số pwm để điều khiển quay thuận hoặc nghịch.
void dc_motor_set_pwmx_duty()
{
if(dcmotor_tn) set_pwm1_duty(pwm_duty);
else set_pwm2_duty(pwm_duty);
}
e. Hàm 717: Tắt 2 khối CCP1 và CCP2, cho PWM bằng 0.
void dc_motor_pwm_ccp1_ccp2_stop()
{
pwm_duty=0;
setup_ccp1(ccp_off);
setup_ccp2(ccp_off);
dc_motor_set_pwmx_duty();

Thực hành vi điều khiển PIC 193


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
}
7.3.4 Các bài thực hành thay đổi tốc độ động cơ dc bằng PWM

Bài mẫu 715. Chương trình dùng CCP1 ở chế độ PWM để điều khiển động cơ quay
thuận thay đổi tốc độ bằng 2 nút điều khiển: UP, DW và nút STOP.
Khi nhấn UP thì động cơ quay thuận và tăng tốc lên, khi nhấn DW thì động cơ giảm
tốc, nhấn STOP thì ngừng. Số cấp điều khiển là 50 hiển thị trên 2 led 7 đoạn. Sử dụng
các thông số tính toán ở trên.
Lưu tên file là “bai_715_dc_motor_pwm_ccp1_up_dw_stop”.
Mục đích: Biết lập trình sử dụng CCP1 điều khiển động cơ DC quay thuận thay đổi
a.
tốc độ.
b. Lưu đồ, giải thuật: Khởi tạo CCP1, số cấp ban đầu bằng 0, tính toán và thiết lập hệ
số PWM theo số cấp để điều khiển ĐCDC quay thuận. Kiểm tra nếu nhấn UP thì tăng
số cấp, nhấn phím DW thì giảm số cấp, nhấn STOP thì số cấp bằng 0. Giải mã hiển
thị số cấp và giá trị PWM trên led 7 đoạn.
c. Chương trình con “bai_715_dc_motor_pwm_ccp1_tv”:
void hien_thi_7doan()
{
giaima_bin_4so_vitri_vn(pwm_duty,0,cx_vn);
giaima_bin_2so_vitri_vn(pwm_capso,5,cx_vn);
led_7d[4] = 0xbf;
xuat_8led_7doan();
}

void phim_up()
{
if(phim_up_c2(150)&&(pwm_duty<1000))
{
pwm_duty= pwm_duty+50;
set_pwm1_duty(pwm_duty);
pwm_capso++;
hien_thi_7doan();
}
}

void phim_dw()
{
if(phim_dw_c2(150)&&(pwm_duty>0))
{
pwm_duty= pwm_duty-50;
pwm_capso--;
hien_thi_7doan();

194 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
set_pwm1_duty(pwm_duty);
}
}

void phim_stop()
{
if(!input(stop))
{
pwm_duty=0;
pwm_capso=0;
hien_thi_7doan();
set_pwm1_duty(pwm_duty);
}
}
d. Chương trình chính
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_07_18f6722_dc_motor.c>
signed int8 pwm_capso;
#include <bai_715_dc_motor_pwm_ccp1_tv.c>
void main()
{
set_up_port();
setup_ccp1(ccp_pwm);
setup_timer_2(t2_div_by_16,249,1);
pwm_duty=0; pwm_capso=0;
hien_thi_7doan();
while(true)
{
phim_dw(); phim_up(); phim_stop();
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: sau khi nạp xong thì nhấn nút UP động cơ sẽ tăng tốc, nhấn DW
thì giảm tốc, nhấn STOP thì động cơ ngừng. Chú ý: khi ở cấp tốc độ 1 hoặc 2 thì
moment chưa đủ làm động cơ quay nên ta tiếp tục tăng cấp cho đến khi đủ moment
quay động cơ. Có led hiển thị các cấp tốc độ.

Bài tập 716. Hãy lấy kết quả tính toán ở trên và lập trình theo yêu cầu.
Nút nhấn BT0 làm nút stop để ngừng động cơ.
Nút nhấn BT1 thì điều khiển động cơ chạy 35% tốc độ tối đa.
Nút nhấn BT2 thì điều khiển động cơ chạy 70% tốc độ tối đa.
Nút nhấn BT3 thì điều khiển động cơ chạy 100% tốc độ tối đa.
Hiển thị số cấp và giá trị PWM trên led 7 đoạn.
Thực hành vi điều khiển PIC 195
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Lưu tên file là “bai_716_dc_pwm_ccp1_3_cap_tocdo”.

Bài tập 717. Chương trình điều khiển động DC có 2 nút: UP, DW.
Khi nhấn UP và giữ thì động cơ quay thuận và tự động tăng tốc lên cho đến khi cực
đại và nếu nhã thì động cơ ngừng.
Khi nhấn DW và giữ thì động cơ quay nghịch và tự động tăng tốc lên cho đến khi cực
đại và nếu nhã thì động cơ ngừng.
Số cấp điều khiển là 50 hiển thị trên 2 led 7 đoạn. Giá trị PWM hiển thị trên 4 led 7
đoạn. Sử dụng các thông số tính toán ở trên
Có 8 led đơn bên trái báo trạng thái ngừng: tắt, chạy: sáng. Quay thuận: 8 led sáng, 8
led tắt, quay ngược: 8 led tắt, 8 led sáng của 16 led bên trái.
Lưu tên file là “bai_717_dc_motor_up_dw_stop_auto”.
Mục đích: Biết lập trình điều khiển động cơ thay đổi tốc độ theo PWM, sử dụng CCP1
a.
và CCP2 để điều khiển thay đổi tốc độ theo cả 2 chiều.
b. Lưu đồ, giải thuật: Số cấp ban đầu bằng 0. Kiểm tra nếu nhấn và giữ phím UP thì mở
CCP1: tăng số cấp, tính toán và thiết lập hệ số PWM theo số cấp để điều khiển ĐCDC
quay thuận, delay và lặp lại. Nếu không còn nhấn UP thì cho số cấp bằng 0, tắt CCP1,
động cơ ngừng.
Tương tự nếu nhấn và giữ phím DW thì mở CCP2: tăng số cấp, tính toán và thiết
lập hệ số PWM theo số cấp để điều khiển ĐCDC quay nghịch, delay và lặp lại. Nếu
không còn nhấn DW thì cho số cấp bằng 0, tắt CCP1, động cơ ngừng
c. Chương trình con “”:
signed int8 pwm_capso;
void hien_thi_7doan()
{
giaima_bin_4so_vitri_vn(pwm_duty,0,cx_vn);
giaima_bin_2so_vitri_vn(pwm_capso,5,cx_vn);
led_7d[4] = 0xbf;
xuat_8led_7doan();
}

void motor_dc_stop()
{
pwm_capso=0;
dc_motor_pwm_ccp1_ccp2_stop();
hien_thi_7doan();
xuat_32led_don_2word(0,0);
}

void phim_up()
{
if(pwm_capso<50)

196 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
{
dcmotor_tn=1;
dc_motor_ktao_ccpx();
pwm_duty= pwm_duty+20;
dc_motor_set_pwmx_duty();
pwm_capso++;
hien_thi_7doan();
xuat_32led_don_2word(0,0xffff);
}
}

void phim_dw()
{
if(pwm_capso<50)
{
dcmotor_tn=0;
dc_motor_ktao_ccpx();
pwm_duty= pwm_duty+20;
dc_motor_set_pwmx_duty();
pwm_capso++;
hien_thi_7doan();
xuat_32led_don_2word(0xffff,0);
}
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_07_18f6722_dc_motor.c>
#include <bai_717_dc_motor_up_dw_stop_auto_tv.c>

void main()
{
set_up_port();
setup_timer_2(t2_div_by_16,249,1);
pwm_duty=0; pwm_capso=0;

hien_thi_7doan();
led_7d[4] = 0xbf;
while(true)
{
if(phim_up_c2(1)==co_nhan)
phim_up();
else if(phim_dw_c2(1)==co_nhan)
phim_dw();
else motor_dc_stop();
delay_ms(50);

Thực hành vi điều khiển PIC 197


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Sau khi nạp xong thì nhấn giữ nút UP động cơ sẽ tăng tốc theo
chiều thuận khi nhả phím thì động cơ ngừng ngừng. Tương tự khi nhấn DW thì động
cơ chạy và tăng tốc chiều ngược lại.
Có led hiển thị các cấp tốc độ và 32 led đơn hiển thị trạng thái thuận nghịch.

Bài tập 718. Giống bài 717 nhưng khi nhả phím thì số cấp giảm dần giống như lúc tăng
khi nhấn dùng delay 50ms. Mục đích để khi nhả phím thì giảm tốc và khi nhấn thì tăng
trở lại ngay từ cấp đang chạy.
Lưu tên file là “bai_718_dc_motor_up_dw_stop_slow_auto”.

Bài tập 719. Giống bài 717 nhưng dùng bộ mã hóa xoay vòng (RT). Ban đầu sau khi
nạp hoặc cấp điện hoặc bị reset thì hiển thị cấp 0.
Khi xoay phải RT thì động cơ quay thuận tăng tốc dần đến tối đa là +20 là lớn nhất.
Xoay ngược về từ +20 đến 0 thì động cơ giảm tốc dần cho đến khi bằng 0 thì ngừng.
Khi xoay trái RT thì động cơ quay ngược tăng tốc dần đến tối đa là -20 là lớn nhất.
Xoay ngược về từ -20 đến 0 thì động cơ giảm tốc dần cho đến khi bằng 0 thì ngừng.
Dùng thêm nút nhấn của RT làm nút Stop: khi nhấn thì động cơ ngừng.
Lưu tên file là “bai_719_dc_motor_up_dw_stop_auto_rotary”.

Bài tập 720. Giống bài 715 nhưng thay đổi tốc độ động cơ 10 cấp từ 0 đến 9 được chọn
bằng 10 nút nhấn từ 0 đến 9 của bàn phím cảm ứng. Chọn chiều quay thuận hay nghịch
bằng phím A, ngừng là phím B.
Lưu tên file là “bai_720_dc_motor_up_dw_stop_touch”.

7.4 ĐIỀU KHIỂN ĐỘNG CƠ SERVO


7.4.1 Động cơ Servo:
Servo là một thuật ngữ chung cho một hệ thống điều khiển vòng kín như hình 7-9.
Hệ thống vòng kín sử dụng tín hiệu phản hồi để điều chỉnh tốc độ và hướng của động cơ
nhằm đạt được kết quả mong muốn.

198 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 7-9. Hệ thống điều khiển vòng kín của động cơ Servo
Động cơ servo RC hoạt động trên cùng một nguyên tắc. Gồm một động cơ DC nhỏ được
kết nối với trục đầu ra thông qua các bánh răng. Trục đầu ra dẫn động một cánh tay servo và
cũng được kết nối với một chiết áp (nồi - Pot). Xem hình 7-10.

Hình 7-10. Các trục và bánh răng bên trong của động cơ Servo
Chiết áp cung cấp phản hồi vị trí cho bộ điều khiển servo nơi vị trí hiện tại của động cơ
được so sánh với vị trí đích. Khi có chênh lệch thì bộ phận điều khiển sẽ hiệu chỉnh lại vị trí
thực của động cơ sao cho khớp với vị trí mục tiêu.
7.4.2 Nguyên lý hoạt động của động cơ Servo
Có thể điều khiển động cơ servo bằng cách gửi một loạt xung đến đường tín hiệu.
Một động cơ servo tương tự thường nhận xung có chu kỳ khoảng 20 mili giây một lần (hay
tần số là 50Hz). Độ dài của xung xác định vị trí của động cơ servo. Xem hình 7-11.

Thực hành vi điều khiển PIC 199


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 7-11. Dạng sóng điều khiển của động cơ Servo


 Nếu xung ở mức ‘1’ khoảng 1ms thì góc servo sẽ bằng không.
 Nếu xung ở mức ‘1’ khoảng 1.5ms thì servo sẽ ở vị trí trung tâm của nó.
 Nếu xung ở mức ‘1’ khoảng 2ms thì servo sẽ ở 180 độ.
Các xung dao động từ 1ms đến 2ms sẽ di chuyển trục servo qua toàn bộ hành trình 180 độ
của nó. Tuy nhiên các động cơ thực tế sản xuất không chính xác lắm.
7.4.3 Các tín hiệu giao tiếp của động cơ servo
Động cơ servo thường có 3 dây tín hiệu như hình 7-12.

Hình 7-12. Dạng sóng PWM


 Tín hiệu “GND” là chân mass chung cho cả động cơ và logic – màu nâu.
 Tín hiệu “5V” là điện áp dương cấp nguồn cho servo – màu đỏ.
 Tín hiệu “Control” là ngõ vào điều khiển hệ thống – màu vàng.
200 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
7.4.4 Giao tiếp vi điều khiển với động cơ servo
Trong kit vi điều khiển thiết kế thì có 2 tín hiệu điều khiển động cơ servo. Một tín hiệu lấy
từ ngõ ra “out6” của IC MBI5026 với tên là “servo1”. Tín hiệu còn lại dùng trực tiếp từ port
“pin_e5” của vi điều khiển PIC18F6722.
Lựa chọn một trong hai tín hiệu này bằng jumper ngay gần servo. Mặc nhiên thì dùng tín
hiệu trực tiếp từ vi điều khiển.
7.4.5 Các chương trình điều khiển động cơ servo

Bài mẫu 721. Chương trình điều khiển động servo bằng 3 nút: BT0, BT1 và BT2.
Khi nhấn BT0 thì làm động cơ quay về góc 0 độ.
Khi nhấn BT1 thì làm động cơ quay trái lệch một góc 90 độ.
Khi nhấn BT2 thì làm động cơ quay trái lệch một góc 180 độ.
Lưu tên file là “bai_721_dc_servo_3btn”.
a. Mục đích: Biết lập trình điều khiển động cơ servo quay 3 vị trí bằng 3 nút nhấn.
b. Lưu đồ giải thuật: Ba nút nhấn có chức năng nạp 3 thời hằng tương ứng 3 góc quay.
Chương trình chính có chức năng tạo xung có tần số 50Hz với xung PWM theo thời
hằng đã nạp.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
unsigned int16 servo_pwm;
unsigned int16 i;

void phim_servo_goc_0()
{
if(phim_bt0_c1(1,1))
{
servo_pwm=1000;
xuat_32led_don_1dw(0xf);
}
}
void phim_servo_goc_90()
{
if(phim_bt2_c1(1,1))
{
servo_pwm=1850;
xuat_32led_don_1dw(0xf0);
}
}
void phim_servo_goc_180()
{
if(phim_bt1_c1(1,1))
{
servo_pwm=3710;
xuat_32led_don_1dw(0xf00);
Thực hành vi điều khiển PIC 201
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
}
}

void quay_servo(unsigned int16 ser_pwm)


{
output_high(servo2);
delay_us(ser_pwm);
output_low(servo2);
delay_us(20000-ser_pwm);
phim_servo_goc_0();
phim_servo_goc_90();
phim_servo_goc_180();
}

void main()
{
set_up_port();
output_low(servo2);
servo_pwm=1000;
xuat_32led_don_1dw(0xf);
while(true)
{
quay_servo(servo_pwm);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Sau khi nạp xong thì vi điều khiển sẽ đưa động cơ về tọa độ góc 0
độ. Nhấn BT1 để quay 90 độ. Nhấn BT0 để về góc 0 độ. Nhấn BT2 để quay 180 độ.
Nhấn BT0 để về 0 độ là đúng yêu cầu.
f. Sai lệch so với lý thuyết: Chương trình trên thì quay góc 0 độ với độ rộng xung 1ms
là chính xác. Còn góc 90 độ thì xung 1,85 ms và góc 180 độ thì không đạt được, chỉ
đạt được khoảng 150 độ.

7.5 ĐIỀU KHIỂN KẾT HỢP 2 ĐỘNG CƠ BƯỚC VÀ DC


Phần này thực hành các bài kết hợp điều khiển 2 động cơ.
Bài tập 722. Hãy viết chương trình điều khiển 2 động cơ: DC và bước bằng 4 nút: BT0:
có chức năng , BT1(OFF_MTDC), BT2(ON_MTB), BT3(OFF_MTB).
Có led đơn báo trạng thái ngừng, quay của động cơ DC và động cơ bước.
Động cơ DC chỉ ON và OFF.
Lưu tên file là “bai_722_dc_dc_step_on_off”.

Bài tập 723. Hãy viết chương trình điều khiển 2 động cơ: DC và bước bằng 3 nút: UP,
DW, OFF.

202 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
UP và DW dùng để thay đổi tốc độ cho cả 2 động số, cố cấp là 10, hiển thị trên 2 led 7
đoạn. Khi nhấn OFF thì ngừng.
Lưu tên file là “bai_723_dc_dc_step_up_dw_off”.

7.6 ĐIỀU KHIỂN ỔN ĐỊNH TỐC ĐỘ ĐỘNG CƠ DC


7.6.1 Giới thiệu PID
Phần này bạn nên xem lại lý thuyết điều khiển dùng PID.
Phần này chỉ thực hành khi động cơ có gắn encoder, tuy nhiên sau này nguồn động cơ này
không còn và chỉ còn động cơ nhưng encoder bị hỏng.
Nếu có encoder thì thực hành phần này, nếu không có thỉ bỏ qua.
7.6.2 Điều khiển động cơ dùng PID
Bài mẫu 725. Chương trình điều khiển động cơ DC ổn định tốc độ dùng phương pháp
điều khiển PID. Nút UP dùng để tăng tốc độ, nút DW dùng để giảm tốc độ và STOP dùng
để ngừng.
Lưu tên file là “bai_725_dc_motro_dk_pid”.
a. Mục đích: Biết điều khiển ổn định tốc độ động cơ dùng PID.
b. Lưu đồ, giải thuật: Dựa vào nguyên lý điều khiển PID.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_07_18f6722_dc_motor.c>
signed int16 t1;
signed int16 xung,xungdat,duty,e,ecu=0,tocdo;
float kp=2,kd=0.2,ki=0.002,tp=0,td=0,ti=0;
int1 refresh;

#int_timer3
void interrupt_timer3()
{
set_timer3(3036); refresh = 1;
}

void tinh_3heso_duty()
{
xung = get_timer1();
set_timer1(0);
e = xungdat - xung;
tp = e;
td = (e-ecu)*10;
ti = ti+e*0.1;
ecu = e;
duty = duty + kp*tp + kd*td + ki*ti;

Thực hành vi điều khiển PIC 203


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
if(duty>1000) duty = 1000;
else if(duty<0) duty = 0;
set_pwm1_duty(duty);
refresh = 0;
}

void phim_up()
{
if(!input(up)&&(xungdat<300))
{
delay_ms(20);
if(!input(up))
{
xungdat= xungdat+10; tocdo++;
lcd_gm_ht_2so_nho_xvn(tocdo,0,18,cx_vn);
delay_ms(200);
}
enable_interrupts(int_timer3);
}
}
void phim_dw()
{
if(!input(dw)&&(xungdat>0))
{
delay_ms(20);
if(!input(dw))
{
xungdat= xungdat-10; tocdo--;
lcd_gm_ht_2so_nho_xvn(tocdo,0,18,cx_vn);
delay_ms(200);
}
}
}

void main()
{
set_up_port();
lcd_setup();
lcd_goto_xy(0,0);
lcd_data("cap toc do:");
lcd_goto_xy(1,0);
lcd_data("toc do dco-rpm:");
lcd_goto_xy(2,0);
lcd_data("xung dat: ");
lcd_goto_xy(3,0);
lcd_data("xung dem: ");
204 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

setup_ccp1(ccp_pwm);
setup_timer_2(t2_div_by_16,249,1);
tocdo=0; duty=0;

setup_timer_1(t1_external_sync|t1_div_by_1);
set_timer1(0);

enable_interrupts(global);
enable_interrupts(int_timer3);

setup_timer_3(t3_internal|t3_div_by_8);
set_timer3(3036);
refresh = 1;
lcd_gm_ht_2so_nho_xvn(tocdo,0,18,cx_vn);
while(true)
{
phim_dw(); phim_up();
if(refresh) tinh_3heso_duty();
if(!input(stop))
{
disable_interrupts(int_timer3);
duty=0;
set_timer1(0);
tocdo=0;
xungdat =0;
xung =0;
lcd_gm_ht_2so_nho_xvn(tocdo,0,18,cx_vn);
set_pwm1_duty(0);
}
t1=(xung*40)/3;
lcd_gm_ht_4so_nho_xvn(t1,1,16,cx_vn);
lcd_gm_ht_3so_nho_xvn(xungdat,2,17,cx_vn);
lcd_gm_ht_3so_nho_xvn(xung,3,17,cx_vn);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: hàng 1 hiển thị cấp tốc độ, hàng 2 hiển thị tốc độ động cơ, hàng 3
hiển thị số xung cài đặt trước, hàng 4 hiển thị số xung đếm được từ encoder. Sau khi
nạp xong chương trình thì nhấn nút UP để tăng giá trị xung cái đặt lên 10 đơn vị,
động cơ sẽ chạy ổn định khi giá trị cài đặt là 30, hệ thống sẽ tự động điều chỉnh tốc
độ thực gần đúng với tốc độ cài.
f. Giải thích chương trình: trong chương trình sử dụng timer T1 đếm xung từ encoder,
sử dụng timer T3 làm bộ định thời đếm 100ms báo ngắt. Khi được 100ms thì đọc giá
trị của counter T1 rồi xóa giá trị của counter T1. Lấy giá trị vừa đọc tính toán sai lệch
Thực hành vi điều khiển PIC 205
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
giữa xung cài và xung đếm, tín hằng số tỷ lệ, hằng số vi phân, hằng số tích phân, cập
nhật lại giá trị và tính toán lại hệ số duty để thay đổi tốc độ động cơ cho phù hợp đúng
với giá trị cài đặt. Giới hạn cho hệ số duty là từ 0 đến 1000, giá trị 1000 tương ứng
với số xung cài đặt lớn nhất là 300. Tốc độ động cơ được tính toán bằng số xung đếm
được trong vòng 100ms nhân với 10 để được 1 giây, nhân tiếp với 60 để được 1 giây
rồi chia cho số xung của 1 vòng là 45 sẽ được tốc độ động cơ là số vòng trên phút.
Đơn giản 2 hệ số cho 15 nên phương trình còn lại là nhân 40 chia 3.
Để thấy được sự ổn định thì phải có tải thay đổi nhưng trong bộ thí nghiệm không có
kéo tải nên khó nhìn thấy chức năng của PID.

206 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 8: THỰC HÀNH


MODULE LED MA TRẬN 2
MÀU

Thực hành vi điều khiển PIC 207


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
8.1 SƠ ĐỒ MẠCH GIAO TIẾP VI ĐIỀU KHIỂN VỚI LED MA TRẬN
Trong phần này sẽ trình bày phần giao tiếp vi điều khiển PIC18F4550 với 3 led ma trận
như hình 8-1:

Hình 8-1. Sơ đồ nguyên lý giao tiếp vi điều khiển với 3 led ma trận
Kit có tích hợp module giao tiếp 3 led ma trận 2 màu xanh và đỏ, sử dụng 4 IC thanh ghi
dịch 16 bit để điều khiển hàng và cột.

8.2 ĐIỀU KHIỂN LED MA TRẬN THEO CÁCH QUÉT HÀNG


8.2.1 Mã quét hàng led ma trận
Khi quét hàng thì mỗi một thời điểm chỉ có 1 hàng sáng, muốn led nào sáng thì cột tương
ứng sẽ ở mức 0. Mỗi một cột chỉ có 1 led sáng duy nhất nên ngõ vào của IC dễ dàng đáp ứng
được dòng điện và led sẽ sáng rõ. Ngoài ra do chỉ có 8 hàng nên thời gian sáng là 1/8 so với quét
cột là 1/24 nên led sáng rõ đẹp – đây chính là ưu điểm của quét hàng.
208 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Khuyết điểm của quét hàng là phải xử lý mã ký tự cần hiển thị: một ký tự gồm 5 byte:
Ở quét hàng thì lấy bit thứ 0 của byte thứ 1 gởi ra cột thứ 1, lấy bit thứ 0 của byte thứ 2 gởi
ra cột thứ 2, … thực hiện cho đủ 24 cột – cho hàng thứ 0 sáng. Tại thời điểm này thì hàng thứ 0
của ký tự sáng.
Tiếp theo lấy bit thứ 1 của byte thứ 1 gởi ra cột thứ 1, lấy bit thứ 1 của byte thứ 2 gởi ra
cột thứ 2, … thực hiện cho đủ 24 cột – cho hàng thứ 1 sáng. Tại thời điểm này thì hàng thứ 1
của ký tự sáng.
Tương tự, cho bit thứ 2 của các byte – hàng thứ 2 sáng, bit thứ 3 của các byte – hàng thứ 3
sáng, bit thứ 4 của các byte – hàng thứ 4 sáng, …, bit thứ 7 của các byte – hàng thứ 7 sáng.
Mã quét hàng: mỗi một thời điểm chỉ cho 1 hàng ở mức logic 1, các hàng còn lại bằng 0.
Mã quét hàng theo sơ đồ mạch: {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}
8.2.2 Thư viện led ma trận quét hàng
Thư viện quét cột ma trận led có tên là “tv_08_matran_led_qhang”.
a. Khai báo: Thư viện font, các mảng quét cột 3 màu, các hằng số và các biến.
#include <tv_09_font.c>
const unsigned int8
ma_quet_hang[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#define mau_xanh 0
#define mau_do 1
#define mau_cam 2
#define slkt_ht 60
unsigned int8 dl_hthi[6*slkt_ht+24+24];
unsigned int8 dl_cot_cd[48];
unsigned int8 dl_cot_dich[48];
unsigned int16 slkt;
b. Hàm 801: Lấy số lượng ký tự chuỗi.
void lay_so_luong_ky_tu_chuoi()
{
slkt=0;
while(chuoi_hthi[slkt]) slkt++;
}
c. Hàm 802: Xóa vùng nhớ chứa dữ liệu để hiển thị.
void xoa_dl_hienthi()
{
unsigned int16 j;
for(j=0;j<6*slkt_ht;j++) dl_hthi[j]=0;
}
d. Hàm 803: Xóa vùng nhớ lưu dữ liệu 48 cột.
void xoa_dl_48_cot()
{
unsigned int8 j;
for(j=0;j<48;j++) dl_cot_cd[j]=0;

Thực hành vi điều khiển PIC 209


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
}
e. Hàm 804: Lấy mã ma trận các số từ nhị phân từ 0 đến 9 cho các bài hiển thị số đếm.
void lay_ma_1_so_matran(usi8 so, vitri_luu)
{
unsigned int8 j;
for(j=0;j<6 ;j++)
dl_hthi[j+vitri_luu*6]=mt_kytu[so][j];
}
f. Hàm 805: Lấy mã ma trận các ký tự dạng mã ASCII.
void lay_ma_ky_tu(usi8 slkt_x)
{
unsigned int8 kytu,i,j;
unsigned int16 n;
n=0;
xoa_dl_hienthi();
for (i=0; i<slkt_x; i++)
{
kytu = chuoi_hthi[i];
for(j=0;j<6 ;j++,n++)
dl_hthi[n+24]=mt_kytu[kytu][j];
}
}
g. Hàm 806: Sắp xếp dữ liệu cột cố định màu xanh cho 3 led ma trận.
void sapxep_vitri_24byte_cot_xanh(usi16 k)
{
signed int8 i;
for(i=0; i<8;i++) dl_cot_cd[i+32] = dl_hthi[i+k];
for(i=8; i<16;i++) dl_cot_cd[i+8] = dl_hthi[i+k];
for(i=16;i<24;i++) dl_cot_cd[i-16] = dl_hthi[i+k];
}
h. Hàm 807: Sắp xếp dữ liệu cột cố định màu đỏ cho 3 led ma trận.
void sapxep_vitri_24byte_cot_do(unsigned int16 k)
{
signed int8 i;
for(i=0; i<8;i++) dl_cot_cd[i+40] = dl_hthi[i+k];
for(i=8; i<16;i++) dl_cot_cd[i+16] = dl_hthi[i+k];
for(i=16;i<24;i++) dl_cot_cd[i-8] = dl_hthi[i+k];
}
i. Hàm 808: Copy dữ liệu từ cột số định sang cột để dịch.
void copy_48_cot_hienthi()
{
unsigned int8 i;
for(i=0;i<48;i++) dl_cot_dich[i]= dl_cot_cd[i];
}
210 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
j. Hàm 809: Tạo dữ liệu cho word thứ 1 – tương ứng led ma trận thứ 1.
unsigned int8 tao_dl_word1 (usi8 x)
{
#bit bserix = x.0
wlmt[1] = (wlmt[1]<<1) + bserix;
x = x>>1; return(x);
}
k. Hàm 810: Tạo dữ liệu cho word thứ 2 – tương ứng led ma trận thứ 2.
unsigned int8 tao_dl_word2(usi8 x)
{
#bit bserix = x.0
wlmt[2] = (wlmt[2]<<1) + bserix;
x = x>>1; return(x);
}
l. Hàm 811: Tạo dữ liệu cho word thứ 3 – tương ứng led ma trận thứ 3.
unsigned int8 tao_dl_word3(usi8 x)
{
#bit bserix = x.0
wlmt[3] = (wlmt[3]<<1) + bserix;
x = x>>1;
return(x);
}
m. Hàm 812: copy 1 bit của 48 cột cần hiển thị.
void copy_1_bit_cua_48_cot_hienthi()
{
unsigned int8 i;
for(i=0;i<16;i++)
dl_cot_dich[i]= tao_dl_word1(dl_cot_dich[i]);
for(i=16;i<32;i++)
dl_cot_dich[i]= tao_dl_word2(dl_cot_dich[i]);
for(i=32;i<48;i++)
dl_cot_dich[i]= tao_dl_word3(dl_cot_dich[i]);
}
n. Hàm 813: Tắt 3 led ma trận.
void xuat_dulieu_tat_matran()
{
wlmt[3]=0; wlmt[2]=0;
wlmt[1]=0; wlmt[0]=0;
xuat_3led_matran();
}
o. Hàm 814: Xóa và copy dữ liệu tại vị trí và màu tùy chọn.
void ma_tran_xoa_va_copy_dl(usi16 vitri,usi8 mau)
{
xoa_dl_48_cot();
Thực hành vi điều khiển PIC 211
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
if(mau==mau_xanh)
sapxep_vitri_24byte_cot_xanh(vitri);
else if(mau==mau_do)
sapxep_vitri_24byte_cot_do(vitri);
else if(mau==mau_cam)
{
sapxep_vitri_24byte_cot_do(vitri);
sapxep_vitri_24byte_cot_xanh(vitri);
}
}
p. Hàm 815: Sắp xếp các ký tự màu đỏ cho 4 số từ 1 đến 4 trên 3 led ma trận.
void ma_tran_quet_8_hang()
{
unsigned int8 k;
for(k=0;k<8;k++)
{
copy_1_bit_cua_48_cot_hienthi();
wlmt[0]= ma_quet_hang[k];
xuat_3led_matran();
delay_us(500);
xuat_dulieu_tat_matran();
}
}
q. Hàm 816: Hiển thị 3 led ma trận theo quét hàng tùy thuộc số chu kỳ quét, vị trí, màu.
unsigned int8 ck=0;
int1 ttx=1;
void ma_tran_quet_hang_if(usi8 sck,usi16 vitri,usi8 mau)
{
if(ttx)
{
ma_tran_xoa_va_copy_dl(vitri, mau);
ttx=0;
}
if(ck<sck)
{
copy_48_cot_hienthi();
ma_tran_quet_8_hang();
ck++;
}
else ck=0;
}
r. Hàm 817: Hiển thị 3 led ma trận theo quét hàng tùy thuộc số chu kỳ quét, vị trí, màu.
void ma_tran_quet_hang(usi8 sck, usi16 vitri, usi8 mau)
{
unsigned int8 ck;
212 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
ma_tran_xoa_va_copy_dl(vitri, mau);
for(ck=0;ck<sck;ck++)
{
copy_48_cot_hienthi();
ma_tran_quet_8_hang();
}
}

Với 3 led ma trận 8×8 có 24 cột, mỗi ký tự 6 byte nên có thể hiển thị được 4 kí tự, việc
copy dữ liệu sẽ được chia ra cho từng ký tự độc lập để dễ điều khiển.
8.2.3 Các chương trình led ma trận quét hàng
Bài mẫu 801. Chương trình điều khiển LED ma trận hiển thị chữ abcd màu xanh theo
phương pháp quét hàng.
Lưu tên file là “bai_801_mtqh_abcd_xanh”
Mục đích: Biết cách điều khiển led quét hàng.
a.
Lưu đồ, giải thuật: Lấy số lượng ký tự của chuỗi cần hiển thị. Lấy mã ma trận cho
b.
từng ký tự lưu vào vùng nhớ hiển thị. Lấy từng bit thứ 0 của từng cột dữ liệu và lấy
đủ 24 cột tùy theo màu xanh và 24 bit cho màu đỏ. Gửi dữ liệu 48 bit đó (tương đương
3 word) cùng với word mã quét hàng ra 4 IC MBI. Kết quả hàng thứ 0 sáng. Làm
tương tự cho hàng thứ 1, 2, … cho đến hàng thứ 7 là kết thúc 1 chu kỳ quét hàng. Lặp
lại, kết quả ta nhìn thấy 4 ký tự sáng.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
const unsigned char chuoi_hthi[]={"ABCD"};
#include <tv_08_matran_led_qhang.c>
#define ck_quet 100
#define vt_quet 24

void main()
{
set_up_port();
lay_so_luong_ky_tu_chuoi();
lay_ma_ky_tu(slkt);
while(true)
{
ma_tran_quet_hang(ck_quet,vt_quet,mau_xanh);
ma_tran_quet_hang(ck_quet,vt_quet,mau_do);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: LED ma trận sáng chuỗi abcd rõ đẹp hơn so với quét cột.

Thực hành vi điều khiển PIC 213


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài tập 802. Hãy hiệu chỉnh chương trình bài 911 để 4 ký tự sáng màu đỏ.
Lưu tên file là “bai_802_mtqh_abcd_do”

Bài mẫu 803. Chương trình điều khiển LED ma trận hiển thị chữ abcd màu xanh rồi
màu đỏ.
Lưu tên file là “bai_803_mtqh_abcd_xanh_do”
a. Mục đích: Biết cách điều khiển led quét hàng hiển thị 2 màu.
b. Lưu đồ, giải thuật: Bài 801 hiển thị màu xanh, thực hiện tương tự cho màu đỏ.
c. Chương trình:

#include <tv_kit_vdk_18f6722_all.c>
const unsigned char chuoi_hthi[]={"ABCD"};
#include <tv_08_matran_led_qhang.c>
#define ck_quet 100
#define vt_quet 24

void main()
{
set_up_port();
lay_so_luong_ky_tu_chuoi();
lay_ma_ky_tu(slkt);
while(true)
{
ma_tran_quet_hang(ck_quet,vt_quet,mau_xanh);
ma_tran_quet_hang(ck_quet,vt_quet,mau_do);
}
}

d. Tiến hành biên dịch và nạp.


e. Quan sát kết quả: Sau khi nạp xong thì 3 LED sáng chữ ABCD màu xanh rồi đến
màu đỏ.

Bài mẫu 804. Chương trình điều khiển LED ma trận hiển thị chuỗi màu xanh dịch từ
phải sang trái.
Lưu tên file là “bai_804_mtqh_chuoi_xanh_dich”
a. Mục đích: Biết cách điều khiển led quét hàng hiển thị chuỗi dịch trái.
b. Lưu đồ, giải thuật: Giống bài đã thực hiện theo cách quét cột.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
const unsigned char chuoi_hthi[]=
{"*1234!** Let make sign better ****"};

214 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
#include <tv_08_matran_led_qhang.c>
#define ck_quet 100
#define vt_quet 24
unsigned int8 vt;
void main()
{
set_up_port();
lay_so_luong_ky_tu_chuoi();
lay_ma_ky_tu(slkt);
while(true)
{
for(vt=0;vt<(slkt-4)*6;vt++)
ma_tran_quet_hang(ck_quet,vt,mau_xanh);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Chuỗi dịch chuyển từ phải sang trái.
f. Câu hỏi: Muốn dịch nhanh hơn thì thay đổi thông số gì?

Bài tập 805. Chương trình điều khiển LED ma trận hiển thị chữ ABCD dịch từ phải
sang trái màu xanh rồi đến màu đỏ.
Lưu tên file là “bai_805_mtqh_abcd_xanh_do_dich”

Bài tập 806. Chương trình điều khiển LED ma trận hiển thị chữ ABCD dịch từ phải
sang trái màu xanh rồi đến màu đỏ và màu cam.
Lưu tên file là “bai_806_mtqh_abcd_xanh_do_cam_dich”

Bài mẫu 807. Chương trình điều khiển LED ma trận đếm 1 số từ 0 đến 9.
Lưu tên file là “bai_807_mtqh_dem_1so_xanh”
a.Mục đích: Biết cách điều khiển led quét hàng hiển thị giá trị đếm 1 số.
b.Lưu đồ, giải thuật: Đếm 1 số, giải mã led ma trận cho biến đếm lưu vào vùng nhớ,
tiến hành quét hàng như bài 801.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
const unsigned char chuoi_hthi[]={"*1234!*"};
#include <tv_08_matran_led_qhang.c>
#define ck_quet 100
#define vt_quet 24
unsigned int8 i;
void main()
{

Thực hành vi điều khiển PIC 215


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
set_up_port();
lay_so_luong_ky_tu_chuoi();
lay_ma_ky_tu(slkt);
while(true)
{
for(i=0;i<10;i++)
{
lay_ma_1_so_matran(i,3);
ma_tran_quet_hang(ck_quet,0,mau_xanh);
}
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Sau khi nạp xong thì LED hiển thị giá trị đếm 1 số từ 0 đến 9.

Bài tập 808. Hãy viết chương trình đếm 2 số từ 00 đến 99.
Lưu tên file là “bai_808_mtqh_dem_2so_xanh”

Bài tập 809. Hãy viết chương trình đếm 3 số từ 000 đến 999.
Lưu tên file là “bai_809_mtqh_dem_3so_xanh”

Bài tập 810. Hãy viết chương trình đếm sản phẩm dùng timer T0 hiển thị giá trị đếm
trên led ma trận, giới hạn đếm từ 00 đến 99.
Lưu tên file là “bai_810_mtqh_dem_sp_t0”

Bài tập 811. Hãy viết chương trình đo nhiệt độ hiển thị trên 2 led ma trận.
Lưu tên file là “bai_811_mtqh_adc_lm35”

Bài tập 812. Hãy viết chương trình đo nhiệt độ và đếm sản phẩm dùng T0 hiển thị 4 số
trên 3 led ma trận : 2 số bên trái hiển thị nhiệt độ, 2 số bên phải hiển thị T0.
Lưu tên file là “bai_812_mtqh_adc_lm35_t0”

216 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Chương 9: THỰC HÀNH


MODULE – GLCD 128×64–
ADC–DAC PCF8591, EEPROM
AT24C256 VÀ CÁC CẢM BIẾN

Thực hành vi điều khiển PIC 217


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
9.1 LÝ THUYẾT GLCD
9.1.1 Giới thiệu GLCD
Ở phần trên ta đã sử dụng hết các khả năng của LCD để hiển thị ký tự ASCII.
Phần này sử dụng GLCD có chức năng giống LCD và thêm khả năng hiển thị hình ảnh.
GLCD có rất nhiều dạng phân biệt theo kích thước điểm ảnh và GLCD có trong kit thực
hành là GLCD 128×64 có nghĩa là có 128 điểm ảnh theo hàng và 64 điểm ảnh theo cột.
GLCD 128×64 như hình 9-1:

Hình 9-1. Hình ảnh của GLCD


9.1.2 Sơ đồ chân của GLCD
Sơ đồ chân của GLCD như bảng 9-1.
Bảng 9-1. Các chân của GLCD
Chân số Tên chân Input/output Chức năng tín hiệu
1 VSS Power GND
2 VDD Power +5V
3 VO Analog Contrast Control
4 RS (CS_SPI) Input Register Select. H: data signal, L: instruction signal
5 R/W (SDI_ SPI) Input Read/Write. H: read mode, L: write mode
6 E (SCK_ SPI) Input Enable (strobe)
6-14 DB0 ~ DB7 H/L Data bit 0~7
15 PSB (CS1) Input Interface selection (Chip select signal for IC1)
0: serial mode. 1: 8/4 bits parallel bus mode
16 NC (CS2) Input No connection (Chip select signal for IC2)
17 RESET Input Reset signal
18 Vout (VEE) O Output voltage for GLCD driving
15 BLA input Backlight Anode

218 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
16 BLK input Backlight Cathode
Trong 20 chân của GLCD được chia ra làm 4 dạng tín hiệu như sau:
Các chân cấp nguồn: Chân số 1 là chân Vss sẽ nối mass (0V), chân thứ 2 là Vdd sẽ nối
với nguồn +5V. Chân thứ 3 dùng để chỉnh contrast thường nối với biến trở, biến trở có 1 đầu
nối với 0V và điện áp ra ở chân số 18 là Vout, chỉnh biến trở cho đến khi thấy được ký tự thì
ngừng, trong bộ thực hành thì đã chỉnh rồi.
Các chân BLA và BLK: là 2 chân dùng để cấp nguồn cho đèn nền để có thể nhìn thấy vào
ban đêm. Giống LCD cũng được điều khiển bằng transistor để tắt mở đèn nền.
Các chân điều khiển: bao gồm tín hiệu RS dùng để điều khiển lựa chọn thanh ghi. Tín
hiệu R/W dùng để điều khiển quá trình đọc và ghi. Tín hiệu E là chân cho phép dạng xung chốt.
3 tín hiệu này còn có chức năng giao tiếp chuẩn SPI ở một số GLCD. Hai tín hiệu PSB và tín
hiệu reset tích cực mức thấp.
Các chân dữ liệu D7÷D0: Chân số 7 đến chân số 14 là 8 chân dùng để trao đổi dữ liệu
giữa thiết bị điều khiển và GLCD.
9.1.3 IC điều khiển GLCD ST7920
Để điều khiển GLCD thì có các IC chuyên dùng được tích hợp bên dưới GLCD và có nhiều
IC điều khiển, GLCD của kit thực hành thì dùng IC có mã số là ST7920.
Sơ đồ khối của IC ST7920 như hình 9-2.

Hình 9-2. Cấu trúc IC ST7920


Thực hành vi điều khiển PIC 219
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Các khối bao gồm:
Khối giao tiếp với vi điều khiển có tên là MPU interface gồm có 5 tín hiệu RS, RW, E,
PSB, RESET và 8 đường dữ liệu.
Có 2 thanh ghi gồm thanh ghi lệnh (Instruction Register) và thanh ghi dữ liệu (Data
Register).
Vùng nhớ DDRAM chứa dữ liệu để hiển thị (Display Data RAM) giống LCD gồm 60 ô
nhớ và mỗi ô nhớ là 16 bit (60×16bit).
Vùng nhớ CGROM là vùng nhớ ROM phát ký tự (Character Generator ROM) có dung
lượng 2M bit, vùng nhớ này giống LCD chứa sẵn các ký tự phổ biến.
Vùng nhớ CGRAM là vùng nhớ RAM phát ký tự tự tạo (Character Generator RAM) có
dung lượng 1024 bit, vùng nhớ này giống LCD dành cho người dùng thiết lập các ký tự tự tạo.
Vùng nhớ HCGROM là vùng nhớ ROM phát ký tự nhưng kích thước mỗi ký tự giảm một
nữa (Half Character Generator ROM) có dung lượng 1024 ô nhớ, mỗi ô 16 bit (1024×16 bit).
Vùng nhớ GRAM chứa dữ liệu hình ảnh để hiển thị (Graphic RAM) có dung lượng 1024
ô nhớ và mỗi ô nhớ chứa 16 bit (1024×16bit).
9.1.4 Mô tả chức năng ic điều khiển GLCD ST7920
Giao tiếp với MPU
IC điều khiển ST7920 hỗ trợ 3 chế độ giao tiếp với MPU: chế độ giao tiếp song-song 8 bit,
chế độ giao tiếp song – song 4 bit và chế độ giao tiếp đồng bộ nối tiếp SPI.
Tín hiệu PSB khi bằng 1 thì chọn chế độ giao tiếp song – song.
Tín hiệu PSB khi bằng 0 thì chọn chế độ giao tiếp nối tiếp SPI.
Còn chế độ giao tiếp song – song 8 bit hay 4 bit thì tùy thuộc vào bit DL trong lệnh thiết
lập chức năng (Function set) – giống LCD.
Hai thanh ghi 8 bit DR và IR được dùng cho các hoạt động ghi và đọc của IC ST7920.
Thanh ghi dữ liệu DR dùng để truy xuất dữ liệu các vùng nhớ DDRAM/CGRAM/GRAM
và IRAM với con trỏ địa chỉ lưu trong bộ đếm AC (Address Counter).
Thanh ghi lệnh IR dùng để lưu trữ lệnh từ MPU gởi đến ST7920.
Các vùng nhớ
Vùng nhớ phát ký tự CGROM 16×16 và HCGROM 8×16
IC ST7920 cung cấp CGROM lên đến 8192 font ký tự 16×16 và 126 ký tự 8×16. Vùng
nhớ này hỗ trợ cho ngôn ngữ Trung Quốc và tiếng Anh. Hai byte liên tiếp được dùng để chỉ định
một ký tự 16×16 hoặc 2 ký tự 8×16.
Các mã ký tự được ghi vào DDRAM và font tương ứng được ánh xạ từ vùng nhớ CGROM
hoặc HCGROM để điều khiển hiển thị trên LCD.
Vùng nhớ chứa ký tự tự tạo CGRAM
IC ST7920 cung cấp cho người dùng khả năng tự tạo ký tự theo font mong muốn.
Vùng nhớ này có địa chỉ 6 bit nên có thể lưu được tối đa 4 mã ký tự tự tạo có kích thước
16×16. 4 bit thấp từ 3 đến 0 dùng để định địa chỉ 16 từ dữ liệu của ký tự tự tạo, 2 bit 5 và 4 dùng
để truy xuất 1 trong 4 ký tự.
4 ký tự tự tạo sẽ có mã hiển thị là 0000H, 0002H, 0004H và 0006H.

220 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Khi tạo mã ký tự thì hàng cuối cùng thường để trắng dùng để nhấp nháy con trỏ.
Vùng nhớ DDRAM
DDRAM có 64×2 byte (64×16 bit) nên có thể lưu trữ 16 ký tự có kích thước 16×16 cho 1
hàng, hoặc 32 ký tự 8×16 cho 1 hàng. Các mã ký tự lưu trong vùng nhớ DDRAM trỏ đến vùng
nhớ với font lưu trong CGROM, HCGROM và CGRAM.
ST7920 hiển thị font với độ cao phân nữa của vùng nhớ HCGROM, font do người dùng
định nghĩa ở vùng nhớ CGRAM và font đầy đủ 16×16 ở vùng nhớ CGROM.
Các mã dữ liệu 02H đến 7FH được dùng cho font ký tự với độ cao giảm phân nữa.
Bảng 9-2. Các font chữ 16x16 của các vùng nhớ của GLCD

Các mã dữ liệu A140H đến D75FH được dùng cho code BIG5 và A1A0H đến F7FFH cho
code GB.
 Để hiển thị font HCGROM thì ghi 2 byte vào DDRAM để hiển thị 2 font 8×16. Một
byte tượng trưng cho 1 font ký tự. Dữ liệu của mỗi byte từ 02H đến 7FH.
 Để hiển thị font CGRAM thì ghi 2 byte vào DDRAM để hiển thị 1 font 16×16. Chỉ
có các từ sau là cho phép 0000H, 0002H, 0004H, 0006H.
 Để hiển thị font CGROM thì ghi 2 byte vào DDRAM để hiển thị 1 font 16×16. Các
từ sau A140H, D75FH là cho code BIG5 và A1A0H, F7FFH là cho code GB.
Byte cao D15 đến D7 được gởi đến GLCD trước và sau đó là byte thấp từ D7 đến D0. Hãy
tham khảo thêm bảng 6-3.
Bảng 9-3. Các font chữ 8x16 của GLCD
Thực hành vi điều khiển PIC 221
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Các ký tự có kích thước 8×16 nằm trong bảng theo sau:


Các font của CGRAM và CGROM chỉ có thể được hiển thị ở vị trí bắt đầu của mỗi địa chỉ
như bảng theo sau 6-4.
Bảng 9-4. Địa chỉ gởi mã của font 16x16

Trong hình trên thì để hiển thị ký tự kích thước 16×16 thì phải gởi 2 byte liên tiếp vào cùng
1 địa chỉ, ví dụ bạn phải gởi 2 byte cùng 1 địa chỉ 0×85 chứ không được gởi 1 byte ở địa chỉ
0×85 và 1 byte ở địa chỉ 0×86.
Vùng nhớ GDRAM
Vùng nhớ RAM hiển thị hình ảnh hỗ trợ không gian ánh xạ có kích thước 64×256 bit như
hình 6-3.
Địa chỉ vùng nhớ GDRAM được thiết lập bằng cách ghi 2 byte liên tiếp cho địa chỉ chiều
ngang và chiều dọc. Hai byte dữ liệu ghi vào GDRAM cho một địa chỉ. Bộ đếm địa chỉ tự động
tăng lên 1 để lưu 2 byte tiếp theo.
Trình tự thực hiện như sau:
222 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
 Thiết lâp địa chỉ dọc (Y) cho GDRAM
 Thiết lâp địa chỉ ngang (X) cho GDRAM
 Ghi 8 bit D15 đến D8 vào GDRAM – byte thứ nhất
 Ghi 8 bit D7 đến D0 vào GDRAM – byte thứ hai

Hình 9-3. Tung độ hiển thị GDRAM và địa chỉ tương ứng của GLCD
Hình 9-3 cho thấy địa chỉ theo chiều ngang x (horizontal address) là 16 (từ 0 đến 15) tính
theo word 16 bit, tính theo bit thì bằng 16×16 = 256 bit.
Địa chỉ theo chiều dọc y (vertical address) là 64 bit (từ 0 đến 63).
Để giúp các bạn dễ hiểu thì hình 9-3 được vẽ lại như hình 9-4.
0,0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 255, 0

0 X

3
0, 63
Y

Thực hành vi điều khiển PIC 223


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Hình 9-4. Vẽ lại hình GDRAM theo khối bộ nhớ
Theo cột vẫn là 16 cột, mỗi cột thì dữ liệu là 16 bit tương ứng 16 pixel.
Theo hàng thì cũng chia ra thành 4 hàng, mỗi ô của 1 hàng có 16 bit tương ứng 16 pixel.
Số lượng pixel mà IC ST7920 có thể điều khiển là 64×256.
Kích thước màn hình GLCD gắn ở kit thực hành thì có kích thước là 64×128. Thực tế thì
kích thước này đúng là 32×256, điều đó có nghĩa là người ta cắt bỏ phần bên dưới và vùng nhớ
hiển thị còn lại như hình 9-5.

0,0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 255, 0

0 X

1
0, 31
Y

Hình 9-5. Bộ nhớ GDRAM của GLCD có kích thước 32×256


Khi chế tạo thì GLCD có kích thước dài và mỏng nên thì người ta bố trí lại như hình 9-6.

0,0 0 1 2 3 4 5 6 7

0 X

1
8 9 10 11 12 13 14 15

Hình 9-6. Bộ nhớ GDRAM của GLCD 32×256 bố trí theo kích thước 64×128
Người ta cắt 8 vùng nhớ ở bên phải đem xuống đặt bên dưới, khi đó tính theo cách bố trí
này thì GLCD có kích thước 64×128.
Khi lập trình điều khiển 1 pixel hiển thị thì ta không thể tính theo kích thước 64×128 của
hình 9-6 được mà phải tính theo kích thước 32×256 của hình 9-5.
Muốn lập trình cho tương thích với kích thước 64×128 thì ta vẽ lại hình 9-6 như hình 9-7.
Giới hạn các tọa độ pixel: Khi lập trình điều khiển 1 pixel hiển thị theo kích thước (y×x =
64×128) thì y phải nằm trong giới hạn từ 0 đến 63 và x từ 0 đến 127.
Khi muốn điều khiển hiển thị 1 pixel thì ta tiến hành kiểm tra y: nếu y nằm trong phạm vi
nhỏ hơn 32 thì điểm pixel đó nằm ở 2 hàng trên (XL, YL), nếu lớn 32 thì ta phải trừ đi cho 32
và tăng kích thước của x lên 128 và khi đó chúng sẽ nằm ở 2 hàng dưới (XH, YH).

224 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

0,0 0 1 2 3 4 5 6 7 127, 0

0 XL

1
127, 31
0, 31 YL
128,0 255, 0
8 9 10 11 12 13 14 15
XH
0

1
128, 31 YH

Hình 9-7. Bộ nhớ GDRAM của GLCD 32×256 chi tiết


Công việc ta vừa trình bày là quy đổi kích thước 64×128 về kích thước thực là 32×256.
Các tính toán trên theo trục ngang là tính toán theo pixel, còn tính toán theo từng khối thì
có 16 khối từ 0 đến 15. Trong hình thì các con số 0, 1, 2 … là theo khối.
Chỉ có trục ngang là theo khối còn dọc thì không.
Tại sao lại quan tâm đến khối vì trong lệnh khởi tạo địa chỉ cho trục ngang theo khối chỉ
có 4 bit địa chỉ nên các tọa độ pixel theo kích thước sau khi chuyển đổi về 64×128 thì ta phải
tiếp tục chuyển giá trị 128 về địa chỉ theo khối bằng cách lấy địa chỉ theo trục ngang chia cho
16.
9.1.5 Các lệnh điều khiển GLCD cơ bản
IC ST7920 có 2 tập lệnh cơ bản và tập lệnh mở rộng như sau:
Tập lệnh cơ bản khi bit RE bằng 0.
Bảng 9-5. Tập lệnh điều khiển cơ bản của GLCD
LỆNH R R D D6 D5 D4 D3 D2 D1 D0 Mô tả cloc
S W 7 k

(1) 0 0 0 0 0 0 0 0 0 1 Write "20H" to DDRAM 1.6m


Clear and set DDRAM address s
display counter to "00H".

(2) 0 0 0 0 0 0 0 0 1 0 Sets DDRAM address 72µs


Cursor counter to zero, returns
home shifted display to original
position. DDRAM
contents remain
unchanged.

(3) 0 0 0 0 0 0 0 1 I/D S Sets cursor move 72µs


Entry direction, and specifies
mode automatic shift.
set

Thực hành vi điều khiển PIC 225


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
(4) 0 0 0 0 0 0 1 D C B Turns display (D), cursor 72µs
Display on/off (C) or cursor
control blinking (B).

(5) 0 0 0 0 0 1 S/C R/L 0 0 Set cursor moving and 72µs


display
Cursor
shift control bit, and the
display
direction, without
shift changing DDRAM data.
(6) 0 0 0 0 1 DL x 0 0 0 Set interface data length 72µs
(DL: 4-bit/8-bit). RE = 1
Functio (RE
extended instruction.
n set ) RE = 0 basic instruction.
(7) Set 0 0 0 1 AC AC AC AC AC AC Set CGRAM address in 72µs
CGRA 5 4 3 2 1 0 address counter.
M addr Make sure that in
extended instruction
SR=0 (Scroll or RAM
address select)

(8) Set 0 0 1 0 AC AC AC AC AC AC Set DDRAM address in 72µs


DDRA AC 5 4 3 2 1 0 address counter. AC6 is
M addr 6 fixed to 0.

(9) 0 1 B AC AC AC AC AC AC AC Read busy flag (BF) for 0µs


Read F 6 5 4 3 2 1 0 completion of internal
Busy operation, also read out
the value of address
Flag
counter (AC).
and
Addres
s

(10) 1 0 D D6 D5 D4 D3 D2 D1 D0 Write data to CGRAM/ 72µs


Write 7 DDRAM/GDRAM
data to
RAM

(11) 1 1 D D6 D5 D4 D3 D2 D1 D0 Read data from internal 72µs


Read 7 CGRAM/DDRAM/GDR
data AM
from
RAM

9.1.6 Các lệnh điều khiển GLCD mở rộng


Tập lệnh mở rộng khi bit RE bằng 1.
Bảng 9-6. Tập lệnh điều khiển mở rộng của GLCD
LỆNH RS RW D7 D6 D5 D4 D3 D2 D1 D0 Mô tả clock

(1) 0 0 0 0 0 0 0 0 0 1 Enter standby mode, any 1.6ms


Stand by others instruction can
terminate (Com1 .. 32
halted)

226 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
(2) 0 0 0 0 0 0 0 0 1 SR SR = 1: enable vertical 72µs
Scroll or scroll position
RAM addr SR = 0: enable CGRAM
select address (basic instruction)

(3) 0 0 0 0 0 0 0 1 R1 R0 Select 1 out of 4 line (in 72µs


reverse DDRAM) and decide
whether to reverse the
display by toggling this
instruction
R1, R0 initial value is 00

(4) 0 0 0 0 1 DL x 1 G 0 Set interface data length 72µs


(DL: 4-bit/8-bit).
Extended (RE)
RE = 1 extended
Function Set
instruction.
RE = 0 basic instruction.
G = 1 graphic display on.
G = 0 graphic display off.
(5) Set IRAM 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 SR = 1: AC5 – AC0 the 72µs
or scroll addr address of vertical scroll.

(6) Set 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 Set GDRAM address to 72µs
GRAPHIC 0 0 1 0 0 0 AC3 AC2 AC1 AC0 address counter (AC).
RAM addr First set vertical address
and horizontal address by
consecutive writing.
Vertical address range
AC5 … AC0.
Horizontal address range
AC3 … AC0.

9.2 CÁC BÀI THỰC HÀNH HIỂN THỊ TEXT TRÊN GLCD
9.2.1 Sơ đồ mạch của GLCD
Bộ thực hành có kết nối một GLCD hai màu có kích thước 128×64 qua IC mở rộng port là
MBI5026 có sơ đồ như hình sau:
Có 8 bit DB7-DB0 nối với out7 đến out0 của MBI, năm tín hiệu điều khiển RST, NC, E,
RW, RS nối với năm ngõ ra từ out8 đến out12. Ba ngõ ra out còn lại nối chung và nối với Anode
của đèn backlight để điều khiển đèn sáng tắt theo yêu cầu để tiết kiệm nguồn và tăng tuổi thọ
của đèn và LCD.
Phần điều khiển GLCD đã trình bày ở phần LCD.
9.2.2 Thư viện hàm điều khiển cơ bản của GLCD
Thư viện GLCD có tên là “tv_09_18f6722_glcd.c” lưu các hàm điều khiển GLCD.

Thực hành vi điều khiển PIC 227


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 9-8. Sơ đồ nguyên lý module GLCD 128×64


Thư viện dùng cho GLCD có tên là “tv_06_gcd”.
a. Khai báo biến và định nghĩa: Biến điều khiển và các bit chi tiết.
unsigned int8 glcd_ctr;
#bit glcd_p = glcd_ctr.5
#bit glcd_rs = glcd_ctr.4
#bit glcd_rw = glcd_ctr.3
#bit glcd_e = glcd_ctr.2
#bit glcd_nc = glcd_ctr.1
#bit glcd_psb = glcd_ctr.0
Giải thích: Định nghĩa biến điều khiển 8 bit của glcd. Tiếp theo là định nghĩa tên từng tín hiệu
điều khiển tương ứng với vị trí từng bit của biến trên để cho phép truy xuất bit.
b. Định nghĩa các lệnh: Các lệnh điều khiển GLCD và địa chỉ.
#define glcd_text_mode 0x30
#define glcd_graphic_mode 0x36

#define glcd_clear_display 0x01


#define glcd_cursor_display 0x0c
#define glcd_entry_mode 0x06

#define glcd_addr_line0 0x80


#define glcd_addr_line1 0x90
#define glcd_addr_line2 0x88
#define glcd_addr_line3 0x98

228 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Giải thích: Định nghĩa hai chế độ điều khiển của GLCD là text và graphic. Định nghĩa các
lệnh điều khiển và địa chỉ của 4 hàng ở chế độ text.
c. Hàm 621: Xuất dữ liệu ra 8 bit GLCD.
void glcd_xuat_db(int8 db)
{
glcd_e=1; xuat_glcd(glcd_ctr,db);
delay_us(20);
glcd_e=0; xuat_glcd(glcd_ctr,db);
}
d. Hàm 622: Xuất lệnh ra GLCD.
void glcd_command(int8 db)
{
glcd_rs = 0;
glcd_xuat_db(db);
}
e. Hàm 623: Xuất dữ liệu ra GLCD.
void glcd_data(int8 db)
{
glcd_rs = 1;
glcd_xuat_db(db);
}
f. Hàm 624: Xóa số to đang hiển thị trên LCD ở hàng x và cột y.
void setup_glcd (int8 glcd_fs_mode)
{
glcd_psb = 1;
glcd_nc = 1;
glcd_e = 0;
glcd_rw = 0;
glcd_p =0;
glcd_command(glcd_fs_mode);
delay_us(10);
glcd_command(glcd_cursor_display);
delay_us(10);
glcd_command(glcd_clear_display);
delay_ms(10);
glcd_command(glcd_entry_mode);
delay_us(10);
}
9.2.3 Các bài thực hành hiển thị ký tự trên GLCD
GLCD có khả năng hiển thị ký tự và hình ảnh, phần này thực hành các bài hiển thị ký tự
trên GLCD giống như trên LCD.
Bài mẫu 901. Chương trình điều khiển GLCD hiển thị 4 hàng kí tự font 16×16.
Nội dung hiển thị xem trong chương trình.
Lưu tên file “bai_901_glcd_ht_chuoi”.

Thực hành vi điều khiển PIC 229


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
a. Mục đích: Biết lập trình hiển thị chuỗi trên GLCD.
b. Lưu đồ, giải thuật: Khởi tạo GLCD chế độ text, thiết lập địa chỉ hàng 0, gửi chuổi dữ
liệu ra hàng 0 để hiển thị, tương tự cho 3 hàng còn lại.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_06_18f6722_glcd.c>

void h901_glcd_hien_thi_chuoi()
{
glcd_command(glcd_addr_line0);
glcd_data("Nhu co Bac ho ");

glcd_command(glcd_addr_line1);
glcd_data("trong ngay vui ");

glcd_command(glcd_addr_line2);
glcd_data("dai thang ");

glcd_command(glcd_addr_line3);
glcd_data("thuc hanh vdk");
}
void main()
{
set_up_port();
setup_glcd(glcd_text_mode);
while(true)
{
h901_glcd_hien_thi_chuoi();
while(true);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Hiển thị nội dung 4 hàng đã khai báo trong chương trình. Có thể
thay đổi nội dung hiển thị.
Bài tập 902. Hãy viết chương trình giống bài 601 nhưng có 2 nút điều khiển ON và
OFF. Khi nhấn ON thì hiển thị 4 hàng thông tin, nhấn OFF thì xóa hết.
Viết thêm hàm xóa 4 chuỗi trên GLCD bằng cách hiển thị 16 khoảng trắng cho 1 hàng.
Lưu tên file “bai_902_glcd_ht_chuoi_on_off”.

Bài mẫu 903. Chương trình đếm sản phẩm dùng timer0 hiển thị trên GLCD font 16×16.
Giới hạn đếm từ 0 đến 50.
Lưu tên file “bai_903_glcd_counter_t0”.
a. Mục đích: Biết lập trình đếm sản phẩm hiển thị trên GLCD ở chế độ text.

230 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
b.Lưu đồ, giải thuật: Khởi tạo GLCD chế độ text, timer0 đếm xung ngoại, đọc giải mã
hiển thị khi có xung mới.
c. Chương trình con “bai_903_glcd_counter_t0_tv”:
unsigned int8 t0, t0_tam,g_han;
void b903_hienthi_4led7doan()
{
giaima_bin_2so_vitri_vn(t0,0,kx_vn);
giaima_bin_2so_vitri_vn(g_han,6,kx_vn);
xuat_8led_7doan();
}

void h903_glcd_gma_hthi(usi8 addr,usi8 x)


{
unsigned int8 tram,chuc,donvi;
tram=x/100; chuc=x/10%10; donvi=x %10;
glcd_command(addr);
if(tram==0)
{
glcd_data(' ');
if(chuc==0) glcd_data(' ');
else glcd_data(chuc+0x30);
}
else
{
glcd_data(tram+0x30);
glcd_data(chuc+0x30);
}
glcd_data(donvi+0x30);
}

void b903_dem_sp_t0_glcd_8l7d()
{
t0 = get_timer0();
if(t0_tam!=t0)
{
t0_tam = t0;
b903_hienthi_4led7doan();
h903_glcd_gma_hthi(glcd_addr_line1,t0);
if (t0>=g_han)
{
set_timer0(0);
buzzer_on_off(300);
}
}
}

Thực hành vi điều khiển PIC 231


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_09_18f6722_glcd.c>
#include <bai_903_glcd_counter_t0_tv.c>

void main()
{
set_up_port();
setup_glcd(glcd_text_mode);

glcd_command(glcd_addr_line0);
glcd_data("dem san pham:");

setup_timer_0(t0_ext_l_to_h|t0_div_1|t0_8_bit);
set_timer0(0);
t0_tam = 1;
g_han=50;
while(true)
{
b903_dem_sp_t0_glcd_8l7d();
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Hiển thị thông tin và giá trị đếm xung ngoại của timer0.

Bài tập 903. Hãy viết chương trình đếm sản phẩm dùng counter T0, hiển thị kết quả
đếm trên 8 led 7 đoạn, LCD và GLCD.
Mục đích: biết lập trình đếm sản phẩm và giải mã hiển thị trên nhiều module.
Lưu tên file là “bai_903_glcd_lcd_4led_dem_sp_t0”

9.3 CÁC BÀI THỰC HÀNH HIỂN THỊ HÌNH ẢNH TRÊN GLCD
9.3.1 Thư viện và hàm điều khiển liên quan đến hình ảnh của GLCD
Phần này thực hành các bài hiển thị hình ảnh số 2 màu trên GLCD.
Hình ảnh số có được từ nhiều nguồn thiết bị khác nhau như máy chụp ảnh hay ảnh chụp
trên màn hình máy tính hay do phần mềm vẽ tạo ra, … với nhiều tên mở rộng khác nhau, … và
muốn hiển thị ảnh trên GLCD thì ta phải dùng phần mềm chuyển đổi ảnh sang file nhị phân còn
gọi là file ảnh. Khi chuyển đổi phần mềm sẽ cung cấp hai thông số là chiều cao và rộng của file
nhị phân, kèm theo là file nhị phân của ảnh.
File nhị phân của ảnh trắng đen là một tập hợp các pixel của ảnh được lưu trữ thành từng
byte, mỗi byte lưu 8 pixel theo chiều bắt đầu từ pixel bên trái trái sang phải và từ trên xuống.

232 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Để hiển thị hình ảnh trên GLCD ta chỉ thực hiện việc gửi file nhị phân của ảnh ra vùng nhớ
gdram của GLCD. Cũng có thể xem là copy ảnh từ bộ nhớ ra màn hình.
Chúng ta phải viết chương trình copy cho đúng thì mới hiển thị lại ảnh đúng.
Để hiển thị một ảnh thì về cơ bản là ta vẽ lại từng điểm ảnh (pixel) trên màn hình GLCD
và diện tích ảnh trên GLCD đúng với ảnh ta cần hiển thị.
a. Khai báo dữ liệu: Định nghĩa kích thước GLCD, mảng để chứa dữ liệu hình ảnh.
#define glcd_ngang 16 //256 pixel
#define glcd_doc 32 //32 hang
int8 doc, ngang;

typedef union
{
unsigned int16 word;
unsigned int8 nbyte[2];
}dots;

typedef struct
{
int1 refresh;
dots pixel[glcd_doc][glcd_ngang];
} gd_ram;
gd_ram gdram_vdk;
b. Hàm 625: Thiết lập màu nền trắng hoặc xanh cho GLCD.
void glcd_mau_nen(int1 glcd_color)
{
int16 d;
if(glcd_color) d=0xffff; else d=0;
for (doc=0; doc < glcd_doc; doc++)
{
for (ngang=0; ngang < glcd_ngang; ngang++)
gdram_vdk.pixel[doc][ngang].word = d;
}
gdram_vdk.refresh = true;
}
c. Hàm 626: làm đổi màu 1 pixel trên GLCD ở hàng x và cột y.
void glcd_pixel(int8 x, int8 y, int1 color)
{
int8 b;
if(y>31){x += 128; y-= 32;};
doc = y;
ngang = x/16;
b = 15 - (x % 16);

if (color == 1) bit_set (gdram_vdk.pixel[doc][ngang].word, b);


else bit_clear (gdram_vdk.pixel[doc][ngang].word, b);
gdram_vdk.refresh = true;
}

Thực hành vi điều khiển PIC 233


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
d. Hàm 627: Xuất toàn bộ dữ liệu hình ảnh từ vi điều khiển sang GLCD.
void gram_vdk_to_gram_glcd_all()
{
if (gdram_vdk.refresh)
{
for (doc = 0; doc <glcd_doc; doc++)
{
glcd_command( 0x80 | doc); // set vertical address.
glcd_command( 0x80 | 0); // set horizontal address.

for (ngang=0; ngang <glcd_ngang; ngang++)


{
glcd_data( gdram_vdk.pixel[doc][ngang].nbyte[1]);
glcd_data( gdram_vdk.pixel[doc][ngang].nbyte[0]);
}
}
gdram_vdk.refresh = false;
}
}
e. Hàm 628: Giống hàm 627 nhưng chỉ copy 1 vùng.
void gram_vdk_to_gram_glcd_area(int8 x,int8 y,int8 rong, int8 cao)
{
int8 hesox,hesoy;
if (gdram_vdk.refresh)
{
if((x/16)!=(x + rong)/16) rong=((rong+15)/16)+1;
else rong=((rong+15)/16);

x = x/16;
for (doc = y; doc <(y+cao); doc++)
{
if(doc>31)
{
hesox = 8+x;
hesoy = doc-32;
}
else {hesox = x; hesoy = doc;}
glcd_command( 0x80 |hesoy);
glcd_command( 0x80 |hesox);

for (ngang=hesox; ngang <(hesox+rong); ngang++)


{
glcd_data( gdram_vdk.pixel[hesoy][ngang].nbyte[1]);
glcd_data( gdram_vdk.pixel[hesoy][ngang].nbyte[0]);
}
}
gdram_vdk.refresh = false;
}
}

234 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
f. Mảng hình ành: Mã nhị phân của 1 logo để thực hành hiển thị ảnh trên GLCD.
const unsigned char Logo_DHSPKTTP []= { 0X00,0X01,0X2E,0X00,0X39,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X00,0X00,0X00,
0X00,0X00,0X02,0X00,0X00,0X00,0X00,0X00,0X02,0X04,0X00,0X00,0X00,0X01,0X02,0X0C,
0X00,0X00,0X00,0X01,0X82,0X0C,0X00,0X00,0X00,0X00,0X80,0X08,0X00,0X00,0X00,0X00,
0X80,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X00,0X00,0X00,0X3F,0XC0,0X00,0X00,
0X00,0X70,0X70,0X70,0X70,0X00,0X00,0X38,0XC8,0X18,0XE0,0X00,0X00,0X18,0XD8,0X18,
0XC0,0X00,0X00,0X01,0XB0,0X0C,0X00,0X00,0X00,0X01,0XA0,0X0C,0X00,0X00,0X00,0X01,
0X60,0X0C,0X00,0X00,0X00,0X01,0X00,0X04,0X00,0X00,0X00,0X01,0X00,0X04,0X00,0X00,
0X00,0X31,0X00,0X04,0X00,0X00,0X00,0X79,0X80,0X0C,0XF0,0X00,0X00,0X71,0X80,0X0C,
0X70,0X00,0X00,0X01,0X80,0X0C,0X00,0X00,0X00,0X00,0XC0,0X18,0X00,0X00,0X00,0X00,
0XC0,0X18,0X00,0X00,0X00,0X00,0X60,0X30,0X00,0X00,0X00,0X00,0X60,0X30,0X00,0X00,
0X00,0X00,0X20,0X20,0X00,0X00,0X00,0X00,0X30,0X60,0X00,0X00,0X00,0X00,0X30,0X60,
0X00,0X00,0X00,0X00,0X3F,0XE0,0X00,0X00,0X00,0X00,0X3F,0XE0,0X00,0X00,0X00,0X00,
0X3F,0XE0,0X00,0X00,0X00,0X00,0X3F,0XE0,0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X00,
0X00,0X00,0X3E,0X60,0X00,0X00,0X00,0X00,0X39,0XE0,0X00,0X00,0X00,0X00,0X07,0XE0,
0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X00,0X00,0X00,0X3E,0X60,0X00,0X00,0X00,0X00,
0X3D,0XE0,0X00,0X00,0X00,0X00,0X3F,0XE0,0X00,0X00,0X00,0X00,0X1F,0XC0,0X00,0X00,
0X00,0X00,0X0F,0X80,0X00,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,};
g. Hàm 629: Xuất ảnh 1 phần ra GLCD.
void glcd_xuat_anh(int width,int height,int x,int y)
{
unsigned int i=0, j=0, k=0;
unsigned int16 count=0;
for(j=0;j<height;j++)
{
for(;i<width;)
{
for(k=8;k>0;k--)
{
glcd_pixel(i+x,j+y,bit_test(Logo_DHSPKTTP[count],
(k-1)));
i++;
}
count++;
}
i=0;
}
}
9.3.2 Các bài thực hành hiển thị hình ảnh trên GLCD
Phần này thực hành các bài hiển thị hình ảnh trên GLCD bằng nhiều cách khác nhau.
Bài mẫu 905. Chương trình hiển thị “logo SPK” trên GLCD tại địa chỉ (0,0).

Thực hành vi điều khiển PIC 235


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Lưu tên file “bai_905_glcd_ht_anh_spkt”.


a. Mục đích: Biết lập trình hiển thị hình ảnh trên màn hình GLCD.
b. Thông số file ảnh nhị phân: File ảnh “logo spk” đã được tạo ra từ ành có kích thước
cao và rộng là 64×64 pixel. Kích thước rộng được chuyển đổi theo dạng word 16 bit
tương ứng 16 pixel nên ảnh có kích thước là 64pixel×4word. Tổng số word của file
ảnh là 256 word và đã khai báo trong thư viện, khi nạp vào vi điều khiển sẽ lưu ở bộ
nhớ chương trình. Khái niệm chiều cao và rộng sẽ tương ứng với chiều dọc và chiều
ngang trên màn hình.
c. Lưu đồ, giải thuật: Khởi tạo chế độ hình ảnh, xóa vùng nhớ đệm gdram của vi điều
khiển. Ánh xạ từng bit của ảnh logo sang từng bit của vùng nhớ đệm gdram tại bất
kỳ vị trí (x,y) theo pixel. Làm cho hết 64×64 = 4096 pixel của ảnh.
Sau đó copy dữ liệu toàn vùng nhớ đệm gdram của vi điều khiển sang vùng nhớ
gdram của GLCD.
d. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_06_18f6722_glcd.c>

void main()
{
set_up_port();
setup_glcd(glcd_text_mode);
delay_ms(1);

setup_glcd(glcd_graphic_mode);
glcd_mau_nen(0) ;
while(true)
{
glcd_xuat_anh(64,64,0,0);
gdram_vdk_to_gdram_glcd_all ();
while(true);
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Sẽ nhìn thấy logo SPK màu trắng trên nền xanh của GLCD.
g. Thay đổi thông số: Thay đổi giá trị của x sang 8 hoặc 10 hoặc 12 và 16 thử xem sao.

Bài tập 906. Hãy hiển thị hai logo SPK trên màn hình GLCD.

236 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Lưu tên file “bai_906_glcd_ht_2anh_spkt”.

Bài tập 907. Hãy hiển thị logo SPK bên trái và sau đó di chuyển sang bên phải với thời
gian delay là 1 giây cho đến khi dụng biên bên phải thì di chuyển ngược lại.
Lưu tên file “bai_907_glcd_ht_anh_spkt_dichuyen”.

9.4 CÁC BÀI THỰC HÀNH VẼ HÌNH TRÊN GLCD


9.4.1 Thư viện “graphics.c”
Phần mềm CCS có hỗ trợ thư viện trên, thư viện có cung cấp 4 hàm dùng để vẽ đường
thẳng, vẽ hình chữ nhật, vẽ cung và vẽ hình tròn và một hàm hiển thị text. Các bài thực hành sẽ
dùng các hàm này để thực hiện một số ứng dụng để vẽ hình và hiển thị text.
9.4.2 Các bài thực hành sử dụng thư viện “graphics.c”

Bài mẫu 911. Chương trình vẽ đường thẳng, đường tròn, hình vuông, hình chữ nhật,
hiển thị text trên GLCD.
Lưu tên file “bai_911_glcd_ve_cac_hinh”.
a. Mục đích: Biết lập trình sử dụng các hàm của thư viện để vẽ các hình trên GLCD.
b. Lưu đồ, giải thuật: Khởi tạo GLCD chế độ hình ảnh, gọi các hàm đã viết.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_09_18f6722_glcd.c>
#include <graphics.c>//duoi tv_pic_glcd

void b911_glcd_line_rect_bar_circle_text()
{
unsigned char glcd_text_cir[]={"graphic"};
setup_glcd(glcd_graphic_mode);
glcd_mau_nen(0);

glcd_text57(0, 0,glcd_text_cir, 1, 1);

glcd_line(0,10,30,30,sang);

glcd_rect(0, 40, 20, 60,no_fill,sang);


glcd_rect(30, 40, 50, 60,co_fill,sang);

Thực hành vi điều khiển PIC 237


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
glcd_circle(60,10,10,no_fill,sang);
glcd_circle(90,10,10,co_fill,sang);

glcd_bar(90,40,100,60,5,sang);

glcd_bar(70,40,70,60,5,sang);
gdram_vdk_to_gdram_glcd_all();
}

void main()
{
set_up_port();
setup_glcd(glcd_text_mode);
delay_ms(1);

setup_glcd(glcd_graphic_mode);
glcd_mau_nen(0) ;
while(true)
{
b911_glcd_line_rect_bar_circle_text();
while(true);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Sẽ nhìn thấy text, đường thẳng và các hình trên GLCD.
f. Thay đổi thông số: Có thể thay đổi các thông số trong các hàm.

Bài mẫu 912. Đồng hồ số và kim: Đọc thời gian thực DS1307, chỉ hiển thị phần giây
dạng số và kim trên GLCD.
(64,0) 96

12

22

32 9 (96,32) 3

Lưu tên file “bai_912_glcd_ds13_kim_giay”.


a. Mục đích: Biết lập trình sử dụng các hàm để vẽ đồng hồ kim đếm giây.
b. Lưu đồ, giải thuật: Chỉ trình bày thêm phần vẽ kim giây trên GLCD.
Vẽ kim giây di chuyển theo đúng giá trị của giây:
Khi giây tăng lên 1 đơn vị thì tương đương kim giây quay một góc 6 độ, bằng 360/60.
238 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Giả sử cho giây bắt đầu bằng 0 thì kim giây được vẽ ở vị trí tương ứng là 12 giờ, góc
lệch so với trục x là 270 độ tương đương 45 giây.
Khi giây tăng lên là 1 thì kim giây quay lệch góc 276 độ. Cứ thế cho đến khi giây
bằng 14 thì kim giây quay lệch góc 357 độ. Khi giây bằng 15 thì kim giây quay lệch
360 độ kết thúc 1 vòng hay 0 độ tính cho vòng mới.
Khi giây bằng 16 thì kim giây quay lệch 6 độ.
Đến đây ta có thể tính toán góc lệch của kim giây theo giây là:
 Lấy giá trị của giây cộng với 45 rồi so sánh với 60: Nếu lớn hơn 60 thì bắt đầu
của chu kỳ đếm mới nên trừ đi cho 60. Ngược lại thì còn nằm trong chu kỳ
đếm hiện tại.
 Lấy giá trị trên nhân với 6 độ thì được góc lệch của kim giây hiện tại.
Tiếp theo tính toán “xtinh” và “ytinh” theo góc lệch có được:
Từ góc ta phải đổi sang radian bằng cách nhân với Pi và chia 180 độ.
Áp dụng công thức lượng giác với 2 thông số đã biết là bán kính và góc ta tính được
“xtinh” và “ytinh” chính là tọa độ điểm cuối của kim giây.

(ytinh) (x_ve,y_ve)

goc

(xt,yt) (xtinh)

Tiếp theo tính toán “x_ve” và “y_ve” theo tâm khác 0:


Theo lượng giác thì tâm đường tròn có tọa độ là (0,0) nhưng tâm của hình tròn trên
GLCD là (xt,yt) khác (0,0) nên ta phải tính theo tâm (xt,yt) như sau: x_ve = xt +
xtinh, y_ve = yt + ytinh.
Chú ý: Khi tính toán thì dùng kiểu số thực, đến giá trị cuối cùng (x_ve,y_ve) thì phải
chuyển về số nguyên có dấu để vẽ.
Xóa kim cũ và vẽ kim mới:
Phải xóa kim giây cũ trước khi tiến hành tính toán và vẽ kim giây mới.
c. Chương trình con “bai_622_glcd_ds13_kim_giay_tv.c”
#define xt 96
#define yt 32
#define bks 22
Thực hành vi điều khiển PIC 239
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
void glcd_ve_kim(usi8 bk,usi16 tg, int1 tt)
{
signed int16 x_ve,y_ve,tg45;
float xtinh,ytinh,goc;

setup_glcd(glcd_graphic_mode);
if(tt) glcd_line(xt,yt,x_ve,y_ve,tat);

tg45 = tg + 45;
if(tg45>60) tg45=tg45-60;
goc = tg45*6;
xtinh = bk*cos((goc*3.14)/180);
ytinh = bk*sin((goc*3.14)/180);
x_ve = xt + (signed int16)(xtinh);
y_ve = yt + (signed int16)(ytinh);
glcd_line(xt,yt,x_ve,y_ve, sang);
glcd_circle(xt,yt,4,co_fill,sang);
glcd_circle(xt,yt,2,no_fill,tat);
}

void glcd_ve_vong_tron_ht_so()
{
unsigned char glcd_text1[]={"clock:"}, glcd_12[]="12",;
unsigned char glcd_3[]="3",glcd_6[]="6",glcd_9[]="9";

setup_glcd(glcd_graphic_mode);
glcd_mau_nen(0) ;
glcd_text57(0,0,glcd_text1, 1, 1);

glcd_text57(xt-5,yt-28,glcd_12, 1,1);
glcd_text57(xt-3,yt+22,glcd_6, 1,1);
glcd_text57(xt-28,yt-3,glcd_9, 1,1);
glcd_text57(xt+24,yt-3,glcd_3, 1,1);
glcd_circle(xt,yt,bks+8,no_fill,sang);
//glcd_circle(xt,yt,bks,no_fill,sang);
glcd_ve_kim_1(bks,giay,0);
}

void glcd_dong_ho_so()
{
const signed int8 maglcd[]={"0123456789"};
glcd_command(glcd_text_mode);
glcd_command(glcd_addr_line1+3);
glcd_data(maglcd[giay/10]);
glcd_data(maglcd[giay%10]);
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#include <tv_09_18f6722_glcd.c>

240 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
#include <graphics.c>//duoi tv_pic_glcd
#include <bai_912_glcd_ds13_kim_giay_tv.c>
usi8 giay_tam, giay_bin;

void main()
{
set_up_port();
setup_glcd(glcd_text_mode);
delay_ms(1);

setup_glcd(glcd_graphic_mode);
glcd_mau_nen(0) ;
ds1307_kiem_tra_ma();

glcd_ve_vong_tron_ht_so(giay_ds);
while(true)
{
ds1307_doc_time(8);
if (giay_tam!=giay_ds)
{
giay_tam=giay_ds;
giay_bin=(giay_ds/16)*10+(giay_ds%16);

glcd_ve_kim(bks,giay_bin,1);
gdram_vdk_to_gdram_glcd_all();
glcd_dong_ho_so(giay_bin);
}
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Sẽ nhìn thấy hình tròn và kim giây di chuyển trên GLCD. Có thêm
hiển thị các con số 12, 3, 6, 9 như đồng hồ thực tế. Có vẽ thêm 2 vòng tròn ở tâm cho
dễ nhìn. Có thêm phần hiển thị đếm giây bằng số.

Bài tập 913. Đồng hồ số và kim: Giống bài 912, thêm phần kim phút. Nên dùng
glcd_bar() cho kim phút, chiều dài ngắn hơn kim giây.
Lưu tên file “bai_913_glcd_dong_ho_phut_giay”.

Bài tập 914. Đồng hồ số và kim: thêm phần kim giờ. Nên dùng glcd_bar() cho kim giờ
và phút, chiều dài kim giờ ngắn hơn kim phút.
Lưu tên file “bai_914_glcd_dong_ho_gio_phut_giay”.

9.4.3 Giải mã 7 đoạn số to sử dụng thư viện “graphics.c”

Thực hành vi điều khiển PIC 241


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bài tập 915. Hãy viết chương trình vẽ số 8 như hình sau trên GLCD.
Hãy phân tích hình và lập trình.
Lưu tên file “bai_915_glcd_so_8_tu_tao”.

(xa,ya)
3 pixel 9 pixel 3 pixel

3 pixel

a
(xf,yf) (xb,yb)
9 pixel

f b

30 pixel
(xg,yg)
g
3 pixel

(xe,ye)

e c
9 pixel

(xd,yd)
d
3 pixel

17 pixel

Bài tập 916. Hãy phát triển bài 915 làm sao có thể giải mã hiển thị bất kỳ số nào từ 0
đến F. Hãy phân tích hình và lập trình. Thực hiện giống bài số to của LCD.
Lưu tên file “bai_916_glcd_so_tu_tao”.

Bài tập 917. Hãy viết chương trình đếm xung ngoại dùng timer0 và giải mã hiển thị
với các số đã xây dựng ở bài 915.
Lưu tên file “bai_917_glcd_dem_xung_so_tu_tao”.

9.5 GIAO TIẾP BỘ NHỚ EEPROM AT24C256

242 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
9.5.1 Khảo sát IC nhớ EEPROM AT24C256
IC nhớ EEPROM AT24C256 có dung lượng 128Kbit hay 32Kbyte hay 32768 byte giao
tiếp chuẩn nối tiếp 2 dây I2C.
Có thể hoạt động truyền dữ liệu hai chiều với tốc độ 1MHz khi dùng nguồn 5V, 400kHz
khi dùng nguồn 2,7V và 100kHz khi dùng nguồn 1,8V.
Cho phép ghi/đọc dữ liệu theo trang bộ nhớ 64 byte.
Cho phép ghi 100,000 lần, dữ liệu có thể lưu trữ lên đến 40 năm.
Sơ đồ chân và tên các chân như hình 9-9:

Hình 9-9. Sơ đồ chân và tên các chân của IC Eeprom AT24C256


Sơ đồ khối bên trong của IC như hình 8-31.
Trong sơ đồ khối gồm các khối “START STOP LOGIC” có chức năng phát hiện các trạng
thái Start và Stop của chuẩn truyền dữ liệu I2C.
Khối “DEVICE ADDRESS COMPARATOR” có chức năng so sánh địa chỉ từ thiết bị chủ
gởi đến.
Khối “SERIAL CONTROL LOGIC” có chức năng điều khiển truyền dữ liệu nối tiếp.
Các khối xử lý địa chỉ và giải mã địa chỉ cùng với bộ nhớ eeprom.
Có 1 transistor có chức năng tắt mở trong quá trình không được truy xuất.
Chức năng các chân
Chức năng chân SCL và SDA theo chuẩn I2C.
Chân WP khi nối GND thì cho phép ghi, nếu nối Vcc thì không cho phép ghi. Nếu để hở
thì bên trong có điện trở kéo xuống mức 0.
Hai chân A0 và A1 dùng để thiết lập địa chỉ cho IC nhớ khi giao tiếp nhiều IC nhớ.
 Nếu chỉ có 1 IC nhớ này có dung lượng 256Kbit thì 2 bit địa chỉ này sẽ là A1A0 =
00.
 Nếu ghép 2 IC nhớ để có dung lượng 512Kbit thì IC thứ nhất có 2 bit địa là A1A0 =
00, IC thứ hai có 2 bit địa là A1A0 = 01.

Thực hành vi điều khiển PIC 243


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
 Nếu ghép 4 IC nhớ để có dung lượng 1Mbit thì IC thứ nhất có 2 bit địa là A1A0 =
00, IC thứ hai có 2 bit địa là A1A0 = 01, IC thứ ba có 2 bit địa là A1A0 = 11, IC thứ
tư có 2 bit địa là A1A0 = 11.

Hình 9-10. Sơ đồ khối của IC Eeprom AT24C256


Tổ chức bộ nhớ
IC nhớ Eeprom AT24C256 có dung lượng 256Kbit được tổ chức thành 512 trang bộ nhớ,
mỗi trang có dung lượng 64byte. Địa chỉ truy xuất ngẫu nhiên là 15 bit.
Hoạt động của 2 tín hiệu SCL và SDA
Theo chuẩn giao tiếp I2C như đã trình bày.
Địa chỉ của thiết bị
Địa chỉ như hình 9-11:

Hình 9-11. Tổ chức địa chỉ của IC Eeprom AT24C256


Có 7 bit địa chỉ như các thiết bị khác, bit LSB là bit lựa chọn chế độ đọc hay ghi, 2 bit địa
chỉ A1A0 như đã trình bày ở trên. Kit thiết kế thì A1A0 = 00 nên địa chỉ ghi là 0xA0 và đọc là
0xA1.
Hoạt động ghi dữ liệu của IC Eeprom AT24C256
Có 2 chế độ ghi: ghi theo byte và ghi theo trang như các hình 9-12 và 9-13.

244 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 9-12. Ghi theo byte của IC Eeprom AT24C256


Hoạt động ghi 1 byte giống như đã trình bày ở đầu chương gồm các bước: thực hiện start,
gởi địa chỉ thiết bị, gởi địa chỉ byte cao của ô nhớ cần ghi, gởi địa chỉ byte thấp của ô nhớ cần
ghi và tiến hành gởi byte dữ liệu và thực hiện stop để kết thúc.

Hình 9-13. Ghi theo trang của IC Eeprom AT24C256


Hoạt động ghi 1 trang bộ nhớ 64 byte gồm các bước: thực hiện start, gởi địa chỉ thiết bị,
gởi địa chỉ byte cao của trang cần ghi, gởi địa chỉ byte thấp của trang cần ghi và tiến hành gởi
byte dữ liệu thứ 0, byte thứ 1, … cho đến byte thứ 63 và thực hiện stop để kết thúc.
Ta chỉ có thể ghi ít hơn 63 chứ nhiều hơn thì nó sẽ cuộn tròn.
Bên trong IC nhớ sẽ tự động tăng 6 bit địa chỉ thấp để nhận đúng 64 byte.
Khi dung lượng lớn và liên tục thì ghi theo trang sẽ nhanh hơn ghi theo byte.
Có 3 chế độ ghi: đọc byte hiện tại, đọc byte ngẫu nhiên và đọc trang như các hình 9-14, 9-
15, 9-16.

Hình 9-14. Đọc byte hiện tại của IC Eeprom AT24C256.

Thực hành vi điều khiển PIC 245


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 9-15. Đọc byte ngẫu nhiên của IC Eeprom AT24C256.

Hình 9-16. Đọc nhiều byte liên tục của IC Eeprom AT24C256.
9.5.2 Mạch điện giao tếp với IC nhớ EEPROM AT24C256
Vi điều khiển PIC18F6722 với bộ nhớ Eeprom AT24C256 như đã trình bày ở chương 1.
9.5.3 Thư viện IC nhớ EEPROM AT24Cxx
Thực hành các bài ghi đọc bộ nhớ nối tiếp Eeprom AT24C256
Thư viện của AT24Cxx theo chuẩn I2C là: “tv_07_i2c_at24cxx”
a. Định nghĩa: Địa chỉ ghi và địa chỉ đọc của IC AT24Cxx.
#define addr_wr_24xxx 0xa0
#define addr_rd_24xxx 0xa1
b. Hàm 705: Reset IC AT24Cxx.
void at24_reset()
{
i2c_start();
i2c_stop();
}
c. Hàm 708: Ghi 1 byte dữ liệu vào địa chỉ của ô nhớ.
void at24_ghi_1byte(usi16 addr,usi8 data_1byte)
{
i2c_start();
i2c_write(at24_addr_wr);
i2c_write(addr>>8);
i2c_write(addr);
i2c_write(data_1byte);
i2c_stop();

246 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
}
Khai báo thư viện giao tiếp 1 dây và định nghĩa các lệnh của vi mạch DS18B20.
d. Hàm 709: Đọc 1 byte dữ liệu tại địa chỉ của 1 ô nhớ.
unsigned int8 at24_doc_1byte(usi16 addr)
{
unsigned int8 data_1byte;
i2c_start();
i2c_write(at24_addr_wr);
i2c_write(addr>>8);
i2c_write(addr);
i2c_start();
i2c_write(at24_addr_rd);
data_1byte = i2c_read(0);
i2c_stop();
return(data_1byte);
}
e. Hàm 706: Khởi tạo ghi địa chỉ của ô nhớ nằm trong IC AT24Cxx.
void at24_khoi_tao_ghi(usi16 addr)
{
i2c_start();
i2c_write(at24_addr_wr);
i2c_write(addr>>8);
i2c_write(addr);
}
f. Hàm 707: Khởi tạo đọc dữ liệu từ địa chỉ của ô nhớ trong IC AT24Cxx.
void at24_khoi_tao_doc(usi16 addr)
{
i2c_start();
i2c_write(at24_addr_wr);
i2c_write(addr>>8);
i2c_write(addr);
i2c_start();
i2c_write(at24_addr_rd);
}

9.5.4 Các chương trình ghi đọc IC nhớ EEPROM AT24C256


Thực hành các bài ghi đọc bộ nhớ nối tiếp Eeprom AT24C256
Bài mẫu 921. Chương trình cài giới hạn từ 0 đến 99 dùng 2 nút UP và DW và cuộn
tròn, dùng chế độ nhấn và giữ để tăng hoặc giảm, có xóa vô nghĩa. Giá trị được lưu vào
ô nhớ có địa chỉ 100 của IC nhớ Eeprom AT24C264. Giống bài 406, chỉ khác là lưu giới
hạn vào bộ nhớ Eeprom để khi mất điện thì không mất giá trị cài vẫn không bị mất.
Lưu tên file là “bai_921_at24_cai_gh_0_99_2bt_up_dw”.
a. Mục đích: Biết lập trình ghi dữ liệu 1 byte vào và đọc ra của bộ nhớ AT24C64.

Thực hành vi điều khiển PIC 247


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
b. Lưu đồ, giải thuật: Giống bài 406, chỉ thêm phần lưu khi thay đổi bằng phím UP hoặc
DW. Khi khởi tạo thì đọc giá trị từ bộ nhớ đã lưu.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>

signed int8 g_han;


void b406_hienthi_4led7doan()
{
giaima_bin_2so_vitri_vn(g_han,6,kx_vn);
xuat_8led_7doan();
}

void b406_up_dw_g_han()
{
if(phim_up_c2(150)==co_nhan)
{
if(g_han<99)
{
g_han++;
b406_hienthi_4led7doan();
at24_ghi_1byte(100,g_han);
}
}
if(phim_dw_c2(150)==co_nhan)
{
if(g_han>0)
{
g_han--;
b406_hienthi_4led7doan();
at24_ghi_1byte(100,g_han);
}
}
}

void main()
{
set_up_port();
g_han = at24_doc_1byte(100);
b406_hienthi_4led7doan();
while(true)
{
b406_up_dw_g_han();
}
}
d. Tiến hành biên dịch và nạp.
248 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
e. Quan sát kết quả: Sau khi nạp xong thì sẽ hiển thị giá trị mặc nhiên cho lần đầu. Sau
đó tiến hành thay đổi giá trị bằng UP hoặc DW. Tắt điện kit thực hành, sau vài giây
thì mở lại, led hiển thị giá trị của lần thay đổi sau cùng là đúng. Địa chỉ 100 có thể
thay đổi trong phạm vi từ 0 đến 8191.

Bài mẫu 922. Chương trình ghi dữ liệu 64 byte bắt đầu từ con số 100 vào trang bộ nhớ
thứ 0. Địa chỉ tăng từ 0 đến 63 và con số ghi vào cũng tăng từ 100 đến 163.
Sau khi ghi xong thì tiến hành đọc lại dữ liệu vừa hiển thị trên 8 led đơn và led 7 đoạn,
địa chỉ cũng hiển thị trên 16 led đơn.
Lưu tên file là “bai_922_at24_wr_rd_page”
a. Mục đích: Biết lập trình ghi dữ liệu 1 trang vào và đọc ra của bộ nhớ AT24C64.
b. Lưu đồ, giải thuật: Ghi dữ liệu một trang: Thiết lập địa chỉ trang cần ghi, tiến hành
ghi dữ liệu 64 byte liên tục. Đọc dữ liệu một trang: Thiết lập địa chỉ trang cần dọc,
tiến hành đọc dữ liệu 64 byte liên tục.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
unsigned int8 i,dt_doc,page;

void at24cxx_ghi_data_page(usi8 x,usi16 pagex)


{
usi16 addr_mem;
usi8 addr_l,addr_h,dt_ghi;

if(pagex>511) pagex=0;
addr_mem = (pagex)*64;
at24_khoi_tao_ghi(addr_mem);
for(i=0;i<64;i++)
{
dt_ghi= i + 100;
i2c_write(dt_ghi);
xuat_32led_don_4byte(addr_h,addr_l|i,0,dt_ghi);
md4l7d_giaima_3so_vitri_vn(dt_ghi,3,kx_vn);
xuat_4led_7doan_4so();
delay_ms(x);
}
i2c_stop();
}

void at24cxx_doc_data_page(usi8 x,usi16 pagex)


{
usi16 addr_mem;
if(pagex>511) pagex=0;
addr_mem = (pagex)*64;
at24_khoi_tao_doc(addr_mem);
for(i=0;i<64;i++)
Thực hành vi điều khiển PIC 249
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
{
dt_doc = i2c_read();
md4l7d_giaima_3so_vitri_vn(dt_doc,3,kx_vn);
xuat_4led_7doan_4so();
xuat_32led_don_4byte(0,i,0,dt_doc);
delay_ms(x);
}
dt_doc = i2c_read(0);
i2c_stop();
}
void main()
{
set_up_port();
at24_reset();
page=0;
at24cxx_ghi_data_page(100,page);
at24cxx_doc_data_page(10,page);
while(true)
{
at24cxx_doc_data_page(200,page);
delay_ms(500);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: Sau khi nạp xong thì quá trình ghi sẽ thực hiện rất nhanh, sau đó
đến quá trình đọc có thể điều chỉnh thời gian delay để dễ quan sát. Dữ liệu đọc hiển
thị đúng bắt đầu từ 100 trên led 7 đoạn và dạng số nhị phân ở 8 led màu đỏ bên phải.
Địa chỉ tương ứng với từng ô nhớ hiển thị ở 16 led đơn bên trái. Bạn có thể thay đổi
trang bộ nhớ và dữ liệu ghi vào.

Bài tập 923. Hãy viết chương trình có chức năng sau:
Hãy mở rộng bài 601 đo nhiệt độ và có tắt mở đèn … thêm phần lưu giá trị nhiệt độ
của 1 chu kỳ: từ lúc mở đèn gia tăng nhiệt đến lúc tắt đèn để giảm nhiệt cho đến khi mở
đèn lại. Lưu 256 mẫu vào bộ nhớ Eeprom và vẽ lại đồ thị trên GLCD.
Lưu tên file là “bai_923_at24_lcd_7doan_lm35a_den_buz_bt3_glcd”

9.6 GIAO TIẾP ADC CỦA IC PCF8591


9.6.1 Giới thiệu IC PCF8591
Ở chương 7 chúng ta đã thực hành các bài chuyển đổi tương tự sang số sử dụng các bộ
chuyển đổi tích hợp bên trong vi điều khiển. Ở chương này chúng ta thực tập các bài chuyển đổi
tương tự sang số và số sang tương tự do IC PCF8591 thực hiện, IC này giao tiếp với vi điều
khiển theo chuẩn I2C.

250 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
IC PCF8591 là một chip CMOS thu thập dữ liệu đơn dùng nguồn cung cấp đơn công suất
thấp 8-bit với 4 ngõ vào tương tự và một ngõ ra tương tự giao tiếp nối tiếp I2C.
Ba chân địa chỉ A0, A1 và A2 được sử dụng cho lập trình địa chỉ phần cứng, cho phép mở
rộng lên đến 8 thiết bị kết nối với theo chuẩn bus I2C mà không cần thêm phần cứng. Địa chỉ,
điều khiển và dữ liệu đến và đi từ thiết bị sẽ được chuyển nối tiếp thông qua 2 dây của bus I2C.
Các chức năng của thiết bị bao gồm ghép kênh các ngõ vào tương tự, chuyển đổi tương tự
sang số 8 bit, chức năng theo dõi và giữ. Tốc độ chuyển đổi tối đa được cho bởi tốc độ tối đa
của bus I2C.
9.6.2 Cấu hình IC PCF8591
 Nguồn cung cấp là nguồn đơn từ 2,5V đến 6V.
 Dòng điện không sử dụng rất thấp.
 Dữ liệu vào và ra nối tiếp theo chuẩn I2C.
 Lựa chọn địa chỉ I2C bởi 3 chân địa chỉ phần cứng.
 Tốc độ lấy mẫu cao nhất bằng tốc độ I2C.
 Có 4 kênh tương tự ngõ vào có thể cấu hình như ngõ vào đơn cực hoặc vi sai.
 Có thể lựa chọn kênh tự động tăng.
 Điện áp tương tự từ V SS đến VDD.
 Có mạch điện theo dõi và giữ trên chip.
 Chuyển đổi A/D sấp xỉ liên tiếp 8 bit.
 Có 1 bộ DAC với 1 ngõ ra tương tự.
9.6.3 Ứng dụng IC PCF8591
 Dùng để giám sát nguồn. Thiết lập các tham chiếu. Vòng điều khiển tương tự.
9.6.4 Sơ đồ chân IC PCF8591
Sơ đồ chân IC như hình 9-17:

Hình 9-17. Sơ đồ khối IC PCF8591


Chức năng từng chân như bảng 9-7.
Thực hành vi điều khiển PIC 251
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Bảng 9-7. Tên và chức năng từng chân của IC PCF8591
TT Tên chân Chân Chức năng
1 AIN0 1 Ngõ vào tương tự thứ 0 (analog inputs A/D converter)
2 AIN1 2 Ngõ vào tương tự thứ 1 (analog inputs A/D converter)
3 AIN2 3 Ngõ vào tương tự thứ 2 (analog inputs A/D converter)
4 AIN3 4 Ngõ vào tương tự thứ 3 (analog inputs A/D converter)
5 A0 5 Ngõ vào thiết lập địa chỉ thiết bị (hardware slave address)
6 A1 6 Ngõ vào thiết lập địa chỉ thiết bị (hardware slave address)
7 A2 7 Ngõ vào thiết lập địa chỉ thiết bị (hardware slave address)
8 VSS 8 Chân nối mass (ground supply voltage)
9 SDA 9 I2C- bus serial data input and output
10 SCL 10 I2C-bus serial clock input
11 OSC 11 Ngõ vào ra của dao động (oscillator input/output)
12 EXT 12 Ngõ vào dao động lựa chọn (external/internal switch for oscillator input)
13 AGND 13 Chân nối mass của tín hiệu tương tự (analog ground supply)
14 VREF 14 Ngõ vào nối điện áp tham chiếu (voltage reference input)
15 AOUT 15 Ngõ ra tín hiệu tương tự của DA (analog output (D/A converter))
16 VDD 16 Nguồn cung cấp (supply voltage)
9.6.5 Sơ đồ khối IC PCF8591
Sơ đồ khối IC như hình 9-18, bao gồm các khối:
 Khối giao tiếp chuẩn I2C. Khối nguồn cung cấp và reset. Khối dao động nội.
 Khối điều khiển logic. Thanh ghi trạng thái. Thanh ghi dữ liệu DAC. Thanh ghi dữ
liệu ADC. Khối đa hợp 4 kênh tương tự
 Khối ADC-DAC bao gồm hai khối lấy mẫu và giữ cho hai ngõ vào, bộ so sánh, bộ
chuyển đổi DAC và thanh ghi xấp xỉ liên tiếp, nguồn điện áp tham chiếu.
 Khối khuếch đại đệm tín hiệu tương tự.

252 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 9-18. Sơ đồ khối IC PCF8591


9.6.6 Địa chỉ ngoài IC PCF8591
Mỗi thiết bị PCF8591 trong hệ thống bus I2C được kích hoạt bằng cách gửi đúng địa chỉ
cho thiết bị. Địa chỉ bao gồm một phần cố định và một phần lập trình. Phần lập trình được thiết
lập bởi các chân địa chỉ A0, A1 và A2.
Địa chỉ luôn là byte đầu tiên được gửi sau khi thực hiện xong điều kiện start trong giao
thức bus I2C. Trong byte địa chỉ thì bit cuối cùng là bit xác nhận đọc / ghi.
9.6.7 Thanh ghi điều khiển của IC PCF8591
Byte thứ hai gửi đến IC PCF8591 được lưu trữ trong thanh ghi điều khiển (control register)
để điều khiển các chức năng của thiết bị như hình 9-19.
 Bit thứ 7, thứ 3 luôn bằng 0.
 Bit thứ 6 dùng để cho phép xuất tín hiệu tương tự ở ngõ ra - hoạt động DAC
 Bit thứ 5 và 4 dùng để thiết lập cho các chế độ ngõ vào tương tự như chế độ ngõ
vào duy nhất hoặc chế độ vi sai ngõ vào.
 Bit thứ 2 là bit cho phép tự động tăng kênh nếu bằng 1, kênh chọn tự động tăng lên
sau mỗi lần chuyển đổi xong.
 Bit thứ 1 và 0 dùng để chọn 1 trong 4 kênh khi thực hiện đọc dữ liệu.

Thực hành vi điều khiển PIC 253


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 9-19. Cấu trúc thanh ghi điều khiển của IC PCF8591
Nếu chế độ tự động tăng được yêu cầu trong các ứng dụng thì phải sử dụng bộ dao động
nội bộ và cờ cho phép ngõ ra tương tự phải bằng 1 (bit thứ 6 của thanh ghi điều khiển). Điều này
cho phép bộ dao động nội bộ chạy liên tục, với cách này sẽ ngăn chặn lỗi chuyển đổi do dao

254 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
động khởi động chậm trễ gây ra. Cờ cho phép ngõ ra tương tự có thể reset ở thời điểm khác để
giảm công suất tiêu thụ điện khi không còn chuyển đổi.
Khi lựa chọn kênh ngõ vào không tồn tại trong kênh có sẵn cao nhất số lượng được phân
bổ. Do đó, nếu cờ cho phép ngõ ra tương tự tự động được thiết lập, tiếp theo là luôn chọn kênh
0. Bit có trọng số cao nhất được dành riêng cho chức năng trong tương lai có thể và được thiết
lập ở mức logic 0. Sau khi cấp điện thì mạch reset khi có điện POR sẽ reset tất cả các bit của
thanh ghi điều khiển và tắt dao động để tiết kiệm năng lượng và ngõ ra tín hiệu tương tự ở trạng
thái tổng trở cao.
9.6.8 Chuyển đổi D/A của IC PCF8591
Byte thứ ba được gửi đến IC PCF8591 sẽ lưu trữ trong thanh ghi dữ liệu DAC và được
chuyển đổi thành điện áp tương tự bởi bộ chuyển đổi DAC.
Chuyển đổi DA bao gồm một chuỗi cầu điện trở mắc nối tiếp và nối với điện áp tham chiếu
bên ngoài tạo thành 256 cấp điện áp khác nhau và switch lựa chọn. Bộ giải mã sẽ chuyển mạch
cho một trong 256 cấp điện áp này đến ngõ ra DAC – xem hình 9-20.

Hình 9-20. Cấu trúc khối DAC của IC PCF8591


Điện áp đầu ra tương tự được đệm bởi một bộ khuếch đại tự động hệ số KĐ bằng 1. Thiết
lập bit cho phép xuất ngõ ra tương tự trong thanh ghi điều khiển để tắt mở bộ đệm này. Trong

Thực hành vi điều khiển PIC 255


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
trạng thái hoạt động, điện áp đầu ra được giữ cho đến khi một byte dữ liệu tiếp tục được gửi đi
để chuyển đổi tiếp.
Bộ chuyển đổi DA trên chip cũng được sử dụng để phục vụ cho chuyển đổi AD liên tiếp
xấp xỉ. Để khối giải thoát khối DA phục vụ cho chuyển đổi AD thì mạch khuếch đại có độ lợi
bằng 1 cần phải có thêm mạch theo dõi và giữ để giữ điện áp ngõ ra tương tự trong lúc thực hiện
chuyển đổi AD.
Công thức cho điện áp ngõ ra được thể hiện trong hình 9-21:

Hình 9-21. Công thức điện áp ra và đặc tính chuyển đổi


Các dạng sóng của chuyển đổi DA theo trình tự được thể hiện trong hình 9-22.

Hình 9-22. Dạng sóng chuyển đổi D/A


9.6.9 Chuyển đổi A/D của IC PCF8591
Chuyển đổi A/D sử dụng kỹ thuật chuyển đổi xấp xỉ liên tiếp. Bộ chuyển đổi D/A chuyển
đổi và bộ so sánh độ lợi cao được sử dụng tạm thời trong chu kỳ chuyển đổi A/D.

256 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Một chu kỳ chuyển đổi A/D được bắt đầu sau khi nhận địa chỉ hợp lệ ở chế độ đọc gởi đến
IC PCF8591. Chu kỳ chuyển đổi A/D được kích hoạt khi xuất hiện cạnh của xung đồng hồ trả
lời (acknowledge) và thực hiện chuyển đổi trong khi đó vẫn thực hiện truyền kết quả của chuyển
đổi trước đó, xem hình 9-23.
Kết quả chuyển đổi được lưu trong thanh ghi dữ liệu ADC và chờ truyền đi. Nếu cờ tự
động tăng cờ được thiết lập, các kênh tiếp theo được chọn. Byte đầu tiên truyền đi trong chu kỳ
đọc có chứa mã kết quả chuyển đổi của chu kỳ đọc trước.
Sau điều kiện POR, các byte đầu tiên đọc có giá trị là 80h.
Tốc độ tối đa của chuyển đổi A/D bằng với tốc độ thực tế của bus I2C.
Dạng sóng kết quả chuyển đổi theo chế độ ngõ vào đơn cực và vi sai như hình 9-24.

Hình 9-23. Dạng sóng truyền dữ liệu của IC PCF8591

Hình 9-24. Dạng sóng chuyển đổi A/D ở chế độ đơn cực và vi sai
9.6.10 Điện áp tham chiếu của IC PCF8591
Thực hành vi điều khiển PIC 257
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Đối với cả hai chuyển đổi D/A và A/D đều sử dụng điện áp tham chiếu bên ngoài cấp cho
các chân VREF và AGND. Chân AGND được nối với mass tương tự hoặc có thể nối với nguồn
điện áp DC để chỉnh điện áp lệch nếu bị lệch.
9.6.11 Bộ dao động của IC PCF8591
Bộ dao động trên chip tạo ra các tín hiệu đồng hồ cần thiết cho chuyển đổi A/D và làm tươi
bộ khuếch đại đệm. Khi sử dụng dao động này chân EXT phải nối với VSS (GND). Tần số dao
động xuất hiện tại chân OSC.
Nếu chân EXT kết nối với VDD thì ngõ ra dao động OSC sẽ chuyển sang trạng thái trở
kháng cao cho phép nhận tín hiệu đồng hồ từ bên ngoài đưa đến chân OSC.
9.6.12 Địa chỉ thanh ghi của IC PCF8591
Byte địa chỉ của IC PCF8591 như hình 9-25:

Hình 9-25. Địa chỉ của IC PCF8591


Tín hiệu đọc/ghi như hình 9-26:

Hình 9-26. Tín hiệu đọc ghi


Chế độ ghi dữ liệu vào IC PCF 8591 như hình 9-27:

Hình 9-27. Chế độ ghi dữ liệu vào IC PCF8591


Chế độ đọc dữ liệu từ IC PCF8591 như hình 9-28:

258 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú

Hình 9-28. Chế độ đọc dữ liệu từ IC PCF8591


Về giao tiếp chuẩn truyền dữ liệu I2C thì đã trình bày chi tiết ở phần giao tiếp với IC thời
gian thực DS13B07 nên ở đây không trình bày lại.
9.6.13 Giao tiếp vi điều khiển với IC PCF8591
Xem hình 8-9 ở trên đã trình bày kết nối với vi điều khiển theo chuẩn I2C giống các thiết
bị khác.
Địa chỉ của IC PCF8591 trong bộ thực hành là 0x90 đối với lệnh ghi và 0x91 đối với lệnh
đọc vì 3 chân thiết lập địa chỉ cứng nối mass.
9.6.14 Thư viện của IC PCF 8591
Độ phân giải của IC PCF8591 được điều chỉnh bằng biến trở bên ngoài và đã hiệu chỉnh
với độ phân giải là 10mV để tương thích với cảm biến LM35.
Thư viện điều khiển IC PCF8591 theo chuẩn I2C là: “tv_05_i2c_ds13_pcf”
a. Các định nghĩa: Địa chỉ của vi mạch PCF8591 và địa chỉ các kênh ADC.
#define pcf8591_address_wr 0x90
#define pcf8591_address_rd 0x91

#define pcf8591_channel_0 0x40


#define pcf8591_channel_1 0x41
#define pcf8591_channel_2 0x42
#define pcf8591_channel_3 0x43
Khai báo thư viện giao tiếp 1 dây và định nghĩa các lệnh của vi mạch DS18B20.
b. Hàm 701: Thiết lập kênh ADC của vi mạch PCF8591.
void pcf_channel(usi8 chan)
{
i2c_start();
i2c_write(pcf_addr_wr);
i2c_write(chan);
i2c_stop();
}
Khai báo thư viện giao tiếp 1 dây và định nghĩa các lệnh của vi mạch DS18B20.
c. Hàm 702: Thiết lập kênh ADC và xuất dữ liệu số ra DAC của PCF8591.
void pcf_xuat_dac(usi8 dac_out)
{
i2c_start();
Thực hành vi điều khiển PIC 259
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
i2c_write(pcf_addr_wr);
i2c_write(pcf_chan0);
i2c_write(dac_out);
i2c_stop();
}
d. Hàm 703: Đọc giá trị từ kênh ADC đang chọn.
usi8 pcf_doc_adc(usi8 ch)
{
usi8 kq;
kq=0;
pcf_channel(ch);
i2c_start();
i2c_write(pcf_addr_rd);
kq= i2c_read(0);
i2c_stop();
return kq;
}
e. Hàm 704: Đọc giá trị từ kênh ADC đang chọn cộng dồn kết quả nhiều lần.
usi8 pcf_doc_chan(usi8 chan, usi8 solan)
{
unsigned int16 pcf;
usi8 i;
pcf = 0;
for(i=0;i<solan;i++)
{
delay_us(30);
pcf=pcf + pcf_doc_adc(chan);
}
pcf = pcf/solan;
return (pcf%256);
}

9.6.15 Các chương trình giao tiếp IC PCF 8591

Bài mẫu 925. Chương trình đọc nhiệt độ từ 2 cảm biến LM35A và LM35B nối với
kênh AN0, AN1 của IC PCF8591 giao tiếp chuẩn I2C, hiển thị kết quả đo trên module 4
led 7 đoạn và LCD. Điều khiển đèn gia tăng nhiệt, buzzer và nút BT3 giống bài 601.
Lưu tên file là “bai_925_pcf_lcd_7doan_lm35ab_den_buz_bt3”
a. Mục đích: Biết lập trình dùng ADC giao tiếp chuẩn I2C để đọc nhiệt độ từ 2 cảm biến
LM35 hiển thị trên led 7 đoạn và LCD.
b. Lưu đồ, giải thuật: Chọn kênh, tiến hành đọc dữ liệu, cộng dồn kết quả, chia trung
bình, hiển thị. Tương tự cho kênh còn lại.
c. Chương trình con “bai_925_pcf_tv”:
void pcf_lm35a_ht_lcd(usi8 x,y)
260 Thực hành vi điều khiển PIC
Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
{
if(pcf_lm35at!=pcf_lm35a)
{
pcf_lm35at=pcf_lm35a;
lcd_gm_ht_2so_to_xvn(pcf_lm35a,x,y,kx_vn);
}
}
void pcf_lm35b_ht_lcd(usi8 x,y)
{
if(pcf_lm35bt!=pcf_lm35b)
{
pcf_lm35bt=pcf_lm35b;
lcd_gm_ht_2so_to_xvn(pcf_lm35b,x,y,kx_vn);
}
}
void pcf_do_ht_2_lm35()
{
pcf_lm35a=pcf_doc_chan(pcf_chan0,solan);
pcf_lm35b=pcf_doc_chan(pcf_chan1,solan);

pcf_lm35a_ht_lcd(1,0);
pcf_lm35b_ht_lcd(1,10);

giaima_bin_2so_vitri_vn(pcf_lm35a,1,kx_vn);
giaima_bin_2so_vitri_vn(pcf_lm35b,3,kx_vn);
xuat_8led_7doan();
}
d. Chương trình chính:
#include <tv_kit_vdk_18f6722_all.c>
#define solan 50
unsigned int8 pcf_lm35a,pcf_lm35b;
unsigned int8 pcf_lm35at=0,pcf_lm35bt=0;
#include <bai_925_pcf_tv.c>

void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();

lcd_goto_xy(0,0);
lcd_data("PCF-LM35A");
lcd_goto_xy(0,10);
lcd_data("PCF-LM35B");

Thực hành vi điều khiển PIC 261


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
while(true)
{
pcf_do_ht_2_lm35();
so_sanh_nd_dk_buzzer(pcf_lm35b);
delay_ms(500);
if(!input(bt3)) buzzer_off();
}
}
e. Tiến hành biên dịch và nạp.
f. Quan sát kết quả: Hiển thị nhiệt độ của 2 cảm biến LM35 trên LCD và led 7 đoạn.
Hệ thống mở đèn, tắt đèn, báo động giống bài 701.

Bài tập 926. Mở rộng bài 926: thêm vào hiển thị thời gian thực giờ phút giây, ngày
tháng năm thứ ở hàng thứ 3. Vừa truy xuất DS1307 và PCF8591 theo chuẩn I2C.
Lưu tên file “bai_926_pcf_lcd_7doan_lm35ab_den_buz_bt3_clock”.

9.7 GIAO TIẾP DAC CỦA IC PCF8591


IC PCF8591 là ADC và DAC, ở phần trước đã thực hành chức năng chuyển đổi tín hiệu
tương tự thành tín hiệu số, phần này thực hành chuyển đổi tín hiệu số sang tín hiệu tương tự để
điều khiển đèn led ở ngõ ra.
Bài mẫu 927. Chương trình chuyển đổi DAC của IC ADC PCF8591, hiển số nhị phân
trên module 4 led 7 đoạn, dữ liệu số gởi đến IC PCF xuất ra chân Aout (xem hình) có nối
với led đơn.
Điện áp ra bằng dữ liệu số nhận với độ phân giải.
Trong bài thực hành này ta sẽ xuất dữ liệu từ 210 đến 255 để nhìn thấy led tắt khi giá
trị thấp, cường độ sáng tăng dần khi giá trị số tăng, khi bằng 255 thì cường độ sáng cực
đại.
Do led gắn điện trở hạn dòng và độ phân giải thấp nên giá trị số phải lớn thì ta mới
nhìn thấy led sáng.
Lưu tên file là “bai_927_dac_pcf8591_up.c”
a. Mục đích: biết sử dụng chức năng DAC của IC PCF8591 điều khiển đèn led.
b. Lưu đồ: sinh viên hãy tự viết.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
#define solan 50
unsigned int8 pcf_lm35a,pcf_lm35b;
unsigned int8 pcf_lm35at=0,pcf_lm35bt=0;
#include <bai_925_pcf_tv.c>
unsigned int8 pcf_dac;

262 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
void main()
{
set_up_port();
lcd_setup();
lcd_khoi_tao_cgram_so_to();

lcd_goto_xy(0,0);
lcd_data("PCF-LM35A");
lcd_goto_xy(0,10);
lcd_data("PCF-LM35B");
pcf_dac = 210;
while(true)
{
pcf_do_ht_2_lm35();
so_sanh_nd_dk_buzzer(pcf_lm35b);
delay_ms(500);
if(!input(bt3)) buzzer_off();
pcf_xuat_dac(pcf_dac);
if(pcf_dac==0) pcf_dac=210;
else pcf_dac++;
xuat_32led_don_4byte(0,0,0,pcf_dac);
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: sau khi nạp xong thì ta nhìn thấy giá trị số hiển thị trên module led
7 đoạn tăng dần và trên led đơn cũng vậy. Hãy quan sát led màu xanh lá nằm bên
phải IC PCF8591 gần biến trở nút áo sẽ thấy cường độ sáng tăng dần. Khi đạt 255 thì
led sáng nhất sau đó giá trị số về lại 210 thì led tắt. Điện áp tương tự ra bắt đầu từ giá
trị 1 tương ứng 10mV nhưng phải dùng đồng hồ thì mới thấy.

Bài tập 928. Hãy thêm vào chương trình 927 sao cho khi tăng lên đến 255 thì giá trị số
giảm dần về 210 rồi lặp lại.
Lưu tên file là “bai_928_dac_pcf8591_up_dw.c”

9.8 GIAO TIẾP CẢM BIẾN CHUYỂN ĐỘNG PIR


9.8.1 Khảo sát cảm biến chuyển động PIR
Cảm biến có hình ảnh như hình 9-22:

Thực hành vi điều khiển PIC 263


Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys

Hình 9-29. Hình ảnh cảm biến chuyển động


Các thông số của cảm biến:
 Điện áp hoạt động từ 5V đến 20V DC.
 Tín hiệu điện áp ra 2 mức cao và thấp: mức cao lớn nhất là 3,3V.
 Thời gian delay từ 5s đến 18 phút.
Phạm vi nhận biết di chuyển khi có gắn ống kính như hình 9-23:

Hình 9-30. Phạm vi nhận biết của cảm biến chuyển động
Sơ đồ chân của cảm biến PIR như hình 9-24:

Hình 9-31. Sơ đồ chân và tên các chân của cảm biến chuyển động

264 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
Kết nối ngõ ra với tải như hình 9-25:

Hình 9-32. Sơ đồ kết nối tải của cảm biến chuyển động
Trong bộ thí nghiệm thì cảm biến PIR được nối đến chân RA3 của vi điều khiển PIC.
9.8.2 Vi điều khiển giao tiếp với cảm biến PIR
Trong bộ thực hành thì cảm biến PIR nối với port RD3 của vi điều khiển như hình 9-26:

Hình 9-33. Sơ đồ của cảm biến chuyển động PIR với vi điều khiển
9.8.3 Các chương trình điều khiển dùng cảm biến PIR
Bài mẫu 931. Chương trình điều khiển đèn tự động sáng khi phát hiện có người chuyển
động hoặc tắt đèn khi không có người chuyển động dùng cảm biến PIR.
Lưu tên file là “bai_931_pir_dk_den.c”
Thực hành vi điều khiển PIC 265
Khoa điện – điện tử Bộ môn điện tử công nghiệp - ys
Mục đích: biết lập trình dùng cảm biến PIR để điều khiển tắt mở đèn.
a.
Lưu đồ, giải thuật: Kiểm tra tín hiệu ra của cảm biến để biết trạng thái phát hiện người
b.
rồi xử lý.
c. Chương trình:
#include <tv_kit_vdk_18f6722_all.c>
int1 tt_triac=0;

void kiemtra_pir_mo_den()
{
if(input(pir)&&(tt_triac==0))
{
triac_2_off(); tt_triac=1;
xuat_32led_don_1dw(0XFFFFFFFF);
}
else if(!input(pir)&&(tt_triac==1))
{
triac_2_on(); tt_triac=0;
xuat_32led_don_1dw(0);
}
}
void main()
{
set_up_port();
tt_triac=0;
while(true)
{
kiemtra_pir_mo_den();
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: sau khi nạp xong thì nếu cảm biến PIR phát hiện không có chuyển
động (đèn màu trắng gần cảm biến PIR tắt) thì đèn triac tắt, nếu có chuyển động (đèn
màu trắng sáng) thì đèn triac sáng. Nếu phát hiện chuyển động đèn đã sáng thì các
bạn hãy ngồi im không nhúc nhích cho đến khi đèn tắt, sau đó trợn mắt to hết cỡ xem
nó có phát hiện không, nếu không thì hãy liết mắt qua lại mà nó cũng không mở thì
hãy chuyển động để nó phát hiện và mở đèn. Có thể dùng báo động bằng âm thanh
nhưng ồn nên dùng đèn để báo hiệu.

266 Thực hành vi điều khiển PIC


Sư phạm kỹ thuật tphcm Nguyễn Đình Phú
TÀI LIỆU THAM KHẢO

[1]. MICROCHIP, PIC 16F87X DATASHEET, 1997.


[2]. MICROCHIP, PIC 18F6722 DATASHEET, 2009.
[3]. Nebojsa Matic, PIC microcontrollers for beginner, too.
[4]. ITead – Studio Ultrasonic ranging module: HC-SR04, 2010.
[5]. ATMEL – AT24C512 DATASHEET, 2007.
[6]. SHARP – GP2D12 optoelectronic Device DATASHEET, 2007.
[7]. MICROCHIP – PICmicro Mid- Range MCU family reference Manual, 1997
[8]. Nguyễn Đình Phú, Vi xử lý - PIC, Đại Học Sư Phạm Kỹ Thuật TP HCM, 2017.

Thực hành vi điều khiển PIC 267

You might also like