BÀI GIẢNG - Khoa Công nghệ Điện tử và Truyền...

133
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA CÔNG NGHỆ ĐIỆN TỬ VÀ TRUYỀN THÔNG BÀI GIẢNG MÔN: THỰC HÀNH VI XỬ LÝ VÀ VI ĐIỀU KHIỂN Thái Nguyên, tháng 2 năm 2012

Transcript of BÀI GIẢNG - Khoa Công nghệ Điện tử và Truyền...

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA CÔNG NGHỆ ĐIỆN TỬ VÀ TRUYỀN THÔNG

BÀI GIẢNG

MÔN: THỰC HÀNH VI XỬ LÝ VÀ VI ĐIỀU KHIỂN

Thái Nguyên, tháng 2 năm 2012

1

MỤC LỤC

PHẦN I MÔ TẢ HỆ THỐNG Giới thiệu Đặc tính

I. Tổng quan hệ thống II. Module LMD01 III. Module LMD02 IV. Module LMD03 V. Module LMD04 VI. Module LMD05 VII. Module LMD06 VIII. Module LMD07 IX. Module LMD09 – Module điều khiển chính

PHẦN II THỰC HÀNH BÀI I: KHẢO SÁT MA TRẬN LED 8x8 MỘT MÀU VÀ QUÉT

HÀNG BÀI 2: KHẢO SÁT MA TRẬN LED 8x8 MỘT MÀU VÀ QUÉT

CỘT BÀI 3: KHẢO SÁT MA TRẬN LED 8x8 2 MÀU XANH ĐỎ VÀ

PHƯƠNG PHÁP QUÉT HÀNG BÀI 4: KHẢO SÁT MA TRẬN LED 8x8 2 MÀU XANH ĐỎ VÀ

PHƯƠNG PHÁP QUÉT CỘT BÀI 5: KHẢO SÁT MODULE HIỂN THỊ 16x32 ĐIỂM MỘT MÀU BÀI 6: KHẢO SÁT MODULE HIỂN THỊ 16x32 ĐIỂM HAI MÀU BÀI 7: KHẢO SÁT HOẶT ĐỘNG CỦA BẢNG TIN ĐIỆN TỬ

2

Đề cương kế hoạch thực hành với KIT LMD

(màn hình ma trận Led)

Sinh viên và giáo viên hướng dẫn thực hành dựa trên đề cương này để chuẩn bị bài thực hành theo Tài liệu mô tả và hướng dẫn thực hành LMD.

Sinh viên cần chuẩn bị bài thực hành bằng cách đọc trước phần mô tả và hướng dẫn thực hành cho các module này, tự tìm hiểu trước các vi mạch. Buổi 1: Làm quen với màn hình ma trận Led và khảo sát Module LMD01, LMD02, LMD09 Sinh viên sẽ:

Tìm hiểu một màn hình ma trận led đơn sắc cơ sở 8x8 - Cấu tạo ma trận Led (đơn sắc) - Biểu diễn một kí tự trên một ma trận cơ sở 8x8 - Cách hiển thị một điểm sáng trên ma trận led - Cách hiển thị một kí tự/ hình ảnh trên ma trận led

(2 phương pháp: quét hàng/cột)

Yêu cầu: sinh viên phải hiểu được cách hiển thị một kí tự trên một ma trận cơ sở 8x8 và có thể tạo ta bộ dữ liệu hiển thị cho 1 kí tự bất kì.

Tìm hiểu các thành phần cơ bản cấu tạo lên một mạch điện ma trận led cụ thể (Khảo sát trực tiếp Module LMD01, LMD 02 và LMD09)

- Các vi mạch dùng để đệm/chốt dữ liệu, vi mạch dùng để quét tuần tự (thanh ghi dịch),…

- Các vi điều khiển có thể dùng để điều khiển hiển thị ma trận led, vi điều kiển dùng trong Module đang khảo sát LMD09

- Nguyên lý hoạt động hiển thị của mạch LMD01 và LMD02

Kiểm tra các linh kiện và xem các module hoạt động hiển thị với chương trình lập trình sẵn.

Yêu cầu: sinh viên nắm được cấu tạo của mạch, nguyên lý hoạt động hiển thị của 2 Module này.

Buổi 2: Khảo sát Module LMD03, LMD04 Tương tự như khi khảo sát với module LMD01 và LMD02, chỉ khác là ma trận led ở hai module này là ma trận led hai mầu xanh-đỏ.

3

Buổi 3: Khảo sát module LMD05, LMD06, LMD07 - Nắm được cách phối ghép các ma trận đơn sắc (đa sắc) cơ sở 8x8

thành một màn hình ma trận led đơn sắc (đa sắc) lớn hơn, phương pháp để hiển thị kí tự và chuỗi kí tự, hiệu ứng dịch chữ.

- Khảo sát một bảng quang báo thực tế và chạy thử chương trình điều khiển trên máy tính.(LMD07). Đưa ra kết luận về cách thức hoạt động của bảng quang báo và chương trình điều khiển.

Giáo viên hướng dẫn có thể đưa ra một số câu hỏi, yêu cầu cho sinh viên sau buổi thực hành. Có các bài tập nâng cao cho sinh viên khá giỏi có nhu cầu tìm hiểu sâu hơn./.

4

PHẦN I: MÔ TẢ HỆ THỐNG Giới thiệu

LMD TS là hệ thống mô hình đào tạo phục vụ khảo sát, nghiên cứu, thực hành thiết kế bảng thông tin điện tử sử dụng công nghệ ma trận đèn LED (Light Emitting Diode – Đi ôt phát quang). Hệ thống giúp sinh viên tiếp cận với công nghệ hiển thị bằng bảng ma trận đèn LED từ cơ bản đến nâng cao, từ đó sinh viên có thể hiểu, thiết kế được hệ thống bảng. Hệ thống được thiết kế theo tư duy logic kỹ thuật liền mạch từ đầu trí cuối dựa theo cách nhìn của sinh viên, cộng với sự sắp xếp, phân chia bài bản theo các vấn đề chuyên môn chi tiết rõ ràng.

Đặc tính

Làm quen với các linh kiện chức năng

Thiết kế dàn trải

Các điểm kiểm tra (test point)

Sơ đồ nguyên lí rõ ràng

Phân cấp từ cơ bản đến nâng cao

Phân chia thành nhiều module

Khảo sát phương pháp quét hàng, quét cột

Hiển thị một màu đỏ và tổ hợp 2 màu xanh đỏ Sau đây là mô tả chi tiết về sản phẩm. Mục I sẽ giới thiệu tổng quan toàn bộ hệ thống, liệt kê các thành phần và các tuy chọn trong hệ thống , các mục từ II đếm IX sẽ giới mô tả chi tiết từng module.

5

I. Tổng quan hệ thống Hệ thống được chia thành 9 module theo bài thực hành, một khung giá chính bằng kim loại để đỡ các module. Khi sử dụng module nào thì cài module đó trên lên ray của khung giá kim loại. Bảng dưới đây là danh sách các module và chức năng của chúng Tên Mô tả LMD01 Ma trận LED đơn sắc 8x8, quét theo hàng, khối quét hàng, đệm

hàng, chốt hàng, đệm cathode, đệm anode, các chốt cấp nguồn kiểm thử tín hiệu

LMD02 Ma trận LED đơn sắc 8x8, quét theo cột, khối quét cột, đệm cột, chốt cột, đệm cathode, đệm anode, đầu nối tín hiệu điều điều khiển và dữ liệu, các chốt cấp nguồn kiểm thử tín hiệu

LMD03 Ma trận LED hai màu xanh/đỏ 8x8, quét theo hàng, khối quét hàng, đệm chốt hàng, đệm anode, đầu nối tín hiệu điều điều khiển và dữ liệu, các chốt cấp nguồn kiểm thử tín hiệu

LMD04 Ma trận LED hai màu xanh/đỏ 8x8, quét theo cột, khối quét cột, đệm chốt cột, đệm cathode, đầu nối tín hiệu điều điều khiển và dữ liệu, các chốt cấp nguồn kiểm thử tín hiệu

LMD05 Module hiển thị màu đỏ, 16x32 pixel, quét theo hàng, khối kích dòng, đệm chốt dữ liệu, đầu vào/đầu ra tín hiệu điều khiển và dữ liệu, các chốt cấp nguồn kiểm thử tín hiệu

LMD06 Module hiển thị hai màu xanh/đỏ 16x32 pixel, quét theo hàng, khối kích dòng, đệm chốt dữ liệu, đầu vào/đầu ra tín hiệu điều khiển và dữ liệu, các chốt cấp nguồn và kiểm thử tín hiệu

LMD07 Bảng tin điện tử 16x96 pixel, outdoor, đơn sắc, giao tiếp RS232, nguồn 220VAC

LMD09 Board điều khiển chung, MCU AT89S52, 16Kbyte Ram, RS232, LMD port, KeyBoard, nạp ISP và cấp nguồn cho thí nghiệm

Khung Giá đỡ bằng kim loại

6

II. Module LMD01 LMD01 là ma trận LED đơn sắc 8x8, quét theo hàng, khối quét hàng, đệm hàng, chốt hàng, đệm cathode, đệm anode, các chốt cấp nguồn kiểm thử tín hiệu

Ảnh 1 LMD01 – Quét theo hàng LMD01 chứa các loại, linh kiện cơ bản, và lí thuyết cơ bản để điều khiển bảng LED. LMD01 đưa ra một ma trận led 8x8 điểm, đơn sắc (đỏ) và các linh kiện để điều khiển một LMD theo phương pháp đầu tiên – Quét theo hàng.

LMD01 gồm các thành phần sau: Ma trận LED 8x8 pixel, đơn sắc (đỏ)

Khối đệm Kathode – ULN2803

Khối đệm Anode – 74LS574

Khối đệm dữ liệu hàng – 74LS164

Khối chốt dữ liệu hàng – 74LS573

Khối quét hàng – 74LS164 Module có chốt cắm nguồn 5V, jack nối tín hiệu điều khiển để kết nôi với module điều khiển chung. Ảnh 1 là module LMD01.

7

Các thành phần được bố trí dàn trải, có sơ đồ nguyên lí rõ ràng, các đường tín hiệu có các chốt để đo thử.

Sơ đồ nguyên lí

Ảnh 2 Sơ đồ nguyên lí LMD01

8

Mach in

Ảnh 3 Bảng mạch in LMD01

9

III. Module LMD02

Ảnh 4 LMD02 – Quét theo cột LMD02 đưa ra một ma trận LED 8x8 điểm, đơn sắc (đỏ) và các linh kiện để điều khiển một LMD theo phương pháp Quét theo cột. Các thành phần được bố trí dàn trải, có sơ đồ nguyên lí rõ ràng, các đường tín hiệu có các chốt để đo thử.

LMD02 gồm các thành phần sau: Ma trận LED 8x8 pixel, đơn sắc (đỏ)

Khối đệm Kathode – ULN2803

Khối đệm Anode – 74LS574

Khối đệm dữ liệu cột – 74LS164

Khối chốt dữ liệu cột – 74LS573

Khối quét cột – 74LS164 Module có chốt cắm nguồn 5V để, jack nối tín hiệu điều khiển để kết nôi với module điều khiển chung. Ảnh 4 là module LMD02.

Sơ đồ nguyên lí

10

Ảnh 5 Sơ đồ nguyên lí LMD02

11

Mach in

Ảnh 6 Bảng mạch in LMD02

IV. Module LMD03

12

Ảnh 7 LMD03 – LMD 8x8 pixel, 2 màu xanh/đỏ, Quét theo hàng LMD03 đưa ra một ma trận LED 8x8 điểm, hai màu xanh/đỏ và các linh kiện để điều khiển một LMD theo phương pháp Quét theo hàng. Các thành phần được bố trí dàn trải, có sơ đồ nguyên lí rõ ràng, các đường tín hiệu có các chốt để đo thử.

LMD03 gồm các thành phần sau: Ma trận LED 8x8 pixel, 2 màu xanh/đỏ

Khối đệm chốt dữ liệu màu xanh – 74LS595

Khối đệm chốt dữ liệu màu đỏ – 74LS595

Khối đệm Anode – 74LS574

Khối quét hàng – 74LS164 Module có chốt cắm nguồn 5V, jack nối tín hiệu điều khiển để kết nôi với module điều khiển chung. Ảnh 7 là module LMD03.

Sơ đồ nguyên lí

13

Ảnh 8 Sơ đồ nguyên lí LMD03

14

Mach in

Ảnh 9 Bảng mạch in LMD03

V. Module LMD04

15

Ảnh 10 LMD04 – LMD 8x8 pixel, 2 màu xanh/đỏ, Quét theo cột LMD04 đưa ra một ma trận LED 8x8 điểm, hai màu xanh/đỏ và các linh kiện để điều khiển một LMD theo phương pháp Quét theo cột. Các thành phần được bố trí dàn trải, có sơ đồ nguyên lí rõ ràng, các đường tín hiệu có các chốt để đo thử.

LMD04 gồm các thành phần sau: Ma trận LED 8x8 pixel, 2 màu xanh/đỏ

Khối đệm màu xanh – ULN2803

Khối đệm màu đỏ – ULN2803

Khối quét cột – 74LS164

Khối đệm chốt dữ liệu cột – 74LS595 Module có chốt cắm nguồn 5V, jack nối tín hiệu điều khiển để kết nôi với module điều khiển chung. Ảnh 10 là module LMD04.

Sơ đồ nguyên lí

16

Ảnh 11 Sơ đồ nguyên lí LMD04

17

Mach in

Ảnh 12 Bảng mạch in LMD04

18

VI. Module LMD05

Ảnh 13 LMD05 – Module hiển thị 16x32 pixel đơn sắc (đỏ) LMD05 là một module hiển thị 16x32 pixel, đơn sắc màu đỏ trên đó có đệm kích dòng Anode, đệm Kathode, đệm chốt dữ liệu theo hàng. Các thành phần được bố trí dàn trải, có sơ đồ nguyên lí rõ ràng, các đường tín hiệu có các chốt để đo thử.

LMD05 gồm các thành phần sau: Ma trận LED 16x32 pixel, 1 màu đỏ

Khối đệm dữ liệu hàng – 4 IC 74LS574

Khối chốt dữ liệu hàng – 4 IC 74LS574

Khối đệm Anode – 4 IC ULN2803

Jack tín hiệu vào, jack tín hiệu ra Module có chốt cắm nguồn 5V, jack nối tín hiệu điều khiển để kết nôi với module điều khiển chung. Ảnh 13 là module LMD05.

Sơ đồ nguyên lí

19

Ảnh 14 Sơ đồ nguyên lí LMD05

20

Mach in

Ảnh 15 Bảng mạch in LMD05

21

VII. Module LMD06

Ảnh 16 LMD06 – Module hiển thị 16x32 pixel hai màu (xanh/đỏ) LMD06 là một module hiển thị 16x32 pixel hai màu xanh và đỏ, trên đó có các khối đệm kích dòng Anode, đệm Kathode, đệm chốt dữ liệu theo hàng. Các thành phần được bố trí dàn trải, có sơ đồ nguyên lí rõ ràng, các đường tín hiệu có các chốt để đo thử.

LMD06 gồm các thành phần sau: Ma trận LED 16x32 pixel, 2 màu xanh/đỏ

Khối đệm chốt dữ liệu hàng – 16 IC 74LS574

Khối đệm Anode – 4 IC ULN2803

Jack tín hiệu vào, jack tín hiệu ra Module có chốt cắm nguồn 5V, jack nối tín hiệu điều khiển để kết nôi với module điều khiển chung. Ảnh 16 là module LMD06.

Sơ đồ nguyên lí

22

Ảnh 17 Sơ đồ nguyên lí LMD06

23

Mạch in

Ảnh 18 Bảng mạch in LMD06

24

VIII. Module LMD07

Ảnh 19 LMD07 – Bảng tin điện tử 16x96 pixel đơn sắc (xanh/đỏ) LMD07 là một bảng thông tin điện tử hoàn chỉnh 16x96 pixel một màu đỏ, với các tham số kỹ thuật như sau:

Led outdoor

16x96 pixel màu đỏ

MCU AT89S52, 8k flash ROM

16 Kbyte Ram

giao diện truyền thông RS232

Sử dụng nguồn 220VAC

IX. Module LMD09 – Module điều khiển chính LMD09 là hệ vi điều khiển chứa các các thành phần để phục vụ cho các bài thực hành các phương pháp điều khiển LMD bằng chương trinh điều khiển Các thành phần có trên module:

- MCU PIC AT89S52 - 16K RAM - Giao diện RS232 - Bàn phím 8 - Giao diện ISP - Cổng điều khiển LMD -

Sơ đồ nguyên lí

25

26

Sơ đồ mạch in

27

PHẦN II: THỰC HÀNH BÀI I: KHẢO SÁT MA TRẬN LED 8x8 MỘT MÀU VÀ QUÉT HÀNG

I. MỤC ĐÍCH Tìm hiểu cấu trúc của ma trận led, kiểm tra độ sáng của từng đèn led, tìm hiểu phương pháp điều khiển quét hàng, và một số linh kiện điều khiển II. THIẾT BỊ SỬ DỤNG Module LMD01, LMD09, dây nguồn, dây cáp tín hiệu Nguyên lí làm việc

- Khối quét hàng làm nhiệm vụ tạo ra tín hiệu quét cho 8 chân đầu ra từ H1 đến H8. Các chân đầu ra sẽ lần lượt và luân phiên có tín hiệu mức cao, tại một thời điểm chỉ có một chân có tín hiệu mức cao, các chân còn lại mang tín hiệu

28

mức thấp hết, sau một khoảng thời gian quy định sẽ chuyển sang chân tiếp theo, cứ như thế từ chân đầu tiên cho đến hết chân cuối cùng sau đó lại quay lại chân đầu tiên. Thời gian tồn tại trạng thái mức cao của mỗi chân đầu ra là bằng nhau nhưng có thể thay đổi được, tổng thời gian để quét hết một vòng 8 chân đầu ra cũng thay đổi được, do vậy phải quyết định được thời điểm bắt đầu chuyển trạng thái của một chân bất kỳ. Khôi quét hàng có một đầu vào tín hiệu đồng bộ SYN và một đầu vào xung nhịp. Đầu vào xung nhịp để quyết định thời điểm chuyển đổi trạng thái của đầu ra, còn đầu vào tín hiệu đồng bộ để xác định thời điểm bắt đầu một vòng quét. Tại thời điểm trước khi bắt đầu một vòng quét mới tín hiệu SYN băng một, ngay sau đó là một xung dương đưa vào làm cho đầu ra H1 chuyển trạng thái từ 0 sang 1, sau đó một khoảng thời gian bắt đầu chuyển trạng thái cho chân đầu ra tiếp theo (H2) tín hiệu SYN = 0, và liền đó là một xung dương được đưa vào đầu vào xung nhịp, tín hiệu SYN chỉ bằng 1 khi bắt đầu một vòng quét mới còn lại toàn bộ thời gian quét luôn = 0. - Khối đệm hàng làm nhiệm vụ chứa dữ liệu của một hàng để sẵng sàng cho việc hiển thị một hàng, dữ liệu được đưa vào kiểu nối tiếp và dịch chuyển trên các chân đầu ra b1 đến b8. Dữ liệu b8 được đưa vào đầu tiên, b1 dịch đến sau, dịch đến khi dữ liệu của b1 được đưa vào thì dữ liệu b8 dịch đến chân b8 và dữ liệu của b1 có trên chân b1. Khối này có một chân đầu vào xung nhịp sử dụng cho việc đọc dữ liệu vào. - Khối chốt hàng làm nhiệm vụ chốt dữ liệu của một hàng. Trước khi hiển thị một hàng dữ liệu phải sẵn hàng ở các đầu vào D của khối chốt hàng, một xung dương được đưa vào để đẩy dữ liệu từ các chân đầu vào D tới các chân đầu ra Q và giữ nguyên ở đó để cho một hàng được hiển thị trong khoảng thời gian xác định trước hiển thị một hàng tiếp theo. - Khối đệm Kathode làm nhiệm vụ tạo điện áp âm hút dòng cho kathode của đèn led, các đầu ra của khối sẽ nối đến các cathode của đèn led. Các đầu vào được nối với dữ liệu điều khiển đèn led. - Khối đệm Anode làm nhiệm vụ cấp nguồn dương cho nhóm các led và các đầu ra Q nối đến các chân A của đèn led. - Khối ma trận đèn led là một ma trân 8x8 đèn led các chân A của một hàng led được nối chung tạo nên 8 chân A chung, các chân K của một cột được nối chung và tạo nên 8 chân K chung.

29

Để hiển thị toàn bộ ma trận led các hàng sẽ lần lượt được luân phiên hiển thị

từ hàng đầu tiên cho đến hàng cuối cùng rồi lặp lại. Tại một thời điểm chỉ có một hàng được hiển thị.

Trước thời điểm bắt đầu hiển thị hàng đầu tiên dữ liệu của hàng đầu tiên được đưa vào bộ đệm hàng theo cách nối tiếp từ b8 vào trước rồi đến b1, xung nhịp được cấp từ bên ngoài vào để đọc mỗi bít dữ liệu tuân tự, khi đã đủ hết dữ liệu rồi thì xung nhịp không được phép làm việc nữa.

Tiếp theo là hiển thị dữ liệu của hàng đầu tiên, khi hiển thị tín hiệu SYN được đưa vào = 1, sau đó sẽ có một xung dương OUTCLK, xung dương OUTCLK sẽ đồng thời làm hai việc: 1 là đưa toàn bộ dữ liệu của hàng đầu tiên mà đang tồn tại ở đầu vào bộ chốt hàng đến đầu ra bộ chốt hàng và 2 đặt đầu ra H1 của khối quét hàng lên mức cao để hiển thị hàng đầu tiên. Vậy là dữ liệu của hàng đầu tiên đã được chuyển đến bộ đệm Kathode, H1 cũng đã được chuyển lên mức cao đưa vào bộ đệm Anode, quá trình bắt đầu hiển thị hàng đầu tiên đã hoàn tất, việc còn lại là của hai bộ đệm. Bộ đệm Kathode sẽ khuyếch đại đảo các bit dữ liệu và điều khiển việc hút dòng cho 8 Kathode chung, bộ đệm Anode sẽ cấp nguồn dương cho một hàng. Trạng thái này được duy trì một khoảng thời gian xác định để các led của hàng đầu tiên được hiển thị trong một khoảng thời gian xác định. Khi hết thời gian cho việc hiển thị hàng đầu tiên thì việc hiển thị hàng thứ hai sẽ phải bắt đầu.

Việc bắt đầu cho hiển thị hàng thứ 2 cũng giống như hàng thứ nhất chỉ có điểm duy nhất khác biệt là tín hiệu SYN đặt vào phải bằng 0 còn lại thì mọi thủ tục không có gì thay đổi. Do vậy khi có xung OUTCLK thì H1 sẽ ở mức thấp và mức cao trước đó của nó sẽ được dịch sang H2 làm cho A2 được cấp nguồn và hàng thứ hai sáng. Hàng thứ hai cũng sẽ được hiển thị trong một khoảng thời gian xác định và kết thúc

Quá trình được diễn ra lặp lại tương tự đối với các hàng sau cho đến hết hàng 8.

30

Kết thúc thời gian hiển thị hàng 8 là hết một chu trình quét toàn bộ LMD, một chu trình quét mới sẽ lại bắt đầu. Quá trình cứ lặp đi lặp lại như thế trong suốt thời gian hoạt động của LMD. III. THỰC HÀNH 1. Kiểm tra LMD

- Đảm bảo ma trận led HY2088BS đã được gắn lên đế MATRIX1 - Không cấp nguồn cho bảng LMD01 - Dùng đồng hồ vạn năng cơ học, để thang đo 1Ohm - Đưa que đỏ vào một chân K1 (dùng kẹp hoặc cầm tay) - Quẹt đầu que đen của đồng hồ qua các chốt từ A1 đến A8, khi quẹt quan

sát lmd sẽ thấy các đèn cột 1 sáng đều lần lượt từ hàng 1 đến hàng 8 là tốt, chứng tỏ không LED nào hỏng và mạch nối đúng cấu hình chân

- Lần lượt làm như thế với các chân từ K2 đến K8, để kiểm tra các cột còn lại của toàn bộ lmd.

Sau khi kiểm tra nếu không thấy led nào hỏng là tốt. 2. Kiểm tra khối đệm cathode ULN2803

- LMD đã được kiểm tra và gắn lên đế MATRIX1 - IC ULN2803 đã gắn lên đế của khối DEMK - Không cắm IC trên các khối ĐỆMA1, và ĐEMK1 - Không cấp nguồn 5V cho bảng, chỉ đấu dây cho chốt GND - Nối dây từ nguồn +5V với một đầu điện trở 100 Ohm, đầu kia của điện

trở nối với một chân A bất kỳ. - Dùng một dây 5V khác quẹt qua các chốt từ b1 đến b8, khi quẹt thấy các

led của hàng tương ứng với chân A lần lượt sáng đều là ULN2803 tốt. 3. Kiểm tra bộ đệm cực dương

- Giữ nguyên các linh kiện như phần trên - Kiểm tra đế của khối QUETHANG không có gì, nếu có thì bỏ ra - IC 74573(4) đã gắn lên đế của khối DEMA - Cấp nguồn 5V và GND cho bảng. - Dùng một dây nguồn 5V chấm vào chốt b bất kỳ giữa khối CHỐT HÀNG

và khối ĐỆMK - Dùng một dây nguồn 5V khác quẹt qua các chốt từ H1 đến H8, khi quẹt

quan sát thấy các LED của cột tương ứng với b sáng đều là tốt. Cả hai khối ĐỆMA VÀ ĐỆMK đều tốt.

4. Kiểm tra khối chốt hàng - Giữ nguyên các linh kiện như phần trên. - Kiểm tra đế ic của khối ĐỆM HÀNG không có gì, nếu có thì bỏ ra - Gắn IC 74573(4) lên đế của khối CHOTHANG - Đưa tín hiệu 0 hoặc 1 vào đầu vào bất kỳ từ D1 đến D8 của khối CHỐT

HÀNG, dùng thanh kim loại hoặc nguồn 0V hoặc 5V quét vào chốt OUTCLK, dùng đồng hồ đo điện áp của các đầu ra từ Q tương ứng với đầu vào D sau mỗi lần quẹt.

31

- Làm lại như trên vài lần với các tín hiệu vào là 0 , 1 ta sẽ thấy đầu vào D được đưa đến đầu ra Q và sau mỗi lần có xung, trạng thái đầu ra sẽ được giữ nguyên nếu không có một xung quẹt lên chốt OUTCLK mặc dù đầu vào có thay đổi trạng thái 0/1.

5. Kiểm tra khối đệm hàng - Gắn IC 74xx164 lên đế của khối DEMHANG và QUETHANG

Chú ý: tất cả các IC phải cắm đúng chiều - Nối chốt nguồn 5V và GND cho bảng (chưa bật nguồn) - Khối điều khiển LMD09 đã có sẵn chương trình lmd01 trên chíp 89s52 - Nối cáp tín hiệu 4 chân từ bảng lmd09 tới lmd01 - Bật nguồn cho cả hai khối. - nếu không có gì sai trên LMD sẽ hiển thị hình ảnh/ kí tự lập trình sẵn. - dùng máy hiện sóng quan sát tín hiệu tại các chốt DATA, INCLK,

OUTCLK, B, H, A, K để thấy rõ quá trình làm việc của khối QUÉT HÀNG, ĐỆM HÀNG và toàn bộ hệ thống

- Phân tích giản đồ xung của 4 chân tín hiệu 6. Sử dụng khối lmd09 lập trình điều khiển thay đổi nội dung hiển thị chữ

32

BÀI 2: KHẢO SÁT MA TRẬN LED 8x8 MỘT MÀU VÀ QUÉT CỘT I. MỤC ĐÍCH Khảo sát phương pháp điều khiển quét cột, và một số linh kiện điều khiển. II. THIẾT BỊ SỬ DỤNG Module LMD02, LMD09, dây nguồn, dây cáp tín hiệu Nguyên lí làm việc

- Khối quét cột làm nhiệm vụ tạo ra tín hiệu quét cho 8 chân đầu ra từ C1 đến C8. Các chân đầu ra sẽ lần lượt và luân phiên có tín hiệu mức cao, tại một thời điểm chỉ có một chân có tín hiệu mức cao, các chân còn lại mang tín hiệu mức thấp hết, sau một khoảng thời gian xác định sẽ chuyển sang chân tiếp theo, cứ như thế từ chân đầu tiên cho đến hết chân cuối cùng sau đó lại quay lại chân đầu tiên. Thời gian tồn tại trạng thái mức cao của mỗi chân đầu ra là bằng nhau nhưng có thể thay đổi được, tổng thời gian để quét hết một vòng 8 chân đầu ra cũng thay đổi được, do vậy phải quyết định được thời điểm bắt đầu chuyển trạng thái của một chân bất kỳ. Khối quét cột có một đầu vào tín hiệu đồng bộ SYN và

33

một đầu vào xung nhịp. Đầu vào xung nhịp để quyết định thời điểm chuyển đổi trạng thái của đầu ra, còn đầu vào tín hiệu đồng bộ để xác định thời điểm bắt đầu một vòng quét. Tại thời điểm trước khi bắt đầu một vòng quét mới tín hiệu SYN bằng một, ngay sau đó là một xung dương đưa vào làm cho đầu ra H1 chuyển trạng thái từ 0 sang 1, sau đó một khoảng thời gian bắt đầu chuyển trạng thái cho chân đầu ra tiếp theo (H2) tín hiệu SYN = 0, và liền đó là một xung dương được đưa vào đầu vào xung nhịp, tín hiệu SYN chỉ bằng 1 khi bắt đầu một vòng quét mới còn lại toàn bộ thời gian quét luôn = 0. - Khối đệm cột làm nhiệm vụ chứa dữ liệu của một cột để sẵng sàng cho việc hiển thị một cột, dữ liệu được đưa vào kiểu nối tiếp và dịch chuyển trên các chân đầu ra b1 đến b8. Dữ liệu của b8 được đưa vào đầu tiên, dịch dần từ b1 đến b8, cho đến khi dữ liệu của b1 được đưa vào thì dữ liệu b8 dịch đến chân b8 và dữ liệu của b1 có trên chân b1. Một chân đầu vào xung nhịp INCLK cần cho việc đọc dữ liệu vào. - Khối chốt cột làm nhiệm vụ chốt dữ liệu của một cột. Trước khi hiển thị một cột dữ liệu phải sẵn hàng ở các đầu vào D của khối chốt cột, một xung dương được đưa vào để đẩy dữ liệu từ các chân đầu vào D tới các chân đầu ra Q và giữ nguyên ở đó để cho một cột được hiển thị trong khoảng thời gian xác định trước hiển thị một hàng tiếp theo. - Khối đệm Kathode làm nhiệm vụ tạo điện áp âm hút dòng cho nhóm kathode của các đèn led, các đầu ra của khối sẽ nối đến các cathode của đèn led. Các đầu vào được nối với dữ liệu điều khiển đèn led. - Khối đệm Anode làm nhiệm vụ cấp nguồn dương cho các led, nên các đầu ra Q nối đến các chân A của đèn led - Khối ma trận đèn led là một ma trân 8x8 đèn led các chân A của một hàng led được nối chung tạo nên 8 chân A chung, các chân K của một cột được nối chung và tạo nên 8 chân K chung

34

Để hiển thị toàn bộ ma trận led các cột sẽ lần lượt được luân phiên hiển thị từ cột đầu tiên cho đến cột cuối cùng rồi lặp lại. Tại một thời điểm chỉ có một cột được hiển thị.

Trước thời điểm bắt đầu hiển thị cột đầu tiên dữ liệu của cột đầu tiên được đưa vào bộ đệm cột theo cách nối tiếp từ b8 vào trước rồi đến b1, xung nhịp được cấp từ bên ngoài vào để đọc mỗi bít dữ liệu tuần tự, khi đã đủ hết dữ liệu rồi thì xung nhịp không được phép làm việc nữa.

Tiếp theo là hiển thị dữ liệu của hàng đầu tiên, khi hiển thị tín hiệu SYN=1 được đưa vào, sau đó sẽ có một xung dương OUTCLK, xung dương OUTCLK sẽ đồng thời làm hai việc: 1 là đưa toàn bộ dữ liệu của cột đầu tiên mà đang tồn tại ở đầu vào bộ chốt cột đến đầu ra bộ chốt cột; và 2 là dịch tín hiệu SYN=1 đến đầu ra C1 của khối quét cột để hiển thị cột đầu tiên. Vậy là dữ liệu của cột đầu tiên đã được chuyển đến bộ đệm Anode, C1 cũng đã được chuyển lên mức cao đưa vào bộ đệm Kathode, quá trình bắt đầu hiển thị hàng đầu tiên đã hoàn tất, việc còn lại là của hai bộ đệm. Bộ đệm Anode sẽ khuyếch đại các bit dữ liệu và điều khiển việc cấp nguồn dương cho 8 Anode , bộ đệm Kathode sẽ khuyếch đại đảo tín hiệu tích cực cột để hút dòng cho một cột. Trạng thái này được duy trì một khoảng thời gian xác định để các led của cột đầu tiên được hiển thị trong một khoảng thời gian xác định. Khi hết thời gian cho việc hiển thị cột đầu tiên thì việc hiển thị cột thứ hai sẽ phải bắt đầu.

Việc bắt đầu cho hiển thị cột thứ 2 cũng giống như cột thứ nhất chỉ có điểm duy nhất khác biệt là tín hiệu SYN đặt vào phải bằng 0 còn lại thì mọi thủ tục không có gì thay đổi. Do vậy khi có xung OUTCLK thì C1 sẽ ở mức thấp và mức cao trước đó của nó sẽ được dịch sang C2 làm cho K2 được nối đất và cột thứ hai sáng. Cột thứ hai cũng sẽ được hiển thị trong một khoảng thời gian xác định và kết thúc

Quá trình được diễn ra lặp lại tương tự đối với các cột sau cho đến hết cột 8. Kết thúc thời gian hiển thị cột 8 là hết một chu trình quét toàn bộ LMD, một

chu trình quét mới sẽ lại bắt đầu. Quá trình cứ lặp đi lặp lại như thế trong suốt thời gian hoạt động của LMD. III. THỰC HÀNH 1. Kiểm tra LMD

- Gắn lmd HY2088BS lên đế MATRIX1 - Không cấp nguồn cho bảng - Đưa điện áp 0V vào một chân K1 (dùng kẹp hoặc cầm tay) - Nối dây từ nguồn 5V nối tiếp với một đầu điện trở 100 Ohm (dùng kẹp

hoặc cầm bằng tay) - Quẹt đầu còn lại của điện trở qua các chốt từ A1 đến A8, khi quẹt quan

sát lmd sẽ thấy các đèn cột 1 sáng đều lần lượt từ hàng 1 đến hàng 8 là tốt, chứng tỏ không LED nào hỏng và mạch nối đúng cấu hình chân

35

- Lần lượt làm như thế với các chân từ K2 đến K8, để kiểm tra các cột còn lại của toàn bộ lmd. Cũng có thể kiểm tra theo từng hàng bằng cách cho điện áp dương vào chân A và quẹt đầu 0V qua các chân K1 đến K8.

Sau khi kiểm tra nếu không thấy led nào hỏng là tốt 2. Kiểm tra khối đệm cathode ULN2803

- LMD đã được kiểm tra và gắn lên đế MATRIX1 - IC ULN2803 đã gắn lên đế của khối DEMK - Không cắm IC trên các khối DEMA2, và DEMK2 - Không cấp nguồn 5V cho bảng, chỉ đấu dây cho chốt GND - Nối dây từ nguồn +5V với một đầu điện trở 100 Ohm, đầu kia nối với một

chân A bất kỳ. - Dùng một dây 5V khác quẹt qua các chốt từ b1 đến b8, khi quẹt thấy các

led của hàng tương ứng với chân A lần lượt sáng đều là ULN2803 tốt. 3. Kiểm tra bộ đệm cực dương

- Giữ nguyên các linh kiện như phần trên - Kiểm tra đế của khối CHOTCOT không có gì - IC 74573(4) đã gắn lên đế của khối DEMA - Cấp nguồn 5V và GND cho bảng. - Dùng một dây nguồn 5V chấm vào chốt C bất kỳ giữa khối QUETCOT và

khối ĐỆMK - Dùng một dây nguồn 5V khác quẹt qua các chốt từ b1 đến b8, khi quẹt

quan sát thấy các LED của cột tương ứng với C đều sáng là tốt. Cả hai khối ĐỆMA VÀ ĐỆMK đều tốt.

4. Kiểm tra khối chốt cột - Giữ nguyên các linh kiện như phần trên. - Kiểm tra đế ic của khối ĐỆMCỘT không có gì, nếu có thì bỏ ra - Gắn IC 74573(4) lên đế của khối CHOTCỘT - Đưa tín 0 hoặc 1 vào đầu vào bất kỳ từ D1 đến D8 của khối CHỐTCOT,

dùng thanh kim kim loại hoặc nguồn 0V hoặc 5V quét vào chốt OUTCLK, dùng đồng hồ đo điện áp của các đầu ra từ Q tương ứng với đầu vào D sau mỗi lần quẹt.

- Làm lại như trên vài lần với các tín hiệu vào là 0 , 1 ta sẽ thấy đầu vào D được đưa đến đầu ra Q và sau mỗi lần có xung, trạng thái đầu ra sẽ được giữ nguyên nếu không có một xung quẹt lên chốt OUTCLK mặc dù đầu vào có thay đổi trạng thái 0/1.

5. Kiểm tra khối đệm cột - Gắn IC 164 lên đế của khối DEMCỘT và QUETCỘT

Chú ý: tất cả các IC phải cắm đúng chiều - Nối chốt nguồn 5V và GND cho bảng (chưa bật nguồn) - Khối điều khiển LMD09 đã có sẵn chương trình lmd02 trên chíp 89s52 - Nối cáp tín hiệu 4 chân từ bảng lmd09 tới lmd02 - Bật nguồn cho cả hai khối. - nếu không có gì sai trên LMD sẽ hiển thị chữ Z

36

- dùng máy hiện sóng quan sát tín hiệu tại các chốt DATA, INCLK, OUTCLK, B, C, A, K để thấy rõ quá trình làm việc của khối QUÉTCỘTT, ĐỆMCỘT và toàn bộ hệ thống

- Phân tích giản đồ xung của 4 chân tín hiệu 6. Sử dụng khối lmd09 lập trình điều khiển thay đổi nội dung hiển thị chữ

37

BÀI 3: KHẢO SÁT MA TRẬN LED 8x8 2 MÀU XANH ĐỎ VÀ PHƯƠNG PHÁP QUÉT HÀNG I. MỤC ĐÍCH Khảo sát cấu trúc của ma trận led 8x8 2 màu xanh đỏ, kiểm tra độ sáng của từng đèn led, tìm hiểu phương pháp điều khiển quét hàng cho 2 màu, và một số linh kiện điều khiển II. THIẾT BỊ SỬ DỤNG Module LMD03, LMD09, dây nguồn, dây cáp tín hiệu Nguyên lí làm việc

- Khối quét hàng làm nhiệm vụ tạo ra tín hiệu quét cho 8 chân đầu ra từ H1 đến H8. Các chân đầu ra sẽ lần lượt và luân phiên có tín hiệu mức cao, tại một thời điểm chỉ có một chân có tín hiệu mức cao, các chân còn lại mang tín hiệu mức thấp hết, sau một khoảng thời gian quy định sẽ chuyển sang chân tiếp theo, cứ như thế từ chân đầu tiên cho đến hết chân cuối cùng sau đó lại quay lại chân đầu tiên. Thời gian tồn tại trạng thái mức cao của mỗi chân đầu ra là bằng nhau nhưng có thể thay đổi được, tổng thời gian để quét hết một vòng 8 chân đầu ra

38

cũng thay đổi được, do vậy phải quyết định được thời điểm bắt đầu chuyển trạng thái của một chân bất kỳ. Khôi quét hàng có một đầu vào tín hiệu đồng bộ SYN và một đầu vào xung nhịp. Đầu vào xung nhịp để quyết định thời điểm chuyển đổi trạng thái của đầu ra, còn đầu vào tín hiệu đồng bộ để xác định thời điểm bắt đầu một vòng quét. Tại thời điểm trước khi bắt đầu một vòng quét mới tín hiệu SYN băng một, ngay sau đó là một xung dương đưa vào làm cho đầu ra H1 chuyển trạng thái từ 0 sang 1, sau đó một khoảng thời gian bắt đầu chuyển trạng thái cho chân đầu ra tiếp theo (H2) tín hiệu SYN = 0, và liền đó là một xung dương được đưa vào đầu vào xung nhịp, tín hiệu SYN chỉ bằng khi bắt đầu một vòng quét mới còn lại toàn bộ thời gian quét luôn = 0. - Khối DEMCHOTG (và DEMCHOTR) làm nhiệm vụ chứa dữ liệu G và R của một hàng và chốt dữ liệu tại đầu ra để hiển thị một hàng, dữ liệu được đưa vào kiểu nối tiếp và xuất ra song song. Dữ liệu của R8 được đưa vào đầu tiên, dữ liệu G1 được đưa vào cuối. Khi 16 bit dữ liệu đã được đưa vào 2 bộ ĐỆMCHÔT, một xung dương OUTCLK được đưa vào để đẩy dữ liệu tới các chân đầu ra và giữ nguyên ở đó để cho một hàng được hiển thị trong khoảng thời gian xác định trước khi hiển thị một hàng tiếp theo. Một khối này làm cả 3 việc tương đương 3 khối: ĐỆMHANG, CHÔTHÀNG, ĐỆMK trong lmd01. ĐỆMCHOTG phục vụ cho màu xanh, ĐỆMCHOTR phục vụ màu đỏ. - Khối đệm Anode làm nhiệm vụ cấp nguồn dương cho nhóm các led, các đầu ra Q nối đến các chân A của đèn led - Khối ma trận đèn led là một ma trân 8x8 điểm, mỗi điểm gồm 2 đèn led nối chung, Anode các chân A của một hàng led được nối chung tạo nên 8 chân A chung, các chân Cathode của màu xanh của một cột được nối chung và tạo nên 8 chân G chung, các chân Cathode của màu đỏ của một cột được nối chung và tạo nên 8 chân R chung

39

Một hàng được hiển thị bao gồm một hàng xanh và một hàng đỏ kết hợp Để hiển thị toàn bộ ma trận led các hàng sẽ lần lượt được luân phiên hiển thị

từ hàng đầu tiên cho đến hàng cuối cùng rồi lặp lại. Tại một thời điểm chỉ có một hàng được hiển thị.

Trước thời điểm bắt đầu hiển thị hàng đầu tiên, dữ liệu của hàng đầu tiên được đưa vào bộ đệm chốt theo cách nối tiếp từ R8 vào trước rồi đến G1, xung nhịp INCLK được cấp từ bên ngoài vào để đọc mỗi bít dữ liệu tuân tự, khi đã đủ hết dữ liệu rồi thì xung nhịp không được phép làm việc nữa.

Tiếp theo là hiển thị dữ liệu của hàng đầu tiên, trước khi hiển thị tín hiệu SYN=1 được đưa vào, sau đó sẽ có một xung dương OUTCLK, xung dương OUTCLK sẽ đồng thời làm hai việc: 1 là đưa toàn bộ dữ liệu của hàng đầu tiên mà đang tồn tại ở trong bộ ĐỆMCHÔT ra các chân R và G của led matrix, và 2 là đặt đầu ra H1 của khối quét hàng lên mức cao để hiển thị hàng đầu tiên. Vậy là dữ liệu của hàng đầu tiên đã đầu tiên đã đến các chân Kathode (R và G), H1 cũng đã được chuyển lên mức cao để đưa vào bộ đệm Anode, quá trình bắt đầu hiển thị hàng đầu tiên đã hoàn tất, việc còn lại là của bộ đệm Anode. Các bít 0 sẽ điều khiển cho Kathode nối với nó sáng, bít 1 sẽ làm cho kathode tắt, bộ đệm Anode sẽ cấp nguồn dương cho một hang. Trạng thái này được duy trì một khoảng thời gian xác định để các led của hàng đầu tiên được hiển thị trong một khoảng thời gian xác định. Khi hết thời gian cho việc hiển thị hàng đầu tiên thì việc hiển thị hàng thứ hai sẽ phải bắt đầu.

Việc bắt đầu cho hiển thị hàng thứ 2 cũng giống như hàng thứ nhất chỉ có điểm duy nhất khác biệt là tín hiệu SYN đặt vào phải bằng 0 còn lại thì mọi thủ

40

tục không có gì thay đổi. Do vậy khi có xung OUTCLK thì H1 sẽ ở mức thấp và mức cao trước đó của nó sẽ được dịch sang H2 làm cho A2 được cấp nguồn và hàng thứ hai sáng. Hàng thứ hai cũng sẽ được hiển thị trong một khoảng thời gian xác định và kết thúc

Quá trình được diễn ra lặp lại tương tự đối với các hàng sau cho đến hết hàng 8.

Kết thúc thời gian hiển thị hàng 8 là hết một chu trình quét toàn bộ LMD, một chu trình quét mới sẽ lại bắt đầu. Quá trình cứ lặp đi lặp lại như thế trong suốt thời gian hoạt động của LMD. III. THỰC HÀNH 1. Kiểm tra LMD

- LMD 2088DHG đã được gắn lên đế MATRIX1 - Không cấp nguồn cho bảng - Đưa điện áp 5V vào một chân A1 (dùng kẹp hoặc cầm tay) - Nối dây từ nguồn 0V nối tiếp với một đầu điện trở 100 Ohm (dùng kẹp

hoặc cầm bằng tay) - Quẹt đầu còn lại của điện trở qua các chốt từ G1 đến R8, khi quẹt quan sát

lmd sẽ thấy các đèn hàng 1 sáng đều lần lượt từ R1 đến G8 là tốt, chứng tỏ không LED nào hỏng và mạch nối đúng cấu hình chân

- Lần lượt làm như thế với các chân từ A2 đến A8, để kiểm tra các cột còn lại của toàn bộ lmd

2. Kiểm tra bộ đệm cực dương - Giữ nguyên các linh kiện như phần trên - Kiểm tra đế của khối QUETHANG, ĐỆMCHỐT không có gì - Không cắm IC trên các khối DEMCHOTR và DEMCHOTG - IC 74573(4) đã gắn lên đế của khối DEMA - Cấp nguồn 5V và GND cho bảng. - Dùng một dây nguồn 0V chấm vào chốt R hoặc G bất kỳ - Dùng một dây nguồn 5V khác quẹt qua các chốt từ H1 đến H8, khi quẹt

quan sát thấy các LED của cột tương ứng với R hoặc G sáng đều là Khối ĐỆMA tốt.

3. Kiểm tra khối ĐỆMCHÔT - Giữ nguyên các linh kiện như phần trên. - Gắn IC 74595 lên đế của khối DEMCHOtTR và DEMCHOTG, - Gắn IC 74164 lên đế của khối QUETHANG

Chú ý: tất cả các IC phải cắm đúng chiều - Nối chốt nguồn 5V và GND cho bảng (chưa bật nguồn) - Khối điều khiển LMD09 đã có sẵn chương trình lmd03 trên chíp 89s52 - Nối cáp tín hiệu 4 chân từ bảng lmd09 tới lmd03 - Bật nguồn cho cả hai khối. - Nếu không có gì sai trên LMD sẽ hiển thị chữ như lập trình sẵn

41

- Dùng máy hiện sóng quan sát tín hiệu tại các chốt DATA, INCLK, OUTCLK, SYN, R, G, H, A để thấy rõ quá trình làm việc của khối QUÉT HÀNG, ĐỆM HÀNG và toàn bộ hệ thống

- Phân tích giản đồ xung của 4 chân tín hiệu DATA, INCLK, OUTCLK, SYN

4. Sử dụng khối lmd09 lập trình điều khiển thay đổi nội dung hiển thị chữ

42

BÀI 4: KHẢO SÁT MA TRẬN LED 8x8 2 MÀU XANH ĐỎ VÀ PHƯƠNG PHÁP QUÉT CỘT I. MỤC ĐÍCH Khảo phương pháp điều khiển quét hàng cho 2 màu, và một số linh kiện điều khiển II. THIẾT BỊ SỬ DỤNG Module LMD04, LMD09, dây nguồn, dây cáp tín hiệu Nguyên lí làm việc

43

- Khối quét cột (QUETR, QUETG) làm nhiệm vụ tạo ra tín hiệu quét cho 16 chân đầu ra từ C1 đến C16. Các chân đầu ra sẽ lần lượt và luân phiên có tín hiệu mức cao, tại một thời điểm chỉ có một chân có tín hiệu mức cao, các chân còn lại mang tín hiệu mức thấp hết, sau một khoảng thời gian quy định sẽ chuyển sang chân tiếp theo, cứ như thế từ chân đầu tiên cho đến hết chân cuối cùng sau đó lại quay lại chân đầu tiên. Thời gian tồn tại trạng thái mức cao của mỗi chân đầu ra là bằng nhau nhưng có thể thay đổi được, tổng thời gian để quét hết một vòng 16 chân đầu ra cũng thay đổi được, do vậy phải quyết định được thời điểm bắt đầu chuyển trạng thái của một chân bất kỳ. Khôi quét hàng có một đầu vào tín hiệu đồng bộ SYN và một đầu vào xung nhịp OUTCLK. Đầu vào xung nhịp để quyết định thời điểm chuyển đổi trạng thái của đầu ra, còn đầu vào tín hiệu đồng bộ để xác định thời điểm bắt đầu một vòng quét. Tại thời điểm trước khi bắt đầu một vòng quét mới tín hiệu SYN băng một, ngay sau đó là một xung dương đưa vào làm cho đầu ra C1 chuyển trạng thái từ 0 sang 1, sau đó một khoảng thời gian bắt đầu chuyển trạng thái cho chân đầu ra tiếp theo (C2) tín hiệu SYN = 0, và liền đó là một xung dương được đưa vào đầu vào xung nhịp, tín hiệu SYN chỉ bằng khi bắt đầu một vòng quét mới còn lại toàn bộ thời gian quét luôn = 0. - Khối DEMCHOTA làm nhiệm vụ chứa dữ liệu của một cột và chốt dữ liệu tại đầu ra để hiển thị một cột, dữ liệu được đưa vào kiểu nối tiếp và xuất ra song song. Dữ liệu của A1 được đưa vào đầu tiên, dữ liệu A8 được đưa vào cuối. Khi 8 bit dữ liệu đã được đưa vào bộ ĐỆMCHÔTA, một xung dương OUTCLK được đưa vào để đẩy dữ liệu tới các chân đầu ra và giữ nguyên ở đó để cho một cột được hiển thị trong khoảng thời gian xác định trước khi hiển thị một hàng tiếp theo. Một khối này làm cả 3 việc tương đương 3 khối: ĐỆMCỘT, CHÔTCỘT, ĐỆMA trong lmd02. - Khối DEMR và DEMG làm nhiệm vụ khuyếch đại đảo cấp nguồn âm để hút dòng từ các Cathode chung của lmd. - Khối ma trận đèn led là một ma trân 8x8 điểm, mỗi điểm gồm 2 đèn led nối chung Anode các chân A của một hàng led được nối chung tạo nên 8 chân A chung, các chân Cathode của màu xanh của một cột được nối chung và tạo nên 8 chân G chung, các chân Cathode của màu đỏ của một cột được nối chung và tạo nên 8 chân R chung

44

Để hiển thị toàn bộ ma trận led 16 cột sẽ lần lượt được luân phiên hiển thị từ

cột C1 đến C16 tương ứng là G1 đến R8 rồi lặp lại. Tại một thời điểm chỉ có một cột được hiển thị.

Trước thời điểm bắt đầu hiển thị cột đầu tiên, dữ liệu của cột đầu tiên được đưa vào bộ đệm chốt theo cách nối tiếp từ A1 vào trước rồi đến A8, xung nhịp INCLK được cấp từ bên ngoài vào để đọc mỗi bít dữ liệu tuần tự, khi đã đủ hết dữ liệu rồi thì xung nhịp không được phép làm việc nữa.

Tiếp theo là hiển thị dữ liệu của cột đầu tiên, trước khi hiển thị tín hiệu SYN=1 được đưa vào, sau đó sẽ có một xung dương OUTCLK, xung dương OUTCLK sẽ đồng thời làm hai việc: 1 là đưa toàn bộ dữ liệu của cột đầu tiên mà đang tồn tại ở trong bộ ĐỆMCHÔT ra các chân A của led matrix, và 2 là đặt đầu ra C1 của khối quét cột lên mức cao để hiển thị cột đầu tiên. Vậy là dữ liệu của cột đầu tiên đã đầu tiên đã đến các chân A, C1 cũng đã được chuyển lên mức cao để đưa vào bộ đệm Kathode, quá trình bắt đầu hiển thị hàng đầu tiên đã hoàn tất, việc còn lại là của bộ đệm Cathode. Các bít 1 sẽ điều khiển cho Anode nối với nó sáng, bít 0 sẽ làm cho Anode tắt, bộ đệm Cathode sẽ hút dòng cho một cột. Trạng thái này được duy trì một khoảng thời gian xác định để các led của cột đầu tiên được hiển thị trong một khoảng thời gian xác định. Khi hết thời gian cho việc hiển thị cột đầu tiên thì việc hiển thị hàng thứ hai sẽ phải bắt đầu.

Việc bắt đầu cho hiển thị cột thứ 2 cũng giống như cột thứ nhất chỉ có điểm duy nhất khác biệt là tín hiệu SYN đặt vào phải bằng 0 còn lại thì mọi thủ tục không có gì thay đổi. Do vậy khi có xung OUTCLK thì C1 sẽ ở mức thấp và mức cao trước đó của nó sẽ được dịch sang C2 làm cho K2 được nối đất và cột

45

thứ hai sáng. Cột thứ hai cũng sẽ được hiển thị trong một khoảng thời gian xác định và kết thúc

Quá trình được diễn ra lặp lại tương tự đối với các cột sau cho đến hết cột16. Các cột từ 1 đến 8 là các cột cho màu xanh, các cột từ 9 đến 16 là các cột cho màu đỏ, do vậy trong phương pháp này 8 cột màu xanh được hiển thị trước sau đó đến 8 cột màu đỏ.

Kết thúc thời gian hiển thị cột 16 là hết một chu trình quét toàn bộ LMD, một chu trình quét mới sẽ lại bắt đầu. Quá trình cứ lặp đi lặp lại như thế, 8 cột màu xanh và 8 cột màu đỏ luân phiên nhau trong suốt thời gian hoạt động của LMD. III. THỰC HÀNH a. Kiểm tra LMD

- LMD 2088DHG đã được gắn lên đế MATRIX1 - Không cấp nguồn cho bảng - Đưa điện áp 5V vào một chân A1 (dùng kẹp hoặc cầm tay) - Nối dây từ nguồn 0V nối tiếp với một đầu điện trở 100 Ohm (dùng kẹp

hoặc cầm bằng tay) - Quẹt đầu còn lại của điện trở qua các chốt từ G1 đến R8, khi quẹt quan sát

lmd sẽ thấy các đèn hàng 1 sáng đều lần lượt từ R1 đến G8 là tốt, chứng tỏ không LED nào hỏng và mạch nối đúng cấu hình chân

- Lần lượt làm như thế với các chân từ A2 đến A8, để kiểm tra các cột còn lại của toàn bộ lmd

b. Kiểm tra bộ đệm cực âm DEMG, DEMR - Giữ nguyên các linh kiện như phần trên - Kiểm tra đế của khối QUETG, QUETR, ĐỆMCHỐT không có gì - IC 2803 đã gắn lên đế của khối DEMG, DEMR - Cấp nguồn 5V và GND cho bảng. - Dùng một dây nguồn 5V chấm vào chốt A - Dùng một dây nguồn 5V khác quẹt qua các chốt từ G1 đến R8, khi quẹt

quan sát thấy các LED của hàng tương ứng với A sáng đều là Khối ĐỆMG, DEMR tốt.

c. Kiểm tra khối ĐỆMCHÔT - Giữ nguyên các linh kiện như phần trên. - Gắn IC 74595 lên đế của khối DEMCHOT - Gắn IC 74164 lên đế của khối QUETG, QUETR

Chú ý: tất cả các IC phải cắm đúng chiều - Nối chốt nguồn 5V và GND cho bảng (chưa bật nguồn) - Khối điều khiển LMD09 đã có sẵn chương trình lmd04 trên chíp 89s52 - Nối cáp tín hiệu 4 chân từ bảng lmd09 tới lmd04 - Bật nguồn cho cả hai khối. - nếu không có gì sai trên LMD sẽ hiển thị chữ X với màu chữ và nền thay

đổi

46

- dùng máy hiện sóng quan sát tín hiệu tại các chốt DATA, INCLK, OUTCLK, SYN, R, G, H, A để thấy rõ quá trình làm việc của khối QUÉT HÀNG, ĐỆM HÀNG và toàn bộ hệ thống

- Phân tích giản đồ xung của 4 chân tín hiệu DATA, INCLK, OUTCLK, SYN

d. Sử dụng khối lmd09 lập trình điều khiển thay đổi nội dung hiển thị chữ

47

BÀI 5: KHẢO SÁT MODULE HIỂN THỊ 16x32 ĐIỂM MỘT MÀU I. MỤC ĐÍCH Tìm hiểu thiết kế của module hiển thị 16x32 điểm, và phương pháp điều khiển. II. THIẾT BỊ SỬ DỤNG Module LMD05, LMD09, dây nguồn, dây cáp tín hiệu Nguyên lí làm việc

LMD05 là mô hình của một module hiển thị, dùng để ghép nối nhiều module này với nhau để có một kích thước hiển thị lớn hơn. - Khối đệm hàng: làm nhiệm vụ tiếp nhận dữ liệu của một hàng. Khối đệm hàng gồm các IC U17, U18, U19, U20. Mỗi IC là bộ 8 DFF độc lập với nhau nhưng dùng chung đầu vào CLK, mỗi IC có 8 đầu vào D và 8 đầu ra Q. Bốn IC được mắc liên tiếp với nhau, 8 đầu ra của IC U17 nối với 8 đầu vào của U18, tương tự U19, U20 như hình vẽ. Đầu vào của khối đệm hàng là đầu vào của U17. Dữ liệu sẽ được đưa vào khối đệm hàng từng byte một (8 bit đồng thời) đi kèm với một xung INCLK. Khi dữ liệu đã có ở đầu vào DFF, một xung dương INCLK sẽ làm cho dữ liệu chuyển đến đầu ra và lưu ở đó, đầu ra đó lại được nối đến đầu vào của DFF tiếp theo đồng thời nối đến đầu ra của toàn khối đệm hàng. Khối đệm hàng có 8 đầu vào nối tiếp, 32 đầu ra dịch chuyển, và 8 đầu ra liên tiếp dành cho việc ghép nối với module tiếp theo. Dữ liệu được đưa vào 8 đầu vào xen kẽ với tín hiệu INCLK để đọc vào, và dịch chuyển trên 32 đầu ra. Hoạt động của khối tương tự như thanh ghi dịch. 8 bit dữ liệu đặt vào đầu vào, 1 xung dương inclk sẽ dịch 8 bit đó đến 8 đầu ra và nối đến bộ 8 đầu vào tiếp theo, sau 4 lần dịch thì ta đọc được 4 byte và có mặt trên 32 đầu ra. - Khối CHỐT HÀNG làm nhiệm vụ chốt dữ liệu của một hàng ở đầu vào đến đầu ra và giữ chúng ở đầu ra trong thời gian hàng đó hiển thị. - Khối ma trận đèn led là một ma đèn led 16 hàng, 32 cột bao gồm U1, U2, U3, U4, U5, U6, U7 và U8, mỗi một khối là một ma trận 8x8. Một hàng có 16 led, 16 kathode của một hang được nối chung với nhau thành một chân K chung. Một hàng có 32 led, và chia làm hai nửa, 16 cathode của mỗi nửa nối với nhau tạo nên một chân K chung. - Khối đệm Cathode: làm nhiệm vụ khuyếch đại đảo tín hiệu quét hàng để hút dòng cho cathode của các hàng. Đầu ra khối này được nối đến Cathode chung của các hàng (K). Khối này sử dụng 4 IC 2803 gồm U9, U10, U11 và U12, mỗi ic có 8 cổng ra, mỗi cổng ra nối đến một chân K, một chân K là nối chung của 16 cathode của một nửa hàng. U9, U10 dành cho nửa trái từ K1 đến K16, U11 và 12 cho nửa phải từ K17 đến K32. Toàn bộ khối này co 32 cổng ra chia cho cho nửa là 16 cho bên phải, 16 cho bên trai, tương ứng với 16 hàng cua ma trận led. Khối này có 16 đầu vào, tương ứng 16 hàng. Mỗi đầu vào nhận tín hiệu điều khiển của một hàng, để điều khiển hai đầu ra cho hai nửa của một hàng đó. Khối

48

này đơn giản chỉ là khuyếch đại đảo 16 tín hiệu điều khiển nối đất cho hàng và tách hàng thành hai nửa để đủ công suất điều

49

khiển.

50

Các đầu vào: - 16 tín hiệu đầu vào điều khiển hàng tương ứng với 16 hàng của ma trận led - 8 đầu vào dữ liêu - INCLK, tín hiệu xung nhịp cho dữ liệu vào - OUTCLK, tín hiệu xung nhịp cho dữ liệu ra Các đầu ra: - 16 tín đầu ra điều khiển hàng tương ứng với 16 hàng của module tiếp theo - 8 đầu ra dữ liệu, để nối đến 8 đầu vào dữ liệu của module tiếp theo - INCLK, dùng cho module tiếp theo - OUTCLK, dùng cho module tiếp theo Các đầu ra của module này sẽ nối đến đầu vào của module tiếp theo khi ghép

nối nhiều module khác nhau Để hiển thị toàn bộ ma trận led, 16 hàng sẽ lần lượt được luân phiên hiển thị

từ hàng1 đến hàng 16 tương ứng là từ K1và K2_1 đến K16 và K2_16 rồi lặp lại. Tại một thời điểm chỉ có một hàng được hiển thị.

Trước thời điểm bắt đầu hiển thị hàng đầu tiên, dữ liệu của hàng đầu tiên được đưa vào bộ đệm hàng theo trình tự 8 bit một như sau: (D25..D32), (D17..D24), (D9..D16), (D1..D8), với Dn là cho bit dữ liệu cho cột n. Dữ liệu của điểm nào phải được dịch đến đúng vị trí của điểm ấy trước khi chúng được chốt đến các chân A tương ứng. Khi có nhiều module được ghép nối với nhau thì có thể xem tương đương hoàn toàn với một module lớn với số điểm của một hàng dài hơn, và trình tự dịch dịch chuyển dữ liệu vẫn tương tự như trên, nghĩa là dữ liệu của byte cuối hàng sẽ đưa vào trước và dữ liệu byte đầu hàng đưa vào sau cùng. Xung nhịp INCLK được cấp từ bên ngoài vào để đọc mỗi byte dữ liệu đồng thời, khi đã đủ hết dữ liệu rồi thì xung nhịp không được phép làm việc nữa.

Để hiển thị dữ liệu của hàng đầu tiên, sẽ phải có một xung dương OUTCLK để chốt toàn bộ dữ liệu của hàng đầu tiên mà đang tồn tại ở đầu vào bộ CHOTHANG ra các chân A của led matrix, và tín hiệu H1của đầu vào bộ đệm cathode ở mức cao để hiển thị cột đầu tiên, các đầu vào khác ở mức thấp, để bộ đệm cathode nối đất cho cathode của hàng đầu tiên. Khối đệm cathode sẽ khuyếch đại đảo tín hiệu H1=1 và làm cho đầu ra K1 nối đất, để hàng 1 được hiển thị, các hàng còn lại ở trạng thái trở kháng cao nên không sáng. Trạng thái này được duy trì một khoảng thời gian xác định để các led của hàng đầu tiên được hiển thị trong một khoảng thời gian xác định. Khi hết thời gian cho việc hiển thị hàng đầu tiên đầu tiên thì việc hiển thị hàng thứ hai sẽ phải bắt đầu.

51

Việc bắt đầu cho hiển thị hàng thứ 2 hoàn toàn giống như hàng thứ nhất, khi ấy H1 trở về mức thấp, H2 sẽ chuyển lên mức cao, còn lại ở các đầu vào còn lại ở mức thấp hết. Hàng thứ hai cũng sẽ được hiển thị trong một khoảng thời gian xác định và kết thúc

Quá trình được diễn ra lặp lại tương tự đối với các hàng sau cho đến hết hàng16.

Kết thúc thời gian hiển thị hàng 16 là hết một chu trình quét toàn bộ LMD, một chu trình quét mới sẽ lại bắt đầu. III. THỰC HÀNH a. Kiểm tra LMD

- 8 LMD 2088BS đã được gắn lên đế MATRIX1 - Không cấp nguồn cho bảng - Đưa điện áp 0V vào chân K1 (dùng kẹp hoặc cầm tay) - Nối dây từ nguồn 5V nối tiếp với một đầu điện trở 100 Ohm (dùng kẹp

hoặc cầm bằng tay) - Quẹt đầu còn lại của điện trở qua các chốt từ A1 đến A32, khi quẹt quan

sát lmd sẽ thấy các đèn hàng 1 sáng đều lần lượt từ A1 đến A32 là tốt, chứng tỏ không LED nào hỏng và mạch nối đúng cấu hình chân

- Lần lượt làm như thế với các chân từ K2 đến K16, để kiểm tra các hàng còn lại của toàn bộ lmd

b. Kiểm tra bộ đệm cực âm ULN2803 - Giữ nguyên các linh kiện như phần trên - IC ULN2803 đã gắn trên các khối U9, U10, U11, U12 - Nối đất cho bảng, không cấp nguồn. - Dùng một dây nguồn 5V chấm vào chốt A1 - Dùng một dây nguồn 5V khác quẹt qua các chốt từ H1 đến H16, khi quẹt

quan sát thấy các LED của cột tương ứng với A1 sáng đều là U9, U10 tốt - Làm lại như trên với A32 để kiểm tra U11, U12.

c. Khảo sát hoạt động của module - Tất cả các IC được gắn trên module

Chú ý: tất cả các IC phải cắm đúng chiều - Nối chốt nguồn 5V và GND cho bảng (chưa bật nguồn) - Khối điều khiển LMD09 đã có sẵn chương trình lmd05 trên chíp 89s52 - Nối cáp tín hiệu 26 chân từ bảng lmd09 tới lmd05 - Bật nguồn cho cả hai khối. - nếu không có gì sai trên LMD sẽ hiển thị chữ như đã lập trình sẵn - dùng máy hiện sóng quan sát tín hiệu tại các chốt DATA, CLKIN,

CLKOUT, D, A, H, K để thấy rõ trình tự của các tín hiệu điều khiển và dữ liệu

d. Sử dụng khối lmd09 lập trình điều khiển thay đổi nội dung hiển thị chữ

52

BÀI 6: KHẢO SÁT MODULE HIỂN THỊ 16x32 ĐIỂM HAI MÀU I. MỤC ĐÍCH Tìm hiểu thiết kế của module hiển thị 16x32 điểm hai màu, và phương pháp điều khiển. II. THIẾT BỊ SỬ DỤNG Module LMD06, LMD09, dây nguồn, dây cáp tín hiệu Nguyên lí làm việc

LMD06 là mô hình của một module hiển thị, dùng để ghép nối nhiều module này với nhau để có một kích thước hiển thị lớn hơn. - Khối đệm hàng: làm nhiệm vụ tiếp nhận dữ liệu của một hàng, bao gồm 1 byte cho màu xanh xen kẽ một byte cho màu đỏ. Khối đệm hàng gồm các IC U21, U22, U23, U24, U25, U26, U27, U28. Mỗi IC là bộ 8 DFF độc lập với nhau nhưng dùng chung đầu vào CLK, mỗi IC có 8 đầu vào D và 8 đầu ra Q. Bốn IC được mắc liên tiếp với nhau, 8 đầu ra của IC U21 nối với 8 đầu vào của U22, tương tự đến U27, U280 như hình vẽ. Đầu vào của khối đệm hàng là đầu vào của U21. Dữ liệu sẽ được đưa vào khối đệm hàng từng byte một (8 bit đồng thời) đi kèm với một xung CLKIN. Khi dữ liệu đã có ở đầu vào DFF, một xung dương CLKIN sẽ làm cho dữ liệu chuyển đến đầu ra và lưu ở đó, đầu ra đó lại được nối đến đầu vào của DFF tiếp theo đồng thời nối đến đầu ra của toàn khối đệm hàng. Khối đệm hàng có 8 đầu vào nối tiếp, 64 đầu ra dịch chuyển, và 8 đầu ra liên tiếp dành cho việc ghép nối với module tiếp theo. Dữ liệu được đưa vào 8 đầu vào nối tiếp nhau 1 byte cho màu xanh và một byte cho màu đỏ, tín hiệu INCLK để đọc vào mỗi byte dữ liệu, và dịch chuyển trên 64 đầu ra. Hoạt động của khối tương tự như thanh ghi dịch. 8 bit dữ liệu đặt vào đầu vào, 1 xung dương CLKIN sẽ dịch 8 bit đó đến 8 đầu ra và nối đến bộ 8 đầu vào tiếp theo, sau 8 lần dịch thì ta đọc được 8 byte và có mặt trên 642 đầu ra. - Khối CHỐT HÀNG làm nhiệm vụ chốt dữ liệu của một hàng ở đầu vào đến đầu ra và giữ chúng ở đầu ra trong thời gian hàng đó hiển thị, bao gồm các IC U13, U14, U15, U16, U17, U18, U19, U20. - Khối ma trận đèn led là một ma đèn led 16x32 điểm, mỗi điểm có 1 đèn màu xanh và một đèn màu đỏ, bao gồm IC U1, U2, U3, U4, U5, U6, U7 và U8, (xem trên sơ đồ nguyên lí và sơ đồ mạch in) mỗi một khối U là một ma trận 8x8 điểm 2 màu 2088DHG. Một cột có 16 led, 16 anode của một cột được nối chung với nhau thành một chân A chung. Một hàng có 32 led, và chia làm hai nửa, 16 cathode của mỗi nửa nối với nhau tạo nên một chân K chung. -

53

- Khối đệm Cathode: làm nhiệm vụ khuyếch đại đảo tín hiệu quét hàng để hút dòng cho cathode của các hàng. Đầu ra khối này được nối đến Cathode chung của các hàng (K). Khối này sử dụng 4 IC 2803 gồm U9, U10, U11 và U12, mỗi ic có 8 cổng ra, mỗi cổng ra nối đến một chân K, một chân K là nối chung của 16 cathode của một nửa hàng. U9, U10 dành cho nửa trái từ K1 đến K16, U11 và 12 cho nửa phải từ K17 đến K32. Toàn bộ khối này co 32 cổng ra chia cho cho nửa là 16 cho bên phải, 16 cho bên trai, tương ứng với 16 hàng cua ma trận led. Khối này có 16 đầu vào, tương ứng 16 hàng. Mỗi đầu vào nhận tín hiệu điều khiển của một hàng, để điều khiển hai đầu ra cho hai nửa của một hàng đó. Khối này đơn giản chỉ là khuyếch đại đảo 16 tín hiệu điều khiển nối đất cho hàng và tách hàng thành hai nửa để đủ công suất điều khiển.

54

Các đầu vào: - 16 tín đầu vào điều khiển hàng tương ứng với 16 hàng của ma trận led - 8 đầu vào dữ liêu - INCLK, tín hiệu xung nhịp cho dữ liệu vào - OUTCLK, tín hiệu xung nhịp cho dữ liệu ra Các đầu ra: - 16 tín đầu ra điều khiển hàng tương ứng với 16 hàng của module tiếp theo - 8 đầu ra dữ liệu, để nối đến 8 đầu vào dữ liệu của module tiếp theo - INCLK, dùng cho module tiếp theo - OUTCLK, dùng cho module tiếp theo Các đầu ra của module này sẽ nối đến đầu vào của module tiếp theo khi ghép

nối nhiều module khác nhau Để hiển thị toàn bộ ma trận led, 16 hàng sẽ lần lượt được luân phiên hiển thị

từ hàng1 đến hàng 16 tương ứng là từ K1và K2_1 đến K16 và K2_16 rồi lặp lại. Tại một thời điểm chỉ có một hàng được hiển thị.

Trước thời điểm bắt đầu hiển thị hàng đầu tiên, dữ liệu của hàng đầu tiên được đưa vào bộ đệm hàng theo trình tự 8 bit một như sau: (D25..D32), (D17..D24), (D9..D16), (D1..D8), với Dn là cho bit dữ liệu cho cột n. Dữ liệu của điểm nào phải được dịch đến đúng vị trí của điểm ấy trước khi chúng được chốt đến các chân A tương ứng. Khi có nhiều module được ghép nối với nhau thì có thể xem tương đương hoàn toàn với một module lớn với số điểm của một hàng dài hơn, và trình tự dịch dịch chuyển dữ liệu vẫn tương tự như trên, nghĩa là dữ liệu của byte cuối hàng sẽ đưa vào trước và dữ liệu byte đầu hàng đưa vào sau cùng. Xung nhịp INCLK được cấp từ bên ngoài vào để đọc mỗi byte dữ liệu đồng thời, khi đã đủ hết dữ liệu rồi thì xung nhịp không được phép làm việc nữa.

Để hiển thị dữ liệu của hàng đầu tiên, sẽ phải có một xung dương OUTCLK để chốt toàn bộ dữ liệu của hàng đầu tiên mà đang tồn tại ở đầu vào bộ CHOTHANG ra các chân A của led matrix, và tín hiệu H1của đầu vào bộ đệm cathode ở mức cao để hiển thị cột đầu tiên, các đầu vào khác ở mức thấp, để bộ đệm cathode nối đất cho cathode của hàng đầu tiên. Khối đệm cathode sẽ khuyếch đại đảo tín hiệu H1=1 và làm cho đầu ra K1 nối đất, để hàng 1 được hiển thị, các hàng còn lại ở trạng thái trở kháng cao nên không sáng. Trạng thái này được duy trì một khoảng thời gian xác định để các led của hàng đầu tiên được hiển thị trong một khoảng thời gian xác định. Khi hết thời gian cho việc hiển thị hàng đầu tiên đầu tiên thì việc hiển thị hàng thứ hai sẽ phải bắt đầu.

55

Việc bắt đầu cho hiển thị hàng thứ 2 hoàn toàn giống như hàng thứ nhất, khi ấy H1 trở về mức thấp, H2 sẽ chuyển lên mức cao, còn lại ở các đầu vào còn lại ở mức thấp hết. Hàng thứ hai cũng sẽ được hiển thị trong một khoảng thời gian xác định và kết thúc Quá trình được diễn ra lặp lại tương tự đối với các hàng sau cho đến hết

hàng16. Kết thúc thời gian hiển thị hàng 16 là hết một chu trình quét toàn bộ LMD,

một chu trình quét mới sẽ lại bắt đầu. III. THỰC HÀNH a. Kiểm tra LMD

- 8 LMD 2088BS đã được gắn lên đế MATRIX1 - Không cấp nguồn cho bảng - Đưa điện áp 0V vào chân K1 (dùng kẹp hoặc cầm tay) - Nối dây từ nguồn 5V nối tiếp với một đầu điện trở 100 Ohm (dùng kẹp

hoặc cầm bằng tay) - Quẹt đầu còn lại của điện trở qua các chốt từ A1 đến A32, khi quẹt quan

sát lmd sẽ thấy các đèn hàng 1 sáng đều lần lượt từ A1 đến A32 là tốt, chứng tỏ không LED nào hỏng và mạch nối đúng cấu hình chân

- Lần lượt làm như thế với các chân từ K2 đến K16, để kiểm tra các hàng còn lại của toàn bộ lmd

b. Kiểm tra bộ đệm cực âm ULN2803 - Giữ nguyên các linh kiện như phần trên - IC ULN2803 đã gắn trên các khối U9, U10, U11, U12 - Nối đất cho bảng, không cấp nguồn. - Dùng một dây nguồn 5V chấm vào chốt A1 - Dùng một dây nguồn 5V khác quẹt qua các chốt từ H1 đến H16, khi quẹt

quan sát thấy các LED của cột tương ứng với A1 sáng đều là U9, U10 tốt - Làm lại như trên với A32 để kiểm tra U11, U12.

c. Khảo sát hoạt động của module - Tất cả các IC được gắn trên module

Chú ý: tất cả các IC phải cắm đúng chiều - Nối chốt nguồn 5V và GND cho bảng (chưa bật nguồn) - Khối điều khiển LMD09 đã có sẵn chương trình lmd05 trên chíp 89s52 - Nối cáp tín hiệu 26 chân từ bảng lmd09 tới lmd05 - Bật nguồn cho cả hai khối. - nếu không có gì sai trên LMD sẽ hiển thị chữ hình mũi tên - dùng máy hiện sóng quan sát tín hiệu tại các chốt DATA, CLKIN,

CLKOUT, D, A, H, K để thấy rõ trình tự của các tín hiệu điều khiển và dữ liệu

d. Sử dụng khối lmd09 lập trình điều khiển thay đổi nội dung hiển thị chữ

56

57

BÀI 7: KHẢO SÁT HOẶT ĐỘNG CỦA BẢNG TIN ĐIỆN TỬ I. MỤC ĐÍCH Làm quen với bảng tin điện tử vừa, làm quen với phần mềm điều khiển bảng tin điện tử từ máy tính. Thực hành cập nhật nội dung, thay đổi font chữ cho bản tin điện tử bằng phần mềm trên máy tính. II. THIẾT BỊ SỬ DỤNG Module LMD07 (bảng tin điện tử), máy tính có cài phần mềm LMD Controller III. THỰC HÀNH 1. Bật bảng tin điện tử Ngay khi vừa cắm nguồn bảng tin sẽ hiển thị nội dung đã lưu từ trước đó với hiệu ứng cuộn ngang. Nội hiển thị này được lưu từ trước đó trong Flash ROM của bộ điều khiển (do lần sử dụng trước đó người dùng đã dùng lệnh Save), khi mới cấp nguồn chương trình sẽ Load nội dung này lên theo trình tự làm việc của phần mềm và thực hiện hiệu ứng cuộn ngang (Roll). 2. Khởi động phần mềm điều khiển Sau khi kích đúp vào file LMDControl.exe bạn sẽ thấy giao diện chương trình như sau:

Từ trên xuống dưới giao diện sử dụng của phần mềm gồm những thành phần sau: - Cửa sổ Preview: là của sổ màu đen để xem bản tin hiển trước khi cho hiển

thị trên bảng điện tử

58

- Khung Display Option gồm có: Nút lệnh Font dùng để chọn font chữ, và ô Message là ô nhập nội dung bản tin hiển thị. Nut lênh Font sẽ cho phép chọn Font, Size, Style của bản tin sẽ hiển thị trên bảng tin điện tử

- Ô Dimension Inf: là ô thông báo kết quả kích thước của bản tin dự đinh hiển thị, kích thước được tính bằng số điểm ảnh của chiều cao và rộng

- Khung Preview gồm: Nut lênh Capture là lệnh thực hiện chuyển đoạn văn bản thành bức ảnh với các điểm ảnh đơn giản (chỉ có màu đỏ và màu đen). Nut lệnh Preview là lênh xem trước bản tin trên máy trước khi cho hiển thị trên bảng tin điện tử. Ô Top Cutting để cắt đi phần trên của bức ảnh bằng số dòng điểm ảnh hiện tại của ô. Ô Bottom Cutting để cắt đi phần dưới của bức ảnh theo số dòng điểm ảnh hiện tại của ô. Ô Threshold dùng để đặt ngưỡng cho chuyển đổi một điểm ảnh nhiều mức thành một điểm ảnh đơn giản (0 hoặc 1).

- Nút lệnh Bit2Byte: mảng bít các điểm ảnh đơn giản thành mảng byte, thực chất là ghép 8 bit thành một byte để truyền đi qua công COM máy tính theo từng byte

- Nut lênh Out Array: là lệnh Truyền Mảng các Byte xuống bảng tin điện tử, lệnh này truyền mảng byte là kết quả chuyển đổi và mã hóa bản tin với định dạng yêu cầu trước đó xuống bảng tin điện tử và yêu cầu bảng tin điện tử hiển thị cố định nội dung của bản tin này (không thực hiện hiệu ứng gì)

- Nút lệnh Roll - Stop dừng hiệu ứng - Save lưu trạng thái hiện tại vào ROM - Load nạp lại nội dung đã lưu 3. Thay đổi nội dung, lưu nội dung cho bảng tin Để thay đổi nội dung làm như sau: - Sau khi khởi động động phần mềm, ô message có nội dung là “Hello! LMD”

kích chuột vào ô message gõ nội dung cần hiển thị (không được bỏ qua, bắt buộc phải gõ gì đó dù một dấu cách rồi lại xóa đi)

- Kích vào Capture, Preview, cửa sổ Preview sẽ hiển thị như hình dưới với thông tin về kích thước ảnh

59

- Nối dây truyền thông RS232 của bảng tin điện tử với cổng COM của máy

tinh - Kích Bit2Byte, Out Array, Bảng điện tử sẽ hiển thị nội dung như Preview - Kích Roll, để thực hiện hiệu ứng cuộn ngang - Kích Stop để thực hiện dừng hiệu ứng - Kích Save để lưu trạng thái hiện tại của bảng vào ROM (trạng thái này sẽ

được giữ lại trong ROM ngay cả khi mất điện) - Kích Load để lấy lại trạng thái đã ghi vào ROM trước đó Để thay đổi Font làm như sau: - Kích vào Font sẽ xuất hiện cửa sổ như hình dưới đây:

60

- Chọn Font, Font style, Size để thay đôi font, kiểu cách, và cơ chữ như mong

muốn, sau đó chọn OK - Kích Capture, Preview, xem lại kết quả chỉnh sửa và thông báo về kích

thước trong ô Dimension Inf - Để hiển thị kết quả mới chọn Bit2byte, Out Array - Nếu sau khi capture thông báo kích thước ảnh lớn hơn kích thước bảng tin

hiện có thì nội dung hiển thị sẽ bị mất đi phần trên của bức ảnh xem trong Preview

- Dùng các điều chỉnh Top cutting, và Bottom Cutting để cắt đinh phần trên và dưới của bức ảnh

- kích Capture để xem thông báo về kích thước ảnh sau mỗi lần chỉnh sửa, lưu ý kích thước thật của bảng hiện có là cao 16 điểm và có thể hiển thị bản tin rộng 256 điểm, một kích thước ảnh rộng hơn sẽ hiển thị bị mất đi phần trên và phần bên phải.

- kich Preview để xem qua Chú ý sau mỗi lần chỉnh sửa nội dung phải kích vào Capture để có nội dung mới, chọn Preview để xem lại nội dung mới, chọn Bit2Byte và Out Array để truyền bản tin ra bảng điện tử

Phụ Lục

61

Mã nguồn chương trình Bài 1: /* Chuong trinh mau lmd1 NTL – viet tren Keil C */ #include <reg51.h> sbit clkIN = 0xB3;//tao xung dich vao bo dem ghi dich sbit DuLieu = 0x97; sbit clkOUT = 0xB4;//tao xung xuat ra dong thoi cua cac bo dem sbit DongBo = 0xB5;//tao xung dong bo hang dau tien, chan nay noi toi dau vao bo ghi dich quet hang void main (void){ char data X[8] = {0xC0,0xD2,0xDA,0xD6,0xD2,0xC0,0xFC,0xFC};// Chữ L và n char TrungGian; int i,j; P1 = 0; while (1){ DongBo = 1; for (i = 0; i <= 7; i++ ) { TrungGian = X[i]; for (j=0; j<=7; j++) { DuLieu = TrungGian%2; //phat bit LSB TrungGian = TrungGian/2; //dich phai clkIN = 1; //tao mot xung vuong kich vao bo dem ghi dich clkIN = 0; } clkOUT = 1; //tao mot xung vuong de bo dem xuat ra dong thoi mot hang clkOUT = 0; //dich xung dong bo hang xuong hang tiep theo DongBo = 0; //tat xung dong bo o cac hang sau } } }

Bài 2:

62

/*chuong trinh thu nghiem lmd2 ------------------------------ dung hai ngat ngoai de dieu khien thay doi du lieu trong mang hien thi. khi co ngat o chan 12 hien thi chu A khi co ngat o chan 13 hien thi chu Z mang char dc khai bao o ngoai -------------------------- Viet tren Keil C NTL */ #include <reg51.h> sbit clkIN = 0xB3;//tao xung dich vao bo dem ghi dich sbit DuLieu = 0x97; sbit clkOUT = 0xB4;//tao xung xuat ra dong thoi cua cac bo dem sbit DongBo = 0xB5;//tao xung dong bo hang dau tien, chan nay noi toi dau vao bo ghi dich quet hang sbit Ngat = 0xAF; //EA sbit Ngatchan12 = 0xA8; //EX0 sbit Ngatchan13 = 0xAA; //EX1 char data X[8] = {0x41,0x63,0x36,0x1c,0x1c,0x36,0x63,0x41}; //du lieu hien thi /*--------------------------------------------------------------------*/ #pragma NOAREGS // ko su dung cac ky hieu thanh ghi tuyet doi cho cac // ham duoc goi tu dich vu ngat static void XuLiNgatChan12 (void) { //chuyen du lieu thanh chu A X[0] = 0x10; //nap du lieu chu A cho bang X X[1] = 0x38; X[2] = 0x6c; X[3] = 0xc6; X[4] = 0xfe; X[5] = 0xc6; X[6] = 0xc6; X[7] = 0xc6; } static void XuLiNgatChan13 (void) { //chuyen du lieu thanh chu Z X[0] = 0x7f; //nap du lieu chu Z cho bang X X[1] = 0x7f; X[2] = 0x06; X[3] = 0x0c; X[4] = 0x18; X[5] = 0x30; X[6] = 0x7f; X[7] = 0x7f;

63

} #pragma AREGS /*--------------------------------------------------------------------*/ void ngatchan12 (void) interrupt 0 using 1{ XuLiNgatChan12 (); //hien thi chi A } void ngatchan13 (void) interrupt 2 using 1{ XuLiNgatChan13 (); //hien thi chi Z } /*--------------------------------------------------------------------*/ void main (void){ char TrungGian; int i,j; Ngat = 1; //cho phep ngat toan cuc Ngatchan12 = 1;//cho phep ngat chan 12 Ngatchan13 = 1;//cho phep ngat chan 13 P1 = 0; while (1){

DongBo = 1; for (i = 7; i >= 0; i-- ) { TrungGian = X[i]; for (j=0; j<=7; j++){ DuLieu = TrungGian%2; //phat bit LSB TrungGian = TrungGian/2; //dich phai clkIN = 1; //tao mot xung vuong kich vao bo dem ghi dich clkIN = 0; } clkOUT = 1; //tao mot xung vuong de bo dem xuat ra dong thoi mot hang clkOUT = 0; //dich xung dong bo hang xuong hang tiep theo DongBo = 0; //tat xung dong bo o cac hang sau } } } Bài 3: /*chuong trinh thu nghiem lmd3 ---------------------------------- hien thi chu A

64

----------------------------------- NTL */ #include <reg51.h> //cac chan tin hieu dieu khien sbit clkIN = 0xB3;//tao xung dich vao bo dem ghi dich sbit DuLieu = 0x97; sbit clkOUT = 0xB4;//tao xung xuat ra dong thoi cua cac bo dem sbit DongBo = 0xB5;//tao xung dong bo hang dau tien, chan nay noi toi dau vao bo ghi dich quet hang //cac bit cho phep ngat sbit Ngat = 0xAF; //EA sbit Ngatchan12 = 0xA8; //EX0 sbit Ngatchan13 = 0xAA; //EX1 sbit NgatDinhthoi0 = 0xA9; // bang du lieu khoi tao //day la bang du lieu toan cuc char data X[24] = { 0xFF,0xEF,0xD7, 0xBB,0x83,0xBB, 0xBB,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF }; int hang,cot; bit msb,lsb; void main (void){ char TrungGian; int i,j; hang = 0; cot = 2; P1 = 0; while (1) { DongBo = 1; for (i = 0; i <= 23; i++ ) { TrungGian = X[i]; for (j=0; j<=7; j++) { DuLieu = TrungGian%2; //phat bit LSB TrungGian = TrungGian/2; //dich phai

clkIN = 1; //tao mot xung vuong kich vao dem ghi dich clkIN = 0;

} clkOUT = 1; //tao mot xung vuong de bo dem xuat ra dong thoi mot hang clkOUT = 0; //dich xung dong bo hang xuong hang tiep theo

65

DongBo = 0; //tat xung dong bo o cac hang sau } } } Bài 4: /*chuong trinh thu nghiem lmd4 */ #include <reg51.h> //cac chan tin hieu dieu khien sbit clkIN = 0xB3; sbit DuLieu = 0x97; sbit clkOUT = 0xB4; sbit DongBo = 0xB5; //cac bit cho phep ngat // bang du lieu khoi tao //day la bang du lieu toan cuc char data X[64] = { 0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00, 0x80,0x01,0x00,0x00, 0xc0,0x01,0x00,0x00, 0xe0,0x01,0x00,0x00, 0xb0,0xff,0xff,0x3f, 0x98,0xff,0xff,0x3f, 0x0c,0x00,0x00,0x30, 0x0c,0x00,0x00,0x30, 0x98,0xff,0xff,0x3f, 0xb0,0xff,0xff,0x3f, 0xe0,0x01,0x00,0x00, 0xc0,0x01,0x00,0x00, 0x80,0x01,0x00,0x00, 0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00 }; /*--------------------------------------------------------------------*/ /*sau day la chuong trinh chinh 1. NHIEM VU: - khai bao, khoi tao khoi tao mang hien thi khoi tao cac biet dieu khien chi so mang de phuc vu xuat mang khoi tao tin hieu dieu khien - dieu khien xuat mang theo vong lap vo han 2. GIAI THUAT 3. Danh sach cac bien, du lieu tac dong - du lieu toan cuc + mang du lieu hien thi: X + Cac chan tin hieu dieu khien port1: Dulieu chan dieu khien xung dich vao bo dem: clkIN chan dieu khien xung dich ra bo dem: clkOUT

66

chan tao xung dong bo hang dau tien: DongBo - Du lieu cuc bo Bien trung gian xac dinh tri so mang: chiso bien dung de dem so byte trong 1 hang, dung cho viec phat 1 hang: k bien dung de dem so hang trong anh, dung cho viec phat 1 hang: i */ void main (void){ int i,k,chiso; while (1){ DongBo = 1; for (i = 0; i <= 15; i++ ) { for (k=0; k<=3; k++) { chiso = i*4 + k; DuLieu = X[chiso]; clkIN = 1; //tao mot xung vuong kich vao bo dem ghi dich clkIN = 0; } clkOUT = 1; //tao mot xung vuong de bo dem xuat ra dong thoi mot hang clkOUT = 0; //dich xung dong bo hang xuong hang tiep theo DongBo = 0; //tat xung dong bo o cac hang sau } } } Bài 5: /*chuong trinh thu nghiem lmd5 --- "CHAY TOT !!!" dieu khien mach quet led co so do phan cung nhu ... dieu khien quet led bang ngat dinh thoi moi khi say ra ngat dinh thoi 0 chuong trinh se xuat ra mot hang dua vao bien ChiSo va chot giu. cu the viec do la - xuat ra lien tuc cac byte cua hang do xe ke xung clkIN - sau khi xuat het cac byte thi xuat ra mot xung clkOUT ChiSo la bien toan cuc dc khoi tao do chuong trinh chinh neu ChiSo bang 0, tuc la hang dau tien dc xuat, khi ay xuat ra DongBo = 1 neu ChiSo khac 0 thi xuat ra mot ra DongBo = 0 sau khi xuat het so byte kiem tra neu ChiSo = 63 thi dua tro ve 0 cong P1 xuat ra song song DuLieu cac chan 21, 22, 23 (p20, p21, p22) dieu khien clkIN, clkOUT, DongBo mang char dc khai bao o ngoai */ #include <reg51.h> //cac chan tin hieu dieu khien sfr DuLieu = 0x90; //chan 1,2,3,4,5,6,7,8 cong P1 cua 8951 duong dl song song noi den dau vao bo dem ghi dich

67

sbit clkIN = 0xA0; //chan 21 8951 tao xung dich vao bo dem ghi dich sbit clkOUT = 0xA1; //chan 22 8951 tao xung xuat ra dong thoi cua bo dem sbit DongBo = 0xA2; //chan 23 8951 tao xung dong bo hang dau tien, chan nay noi toi dau vao bo ghi dich quet hang //cac thanh ghi va bit chuc nang dac biet sfr CheDoDinhThoi = 0x89; sfr ByteThapDinhThoi0 = 0x8A; sfr ByteCaoDinhThoi0 = 0x8C; sbit BatDinhThoi0 = 0x8C; //cac bit cho phep ngat sbit Ngat = 0xAF; //EA sbit NgatDinhthoi0 = 0xA9; //DINH NGHIA CAC THAM SO KICH THUOC BANG, THOI GIAN QUET #define BeRong 4 //so byte cua mot hang #define ChieuCao 16 //so hang #define SoByteMang 64 //so byte cua mang hien thi X #define SoLanNgat 5 //so lan say ra ngat dinh thoi #define SoDemDinhThoi 256 //so xung nhip dinh thoi can dem // bang du lieu khoi tao // 16 11 1985 char data X[SoByteMang] = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x00, 0x00,0x00,0x49,0x00, 0xFF,0xFF,0x49,0xFF, 0x40,0x40,0x49,0x40, 0x20,0x20,0x25,0x20, 0x00,0x00,0x1E,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x8c,0x6E,0x7C,0x00, 0x92,0x91,0xA2,0x00, 0xA1,0x91,0x91,0xFF, 0xA1,0x91,0x91,0x40, 0xA1,0x91,0x91,0x20, 0x72,0x6E,0x62,0x00, 0x00,0x00,0x00,0x00 }; /*--------------------------------------------------------------------*/ int ChiSo,n;//chi so mang va bien n de dem so lan say ra ngat /*--------------------------------------------------------------------*/ #pragma NOAREGS // ko su dung cac ky hieu thanh ghi tuyet doi cho cac // ham duoc goi tu dich vu ngat /*----------------------------------*/ static void XuLiNgatDinhThoi0 (void) //xuat ra mot hang thu x /*day la chuong chinh con phuc vu ngat dinh thoi 0 nhiem vu cua chuong trinh con nay la: - dem so lan say ra ngat dinh thoi qua bien n - khi n < 100 thi tang len 1 ket thuc - khi n = 100 thi xuat ra hang ket thuc viec xuat ra mot hang dua vao bien ChiSo. bien ChiSo ban dau dc main gan la 0, la chi so cua byte dau hang

68

+ kietm tra neu la hang dau tien (n==0) thi DongBo=0, nguoc lai =1 + su dung vong lap voi so vong la so byte cua hang moi chu trinh lap se xuat ra mot byte, va clkIN, tang ChiSo + ket thuc vong lap thi xuat ra mot xung chot clkOUT, va chi so da tro den hang tiep theo + kiem tra neu xuat het mang (chiso=SoByteMang) thi gan lai chiso=0 */ { int k; //bien dem so byte trong mot hang if (n==SoLanNgat) //neu ngat SoLanNgat lan thi { n=0; //dem lai tu 0 voi lan sau if (ChiSo==0) {DongBo = 1;}//DongBo=1 o hang dau tien else {DongBo = 0;}// =0 cac hang sau for (k=1; k<=BeRong; k++) //va xuat ra mot hang { DuLieu = X[ChiSo]; clkIN = 1; //tao mot xung vuong kich vao bo dem ghi dich clkIN = 0; ChiSo++; //tang chi so len 1, } //ket thuc for chi so se tang len 4 clkOUT = 1; //tao mot xung vuong de bo dem xuat ra dong thoi mot hang clkOUT = 0; //dich xung dong bo hang xuong hang tiep theo if (ChiSo > (SoByteMang-1)) {ChiSo=0;} } else //neu n < 100 thi { n++;//tiep tuc dem so lan ngat } } #pragma AREGS /*--------------------------------------------------------------------*/ void NgatDinhThoi0 (void) interrupt 1 using 1 { XuLiNgatDinhThoi0 (); //dich 1 cot tu trai qua phai } /*--------------------------------------------------------------------*/ /*sau day la chuong trinh chinh 1. NHIEM VU: + khoi tao cac gia tri bien: khoi tao bien dieu khien chi so mang ChiSo de phuc vu xuat mang khoi tao bien dem n de tinh toc do ngat + thiet lap cac che do ngat va dinh thoi cho phep ngat toan cuc cho phep ngat dinh thoi 2. GIAI THUAT 3. Danh sach cac bien, du lieu tac dong Bit cho phep ngat toan cuc: Ngat Bit cho phep ngat dinh thoi 0: Ngatdinhthoi0 Bien trung gian xac dinh tri so mang: chiso Bien dem so lan say ra ngat: n Gia tri thanh ghi dinh thoi */ void main (void){ //khoi tao ChiSo = 0; //khoi tao chi so cua mang

69

n = 0; //khoi tao bien dem so lan ngat //thiet lamp che do cho dinh thoi CheDoDinhThoi = (CheDoDinhThoi & 0xf0) | 0x02;

// thiet lap che do tu dong lap lai 8 bit cho T0 ByteCaoDinhThoi0 = 256 - SoDemDinhThoi;

// nap lai cho TL0 de dem SoDemDinhThoi xung nhip he thong ByteThapDinhThoi0 = ByteCaoDinhThoi0; //khoi dong he thong Ngat = 1; //cho phep ngat toan cuc NgatDinhthoi0 = 1;//cho phep ngat dinh thoi 0 BatDinhThoi0 = 1; // khoi dong dinh thoi 0 //doi while (1); } Bài 6: /*chuong trinh thu nghiem lmd6 --- "CHAY TOT !!!" dieu khien mach quet led co so do phan cung nhu ... dieu khien quet led bang ngat dinh thoi tao hieu ung dich chuyen ngang moi khi say ra ngat dinh thoi 0 chuong trinh se xuat ra mot hang dua vao bien ChiSo va chot giu. cu the viec do la - xuat ra lien tuc cac byte cua hang do xe ke xung clkIN - sau khi xuat het cac byte thi xuat ra mot xung clkOUT ChiSo la bien toan cuc dc khoi tao do chuong trinh chinh neu ChiSo bang 0, tuc la hang dau tien dc xuat, khi ay xuat ra DongBo = 1 neu ChiSo khac 0 thi xuat ra mot ra DongBo = 0 sau khi xuat het so byte kiem tra neu ChiSo = 63 thi dua tro ve 0 cong P1 xuat ra song song DuLieu mang char dc khai bao o ngoai */ #include <reg51.h> //cac chan tin hieu dieu khien sbit clkIN = 0xB3;//tao xung dich vao bo dem ghi dich sfr DuLieu = 0x90; sbit clkOUT = 0xB4;//tao xung xuat ra dong thoi cua cac bo dem sbit DongBo = 0xB5;//tao xung dong bo hang dau tien, chan nay noi toi dau vao bo ghi dich quet hang //cac thanh ghi va bit chuc nang dac biet sfr CheDoDinhThoi = 0x89; sfr ByteThapDinhThoi0 = 0x8A;

70

sfr ByteCaoDinhThoi0 = 0x8C; sbit BatDinhThoi0 = 0x8C; //cac bit cho phep ngat sbit Ngat = 0xAF; sbit NgatDinhthoi0 = 0xA9; //DINH NGHIA CAC THAM SO KICH THUOC BANG, THOI GIAN QUET #define BeRong 4 //so byte cua mot hang #define ChieuCao 16 //so hang #define SoByteMang 64 //BeRong * ChieuCao = so byte cua mang hien thi X #define NgatDu 5 //so lan say ra ngat dinh thoi #define SoDemDinhThoi 256 //so xung nhip dinh thoi can dem // bang du lieu khoi tao char code KhoiTao[SoByteMang] ={0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00, 0x80,0x01,0x00,0x00, 0xc0,0x01,0x00,0x00, 0xe0,0x01,0x00,0x00, 0xb0,0xff,0xff,0x3f, 0x98,0xff,0xff,0x3f, 0x0c,0x00,0x00,0x30, 0x0c,0x00,0x00,0x30, 0x98,0xff,0xff,0x3f, 0xb0,0xff,0xff,0x3f, 0xe0,0x01,0x00,0x00, 0xc0,0x01,0x00,0x00, 0x80,0x01,0x00,0x00, 0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00 }; char idata X[SoByteMang]; char bdata ThanhGhiTrungGian; //day la thanh ghi trung gian truy cap bit sbit BitThapNhat= ThanhGhiTrungGian ^ 0; sbit BitCaoNhat = ThanhGhiTrungGian ^ 7; bit BitRa;//bit chua bit di ra tu bit dau hang bit BitVao;//bit chua bit di Vao cuoi hang /*--------------------------------------------------------------------*/ int ChiSo,DemSoLanNgatT0;//chi so mang va bien n de dem so lan say ra ngat int SoDongDaXuat; /*--------------------------------------------------------------------*/ #pragma NOAREGS // ko su dung cac ky hieu thanh ghi tuyet doi cho cac // ham duoc goi tu dich vu ngat /*----------------------------------*/ static void XuLiNgatDinhThoi0 (void) //xuat ra mot hang thu x /*day la chuong chinh con phuc vu ngat dinh thoi 0 nhiem vu cua chuong trinh con nay la: - dem so lan say ra ngat dinh thoi qua bien n

71

- khi n < SoLanNgat thi tang len 1 ket thuc - khi n = SoLanNgat thi xuat ra hang ket thuc viec xuat ra mot hang dua vao bien ChiSo. bien ChiSo ban dau dc main gan la 0, la chi so cua byte dau hang + kietm tra neu la hang dau tien (n==0) thi DongBo=0, nguoc lai =1 + su dung vong lap voi so vong la so byte cua hang moi chu trinh lap se xuat ra mot byte, va clkIN, tang ChiSo + ket thuc vong lap thi xuat ra mot xung chot clkOUT, va chi so da tro den hang tiep theo + kiem tra neu xuat het mang (chiso=SoByteMang) thi gan lai chiso=0 */ { int k; //bien dem so byte trong mot hang if (++DemSoLanNgatT0==NgatDu) //neu ngat SoLanNgat lan thi { DemSoLanNgatT0=0; //dem lai tu 0 voi lan sau SoDongDaXuat++; if (ChiSo==0) {DongBo = 1;}//DongBo=1 o hang dau tien else {DongBo = 0;}// =0 cac hang sau for (k=1; k<=BeRong; k++) //va xuat ra mot hang { DuLieu = X[ChiSo]; clkIN = 1; //tao mot xung vuong kich vao bo dem ghi dich clkIN = 0; ChiSo++; //tang chi so len 1, } //ket thuc for chi so se tang len 4 clkOUT = 1; //tao mot xung vuong de bo dem xuat ra dong thoi mot hang clkOUT = 0; //dich xung dong bo hang xuong hang tiep theo if (ChiSo > (SoByteMang-1)) {ChiSo=0;} } } #pragma AREGS /*--------------------------------------------------------------------*/ void NgatDinhThoi0 (void) interrupt 1 using 1 { XuLiNgatDinhThoi0 (); //dich 1 cot tu trai qua phai } /*--------------------------------------------------------------------*/ void Quay1DiemCho1Hang (int SoHang)//so hang bat dau tu 1 den 16 /*day la thu tuc dich chuyen mot hang thu tuc nay se lam cho mot hang quay di mot cot theo giai thuat sau: - ve dau hang - chep bit dau hang - thuc hien vong lap quay cac byte tu cuoi hang den dau hang co kem theo bit dau hang + chep byte vao ThanhGhiTrungGian + dich trai (*2) + BitVao->BitThapNhat + BitRa ->BitVao + nhay den byte tiep theo thuc hien tiep chu trinh */ { int SoByte; ThanhGhiTrungGian = X[SoHang*BeRong - 1]; //chep Byte dau hang vao ThanhGhiTrungGian

72

BitVao = BitCaoNhat; //chep bit dau hang vao BitTrungGian for (SoByte=0; SoByte<BeRong; SoByte++)//thuc hien vong lap quay cac byte tu cuoi { //hang den dau hang co kem theo bit dau hang ThanhGhiTrungGian = X[(SoHang-1)*BeRong + SoByte];//chep byte dang tro BitRa = BitCaoNhat; //chep bit Cao nhat truoc khi dich ThanhGhiTrungGian *=2; //dich trai if (BitVao) {ThanhGhiTrungGian++;} BitVao = BitRa; X[(SoHang-1)*BeRong + SoByte] = ThanhGhiTrungGian; } } /*--------------------------------------------------------------------*/ /*sau day la chuong trinh chinh 1. NHIEM VU: + khoi tao cac gia tri bien: khoi tao bien dieu khien chi so mang ChiSo de phuc vu xuat mang khoi tao bien dem n de tinh toc do ngat + thiet lap cac che do ngat va dinh thoi cho phep ngat toan cuc cho phep ngat dinh thoi 2. GIAI THUAT 3. Danh sach cac bien, du lieu tac dong Bit cho phep ngat toan cuc: Ngat Bit cho phep ngat dinh thoi 0: Ngatdinhthoi0 Bien trung gian xac dinh tri so mang: chiso Bien dem so lan say ra ngat: n Gia tri thanh ghi dinh thoi */ void main (void) { int Hang;//bien mang mang chi so hang //khoi tao SoDongDaXuat=0; ThanhGhiTrungGian = 0; ChiSo = 0; //khoi tao chi so cua mang DemSoLanNgatT0 = 0; //khoi tao bien dem so lan ngat for (Hang=0; Hang<=SoByteMang; Hang++)//nap du lieu khoi tao {X[Hang] = KhoiTao[Hang];} //thiet lamp che do cho dinh thoi CheDoDinhThoi = (CheDoDinhThoi & 0xf0) | 0x02; // thiet lap che do tu dong lap lai 8 bit cho T0 ByteCaoDinhThoi0 = 256 - SoDemDinhThoi; // nap lai cho TL0 de dem SoDemDinhThoi xung nhip he thong ByteThapDinhThoi0 = ByteCaoDinhThoi0; //khoi dong he thong Ngat = 1; //cho phep ngat toan cuc NgatDinhthoi0 = 1;//cho phep ngat dinh thoi 0 BatDinhThoi0 = 1; // khoi dong dinh thoi 0 //vong lap thuc hien hieu ung dich chuyen while (1) { if (SoDongDaXuat==48) //neu da dc 48 dong

73

{ SoDongDaXuat=0; //xoa for ( Hang=1; Hang<=16; Hang++) //dich ca hinh di 1 cot {Quay1DiemCho1Hang(Hang);} }; }; }

74

MỤC LỤC

PHẦN I: MÔ TẢ THIẾT BỊ ------------------------------------------------------------------------------------ 74

I. GIỚI THIỆU HỆ THỐNG ----------------------------------------------------------------------------------- 75

II. MÔ TẢ CÁC THÀNH PHẦN CỦA HỆ THỐNG ----------------------------------------------- 77 DIP SWITCH (DIPSW) ------------------------------------------------------------------------------------------77

JUMPERs--------------------------------------------------------------------------------------------------------- 77

MCU SOCKETs ----------------------------------------------------------------------------------------------- 79

POWER SUPPLY ---------------------------------------------------------------------------------------------------82

ON-BOARD PROGRAMMER-------------------------------------------------------------------------------83

REAL TIME CLOCK (RTC) DS1307--------------------------------------------------------------------84

RS-232 COMMUNICATION ---------------------------------------------------------------------------------85

USB COMMUNICATION--------------------------------------------------------------------------------------86

PS/2 COMMUNICATION--------------------------------------------------------------------------------------87

DS1820 DIGITAL THERMOMETER -------------------------------------------------------------------88

A-D CONVERTER INPUT ------------------------------------------------------------------------------------89

DIRECT PORT ACCESS ---------------------------------------------------------------------------------------90

PHẦN II: THỰC HÀNH ----------------------------------------------------------------------------------------- 91

BÀI THỰC HÀNH SỐ 1: SỬ DỤNG PHẦN MỀM WINPIC800 TRUY CẬP CỔNG VÀO RA SỐ VÀ ĐIỀU KHIỂN LED 7 DOẠN--------------------------------------------------------- 91

I. MỤC ĐÍCH -------------------------------------------------------------------------------------------------- 91 II. CHUẨN BỊ -------------------------------------------------------------------------------------------------- 91

III. THỰC HÀNH -------------------------------------------------------------------------------------------- 91

BÀI THỰC HÀNH SỐ 2: BIẾN ĐỔI ADC, ĐO ĐIỆN ÁP, NHIỆT ĐỘ HIỂN THỊ TRÊN LED VÀ TRUYỀN THÔNG QUA RS232 ----------------------------------------------------- 99

I. MỤC ĐÍCH -------------------------------------------------------------------------------------------------- 99

II. CHUẨN BỊ -------------------------------------------------------------------------------------------------- 99

III. THỰC HÀNH -------------------------------------------------------------------------------------------- 99

BÀI THỰC HÀNH SỐ 3: ĐỌC PHÍM BẤM, ĐIỀU KHIỂN RELAY VÀ ĐỌC THỜI GIAN THỰC DS1307 HIỂN THỊ TRÊN LEB 7 ĐOẠN ------------------------------------------103

I. MỤC ĐÍCH -------------------------------------------------------------------------------------------------103

II. CHUẨN BỊ -------------------------------------------------------------------------------------------------103

III. THỰC HÀNH -------------------------------------------------------------------------------------------103 PHỤ LỤC: MỘT SỐ MÃ NGUỒN MẪU------------------------------------------------------32

PHẦN I: MÔ TẢ THIẾT BỊ

75

I. GIỚI THIỆU HỆ THỐNG

HẾ THỐNG ĐÀO TẠO PIC (PIC.TS) là board mạch đầy đủ các công cụ cho việc học tập và nghiên cứu vi điều khiển PIC của Microchip. Sinh viên dễ dàng thực hành, kiểm tra và đánh giá khả năng của vi điều khiển PIC. PIC.TS cho phép PIC giao tiếp với một số lượng lớn các thiết bị ngoại vi và mạch ngoài. Với PIC.TS, sinh viên không còn lo lắng về phần cứng mà chỉ cần tập trung vào việc phát triển phần mềm. Trên PIC.TS, mỗi thành phần được in thẳng trên board mạch rất rõ ràng đánh dấu sự mô tả kết nối đến các thiết bị cùng một vài ghi chú hữu ích.

Hình 1.1 - PIC.TS

76

Hình 1.2 - Sơ đồ nguyên lí PIC.TS

77

II. MÔ TẢ CÁC THÀNH PHẦN CỦA HỆ THỐNG

1. DIP SWITCH (DIPSW)

PIC.TS có đặc tính là kết nối với nhiều thiết vị ngoại vi. Để kết nối những thiết bị này trước khi lập trình, cần phải kiểm tra và thiết đặt của các jumper và DIPSW.

DIPSW là linh kiện tập hợp nhiều switch có 2 vị trí ON và OFF dùng để nối hoặc ngắt giữa 2 chân với nhau. PIC.TS có 2 DIPSW.

DIPSW1 cho phép kết nối giữa các port của PIC (PORTA và PORTE) với điện trở pull-up/down bên ngoài. Các điện trở pull-up/down phải được tách rời ra khi các chân của các port này dùng làm ngõ vào Analog vì làm ảnh hưởng đến mức điện áp đầu vào. Khi các chân của PORTA và PORTE sử dụng như digital inputs/outputs thì những điện trở pull-up/down lại thích hợp và được cho phép.

Sáu switches đầu của DIPSW2 cho phép kết nối tới PortA để điều khiển 6 LED 7 đoạn (7-Segment display). Nếu không cần 7-seg Display trong bài tập thì các SW này cần phải OFF.

Hai switches đầu của SW2 cho phép kết nối DS1307 đến chân RC4 và RC3 của PIC. Khi không có nhu cầu sử dụng DS1307 thì nên đưa các SW này về vị trí OFF.

Hình 1.3 - Dip switch

78

2. JUMPERs

Jumpers cũng giống như switches, có thể ngắt hoặc nối hai điểm với nhau. Bên trong vỏ bọc nhựa của jumper là một lá kim loại dùng để tiếp xúc. Nó sẽ nối (dẫn điện) nếu jumper này được gắn vào hai pin đang bị ngắt.

Ví dụ: Hai biến trở trong mạch ADC được ngắt rời với RA2 và RA3. Để nối chúng với nhau cần sử dụng jumper.

Hình 1.4 - Jumper như một Switch

Các jumper cũng thường được sử dụng để lựa chọn giữa hai kết nối. Như minh họa trong hình dưới, điểm giữa được nối với bên phải hoặc bên trái tuỳ thuộc vào vị trí của jumper.

Hình 1.5 – Lựa chọn kết nối với jumper

79

2. MCU SOCKETs

PIC.TS được thiết kế sử dụng cho các loại vi điều khiển PIC 16F và 18F. Người sử dụng có thể dùng các PIC khác nhau thích hợp cho công việc của mình có các kiểu chân phù hợp với socket DIP40, DIP28, DIP18.

Hình 1.6 - MCU socket

Chú ý: Tất cả các sockets trên được nối song song với nhau, vì vậy trong cùng một thời điểm bạn chỉ có thể sử dụng được một vi điều khiển PIC mà thôi.

Chân MCU được sử dụng để nối đến nhiêu thiết bị ngoại vi như được minh hoạ trong Hình 1.8. Do đó tất cả các port đều kết nối trực tiếp đến những đầu nối 5x2. Những đầu nối như vậy cho phép mở rộng kết nối đến các thiết bị ngoại vi bên ngoài hoặc hữu ích cho việc kết nối với các đầu dò digital logic.

Tất cả các ports đều được nối đến điện trở pull-ip/down và được đánh số ghi chú rất chi tiết để dễ dàng cho việc kiểm tra và đo thử.

Một vài chân được kết nối tới các thiết bị ngoại vi khác như DS1820 temperature sensor, RS-232 communication, 7-segment displays, LCD.

80

Hình 1.8 - Sự kết nối hệ thống

PIC.TS có một nút bấm sử dụng cho mục đích RESET, sơ đồ mạch RESET được nhìn thấy trong hình dưới.

Hình 1.9 – Sơ đồ mạch reset

81

82

3. POWER SUPPLY

Để hệ thống làm việc cần phải cấp nguồn. PIC.TS có thể hoạch động bằng nguồn ngoài hoặc được cung cấp qua cable USB.

Trong trường hợp cấp nguồn qua USB, hệ thống phải được nối với PC bằng cable USB và công tắc nguồn phải được gạt về phía USB. Lưu ý là việc cấp nguồn qua USB chỉ sử dụng khi chạy thử chương trình. Khi nạp chương trình cho chip bạn phải sử dụng nguồn ngoài. Khi sử dụng nguồn ngoài, PIC.TS sẽ tạo ra điện áp +5V cấp cho hệ thống và điện áp +13V dùng làm điện áp lập trình chip.

Hình 1.10 – Lựa chọn nguồn cung cấp

Power supply swiches

Power supply connector

83

4. ON-BOARD PROGRAMMER

Không cần sử dụng bất kỳ mạch nạp nào khác, PIC.TS có riêng một mạch nạp on-board rất tiện lợi và dễ sử dụng. Bạn chỉ cần cắm cáp kết nối đến PC qua cổng LPT.

Hình 1.11 –Mạch nạp

Đây là mạch nạp giao tiếp qua cổng máy in sử dụng phần mềm WinPIC800 có độ ổn định cao, tốc độ nhanh, hỗ trợ rất nhiều PIC.

M ch n p cho PIC trên PIC.TS

Cáp k t n i

84

5. REAL TIME CLOCK (RTC) DS1307

PIC.TS sử dụng đồng hồ thời gian thực DS1307 giao tiếp chuẩn I2C với vi điều khiển PIC. Hai chân SCL và SDA nối với RC3 và RC4 qua SW2. Pin CMOS dùng nuôi DS1307 khi ngắt nguồn.

Hình 1.12 – Sơ đồ kết nối DS1307

RTC DS1307

Pin Cmos

85

RS-232 communiction

6. RS-232 COMMUNICATION Truyền thông RS-232 cho phép truyền dữ liệu điểm tới điểm. RS232 thường được

dùng trong các ứng dụng giao tiếp truyền thông giữa giữa vi điều khiển và máy tính. Mức điện áp giữa vi điều khiển và máy tính không thích hợp nhau. Do vậy bộ đệm Max-232 được sử dụng. Để sử dụng linh hoạt hơn, trên PIC.TS vi điều khiển được nối tới Max232 qua cặp jumper JP_TX và JP_TD. Jumper JP_RX được sử dụng để nối tới đường Rx tới RC7, RB2 hoặc RB1. Jumper JP_TX được sử dụng để nối tới đường Tx tới RC6, RB5 hoặc RB2. Chú ý: JP5 và JP6 không được nối cùng lúc đến RB2.

Hình 1.13 - Kết nối PIC với máy tính

86

7. USB COMMUNICATION

PIC.TS có một cổng USB. Nó được sử dụng cho những loại vi điều khiển PIC đặc biệt có hỗ trợ giao tiếo USB như 18F2450, 18F2550, 18F4550… ngoài khả năng giao tiếp USB nó còn là bộ phận cấp nguồn 5V cho chế độ chạy thử (không sử dụng được nguồn USB ở chế độ nạp).

Để kết nối giữa vi điều khiển và socket USB cần phải nối cả 3 jumpers JP17, JP18 và JP19 lên phía trên. Kết quả là vi điều khiển có RC3, RC4 và RC5 được tách ra khỏi các phần tử khác trên board và nối với socket USB.

Hình 1.14 – Sơ đồ kết nối truyền thông USB

USB communication connector

87

8. PS/2 COMMUNICATION

Đầu nối PS/2 cho phép kết nối trực tiếp giữa PIC.TS với những thiết bị có sử dụng giao tiếp PS/2 như PC, bàn phím hoặc chuột. Ví dụ: vi điều khiển được nối với bàn phím để đọc những phím được nhấn hoặc kết nối với PC để hoạt động như một bàn phím. Đường DATA cà CLK được sử dụng cho việc truyền dữ liệu. Trong trường hợp này chúng được nối tới những pin tương ứng RC1 và RC0 của vi điều khiển.

Hình 1.15 – Sơ đồ kết nối PS/2 với vi điều khiển

88

9. DS1820 DIGITAL THERMOMETER

DS1820 là IC cảm biến nhiệt độ dạng số rất tốt cho việc đo nhiệt độ môi trường với dải nhiệt độ đo rộng -55OC đến 125OC với độ chính xác +/- 0.5OC. Nó phải được đặt chính xác trong socket 3 chân và đúng chiều với hình vẽ in trên PIC.TS. Nếu không DS1820 có thể bị hỏng. Chân data của DS1820 có thể nối tới pin RA5 hoặc RE2 của vi điều khiển PIC bởi jumper JP14.

Hình 1.16 – Sơ đồ kết nối DS18b20 với vi điều khiển

89

10. A-D CONVERTER INPUT

Board phát triển Kit phát triển Vi điều khiển PIC có 2 biến trở để làm việc với Analog to Digital converter – ADC. Biến trở P1 thì hoạt động khi Jumper JP 15 được chọn gắn vào cho tín hiệu analog đến chân RA2 của Microcontroller. Biến trở P2 thì hoạt động khi jumper JP16 được chọn gắn vào cho tín hiệu analog đến chân RA3 của microcontroller. Cả 2 đầu ra analog của biến trở trong phạm vi 0V đến 5V.

Hình 1.17 - ADC Converter input

Để đo tín hiệu tương tự các jumper pull-up/down của PORTA cần phải được loại bỏ. Các chân của PORTA không kết nối tới bất cứ các thành phần thiết bị nào khác.

Ứng dụng chuyển đổi tương tự - số khác nhau, vi điều khiển nhận tín hiệu tương tự từ chân đầu vào và chuyển nó thành tín hiệu số. Về cơ bản, bạn có thể đo bất kỳ tín hiệu tương tự nào trong phạm vi 0 ÷ 5V

Hình 1.18 – Sơ đồ kết nối khi đo ADC

90

11. DIRECT PORT ACCESS

Tất cả các pin vào/ra của microcontroller có thể được truy cập trực tiếp qua các đầu nối đặt bên mép phải của PIC.TS cho mỗi PORTA, PORTB, PORTC, PORTD và PORTE. Đây là socket 10-pin (5x2) cung cấp VDD, GND và 8 pin port kết nối với bên ngoài bằng cáp kết nối.

Những đầu nối này sử dụng cho việc mở rộng hệ thống với những board mở rộng hệ thống bên ngoài và cần bảo đảm những thiết bị ngoại vi trên board phải được tách ra bằng việc đặt các jumper thích hợp khi thiết bị ngoại vi bên ngoài cũng dùng chân đó.

Những đầu nối cũng có thể sử dụng để gắn đầu dò logic hoặc các thiết bị đo thử khác.

Hình 1.19 - Sơ đồ kết nối PORTB

91

PHẦN II: THỰC HÀNH

Bài thực hành số 1 SỬ DỤNG PHẦN MỀM WINPIC800

TRUY CẬP CỔNG VÀO RA SỐ VÀ ĐIỀU KHIỂN LED 7 DOẠN I. MỤC ĐÍCH

- Làm quen với phần mềm WinPIC800, biết cách sử dụng phần mềm và mạch nạp có sẵn trên PIC.TS để nạp chương trình cho PIC.

- Tìm hiểu các cổng vào ra của vi điều khiển PIC16f877A. - Viết chương trình điều khiển các cổng vào ra, thực hiện giải mã và hiển thị các số

từ 0 ÷ 9 trên leb 7 thanh.

II. CHUẨN BỊ - Máy tính có cài chương trình WinPIC800, trình dịch CCS, HT-PIC. - PIC.TS và các module, vi điều khiển PIC16F877A, đồng hồ đo, cáp nguồn, cáp

kết nối. - Lý thuyết về lập trình C, lập trình C cho PIC trên CCS, HT-PIC… - Giải mã và hiển thị với led 7 thanh.

III. THỰC HÀNH 1. Nạp chương trình cho PIC bằng phần mềm WinPIC Trên PIC.TS được thiết kế sẵn một mạch nạp do đó sẽ không cần bất kỳ mạch nạp nào từ bên ngoài. Mặt khác với mạch nạp sẵn có này bạn không cần phải tháo chip nhiều lần tránh các phiền phức và hư hỏng vật lý.

Phần mền WinPIC800 đi cùng không cần cài đặt có thể sử dụng ngay rất tiện lợi. Nhấn dúp vào biểu tượng WinPIC800 trên desktop hoặc file WinPIC800.exe trong thư mục WinPIC800. Cửa sổ chương trình WinPIC800 hiện lên:

Hình 2.1 – Giao diện WinPIC800

92

Nhấn vào menu Settings ->Hardware để chọn cấu hình sử dụng WinPIC800 cho PIC.TS như sau:

Hình 2.2 – Cầu hình cho WinPIC800 Lưu ý: - Nếu không hiện lên bảng như hình trên thì nhấp chuột vào ô tròn số 1 - Nhấp vào ô tròn số 2 để bật các chức năng chọn cấu hình

Cài đặt cấu hình cho WinPIC800 chính xác như hình sau:

Hình 2.3 – Cấu hình WinPIC800 để sử dụng cho PIC.TS

93

Nhấn vào nút Apply edits để xác nhận cài đặt.

Kết nối với PIC.TS:

- Chuyển chuyển mạch nguồn sang chế độ nguồn từ kit (lên trên). - Bật Công tắc nguồn – Đèn Power sáng. - Nối cable programmer vào cổng LPTx của PC và bo mạch.

Kiểm tra kết nối:

Sau khi kết nối phần cứng, chạy phần mềm WinPIC800. Nhấn vào Icon Detect device (trong vòng tròn hình dưới) màn hình hiện lên như hình sau:

Hình 2.4 – Quá trình kiểm tra kết nối và loại pic sử dụng

Nhấn chọn ô “Close this window….” Để lần sau bảng detect tự động. Nhấn nút accept để đóng cửa sổ.

Lưu ý: Khi nhân nút detect device WinPIC800 sẽ tự động chọn device mà nó detect được. Điều này này giúp bạn khỏi tốn công chọn device.

Kích vào menu chọn File -> Open sau đó chọn đường dẫn dến file .hex. Ví dụ: D:\PIC\port test.hex chọn OK.

Sau đó vào menu chọn thực đơn Device -> Program All.

Kết quả: Chíp sẽ được nạp chương trình điều khiển.

94

Hình 2.5 – Đang nạp chương trình cho vi điều khiển Chú ý: Sau khi nạp chương trình thành công phải tháo cáp nạp để tránh gây ảnh hưởng tới hoạt động của hệ thống. 2. Truy cập cổng vào ra số

Nhiệm vụ: Tìm hiểu vi điều khiển 16F877A và lập trình điều khiển các cổng vào ra số.

R0 R1 R2 R3 R4 R5 R6 R7

D0 D1 D2 D3 D4 D5 D6 D7

1 23 45 67 89 10

JP1

VCC

1 23 45 67 89 10

JP2

1 23 45 67 89 10

JP3

1 23 45 67 89 10

JP4

1 23 45 67 89 10

JP5

VCC VCC VCC VCC

D8 D9 D10 D11 D12 D13 D14 D15

D16 D17 D18 D19 D20 D21 D22 D23 D24 D25 D26 D27 D28 D29 D30 D31 D32

R8 R9 R10 R11 R12 R13 R14 R15

R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 R30 R31 R32

A0 A1 A2 A3 A4 A5 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1

C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2

A0 A1A2 A3A4 A5

B0 B1B2 B3B4 B5B6 B7

C0 C1C2 C3C4 C5C6 C7

D0 D1D2 D3D4 D5D6 D7

E0 E1E2

95

Hình 2.6 – Sơ đồ nguyên lý module PIC.TS01 Nguyên lý hoạt động: Các đèn led trên PIC.TS01 sẽ được nối trực tiếp chân anot đến cổng của vi điều

khiển PIC trên PIC.TS đồng thời nối tiếp một điện trở 100ohm rồi đưa xuống đất. Các cổng của PIC có thể cấp dòng trực tiếp cho led mà không cần đệm hay khuếch đại. Mỗi cổng vào ra số được nối với một đèn led. Khi một cổng được xuất giá trị là “1” thì led sáng ngược lại nếu xuất giá trị “0” led tắt. Chú ý: ở đây giả định là PIC đang được cấu hình là một cổng ra số.

Các bước tiến hành: - Nối các cổng PA, PB, PC, PD và PE của PIC.TS tương ứng với các JP1, JP2,

JP3, JP4 và JP5 của module PIC.TS01. - Viết chương trình điều kiển các đèn led tắt sáng theo yêu cầu. - Biên dịch và nạp chương trình lên vi điều khiển PIC - Sửa lại chương trình để có được chu chình led sáng theo ý muốn.

Có thể chạy thử chương trình mẫu: PORT_TEST.C có sẵn ở thư mục .../sample/ PORT_TEST/ để tham khảo hoặc kiểm tra các module có chạy tốt hay không trước khi viết một chương trình cho riêng mình. 3. Điều khiển led 7 đoạn

Nhiệm vụ: Tìm hiểu led 7 đoạn, PIC16F877A trong điều khiển và giải mã hiển thị các số. Viết được chương trình giải mã hiển thị các số theo yêu cầu trên led 7 đoạn.

R0 R1 R2 R3 R4 R5

D0 D1 D2 D3 D4 D5

1 23 45 67 89 10

JP1

VCC

1 23 45 67 89 10

JP2

1 23 45 67 89 10

JP3

1 23 45 67 89 10

JP4

1 23 45 67 89 10

JP5

VCC VCC VCC VCC

D10 D11 D12 D13

D30 D31 D32

R10 R11 R12 R13

R14R15R16R17R18R19R20

R21

R22R23R24R25R26R27R28R29

R30 R31 R32

A0 A1 A2 A3 A4 A5

B0B1

B2B3

B4 B5 B6 B7

C0C1C2C3C4C5C6C7

D0D1D2D3D4D5D6D7

E0 E1 E2

A0 A1A2 A3A4 A5

B0 B1B2 B3B4 B5B6 B7

C0 C1C2 C3C4 C5C6 C7

D0 D1D2 D3D4 D5D6 D7

E0 E1E2

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

DIGIT1

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

DIGIT2

VCC

F1 F2 F3 F4

123

JPVCC

Hình 2.7 – Sơ đồ nguyên lý PIC.TS03

96

Nguyên lý hoạt động: Trong PIC.TS03 sử dụng các led catot chung. Anot của mỗi thanh led của led 7

đoạn được nối đến cổng vi điều khiển PIC thông qua điện trở 100ohm nhằm hạn dòng. Catot của mỗi led 7 đoạn được nôi xuống đất. Khi cổng đó xuất giá trị là “1” thì thành led sáng và ngược lại xuất “0” thì tắt. Chữ số bên phải nối với cổng PC, chữ số bên trái nối với cổng PD. Các thanh a, b, c, d, e, f, g của mỗi chữ số tương ứng nối với các bit b0, b1, b2, b3, b4, b5, b6 của mỗi cổng.

Các bước tiến hành: - Nối các PORT PC và PD PIC.TS tương ứng với JP3 và JP4 trên module

PIC.TS03. - Viết chương trình điều kiển led 7 đoạn để hiển thị chữ số theo yêu cầu. - Biên dịch và nạp chương trình cho vi điều khiển PIC. - Sửa lại chương trình để có được sự hiển thị theo yêu cầu.

Có thể chạy thử chương trình mẫu: 7SegCount00To99.c có sẵn ỏ thư mục …/sample/7SEGS_LED/ để tham khảo hoặc kiểm tra module có chạy tốt hay không trước khi viết một chương trình theo ý muốn. 4. Điều khiển đèn giao thông

Nhiệm vụ: Tìm hiểu PIC16F877A trong việc vào ra số và giải mã điều khiển led 7 đoạn. Viết chương trình điều khiển đèn giao thông.

R0 R1 R2 R3 R4 R5

D0 D1 D2 D3 D4 D5

1 23 45 67 89 10

JP1

VCC

1 23 45 67 89 10

JP2

1 23 45 67 89 10

JP3

1 23 45 67 89 10

JP4

1 23 45 67 89 10

JP5

VCC VCC VCC VCC

D10 D11 D12 D13

D30 D31 D32

R10 R11 R12 R13

R14R15R16R17R18R19R20

R21

R22R23R24R25R26R27R28R29

R30 R31 R32

A0 A1 A2 A3 A4 A5

B0B1

B2B3

B4 B5 B6 B7

C0C1C2C3C4C5C6C7

D0D1D2D3D4D5D6D7

E0 E1 E2

A0 A1A2 A3A4 A5

B0 B1B2 B3B4 B5B6 B7

C0 C1C2 C3C4 C5C6 C7

D0 D1D2 D3D4 D5D6 D7

E0 E1E2

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

DIGIT1

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

DIGIT2

VCC

F1 F2 F3 F4

123

JPVCC

Hình 2.8 – Sơ đồ nguyên lý PIC.TS03

97

Nguyên lý hoạt động: Trong PIC.TS03 sử dụng các led catot chung. Anot của mỗi thanh led của led 7

đoạn được nối đến cổng vi điều khiển PIC thông qua điện trở 100ohm nhằm hạn dòng. Catot của mỗi led 7 đoạn được nôi xuống đất. Khi cổng đó xuất giá trị là “1” thì thành led sáng và ngược lại xuất “0” thì tắt. Chữ số bên phải nối với cổng PC, chữ số bên trái nối với cổng PD. Các thanh a, b, c, d, e, f, g của mỗi chữ số tương ứng nối với các bit b0, b1, b2, b3, b4, b5, b6 của mỗi cổng.

Các đèn led xanh, đỏ và vàng cũng được nối đến các cổng của vi điều khiển PIC thông qua trở 100ohm. Khi vi điều khiển xuất giá trị “1” ra cổng đó thì đèn tương ứng sáng ngược lại nếu xuất giá trị “0” đèn sẽ tắt. Các đèn led và led 7 đoạn được nối với vi điều khiển PIC theo như bảng sau:

Bảng 1

LED Tên cổng Gi chú

D0 A0 Đỏ D1 A1 Vàng

D2 A2 Xanh D3 A3 Xanh

D4 B4 Vàng

D5 A5 Đỏ D11 B5 Đỏ

D12 B6 Vàng

D13 B7 Xanh D30 E0 Xanh

D31 E1 Vàng

D32 E2 Đỏ F1 B0 Nút 1

F2 B1 Nút 2 F3 B2 Nút 3

F43 B3 Nút 4

Cách tiến hành:

- Nối các port PA, PB, PC, PD và PE của kit chính PIC.TS tương ứng với các port JP1, JP2, JP3, JP4 và JP5 của module PIC.TS03.

98

- Viết chương trình điều kiển các đèn led xanh, đỏ, vàng tắt sáng theo thời gian yêu cầu đồng thời hiển thị thời gian đếm ngược trên led 7 đoạn cho một chiều được quy định.

- Biên dịch và nạp chương trình lên vi điều khiển PIC. - Sửa lại chương trình để có được thời gian lưu thông các luồng theo theo yêu cầu. Có thể thử chương trình mẫu: TRAFFIC_LIGHT.c có sẵn ỏ thư mục

…/sample/TRAFFIC_LIGHT/ để tham khảo hoặc kiểm tra module có chạy tốt hay không trước khi viết một chương trình theo yêu cầu.

Mở rộng, nếu có thể hãy viết chương trình dùng các phím F để thay đổi thời gian lưu thông của các luồng.

99

Bài thực hành số 2 BIẾN ĐỔI ADC, ĐO ĐIỆN ÁP, NHIỆT ĐỘ

HIỂN THỊ TRÊN LED VÀ TRUYỀN THÔNG QUA RS232 I. MỤC ĐÍCH

Làm quen với bộ biến đổi tương tự số ADC có sẵn trên vi điều khiển PIC16F877A. Tìm hiểu chuẩn 1 dây và truyền thông không đồng bộ UART. Viết chương trình biến đổi ADC, đo điện áp, giao tiếp vơi cảm biến nhiệt độ DS18B20.

II. CHUẨN BỊ - Máy tính có cài chương trình WinPIC800, trình dịch CCS, HT-PIC. - PIC.TS và các module, vi điều khiển PIC16F877A, đồng hồ đo, cáp nguồn, cáp

kết nối. - Lý thuyết về lập trình C, lập trình C cho PIC trên CCS, HT-PIC… - Lý thuyết về chuẩn 1 dây, truyền thông không đồng bộ UART.

III. THỰC HÀNH 1. Biến đồi ADC và hiển thị trên led

Nhiệm vụ: Tìm hiểu và sử dụng bộ biến đổi ADC của vi điều khiển PIC16F877A

1 2

JP_ADC1

1 2

JP_ADC2VCC

RA2 RA3123

VR1

123

VR2

Hình 2.9 – Sơ đồ nguyên lý khối biến trở

Nguyên lý hoạt động: Khi vặn biến trở VR1 và VR2 tương ứng điện áp tai RA2 và RA3 sẽ thay đổi.

Cấu hình PIC cho phép bộ biến đổi ADC kênh 2 và kênh 3 (RA2 và RA3) hoạt động. Giá trị tương tự tai RA2 và RA3 sẽ được bộ ADC của PIC chuyển sang thành tín hiệu số.

Cách tiến hành: - Kiểm tra jumper JP_ADC2 ở trạng thái kết nối, để nối đầu ra biến trở với đầu

vào ADC của PIC. VR2 và JP_ADC2 nối đến ngõ vào AN3. - Công tắc DIP_SW1.3, DIP_SW1.4 ở trạng thái OFF để ngắt đầu vào ADC ra

khỏi điện trở treo khi làm việc với điện áp tương tự (điện trở treo dùng khi làm việc ở chế độ vào ra tín hiệu số)

100

- Nối port PC (PD) của kit chính PIC.TS với các port JP3 (JP4) của module PIC.TS03

- Viết chương trình đọc giá trị từ bộ chuyển đổi ADC và xuất ra cổng C (D) - Biên dịch và nạp chương trình lên vi điều khiển PIC - Sau khi nạp thành công, khi chương trình đang chạy, vặn biến trở từ min đến

max sẽ thấy giá trị của điện áp được chuyển đổi thành tín hiệu số hiển thị trên các led nối với PC (PD) thay đổi theo mỗi vị trí của chiết áp

Có thể thử chương trình mẫu: ADC Single_LED.c có sẵn ỏ thư mục …/sample/ADC2PORTC/ để tham khảo hoặc kiểm tra module có chạy tốt hay không trước khi viết một chương trình theo yêu cầu. 2. Đo điện áp và truyền thông qua RS232

Nhiệm vụ: Sử dụng bộ ADC trên PIC để đo điện áp từ đầu ra của biến trở sau đó truyền dữ

liệu đo được lên máy tính qua RS232. Cách tiên hành: - Kiểm tra jumper JP_ADC1, JP_ADC2 ở trạng thái kết nối, để nối đầu ra chiết

áp với đầu vào ADC của PIC - Công tắc DIP_SW1.3, DIP_SW1.4 ở trạng thái OFF để ngắt đầu vào ADC ra

khỏi điện trở treo khi làm việc với điện áp tương tự (điện trở treo dùng khi làm việc ở chế độ vào ra tín hiệu số)

- Kiểm tra JP_TX và JP_RX ở trạng thái nối chân 5 với chân 6 để nối chân TX và RX của bộ thu phát UART với bộ phát thu MAX232

- Nối cổng truyền thông nối tiếp của PIC.TS với cổng COM của máy tính - Sử dụng trình HyperTermial giao tiếp với tín hiệu trên kênh RS232 Vào Hyper Terminal như hình dưới đây

Hình 2.10a - Hyper Terminal

Gõ tên là 9600 trong ô Name như hình dưới, rồi chọn OK.

101

Hình 2.10b - Hyper Terminal

Chọn COM1 trong ô Connect using như sau:

Hình 2.10c - Hyper Terminal

Đặt các thuộc tính như hình dưới, rồi chọn OK

Hình 2.10d - Hyper Terminal

Bấm vào biểu tượng Call để kết nối - Viết chương trình đọc giá trị từ bộ chuyển đổi ADC và truyền dữ liệu đó qua bộ

truyền thông nối tiếp

102

- Biên dịch và nạp chương trình lên vi điều khiển PIC - Sau khi nạp thành công, khi chương trình đang chạy, vặn biến trở từ min đến

max trên màn hình máy tính sẽ hiển thị các giá trị của điện áp được chuyển đổi thành tín hiệu số thay đổi theo mỗi vị trí của chiết áp.

Có thể thử chương trình mẫu: ADC1.c có sẵn ỏ thư mục …/sample/ ADC2UART/ để tham khảo, hoặc kiểm tra module có chạy tốt hay không, trước khi viết một chương trình theo yêu cầu.

Mở rộng: có thể thay đổi chương trình để chuyển đổi giá trị đầu ra ADC thành giá trị điện áp tương ứng và gửi lên máy tính theo dạng U1 = X.X (V) , U2 = Y.Y (V). Trong đó X.X là điện áp của VR1, Y.Y là điện áp của VR2, nằm trong khoảng 0.0V đến 5.0V. Ví dụ: U1 = 2.5 (V), U2 = 1.8 (V) 3. Đo nhiệt độ và truyền thông qua RS232

Nhiệm vụ: Thực hành với bộ cảm biến nhiệt độ DS18B20 có sẵn trên PIC.TS. Giao tiếp PIC

với DS18B20 thông qua giao tiếp 1 dây (one wire interface), truyền dữ liệu không đồng bộ UART có sẵn trên PIC qua chuẩn RS232. Viết chương trình đọc dữ liệu nhiệt độ từ DS18B20 và truyền dữ liệu đó qua UART.

Cách tiến hành: - Kiểm tra jumper JP_temp ở trạng thái kết nối chân 1 (bên phải) với chân 2 để

nối chân data của DS1820 với RE2 của PIC. - Công tắc DIP_SW1.5 ở trạng thái ON để nối đến điện trở treo (điện trở treo

dùng khi làm việc ở chế độ vào ra tín hiệu số). - Kiểm tra JP_TX và JP_RX ở trạng thái nối chân 5 với chân 6, để nối chân TX

và RX của bộ thu phát UART với bộ phát thu MAX232. - Nối cổng truyền thông nối tiếp của Kit chính với cổng COM của máy tính. - Sử dụng trình HyperTermial giao tiếp với tín hiệu trên kênh RS232. - Viết chương trình đọc giá trị nhiệt độ từ DS1820 và truyền đi qua bộ truyền

thông không đồng bộ. - Biên dịch và nạp chương trình lên vi điều khiển PIC - Sau khi nạp thành công, khi chương trình đang chạy, dùng tay (hoặc một nguồn

nhiệt nào đó) trạm vào cảm biến nhiệt DS1820 và quan sát thấy giá trị nhiệt độ hiển thị trên màn hình từ từ tăng lên (Chú ý độ trễ là tương đối lớn, cỡ 1 giây và giá trị hiển thị được có thể sai lệch vài độ). Khi bỏ tay ra nhiệt độ sẽ giảm xuống từ từ.

Có thể thử chương trình mẫu có sẵn ỏ thư mục …/sample/TEMP2UART/ để tham khảo hoặc kiểm tra module có chạy tốt hay không, trước khi viết một chương trình cho riêng mình.

103

Bài thực hành số 3 ĐỌC PHÍM BẤM, ĐIỀU KHIỂN RELAY

VÀ ĐỌC THỜI GIAN THỰC DS1307 HIỂN THỊ TRÊN LEB 7 ĐOẠN

I. MỤC ĐÍCH Đọc phím bấm, phương pháp quét ma trận phím. Tìm hiểu làm quen với Thời

gian thực DS1307 có sẵn trên PIC.TS. Viết chương trình đọc phím bấm và điều khiển vào ra số, đọc dữ liệu thời gian từ DS1307 và hiển thị trên led 7 đoạn.

II. CHUẨN BỊ - Máy tính có cài chương trình WinPIC800, trình dịch CCS, HT-PIC. - PIC.TS và các module, vi điều khiển PIC16F877A, đồng hồ đo, cáp nguồn, cáp

kết nối. - Lý thuyết về lập trình C, lập trình C cho PIC trên CCS, HT-PIC… - Phương pháp quét ma trận phím, chống rung phím co khí bằng phần mềm. - Lý thuyết về giao tiếp chuẩn I2C.

III. THỰC HÀNH 1. Đọc phím bấm

Nhiệm vụ: Làm quen sử dụng phím bấm, giao tiếp với phím bấm bằng cổng vào ra số. Viết chương trình sử dụng các cổng vào ra để nhận lệnh từ phím bấm.

Cách tiên hành: - Nối các port PA, PB, PC và PD của kit chính PIC.TS tương ứng với các port JP1,

JP2, JP4 và JP3 của module PIC.TS01 - Kiểm tra jumper KEY_JP của module PIC.TS02 nối xuống đất để nối 8 cực của 8

phím bấm F0 đến F7 xuống đất, tám cực còn lại nối đến cổng port D của PIC. - Kiểm tra jumper JP4 của kit chính PIC.TS nối lên dương nguồn (vị trí bên dưới)

để nối treo port D lên dương nguồn Như vậy, Port D sẽ được treo lên dương nguồn đồng thời nối đến 8 phím bấm,

các cực còn lại của 8 phím bấm nối xuống đất, khi phím được bấm sẽ làm cho port được nối xuống đất, khi không được bấm port sẽ được nối đến 5V qua điện trở treo 4,7K.

- Viết chương trình nhận biết trạng thái của 8 phím bấm trên port D và thực hiện lệnh quy định cho phím đó, giả sử bật sáng một số thanh led nào đó trên 6 led 7 đoạn

- Biên dịch và nạp chương trình lên vi điều khiển PIC - Sửa lại chương trình để có được chức năng của các phím theo yêu cầu khác.

104

Có thể thử chương trình mẫu: BUTTON.c có sẵn ỏ thư mục…/sample/ BUTTON/ để tham khảo hoặc kiểm tra các module có chạy tốt hay không trước khi viết một chương trình cho riêng mình 2. Đọc phím bấm từ bàn phím ma trận

Nhiệm vụ: Làm quen với việc giao tiếp với bàn phím ma trận, giao tiếp PIC với bàn phím

ma trận bằng cổng vào ra số. Viết một chương trình sử dụng các cổng vào ra để nhận lệnh từ phím bấm.

B00 B01 B02 B03

B10 B11 B12 B13

B20 B21 B22 B23

B30 B31 B32 B33

1 23 45 67 89 10

JP4

VCC

P40 P41P42 P43P44 P45P46 P47

P40

P41

P42

P43

P44P45P46P47

12345

AR0

12345

AR1

123

Jum1

123

Jum2

VCC

VCC

Hình 2.11 – Sơ đồ nguyên lý kết nối bàn phím ma trận

Cách tiến hành: - Nối các port PA, PB, PC và PD của kit chính PIC.TS tương ứng với các port

JP1, JP2, JP4 và JP3 của module PIC.TS02 Các chân RC0 đến RC7 của PIC đã lần lượt nối tới các hàng 0 đến 3, các cột 0

đến 3 của ma trận bàn phím: RC[0..3] -> hàng[0..3] RC[4..7] -> cột[0..3] - Kiểm tra jumper JUM1 của module PIC.TS02 nối lên dương nguồn để nối 4

cổng PC[0..3] lên dương nguồn. - Kiểm tra jumper JUM2 ở trạng thái không kết nối - Viết chương trình nhận biết trạng thái của 16 phím bấm trên port C và thực hiện

lệnh quy định cho phím đó, giả sử bật sáng một số thanh led nào đó trên 6 led 7 đoạn

- Biên dịch và nạp chương trình lên vi điều khiển PIC - Sửa lại chương trình để có được chức năng của các phím theo yêu cầu khác Có thể thử chương trình mẫu: KEY_BOARD.c có sẵn ỏ thư mục …/sample/

KEY_BOARD/ để tham khảo hoặc kiểm tra các module có chạy tốt hay không, trước khi viết một chương trình cho riêng mình.

105

3. Đọc phím bấm và điều khiển relay Nhiệm vụ: Viết chương trình nhận biết phím bấm , chống nẩy phím và điều khiển

đóng ngắt relay tương ứng với phím yêu cầu.

Hình 2.12– Sơ đồ nguyên lý PIC.TS04

Nguyên lý hoạt động: Các chân RB6, RB4, RB2 và RB0 của PIC lần lượt nối tới các đầu vào IN1 đến

IN 4 của ULN2803. RB1, RB3, RB5và RB7 lần lượt F3. Port B sẽ được treo lên dương nguồn đồng thời nối đến 4 phím bấm, các cực còn lại của 4 phím bấm nối xuống đất, khi phím được bấm sẽ là cho port được nối xuống đất, khi không được bấm port sẽ được nối đến 5V qua điện trở treo 4,7K.

Khi đầu vào IN1 đến IN4 của ULN2803 có giá trị logic là “1” do vi điều khiển xuất ra thi tương ứng OUT1 đến OUT4 sẽ được nối xuống đất, relay sẽ đóng. Ngược lại khi đầu vào có giá trị logic là “0” Relay mở.

Cách tiến hành: - Nối port PB của PIC.TS với port JP2 của module PIC.TS04 - Kiểm tra jumper KEY_JP của module PIC.TS04 nối xuống đất.

106

- Kiểm tra jumper JP2 của PIC.TS nối lên dương nguồn. - Viết chương trình nhận biết trạng thái của 4 phím bấm trên port B và khi một

phím được bấm một lần sẽ thực hiện lật chuyển trạng thái của RELAY tương ứng và giữ ở trạng thái đó cho đến lần bấm sau sẽ lại chuyển trạng thái. Chuyển trạng thái có nghĩa là nếu RELAY đó đang đóng sẽ chuyển sang trạng thái mở, còn nếu nó đang mở sẽ chuyển sang trạng thái đóng.

- Biên dịch và nạp chương trình lên vi điều khiển PIC - Sửa lại chương trình để có được chức năng của các phím theo yêu cầu khác. Có thể thử chương trình mẫu: RELAY.c có sẵn ỏ thư mục …/sample/ RELAY/ để

tham khảo hoặc kiểm tra các module có chạy tốt hay không trước khi viết một chương trình khác theo yêu cầu.

4. Đọc thời gian thực hiển thị trên Led 7 đoạn Nhiệm vụ: Làm quen với bộ đếm thời gian thực DS11307, giao tiếp PIC với DS1307 qua

giao tiếp I2C. Viết chương trình giao tiếp PIC với DS1307, giao tiếp PIC với bộ hiển thị led 7 đoạn theo chế độ quét (hiển thị động), đọc dữ liệu thời gian từ DS1307 và hiển thị trên bộ hiển thị led 7 đoạn.

12345678

161514131211109

SW2RA0RA1RA2RA3RA4RA5RC3_URC4_U

X11

X22

VBAT 3

GND4

SDA5 SCL6

SQW/OUT 7

VCC 8RTC

DS1307

12

X 32768Hz

4K7R_rtc1

4K7R_rtc2

VCC

BATTERY Hình 2.13 – Sơ đồ nguyên lý khối thời gian thực

107

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

Digit0

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

Digit1

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

Digit2

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

Digit3

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

Digit4

f9

g10

e1 d2

A 3

c4

DP5

b6 a7

A 8

Digit5seg_a seg_a seg_a seg_a seg_a

seg_bseg_bseg_bseg_bseg_bseg_cseg_dseg_eseg_fseg_gseg_P

seg_cseg_dseg_eseg_fseg_gseg_P

seg_cseg_dseg_eseg_fseg_gseg_P

seg_cseg_dseg_eseg_fseg_gseg_P

seg_cseg_dseg_eseg_fseg_gseg_P

A0

A1

A2

A3

A4

A5

1 23 45 67 89 10

JP1

1 23 45 67 89 10

JP2

220R0220R1220R2220R3220R4220R5220R6220R7

seg_aseg_bseg_cseg_dseg_eseg_fseg_gseg_P

VCC

VCC

2

3

1

Q0

2

3

1

Q1

2

3

1

Q2

2

3

1

Q3

2

3

1

Q4

2

3

1

Q5VCC

10KR8

10KR9

10KR10

10KR11

10KR12

10KR13

P10P11P12P13P14P15P10 P11P12 P13P14 P15

P20P21P22P23P24P25P26P27

P20 P21P22 P23P24 P25P26 P27

123

KEY JPVCC

1 23 45 67 89 10

JP3

VCC

P30 P31P32 P33P34 P35P36 P37

P30P31P32P33P34P35P36P37

F0F1F2F3F4F5F6F7

Hình 2.14 – Sơ đồ nguyên lý khối phím bấm và hiển thị PIC.TS02

Nguyên tắt hoạt động: Chân SCL và SDA của DS1307 được nối với RC3 và RC4 của PIC. Đây là hai

chân hỗ trợ giao tiếp I2C của PIC. Các thanh a, b, c, d, e, f, g, p chung của 6 led 7 đoạn tương ứng sẽ được nối đến port B của vi điều khiển PIC trên PIC.TS nối tiếp qua một điện trở 100 ohm. Cổng A của PIC sẽ điều khiển 6 Transitor qua 6 điện trở để cấp nguồn cho 6 anot chung của 6 led 7 đoạn tương ứng.

Bảng sau đây mô tả thứ tự kết nối các chân của hai cổng A và B

Chân PIC

điện trở Chân Led 7 thanh

Transitor

RA5 R8 A5 Q5

RA4 R9 A4 Q4

RA3 R10 A3 Q3

RA2 R11 A2 Q2

RA1 R12 A1 Q1

RA0 R13 A0 Q0

RB7 R7 p

RB6 R6 g

RB5 R5 f

RB4 R4 e

108

RB3 R3 d

RB2 R2 c

RB1 R1 b

RB0 R0 a

Chương trình điều khiển sẽ dùng hai cổng A và B để điều khiển bộ hiển thị 6 led 7 thanh đồng thời giao tiếp với DS1307 để đọc giá trị giờ, phút, giây và hiển thị trên bộ hiển thị led 7 thanh.

Cách tiến hành: - Kiểm tra SW2.7, SW2.8 ở trạng thái ON để nối chân SCL và SDA của DS1307

với RC3 và RC4 của PIC. - Nối các port PA, PB và PD của PIC.TS tương ứng với các port JP1, JP2 và JP3

của module PIC.TS02. - Viết chương trình đọc giờ, phút, giây từ DS1307 và hiển thị trên bộ hiển thị led

7 thanh. - Biên dịch và nạp chương trình lên vi điều khiển PIC. - Sau khi nạp thành công, khi chương trình đang chạy, tắt nguồn cho hệ thống, để

một thời gian sau đó bật lại ta sẽ thấy thời gian vẫn tiếp tục chạy khi tắt nguồn . Có thể thử chương trình mẫu: …\samples\DS1307-7SEG\Ds1307 LED.c

có sẵn ỏ thư mục để tham khảo hoặc kiểm tra module có chạy tốt hay không trước khi viết một chương trình theo yêu cầu khác.

109

PHỤ LỤC

/**************************************** Bo mon DTVT Khoa CNTT Thai Nguyen FILE NAME: Test led PortD.c ***************************************/ #include<16f877A.h> #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=8000000) // defind crystal = 8MHz //****************************** // main program start here //****************************** void main() { char i,count; while(TRUE) { count=1; //ship a for (i=0;i<=6;i++) { output_a(count); delay_ms(150); count=count<<1; } count=1; //ship b for (i=0;i<=8;i++) { output_b(count); delay_ms(150); count=count<<1; } count=1; //ship c for (i=0;i<=8;i++) { output_c(count); delay_ms(150); count=count<<1;

110

} count=1; //ship d for (i=0;i<=8;i++) { output_d(count); delay_ms(150); count=count<<1; } count=1; //ship e for (i=0;i<=3;i++) { output_e(count); delay_ms(150); count=count<<1; } output_a(0xff); // a delay_ms(150); output_a(0x00); output_b(0xff); // b delay_ms(150); output_b(0x00); output_c(0xff); // c delay_ms(150); output_c(0x00); output_d(0xff); // d delay_ms(150); output_d(0x00); output_e(0xff); // e delay_ms(150); output_e(0x00); delay_ms(150); output_a(0xff); //flash all ON output_b(0xff); output_c(0xff); output_d(0xff); output_e(0xff); delay_ms(150); output_a(0x00); // OFF

111

output_b(0x00); output_c(0x00); output_d(0x00); output_e(0x00); delay_ms(150); output_a(0xff); // ON output_b(0xff); output_c(0xff); output_d(0xff); output_e(0xff); delay_ms(150); output_a(0x00); // OFF output_b(0x00); output_c(0x00); output_d(0x00); output_e(0x00); delay_ms(150); }} //===============================================//TEN DE TAI :HE THONG DAO TAO VI DIEU KHIEN PIC //Ngon ngu :C cho PIC, dung trinh bien dich CCS compiler //Lap trinh vien :Bo mon DTVT Khoa CNTT TN //Chuong trinh :VAO RA CONG //Su dung MCU :16f877a cua Microchip.thach anh 8 Mhz //Ngay bat dau :Ngay xx thang' xx nam 2008 //Ngay hoan thanh :Ngay xx thang' xx nam 2008 //Mo ta hardware :DEN GIAO THONG //File name: Trafic_light.c //=============================================== #include <16f877A.h> #include <def_877a.h> //file header do nguoi dung dinh nghia #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=8000000) // defind crystal = 8MHz byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void display_right_led(byte digit); void display_left_led(byte digit); void displayh(byte n); void displayl(byte k);

112

//****************************** // main program start here //****************************** void main() { char i; //tat het cac den output_a(0x00); output_b(0x00); output_c(0x00); output_d(0x00); output_e(0x00); delay_ms(3); while(TRUE) { //phase 1 //duong ngang RA2 = 1; RE0 = 1;//xanh RA1 = 0; RE1 = 0;//vang RA0 = 0; RE2 = 0;//do //duong doc RA3 = 0; RB7 = 0;//xanh RB4 = 0; RB6 = 0;//vang RA5 = 1; RB5 = 1;//do //dem for (i=30;i>3;i--) displayh(i); //phase2 //duong ngang RA2 = 0; RE0 = 0;//xanh RA1 = 1; RE1 = 1;//vang RA0 = 0; RE2 = 0;//do //duong doc RA3 = 0; RB7 = 0;//xanh RB4 = 0; RB6 = 0;//vang RA5 = 1; RB5 = 1;//do //dem for (i=3;i>0;i--) displayl(i); //============

113

//phase 3 //duong ngang RA2 = 0; RE0 = 0;//xanh RA1 = 0; RE1 = 0;//vang RA0 = 1; RE2 = 1;//do //duong doc RA3 = 1; RB7 = 1;//xanh RB4 = 0; RB6 = 0;//vang RA5 = 0; RB5 = 0;//do //dem for (i=30;i>3;i--) displayh(i); //============= //phase4 //duong ngang RA2 = 0; RE0 = 0;//xanh RA1 = 0; RE1 = 0;//vang RA0 = 1; RE2 = 1;//do //duong doc RA3 = 0; RB7 = 0;//xanh RB4 = 1; RB6 = 1;//vang RA5 = 0; RB5 = 0;//do //dem for (i=3;i>0;i--) displayl(i); } } //=================================== void display_right_led(byte digit) { output_c(DIGITS[digit] ^ 0xff); } //=================================== void display_left_led(byte digit) { output_d(DIGITS[digit] ^ 0xff); } //===================================

114

void displayh(byte n) { byte i; for (i = 0; i < 100; i++) { display_left_led(n / 10); display_right_led(n % 10); delay_ms(6); } } //================================== void displayl(byte k) { byte i; for (i = 0; i < 2; i++) { display_left_led(k / 10); display_right_led(k % 10); delay_ms(180); output_c(0xff); output_d(0xff); delay_ms(120); } } /*********************************************************** * Bo mon DTVT Khoa CNTT Thai Nguyen * File name: 7seccount00to99.c ************************************************************/ #include <16F877A.h> #fuses HS, NOWDT, PUT,NOLVP #use delay (clock=8000000) // define crystal = 8MHz #define LEFT_LED_C1 PIN_A1 #define RIGHT_LED_C2 PIN_A0 // 0 1 2 3 4 5 6 7 8 9 byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void display_right_led(byte digit); void display_right_led(byte digit) void display_left_led(byte digit); //*********************************************************** //Chuong trinh chinh void main() { while (true) count_00_99();

115

} //********************************************************** void display_right_led(byte digit) { output_c(DIGITS[digit] ^ 0xff); } //************************************************************* void display_left_led(byte digit) { output_d(DIGITS[digit] ^ 0xff); } //*************************************************************** //ham display n hien thi 100 viec goi ham hien thi hang truc va hang don vi void display(byte n) { byte i; for (i = 0; i < 100; i++) { display_left_led(n / 10); display_right_led(n % 10); delay_ms(1); } } //**************************************************************** //ham dem tu 0 den 99 thuc hien 100 lan ham display(i) voi bien i = 0 den 100 void count_00_99() { byte i; for (i = 0; i < 100; i++) display(i); } //**************************************************************** /**********************************************

Bo mon DTVT Khoa CNTT Dai hoc Thai Nguyen * File name: ADC Single_LED.c

***********************************************/ #include <16F877A.h> #fuses HS, NOWDT, NOPROTECT, NOLVP #device 16F877*=16, ADC=8 #use delay(clock=8000000) //*********************************************

116

void main() { setup_adc(adc_clock_internal); setup_adc_ports(ALL_ANALOG); set_adc_channel(3); // PIC.TS VR1 JP1=RA2, VR2 JP2=RA3 delay_ms(10); while (true) output_c(read_adc()); } //********************************************* /**************************************************** * Bo mon DTVT Khoa CNTT Dai hoc Thai Nguyen * * File name: ADC1.c *****************************************************/ #include <16F877A.h> // PIC16F877 header file #device 16f877*=16, ADC=10 // 10 bits ADC #use delay(clock=8000000) // for 8Mhz crystal #fuses HS, NOWDT, NOPROTECT, NOLVP // for debug mode #use rs232(baud=9600, xmit=PIN_C7, rcv=PIN_C6, stream=MYPC) // rs232 setting #define DO_NOTHING 0 #define DO_START_ADC 1 #define DO_END_ADC 2 /*============================================*/ void main(void) { int16 int_volt; int8 str_volt[21]; float flt_volt; int8 do_what = DO_NOTHING; int8 tmp; printf( "S: Start ADC\n\r"); Printf( "Q: END ADC\n\r"); while(true){ // if rs232 get char if(0 != kbhit()) { tmp = fgetc(MYPC); switch(tmp)

117

{ case 'S': case 's': printf( "S: Start ADC\n\r" ); do_what = DO_START_ADC; // init pic16f877a adc setup_adc_ports(RA0_RA1_RA3_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(3); break; case 'Q': case 'q': printf( "Q:EndADC\n\r" ); do_what = DO_END_ADC; // adc off setup_adc(ADC_OFF); break; default : // rs232 get other char putc(tmp); break; }//end switch(tmp) }//end if(kbhit()) switch(do_what) { case DO_START_ADC: // start adc and send result to PC int_volt = read_adc(); flt_volt = 5.0 * int_volt / 0x3ff; sprintf(str_volt, "ADC: %1.3fV\n\r", flt_volt); printf(str_volt); printf( "\n\r" ); delay_ms(500); break; case DO_END_ADC: // you want to do break; case DO_NOTHING: // you want to do break; default:

118

break; }//end switch(do_what) }//end while(1) }//end main() /**************************************** chuong trinh dieu khien led de kiem tra cong Bo mon DTVT Khoa CNTT Dai hoc Thai Nguyen ***************************************/ #include <16F877A.h> #device *=16 #device adc=8 #FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=8000000) #include <1wire.c> #use rs232(baud=9600, xmit=PIN_C7, rcv=PIN_C6, stream=MYPC) // rs232 setting #include <ds1820.c> void main() { float temperature; setup_psp(PSP_DISABLED); // huy bo PSP setup_spi(FALSE); //THIET PAP SPI setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //Thiet lap bo dinh thoi ben setup_timer_1(T1_DISABLED); //cam setup_timer_2(T2_DISABLED,0,1); //cam setup_comparator(NC_NC_NC_NC); setup_vref(VREF_LOW|-2); printf("\n\r Bo mon Dien Tu Vien Thong Khoa CNTT"); printf( "\n\rXin chao, toi la PIC.TS, Toi dang do nhiet do\n\r",); delay_ms(100); while (TRUE) { temperature = ds1820_read(); printf( "Nhiet do: %3.1f ", temperature); printf( "oC, "); if(temperature >= 30) printf("Nong!\n\r ");

119

else if( temperature >= 20 && temperature < 30) printf("Nhiet do vua\n\r!"); else printf("Lanh!\n\r "); delay_ms(20); } } //***************************************************** Bo mon DTVT Khoa CNTT Thai Nguyen File name: //============================================== //TEN DE TAI :HE THONG DAO TAO VI DIEU KHIEN PIC //Ngon ngu :C cho PIC, dung trinh bien dich CCS compiler //Lap trinh vien :Bo mon dien tu Vien Thong //Chuong trinh :CHUONG TRINH DOC PHIM //Su dung MCU :16f877a cua Microchip.thach anh 8 Mhz //Ngay bat dau :Ngay xx thang' xx nam 2008 //Ngay hoan thanh :Ngay xx thang' xx nam 2008 //file name: button.c //=============================================== #include <16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay (clock=8000000) // define crystal = 8MHz #use Fast_IO(D) byte command; //ma lenh // 0 1 2 3 4 5 6 7 8 9 byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void keyscan(); void display(); //***************************************************** void main() { Set_tris_D(1); command = 0; output_a(0x00);//bat chan A5 while(true) { keyscan();

120

display(); } }//end of main program //**************************************************** void keyscan() { output_d(0xff); if(input(PIN_D0) == 0) { delay_ms(150); if (input(PIN_D0)==0) command = 1; display() ; } if(input(PIN_D1) == 0) { delay_ms(150); if (input(PIN_D1)==0) command = 2; display() ; } if(input(PIN_D2) == 0) { delay_ms(150); if (input(PIN_D2)==0) command = 3; display() ; } if(input(PIN_D3) == 0) { delay_ms(150); if (input(PIN_D3)==0) command = 4; display() ; } if(input(PIN_D4) == 0) { delay_ms(150); if (input(PIN_D4)==0) command = 5; display() ; } if(input(PIN_D5) == 0) { delay_ms(150);

121

if (input(PIN_D5)==0) command = 6; display() ; } if(input(PIN_D6) == 0) { delay_ms(150); if (input(PIN_D6)==0) command = 7; display() ; } if(input(PIN_D7) == 0) { delay_ms(150); if (input(PIN_D7)==0) command = 8; display() ; } output_d(0xff); } //****************************************************** void display() { output_b(DIGITS[command] ^ 0xff); } //***************************************************** //END PROGRAM //============================================================================= //TEN DE TAI :RELAY //Ngon ngu:ANSI C cho PIC, dung trinh bien dich Hi-Tech PICC compiler //Lap trinh vien : Bo mon DTVT Khoa CNTT //Chuong trinh :HIEN THI SO BAT KY TREN LED_7T //Su dung MCU : 16f877a cua Microchip.thach anh 20 Mhz //Ngay bat dau :Ngay xx thang' xx nam 20xx //Ngay hoan thanh : Ngay xx thang' xx nam 20xx //Mo ta hardware : //khi dich chon dung loai PIC:Configure-->Select Device-->chon loai PIC //============================================ #include<pic.h> __CONFIG(UNPROTECT & WDTEN & HS & PWRTEN & BOREN & LVPDIS & DUNPROT & DEBUGDIS);

122

//************************************************** void init(void); void Delay(void); //===========Chuong trinh ========================= void main() //chuong trinh trinh { init(); while(1) { if (RB1 == 0) { Delay(); if (RB1 == 0)RB0 ^= 1;} if (RB3 == 0) { Delay(); if (RB3 == 0)RB2 ^= 1;} if (RB5 == 0) { Delay(); if (RB5 == 0)RB4 ^= 1;} if (RB7 == 0) { Delay(); if (RB7 == 0)RB6 ^= 1;} CLRWDT(); } CLRWDT(); } //==============THE END ========================= void init(void) { //---------Dinh nghi cacs cong------------------ OPTION = 0x01000000; TRISB = 0b10101010; Delay(); PORTB = 0b10101010; } //=============================================== void Delay() {

123

unsigned char i; for (i =0;i<20;i++) { NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); } } //================THE END ===================== //===============================================//TEN DE TAI : Ma tran phim //Ngon ngu :ANSI C cho PIC, dung trinh bien dich Hi-Tech PICC compiler //Lap trinh vien :Bo mon DTVT //Chuong trinh : HIEN THI SO BAT KY TREN LED_7T //Su dung MCU :16f877a cua Microchip.thach anh 20 Mhz //Mo ta firmware :Coi keu khi duoc 5s va co phim RB7 bam thi no keu-theo thoi gian tuy //khi dich chon dung loai PIC:Configure-->Select Device-->chon loai PIC //============================================ #include<pic.h> __CONFIG(UNPROTECT & WDTEN & HS & PWRTEN & BOREN & LVPDIS & DUNPROT & DEBUGDIS); //===============Mang phông so; ép vào mauc thu hai=================== #define KEYPORT PORTC #define NOKEY 16 bit keyfound = 0; const unsigned char KEY_IO[16] = {0xEE, 0xDE, 0xBE, 0x7E, //C4 C5 C6 C7 0xED, 0xDD, 0xBD, 0x7D,//C3 0xEB, 0xDB, 0xBB, 0x7B,//C2 0xE7, 0xD7, 0xB7, 0x77}; const unsigned char KEY_MAP[16] = {12,11, 0,10, 13, 9, 8, 7, 14, 6, 5, 4, 15, 3, 2, 1}; // 0 1 2 3 4 5 6 7 8 9 a b c d e f

124

const unsigned char DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char maphim; //===========Cac dinh nghia ========================= void init(void); //su bat dau void keyscan(void); void display(void); unsigned char kboard_idkey(void); void delay(void); //==================Chuong trinh chinh'=============== void main() //chuong trinh trinh { init(); //bat dau chuong trinh PORTA = 0xff; maphim = 0; PORTB = (DIGITS[maphim] ^ 0xff); while(1) //lenh While(bt).Neu bt=1 luon dung thi lap lai ko thoat khoi //lenh While(bt).Neu bt=0 thi sai thi thoat khoi vong lap { keyscan(); display(); CLRWDT(); } CLRWDT(); } //================THE END MAIN=================== void init(void) { //---------Dinh nghi cacs cong------------------ TRISD = 0b00000000; //cong X la ra PORTD = 0b11111111; //CONG RA MUC 0 HAY 1 TRISE = 0b00000011; TRISB = 0b00000000; PORTB = 0b00000000; //--------Dinh nghia cong A-------- ADCON1 = 0b00001111; //4bít dau ko làm gì; 4bít sau de cong ra so TRISA = 0b11000000; //C?ng A có A0-5 là ra TRISC = 0b11110000;

125

PORTC = 0b11110000; } //--------------chia lay gia tri chung cho moi cai--------------- //=================================== void keyscan() { maphim = KEY_MAP[(kboard_idkey())]; } void delay() { NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); } void display() { if (keyfound) { PORTB = (DIGITS[maphim] ^ 0xff); PORTA = 0x00; } } //================================= unsigned char kboard_idkey() { unsigned char key = 0xFF; keyfound = 0; do { key++; KEYPORT &= 0xF0; // clear lower nibble KEYPORT |= KEY_IO[key] & 0x0F; // output lower nibble NOP(); NOP(); keyfound = ((KEYPORT & 0xF0) == (KEY_IO[key] & 0xF0)); } while((key < NOKEY) && (!keyfound));

126

return(key); } //=======================THE END=============================== /*************************************************************** * Real time Clock DS1307 * * Dong ho so su dung DS1307 hien thi tren 6 LED 7-segment hh.mm.ss * * Compiler Sofware: Compiler CCS Ver 4.018 * * Program design: Bo Mon DTVT - Khoa CNTT Thai Nguyen * * Harware: * * - Pull up PORTD, Pull-down Switches, connect PORTD to Switches * * - PORTA and PORTB to control leb * * - Switches: F0 - Mode, F1 - set time, F2 - clean status * * - DIP Swich SW2 all ON (Enable 7-segment and RTC DS1307) * File name: DS1307.c ****************************************************************/ #include <16F877A.h> //file header nguoi dung dinh nghia #include <def_877a.h> #include <ds1307.c> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=8000000) byte sec,min,hour; //Su dung led 7 thanh loai catot // // 1 2 3 4 5 6 7 8 9 . byte const MAP[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; byte DIS1,DIS2,DIS3,DIS4,DIS5,DIS6; byte key,mode; int1 ampm,blink,blink_sec,blink_min,blink_hour; int1 on_off; int16 count; #bit SW1 = 0x8.0 // D0 - mode #bit SW2 = 0x8.1 // D1 - set_time #bit SW3 = 0x8.2 // D2 - Clear_status //****************************************************************** //Khai bao chuong trinh con

127

//****************************************************************** void init(void); void set_blink(void); void change_time(void); void update_1307(void); void keyscan(void); void set_sec(void); void set_min(void); void set_hour(void); void clear_status(void); void read_time(void); void update_time(void); void display(void); //****************************************************************** //Chuong trinh chinh //****************************************************************** void main() { byte u; Delay_ms(5); init(); u=read_ds1307(0); sec=u & 0x7F;// enable RTC write_ds1307(0,sec);// set second to 00 and enable clock(bit7=0) //Xoa tat ca cac co khien key=5;mode=0;blink=0; blink_sec=0;blink_min=0;blink_hour=0; count=15;on_off=1; ampm = bit_test(hour,5);// test AM_PM if(ampm==0) {RD4 = 0;RD5=1;} //LED AM if(ampm==1) {RD4 = 1;RD5=0;} //LED PM while(true) { read_time(); display(); keyscan(); } }//end of main program //******************************************************************

128

void set_blink() { switch (mode) { case 1: blink_sec=1; break; case 2: {blink_min=1;blink_sec=0;} break; case 3: {blink_hour=1;blink_min=0;} break; case 4: { blink=0;mode = 0;blink_sec=0; blink_min=0;blink_hour=0; } break; } } //****************************************************************** void change_time() { if(mode == 1) {blink_sec=1;set_sec();} if(mode == 2) {blink_min=1;set_min();} if(mode == 3) {blink_hour=1;set_hour();} if(mode == 4) { blink=0;mode = 0; blink_sec=0; blink_min=0; blink_hour=0; } } //****************************************************************** void update_1307() { write_DS1307(0,sec); write_DS1307(1,min); bit_set(hour,6); if (ampm == 0) {bit_clear(hour,5); write_DS1307(2,hour);} // AM if (ampm == 1) {bit_set (hour,5); write_DS1307(2,hour);} // PM } //****************************************************************** void keyscan() {

129

RD0=1;RD1=1;RD2=1;RD3=1; if(SW1 != 1) { key=0;SW1=1;delay_ms(150);} if(SW2 != 1) { key=1;SW2=1;delay_ms(150);} if(SW3 != 1) { key=2;SW3=1;delay_ms(150);} if(key != 5) { switch (key) { case 0: {mode++;key = 5;blink=1;set_blink();} break; case 1: {change_time();key = 5;update_1307();} break; case 2: {clear_status();key = 5;} break; } } } //****************************************************************** void set_sec() { sec=read_ds1307(0); if (sec>=0x30) {sec=0; min++; write_ds1307(1,min);} else sec=0; write_ds1307(0,sec); } //****************************************************************** void set_min() { byte j; min=read_ds1307(1); min++; j=min & 0x0F; if (j>=0x0A) min=min+0x06; if (min>=0x60) min=0; write_ds1307(1,min); } //****************************************************************** void set_hour() { hour= hour & 0x1F; hour++;

130

if(hour== 0x0a) hour = hour+0x06; if(hour == 0x13) { hour = 0x00; if (ampm == 0) ampm = 1; else ampm = 0; } } //****************************************************************** void clear_status() { mode=4; set_blink(); } //****************************************************************** void read_time() { sec = read_DS1307(0); min = read_DS1307(1); hour = read_DS1307(2); update_time(); } //****************************************************************** void update_time() { ampm = bit_test(hour,5); //test AM PM if(ampm == 0) {RD4 = 0;RD5=1;} //AM if(ampm == 1) {RD4 = 1;RD5=0;} // PM DIS1= sec & 0x0F; DIS2=(sec & 0xF0)>>4; //convert to BCD SEC DIS3= min & 0x0F; DIS4=(min & 0xF0)>>4; //convert to BCD MIN DIS5= hour & 0x0F; DIS6=(hour & 0x10)>>4; //convert to BCD HOUR } //****************************************************************** void display() { TRISB=0x00;TRISA=0x00; if(blink==0) goto norm; if(on_off==0) goto led_blink; norm: //-----------------------------------------------------------------

131

// sec - min - hour PortB=MAP[DIS1]; RA5=0;//DIS1 delay_ms(1); RA5=1; PortB=MAP[DIS2]; RA4=0; //DIS2 delay_ms(1); RA4=1; PortB=MAP[DIS3];output_low(PIN_B7);RA3=0;//DIS3 delay_ms(1); RA3=1; PortB=MAP[DIS4]; RA2=0;//DIS4 delay_ms(1); RA2=1; PortB=MAP[DIS5];output_low(PIN_B7); RA1=0;//DIS5 delay_ms(1); RA1=1; PortB=MAP[DIS6];if (portb==0xC0) RA0=1; else RA0=0;//DIS6 delay_ms(1); RA0=1;//*/ if(count!=0) goto exit; else { count=15; on_off=0; } goto exit; led_blink: PortB=MAP[DIS1]; if (blink_sec==1) RA5=1;//DIS1 else RA5=0; delay_ms(3); RA5=1; PortB=MAP[DIS2]; if (blink_sec==1) RA4=1;//DIS2 else RA4=0; delay_ms(3); RA4=1; PortB=MAP[DIS3];output_low(PIN_B7); if(blink_min==1) RA3=1;//DIS3 else RA3=0;//DIS3 delay_ms(3); RA3=1; PortB=MAP[DIS4]; if(blink_min==1) RA2=1;//DIS4 else RA2=0;//DIS4 delay_ms(3); RA2=1; PortB=MAP[DIS5];output_low(PIN_B7); if(blink_hour==1) RA1=1;//DIS5 else RA1=0;//DIS5 delay_ms(3); RA1=1;

132

PortB=MAP[DIS6]; if(blink_hour==1) RA0=1;//DIS6 else {if (portb==0xC0) RA0=1; else RA0=0;}//DIS6 delay_ms(3); RA0=1;//*/ if(count==0) {count=15;on_off=1;} //------------------------------------------------------------------ exit: count--; } //************************************************* void init() { Trisd = 0x0F; Trisb = 0x00;//output Trisa = 0x00; RD4=1;RD5=1; init_ds1307(); } //************************************************* //END PROGRAM