-Vi-điều-khiển-At89s52

44
A .GIỚI THIỆU VỀ VI ĐIỀU KHIỂN 89S52 1. Tổng quan về 89S52 AT89S52 là họ IC vi điều khiển do hãng Atmel sản xuất. Các sản phẩm AT89S52 thích hợp cho những ứng dụng điều khiển. Việc xử lý trên byte và các toán số học ở cấu trúc dữ liệu nhỏ được thực hiện bằng nhiều chế độ truy xuất dữ liệu nhanh trên RAM nội. Tập lệnh cung cấp một bảng tiện dụng của những lệnh số học 8 bit gồm cả lệnh nhân và lệnh chia. Nó cung cấp những hổ trợ mở rộng trên chip dùng cho những biến một bit như là kiểu dữ liệu riêng biệt cho phép quản lý và kiểm tra bit trực tiếp trong hệ thống điều khiển. AT89S52 cung cấp những đặc tính chuẩn như: 8 KByte bộ nhớ chỉ đọc có thể xóa và lập trình nhanh (EPROM), 128 Byte RAM, 32 đường I/O, 3 TIMER/COUNTER 16 Bit, 5 vectơ ngắt có cấu trúc 2 mức ngắt, một Port nối tiếp bán song công, 1 mạch dao động tạo xung Clock và bộ dao động ON-CHIP. Các đặc điểm của chip AT89S52 được tóm tắt như sau: 8 KByte bộ nhớ có thể lập trình nhanh, có khả năng tới 1000 chu kỳ ghi/xoá Tần số hoạt động từ: 0Hz đến 24 MHz 3 mức khóa bộ nhớ lập trình 3 bộ Timer/counter 16 Bit 128 Byte RAM nội.

Transcript of -Vi-điều-khiển-At89s52

A .GIỚI THIỆU VỀ VI ĐIỀU KHIỂN 89S52

1. Tổng quan về 89S52

AT89S52 là họ IC vi điều khiển do hãng Atmel sản xuất. Các sản phẩm

AT89S52 thích hợp cho những ứng dụng điều khiển. Việc xử lý trên byte và các

toán số học ở cấu trúc dữ liệu nhỏ được thực hiện bằng nhiều chế độ truy xuất

dữ liệu nhanh trên RAM nội. Tập lệnh cung cấp một bảng tiện dụng của những

lệnh số học 8 bit gồm cả lệnh nhân và lệnh chia. Nó cung cấp những hổ trợ mở

rộng trên chip dùng cho những biến một bit như là kiểu dữ liệu riêng biệt cho

phép quản lý và kiểm tra bit trực tiếp trong hệ thống điều khiển.

AT89S52 cung cấp những đặc tính chuẩn như: 8 KByte bộ nhớ chỉ đọc có

thể xóa và lập trình nhanh (EPROM), 128 Byte RAM, 32 đường I/O, 3

TIMER/COUNTER 16 Bit, 5 vectơ ngắt có cấu trúc 2 mức ngắt, một Port nối tiếp

bán song công, 1 mạch dao động tạo xung Clock và bộ dao động ON-CHIP.

Các đặc điểm của chip AT89S52 được tóm tắt như sau:

8 KByte bộ nhớ có thể lập trình nhanh, có khả năng tới 1000 chu kỳ ghi/xoá

Tần số hoạt động từ: 0Hz đến 24 MHz

3 mức khóa bộ nhớ lập trình

3 bộ Timer/counter 16 Bit

128 Byte RAM nội.

4 Port xuất /nhập I/O 8 bit.

Giao tiếp nối tiếp.

64 KB vùng nhớ mã ngoài

64 KB vùng nhớ dữ liệu ngoại.

4 s cho hoạt động nhân hoặc chia

Sơ đồ khối của AT89S52

AT89S52

2. Mô tả chân 89S52

2.1. Sơ đồ chân 89S52

Mặc dù các thành viên của

họ 8051(ví dụ 8751, 89S52,

89C51, DS5000) đều có các kiểu

đóng vỏ khác nhau, chẳng hạn

như hai hàng chân DIP (Dual In-

Line Pakage), dạng vỏ dẹt vuông

QPF (Quad Flat Pakage) và dạng

chip không có chân đỡ LLC

(Leadless Chip Carrier) thì chúng

đều có 40 chân cho các chức

năng khác nhau như vào ra I/O,

đọc , ghi , địa chỉ, dữ liệu

và ngắt. Cần phải lưu ý một số hãng cung cấp một phiên bản 8051 có 20 chân

với số cổng vào ra ít hơn cho các ứng dụng yêu cầu thấp hơn. Tuy nhiên vì hầu

hết các nhà phát triển sử dụng chíp đóng vỏ 40 chân với hai hàng chân DIP nên

ta chỉ tập trung mô tả phiên bản này.

2.2. Chức năng của các chân 89S52

Port 0: từ chân 32 đến chân 39 (P0.0 _P0.7). Port 0 có 2 chức năng: trong

các thiết kế cỡ nhỏ không dùng bộ nhớ mở rộng nó có chức năng như các

đường IO, đối với thiết kế lớn có bộ nhớ mở rộng nó được kết hợp giữa bus địa

chỉ và bus dữ liệu.

Port 1: từ chân 1 đến chân 9 (P1.0 _ P1.7). Port 1 là port IO dùng cho giao

tiếp với thiết bị bên ngoài nếu cần.

Port 2: từ chân 21 đến chân 28 (P2.0 _P2.7). Port 2 là một port có tác dụng

kép dùng như các đường xuất/nhập hoặc là byte cao của bus địa chỉ đối với các

thiết bị dùng bộ nhớ mở rộng.

Port 3: từ chân 10 đến chân 17 (P3.0 _ P3.7). Port 3 là port có tác dụng kép.

Các chân của port này có nhiều chức năng, có công dụng chuyển đổi có liên hệ đến

các đặc tính đặc biệt của 89S52 như ở bảng sau:

Bit Tên Chức năng chuyển đổi

P3.0

P3.1

P3.2

P3.3

P3.4

P3.5

P3.6

P3.7

RXD

TXD

INT0

INT1

T0

T1

WR

RD

Ngõ vào dữ liệu nối tiếp.

Ngõ xuất dữ liệu nối tiếp.

Ngõ vào ngắt cứng thứ 0.

Ngõ vào ngắt cứng thứ 1.

Ngõ vào TIMER/ COUNTER thứ 0.

Ngõ vào của TIMER/ COUNTER thứ

1.

Tín hiệu ghi dữ liệu lên bộ nhớ ngoài.

Tín hiệu đọc bộ nhớ dữ liệu ngoài.

PSEN (Program store enable):

PSEN là tín hiệu ngõ ra có tác dụng cho phép đọc bộ nhớ chương trình

mở rộng và thường được nối đến chân OE của Eprom cho phép đọc các byte

mã lệnh.

PSEN ở mức thấp trong thời gian 89S52 lấy lệnh. Các mã lệnh của

chương trình được đọc từ Eprom qua bus dữ liệu, được chốt vào thanh ghi lệnh

bên trong 89S52 để giải mã lệnh. Khi 89S52 thi hành chương trình trong ROM

nội, PSEN ở mức cao.

ALE (Address Latch Enable):

Khi 89S52 truy xuất bộ nhớ bên ngoài, Port 0 có chức năng là bus địa chỉ và

dữ liệu do đó phải tách các đường dữ liệu và địa chỉ. Tín hiệu ra ALE ở chân thứ

30 dùng làm tín hiệu điều khiển để giải đa hợp các đường địa chỉ và dữ liệu khi

kết nối chúng với IC chốt.

Tín hiệu ở chân ALE là một xung trong khoảng thời gian port 0 đóng vai trò

là địa chỉ thấp nên chốt địa chỉ hoàn toàn tự động.

EA (External Access): Tín hiệu vào EA (chân 31) thường được mắc lên mức

1 hoặc mức 0. Nếu ở mức 1, 89S52 thi hành chương trình từ ROM nội. Nếu ở

mức 0, 89S52 thi hành chương trình từ bộ nhớ mở rộng. Chân EA được lấy làm

chân cấp nguồn 21V khi lập trình cho Eprom trong 89S52.

RST (Reset): Khi ngõ vào tín hiệu này

đưa lên mức cao ít nhất 2 chu kỳ máy, các

thanh ghi bên trong được nạp những giá trị

thích hợp để khởi động hệ thống. Khi cấp điện

mạch phải tự động reset.

Các giá trị tụ và điện trở được chọn là:

R1=10, R2=220, C=10 F.

Các ngõ vào bộ dao động X1, X2:

Bộ tạo dao động được tích hợp bên trong

89S52. Khi sử dụng 89S52, người ta chỉ cần

nối thêm thạch anh và các tụ. Tần số thạch

anh tùy thuộc vào mục đích của người sử dụng,

giá trị tụ thường được chọn là 33p.

3. Tổ chức bộ nhớ bên trong 89S52

Bộ nhớ trong 89S52 bao gồm ROM và RAM. RAM trong 89S52 bao gồm

nhiều thành phần: phần lưu trữ đa dụng, phần lưu trữ địa chỉ hóa từng bit, các

bank thanh ghi và các thanh ghi chức năng đặc biệt.

AT89S52 có bộ nhớ được tổ chức theo cấu trúc Harvard: có những vùng

bộ nhớ riêng biệt cho chương trình và dữ liệu. Chương trình và dữ liệu có thể

chứa bên trong 89S52 nhưng 89S52 vẫn có thể kết nối với 64K byte bộ nhớ

chương trình và 64K byte dữ liệu bên ngoài.

Bản đồ bộ nhớ Data bên trong Chip 89S52 được tổ chức như sau:

Địa chỉ

byteĐịa chỉ bit Địa chỉ bit

Địa chỉ

byte

RAM bên trong AT89S52 được phân chia như sau:

Các bank thanh ghi có địa chỉ từ 00H đến 1FH.

RAM địa chỉ hóa từng bit có địa chỉ từ 20H đến 2FH.

RAM đa dụng từ 30H đến 7FH.

Các thanh ghi chức năng đặc biệt từ 80H đến FFH

3.1. RAM đa dụng

RAM đa dụng có địa chỉ từ 30h – 7Fh có thể truy xuất mỗi lần 8 bit bằng

cách dùng chế độ định địa chỉ trực tiếp hay gián tiếp.

Các vùng địa chỉ thấp từ 00h – 2Fh cũng có thể sử dụng cho mục đích như

trên, ngoài các chức năng đặc biệt được đề cập ở phần sau.

3.2. RAM có thể định địa chỉ bit

Vùng địa chỉ từ 20h -2Fh gồm 16 byte có thể thực hiện như vùng RAM đa

dụng (truy xuât mỗi lần 8 bit) hay thực hiện truy xuất mỗi lần 1 bit bằng các lệnh

xử lý bit.

3.3. Các bank thanh ghi

Vùng địa chỉ 00h – 1Fh được chia thành 4 bank thanh ghi: bank 0 từ 00h – 07h,

bank 1 từ 08h – 0Fh, bank 2 từ 10h – 17h và bank 3 từ 18h – 1Fh. Các bank

thanh ghi này được đại diện bằng các thanh ghi từ R0 đến R7. Sau khi khởi động

thì hệ thống bank 0 được chọn sử dụng.

Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một bank thanh ghi được truy

xuất bởi các thanh ghi R0 đến R7. Viêc thay đổi bank thanh ghi được thực hiện

thông qua thanh ghi từ trạng thái chương trình (PSW).

3.4. Các thanh ghi có chức năng đặc biệt

Các thanh ghi trong 89S52 được định dạng như một phần của RAM trên

chip vì vậy mỗi thanh ghi sẽ có một địa chỉ (ngoại trừ thanh ghi bộ đếm chương

trình và thanh ghi lệnh vì các thanh ghi này hiếm khi bị tác động trực tiếp). Cũng

như R0 đến R7, 89S52 có 21 thanh ghi có chức năng đặc biệt (SFR: Special

Function Register) ở vùng trên của RAM nội từ địa chỉ 80H đến 0FFH.

Sau đây là một vài thanh ghi đặc biệt thường được sử dụng:

3.4.1. Thanh ghi trạng thái chương trình (PSW: Program Status Word)

BIT SYMBOL ADDRESS DESCRIPTION

PSW.7 CY D7H Cary Flag

PSW.6 AC D6H Auxiliary Cary Flag

PSW.5 F0 D5H Flag 0

PSW4 RS1 D4H Register Bank Select 1

PSW.3 RS0 D3H Register Bank Select 0

00=Bank 0; address 00H07H

01=Bank 1; address 08H0FH

10=Bank 2; address 10H17H

11=Bank 3; address 18H1FH

PSW.2 OV D2H Overlow Flag

PSW.1 - D1H Reserved

PSW.0 P DOH Even Parity Flag

Chức năng từng bit trạng thái chương trình

- Cờ Carry CY (Carry Flag):Cờ nhớ thường nó được dùng cho các lệnh

toán học: C =1 nếu phép toán cộng có sự tràn hoặc phép trừ có mượn và

ngược lại C = 0 nếu phép toán cộng không tràn và phép trừ không có

mượn.

- Cờ Carry phụ AC (Auxiliary Carry Flag): Khi cộng những giá trị BCD

(Binary Code Decimal), cờ nhớ phụ AC được set nếu kết quả 4 bit thấp

nằm trong phạm vi điều khiển 0AH - 0FH. Ngược lại AC = 0

- Cờ 0 (Flag 0):

Cờ 0 (F0) là 1 bit cờ đa dụng dùng cho các ứng dụng của người dùng.

- Những bit chọn bank thanh ghi truy xuất:

RS1 và RS0 quyết định dãy thanh ghi tích cực. Chúng được xóa sau khi

reset hệ thống và được thay đổi bởi phần mềm khi cần thiết.

Tùy theo RS1, RS0 = 00, 01, 10, 11 sẽ được chọn Bank tích cực tương

ứng là Bank 0, Bank1, Bank2 và Bank3.

- Cờ tràn OV (Over Flag):

Cờ tràn được set sau một hoạt động cộng hoặc trừ nếu có sự tràn toán học.

- Bit Parity (P):

Bit tự động được set hay Clear ở mỗi chu kỳ máy để lập Parity chẵn với

thanh ghi A. Sự đếm các bit 1 trong thanh ghi A cộng với bit Parity luôn luôn

chẵn. Ví dụ A chứa 10101101B thì bit P set lên một để tổng số bit 1 trong A và P

tạo thành số chẵn.

Bit Parity thường được dùng trong sự kết hợp với những thủ tục của Port

nối tiếp để tạo ra bit Parity trước khi phát đi hoặc kiểm tra bit Parity sau khi thu.

RS1 RS0 BANK

0 0 0

0 1 1

1 0 2

1 1 3

3.4.2. Thanh ghi TIMER

Vi Điều Khiển 89S52 có 3 timer 16 bit, mỗi timer có bốn cách làm việc.

Người ta sử dụng các timer để:

o Định khoảng thời gian.

o Đếm sự kiện.

o Tạo tốc độ baud cho port nối tiếp trong 89S52.

Trong các ứng dụng định khoảng thời gian, người ta lập trình timer ở những

khoảng đều đặn và đặt cờ tràn timer. Cờ được dùng để đồng bộ hóa chương

trình để thực hiện một tác động như kiểm tra trạng thái của các ngõ vào hoặc gửi

sự kiện ra các ngõ ra. Các ứng dụng khác có thể sử dụng việc tạo xung nhịp đều

đặn của timer để đo thời gian trôi qua giữa hai sự kiện (ví dụ đo độ rộng xung).

3.4.3. Thanh ghi ngắt (INTERRUPT)

Một ngắt là sự xảy ra một điều kiện, một sự kiện mà nó gây ra treo tạm thời

thời chương trình chính trong khi điều kiện đó được phục vụ bởi một chương

trình khác.

Các ngắt đóng một vai trò quan trọng trong thiết kế và cài đặt các ứng

dụng vi điều khiển. Chúng cho phép hệ thống đáp ứng bất đồng bộ với một sự

kiện và giải quyết sự kiện đó trong khi một chương trình khác đang thực thi.

- Tổ chức ngắt của 89S52:

Có 5 nguồn ngắt ở 89S52: 2 ngắt ngoài, 2 ngắt từ timer và 1 ngắt port

nối tiếp. Tất cả các ngắt theo mặc nhiên đều bị cấm sau khi reset hệ thống và

được cho phép từng cái một bằng phần mềm. Mức độ ưu tiên của các ngắt được

lưu trong thanh ghi IP (Interrupt Priority) hay nói cách khác thanh ghi IP cho phép

chọn mức ưu tiên cho các ngắt (giá trị thanh ghi IP khi reset là 00h).

Bit Ký hiệu Địa chỉ bit Mô tả

IP.7 _ _ Không được mô tả

IP.6 _ _ Không được mô tả

IP.5 ET2 BDH Chọn mức ưu tiên cao (=1) hay thấp (=0)

tại timer 2

IP.4 ES BCH Chọn mức ưu tiên cao (=1) hay thấp (=0)

tại cổng nối tiếp.

IP.3 ET1 BBH Chọn mức ưu tiên cao (=1) hay thấp (=0)

tại timer 1

IP.2 EX1 BAH Chọn mức ưu tiên cao (=1) hay thấp (=0)

tại ngắt ngoài 1

IP.1 ET0 B9H Chọn mức ưu tiên cao (=1) hay thấp (=0)

tại timer 0

IP.0 EX0 B8H Chọn mức ưu tiên cao (=1) hay thấp (=0)

tại ngắt ngoài 0

Tóm tắt thanh ghi IP

Nếu 2 ngắt xảy ra đồng thời thì ngắt nào có nào có mức ưu tiên cao hơn

sẽ được phục vụ trước.

Nếu 2 ngắt xảy ra đồng thời có cùng mức ưu tiên thì thứ tự ưu tiên được

thực hiện từ cao đến thấp như sau: ngắt ngoài 0 – timer 0 – ngắt ngoài 1 – timer

1 – cổng nối tiếp – timer 2.

Nếu chương trình của một ngắt có mức ưu tiên thấp đang chạy mà có

một ngắt xảy ra với mức ưu tiên cao hơn thì chương trình này tạm dừng để chạy

một chương trình khác có mức ưu tiên cao hơn.

- Cho phép và cấm ngắt:

Mỗi nguồn ngắt được cho phép hoặc cấm ngắt qua một thanh ghi chức

năng đặt biệt có định địa chỉ bit IE (Interrupt Enable: cho phép ngắt) ở địa chỉ

A8H.

Bit Ký hiệu Địa chỉ bit Mô tả

IE.7 EA AFH Cho phép / Cấm toàn bộ

IE.6 _ AEH Không được mô tả

IE.5 ET2 ADH Cho phép ngắt từ Timer 2 (8052)

IE.4 ES ACH Cho phép ngắt port nối tiếp

IE.3 ET1 ABH Cho phép ngắt từ Timer 1

IE.2 EX1 AAH Cho phép ngắt ngoài 1

IE.1 ET0 A9H Cho phép ngắt từ Timer 0

IE.0 EX0 A8H Cho phép ngắt ngoài 0

Tóm tắt thanh ghi IE

- Các cờ ngắt:

Khi điều kiện ngắt xảy ra thì ứng với từng loại ngắt mà loại cờ đó được đặt

lên mức cao để xác nhận ngắt.

Ngắt Cờ Thanh ghi SFR và vị trí bit

Bên ngoài 0 IE0 TCON.1

Bên ngoài 1 IE1 TCON.3

Timer 1 TF1 TCON.7

Timer 0 TF0 TCON.5

Port nối tiếp TI SCON.1

Port nối tiếp RI SCON.0

Các loại cờ ngắt

- Các vectơ ngắt:

Khi chấp nhận ngắt, giá trị được nạp vào PC gọi là vector ngắt. Nó là địa chỉ

bắt đầu của ISR cho nguồn tạo ngắt, các vector ngắt được cho ở bảng sau :

Ngắt Cờ Địa chỉ vector

Reset hệ

thống

RST 0000H

Bên ngoài 0 IE0 0003H

Timer 0 TF0 000BH

Bên ngoài 1 IE1 0013H

Timer 1 TF1 001BH

Port nối tiếp TI và RI 0023H

Timer 2 002BH

Vector reset hệ thống (RST ở địa chỉ 0000H) được để trong bảng này vì theo nghĩa này, nó giống ngắt: nó ngắt chương trình chính và nạp cho PC giá trị mới.

B. IC ghi dịch 74HC595 .Hình dạng thực tế:

1, Chức năng :Là ic ghi dịch 8bit kết hợp chốt dữ liệu , đầu vào nối tiếp đầu ra song song .Chức năng: Thường dùng trong các mạch quét led 7 , led matrix …để tiết

kiệm số chân VDK tối đa (3 chân) . Có thể mở rộng số chân vi điều khiển bao nhiêu tùy thích bằng việc mắc nối tiếp đầu vào dữ liệu các ic với nhau .2,Sơ đồ chân:

Giải thích ý nghĩa hoạt động của một số chân quan trọng:

Chân 14 : đầu vào dữ liệu nối tiếp . Tại 1 thời điểm xung clock chỉ đưa vào được 1 bit

QA=>QH : trên các chân (15,1,2,3,4,5,6,7)

Xuất dữ liệu khi chân chân 13 tích cực ở mức thấp và có một xung tích cực ở sườn âm tại chân chốt 12

Chân 13 : Chân cho phép tích cực ở mức thấp (0) .Khi ở mức cao, tất cả các đầu ra của 74595 trở về trạng thái cao trở, không có đầu ra nào được cho phép.

Chân 9: Chân dữ liệu nối tiếp . Nếu dùng nhiều 74595 mắc nối tiếp nhau thì chân này đưa vào đầu vào của con tiếp theo khi đã dịch đủ 8bit.

Chân 11: Chân vào xung clock . Khi có 1 xung clock tích cực ở sườn dương(từ 0 lên 1) thì 1bit được dịch vào ic.

Chân 12 : xung clock chốt dữ liệu . Khi có 1 xung clock tích cực ở sườn dương thì cho phép xuất dữ liệu trên các chân output . lưu ý có thể xuất dữ liệu bất kỳ lúc nào bạn muốn ,ví dụ đầu vào chân 14 dc 2 bit khi có xung clock ở chân 12 thì dữ liệu sẽ ra ở chân Qa và Qb (chú ý chiều dịch dữ liệu từ Qa=>Qh)

Chân 10: khi chân này ở mức thấp(mức 0) thì dữ liệu sẽ bị xóa trên chip)

Sơ đồ hoạt động của chíp :

3, Bảng thông số chip:

Đây là ic đầu ra hoạt động ở 2 mức 0 &1 dòng ra tầm 35mA . điện áp hoạt động <=7V . Công suất trung bình 500m

Dựa vào bảng tính toán được các thông số khi thiết kế mạch

4, Tần số đáp ứng:

Tại 6V thì tần số vào đáp ứng khoảng 400ns . Dựa vào đó chúng ta se đưa được ra tần số quét hợp lý.

6, Cấu tạo chip :

+ Nguyên tắc hoạt động:

Khi đưa một bít dữ liệu vào đầu vào Serial Input (chân 14) cần có một xung từ thấp lên cao trên chân SCK (chân 11). Khi đó bít dữ liệu này sẽ được dịch vào trong thanh ghi dịch (8-stage shift register).

Khi dịch đủ 8 bít và có 1 xung từ thấp lên cao trên chân RCK (chân 12) thì 8 bít dữ liệu sẽ được chốt vào thanh ghi chứa (8-bit storage register). Đồng thời 8 bít dữ liệu này vẫn tồn tại trong thanh ghi dịch.

Khi dữ liệu đã được chốt vào thanh ghi chứa mà chân G (chân 13) ở mức thấp thì dữ liệu này sẽ được đẩy vào vùng đệm 3 trạng thái và dữ liệu sẽ xuất hiện ở đầu ra song song QA…QH

Chân SCLR dùng để xóa thanh ghi dịch, nếu SCLR ở mức thấp, nội dung của thanh ghi dịch sẽ bị xóa.

Khi trong thanh ghi dịch đã đủ 8 bít mà đưa thêm vào bít thứ 9 thì bít đầu tiên sẽ bị đẩy ra đầu ra QH’ và bít thứ 9 sẽ nhảy vào thanh ghi dịch.

C. GIỚI THIỆU VỀ MA TRẬN LED

a. Cấu tạo

_ Ma trận led bao gồm nhiều led đơn bố trí thành hàng và cột trong một vỏ. Các tín hiệu điều khiển cột được nối với Anode trên tất cả các led trên cùng một cột. Các tín hiệu điều khiển hàng cũng được nối với Cathode của tất cả các led trên cùng 1 hàng như hình vẽ :

b. Cơ sở lý thuyết

Dựa trên nguyên tắc quét hình, ta có thể thực hiện việc hiển thị ma trận đèn bằng cách quét theo cột.

Mỗi led trên ma trận LED có thể coi như một điểm ảnh. Địa chỉ của mỗi điểm ảnh này được xác định đồng thời bởi bộ đệm hàng và bộ đệm cột, điểm ảnh này sẽ được xác định trạng nhờ dữ liệu đưa ra từ bộ vi điều khiển 89C51.

Như vậy tại mỗi thời điểm chỉ có trạng thái của một điểm ảnh được xác định. Tuy nhiên khi xác định địa chỉ và trạng thái của điểm ảnh tiếp theo thì các điểm ảnh còn lại sẽ chuyển về trạng thái tắt (nếu led sáng thì sẽ tắt dần ).

Vì thế để hiển thị được toàn bộ hình ảnh của ma trận LED, ta có thể quét ma trận nhiều lần với tốc độ quét rất lớn, lớn hơn nhiều lần so với thời gian kịp tắt của đèn. Mắt người chỉ nhận biết đươc tối đa 24hình/s do đó nếu tốc độ quét rất lớn thì sẽ không nhận ra được sự thay đổi nhỏ của led mà sẽ thấy được toàn bộ hình ảnh cần hiển thị.

c. Nguyên lý hoạt động

Khi có một tín hiệu điều khiển ở cột và hàng, các chân Anode của các led trên cột tương ứng được cấp điện áp cao, đồng thời các chân Cathode của các led trên hàng tương ứng được cấp điện áp thấp. Tuy nhiên lúc đó chỉ có một led sáng, vì nó có đồng thời điện thế cao trên Anode và điện thế thấp trên Cathode. Như vậy khi có một tín hiệu điều khiển hàng và cột thì tại một thời điểm chỉ có duy nhất một led tại chổ gặp nhau của hàng và cột là sáng. Các bảng quang báo với số lượng led lớn hơn cũng được kết nối theo cấu trúc như vậy.

Trong trường hợp ta muốn cho sáng đồng thời một số led rời rạc trên ma trận, để hiển thị một ký tự nào đó, nếu trong hiển thị tĩnh ta phải cấp áp cao cho Anode và áp thấp cho Cathode, cho led tương ứng mà ta muốn sáng . Nhưng khi đó một số led ta không mong muốn cũng sẽ sáng , miễn là nó nằm tại vị trí gặp nhau của các cột và hàng mà ta cấp nguồn . Vì vậy trong điều khiển led ma trận ta không thể sử dụng phương pháp hiển thị tĩnh mà phải sử dụng phương pháp quét (hiển thị động), có nghĩa là ta phải tiến hành cấp tín hiệu điều khiển theo dạng xung quét trên các hàng và cột cần hiện thị. Để cho mắt nhìn thấy các led không bị nháy , thì tần số quét nhỏ nhất cho mỗi chu kỳ là khoảng 20HZ (50ms). Trong lập trình điểu khiển led ma trận bằng vi xử lý ta cũng phải sử dụng phương pháp quét như vậy.

Ma trận led có thể là loại chỉ hiển thị được một màu hoặc hiển thị được 2 màu trên một điểm , khi đó led có số chân ra tương ứng : đối với ma trận led 8x8 hiển thị một màu ,thì số chân ra là 16 , trong đó 8 chân dùng để điều khiển hàng và 8

chân còn lại dùng để điểu khiển cột . Đối với loại 8x8 có 2 màu thì số chân ra của led là 24 chân , trong đó có 8 chân dùng để điều khiển cột ( hoặc hàng ) chung cho cả hai màu , 16 chân còn lại thì 8 chân dùng để điều khiển hàng ( hoặc cột ) màu thứ nhất , 8 chân còn lại dung để điều khiển màu thứ 2.

D. IC ULN2803

ULN2803 là IC đệm đảo có 16 chân trong đó có 8 ngõ vào và 8ngõ ra, dứoi đây là hình dạng và cấu tạo bên trong của 2803:

Bộ đệm đảo dùng IC ULN2803 nhằm đảo bít nếu ngõ vào ở mức cao qua 2803 ra sẽ là mức thấp và ngược lại. ULN2803 chịu đựng mức điện áp từ 6V-15V.

E. Mô tả bài toán quét ma trận led

Kết nối AT89S52 với 3 ma trận LED 8x8 hai màu. Lập trình hiển thị chữ trên ma trận LED với hiệu ứng chạy trái…

2. Định hướng giải quyết

a. Về mặt phần cứng

Các chân Anot chung của 3 ma trận LED được nối chung nhau một cách tương ứng.

Các chân Katot chung của cả 3 ma trận LED sẽ được điều khiển riêng rẽ.

Như vậy sau khi nối 3 ma trận LED 8x8x2 sẽ được một ma trận LED mới có 8 đường Anot chung và 48 đường Katot chung.

Mạch đệm nguồn cho ma trận LED này sử dụng transistor C945. Có 8 đường Anot chung cho nên cần sử dụng 8 transistor.

Mạch đệm cho các chân Katot chung sử dụng thanh ghi dịch 74HC595. Mỗi thanh ghi dịch này có thể đệm được 8 đường Katot chung (1bytes) của một ma trận LED vì thế để đệm cho 3 ma trận LED thì cần 6 thanh ghi dịch 74HC595.

b. Về mặt phần mềm:

- Tạo dữ liệu cho việc hiển thị:

+ Căn cứ vào các điểm sáng tối trên ma trận LED để tạo ra dữ liệu:

+ Dữ liệu này sẽ được đưa ra chân Katot của các ma trận LED, mức logic 0 thì

LED sáng, mức logic 1 thì LED tối.

+ Ví dụ dữ liệu của chữ E:

Hiển thị dữ liệu đứng yên:

Ta đặt ma trận LED sao cho khi cấp nguồn vào chân Anot chung thì LED sáng theo hàng. Như thế 4 ma trận ghép lại sẽ có 8 hàng và 32 cột.

Sử dụng phương pháp quét tương tự như quét LED 7 thanh. Tại một thời điểm chỉ có 1 trong 8 hàng được cấp nguồn cho LED sáng, các hàng khác không được cấp.

Trình tự quét tiến hành như sau:

Đưa dữ liệu ra các chân Katot để tạo các điểm LED sáng tối Cấp nguồn cho hàng tương ứng Trễ sáng trong một thời gian Cắt nguồn để tắt hàng tương ứng Tiếp tục 4 bước trên với hàng tiếp theo. Hiển thị dữ liệu với các hiệu ứng dịch trái, phải…

Như thế thì :

Thực tế của các hiệu ứng dịch trái, phải…là hiển thị tĩnh với các dữ liệu khác nhau.

Dữ liệu hiển thị được lưu trong một vùng nhớ tạm gọi là vùng Buffer. Các

bước tiến hành tạo ra hiệu ứng dịch trái như sau:

Hiển thị tĩnh dữ liệu hiện tại ra ma trận LED Trễ sáng trong một thời gian Dịch toàn bộ dữ liệu trong vùng Buffer sang trái một vị trí Hiển thị tĩnh dữ liệu mới ra ma trận LED Thực hiện lại từ bước 2.

Các bước tiến hành với hiệu ứng khác cũng tương tự, chỉ khác ở thuật toán cập nhật lại dữ liệu.

F. Xây dựng giải thuật chương trình

a. Hiển thị dữ liệu đứng yên: b: Xử lý hiệu ứng.

G. GIAO TIẾP MÁY TÍNH VỚI VI ĐIỀU KHIỂN AT89S52

Sử dụng giao thức truyền thông nối tiếp bộ UART của vi điều khiển AT89s52 và sử dụng chip chuyển đổi chuyên dụng từ giao thức UART sang giao thức USB để kết nối máy tính qua cổng USB.

Chíp PL2303 là chip chuyên dụng chuyển đồi từ UART sang USB, cấu

tạo của nó như sau:

Một số chân quan trọng :

Chân 1:TXD dữ liệu ra cổng nối tiếp UART– nối tới vi điều khiển Chân 5:RXD dữ liệu đưa tới cổng nối tiếp UART – nối tới vi điều khiển Chân 20 : cấp nguồn 5 v cho chip hoạt động Chân 21 : nối tới cực âm của nguồn Chân 27,28: nối tới thạch anh tạo dao động cho chip hoạt động 12Mhz Chân 15,6: hai chân dữ liệu nối vào cổng USB của máy tính để chuyển đổi

giao tiếp từ USB sang UART.

Sơ đồ khối bên trong PL2303 Sơ đồ chân cổng PL2303

Thiết kế mạch :

LATCHCLOCK

DATA

OE19

DIR1

A12 B1 18

A23 B2 17

A34 B3 16

A45 B4 15

A56 B5 14

A67 B6 13

A78 B7 12

A89 B8 11

VCC 20

GND10

U17

74HC245AD

VCC

GND

OE

1KR2

VCC

1KR3

VCC

RXD1TXD1

GND

XT1XT2

SCK1MISO1MOSI1

RESET

D2

LED1K

R18

VCC

(MISO) P1.62

(SCK) P1.73

RST4

(RXD) P3.05

NC 6

(TXD) P3.17

(INT0) P3.28

(INT1) P3.39

(T0) P3.410

(T1) P3.511

(RD) P3.713

XTAL214

XTAL115

GND16

GND17

(A8) P2.0 18(A9) P2.1 19(A10) P2.2 20(A11) P2.3 21(A12) P2.4 22

P2.6 (A14) 24P2.7 (A15) 25

PSEN 26ALE/PROG 27

NC 28

EA/VPP 29

P0.7 (AD7) 30P0.6 (AD6) 31P0.5 (AD5) 32P0.4 (AD4) 33

P0.2 (AD2) 35P0.1 (AD1) 36P0.0 (AD0) 37

VCC38

NC 39

P1.0 (T2)40

P1.1 (T2 EX)P1.1 (T2 EX)41

P1.242

P1.343

P1.444

(WR) P3.612

P2.5 (A13) 23

P0.3 (AD3) 34

(MOSI) P1.51

U18

AT89s52TQFP

EN1

SCKMISOMOSISCK1MISO1MOSI1EN1

VCC

VCC

GND

B1B2B3B4

L

L

SCLSDA

Mạch chíp chủ và đệm đầu ra điều khiển ma trận led

TXD1

DTR_N2

RTS_N3

VDD_2324

RXD5

RI_N6

GND7

VDD8

DSR_N9

DCD_N10

CTS_N11

SHTD_N12

EE_CLK13

EE_DATA14 DP 15DM 16VDD_3V3 17GND_3V3 18RESET 19VDD1 20GND1 21TRI_MODE 22LD_MODE 23VDD_PLL 24GND_PLL 25PLL_TEST 26OSC1 27OSC2 28

U19

PL2303

GND

10pC2

10pC1

12

12MHzY1

GND

0.1uC3

GND

27R6

27R7

1.5KR8

0.1uC4

GND

USB Interface

D-D+

+5

RXD1

TXD1

1234

J3

GND

VCC

+5

VCC

Mạch chuyển đổi từ USB sang UART dùng chip PL2303

Reset, Clock & Programmer

22p

C5

22p

C6

12

xxxMHzY2

GND

XT1

XT2

123456

J4

JUMPER 6

GND

RESETSCKMISOMOSI

8k2R12

10uFC7

RESET

GND

VCC

VCC

Hình 1 Mạch tạo dao động và mạch reset

IN11

IN22

IN33

IN44

IN55

IN66

IN77

IN88

OUT118

OUT316

OUT415

OUT514

OUT613

OUT712

OUT811

OUT217

COM D10

GND9

U2

ULN2803A

IN11

IN22

IN33

IN44

IN55

IN66

IN77

IN88

OUT118

OUT316

OUT415

OUT514

OUT613

OUT712

OUT811

OUT217

COM D10

GND9

U5

ULN2803A

C5R1

C5G2

H53

C6R4

C6G5

H66

C7R7

C7G8

H79

C8R10

C8G11

H812

H413

C4G14

C4R15

H316

C3G17

C3R18

H219

C2G20

C2R21

H122

C1G23

C1R24

8X8 - 60MM2COLOUR

U3

Matrix-8x8-60mm-2colour

VCC

VCC

GND

GND

OE13

RCLK12

SER14

SRCLR10

SRCLK11

QA15

QB1

QC2

QD3

QE4

QF5

QG6

QH7

QH'9

VCC16

GND8

U1

74HC595B1ROE

13

RCLK12

SER14

SRCLR10

SRCLK11

QA15

QB1

QC2

QD3

QE4

QF5

QG6

QH7

QH'9

VCC16

GND8

U4

74HC595B1R

VCC

VCC

VCC

VCC

GND

GND

OE

OE

LATCH

LATCH

CLOCK

CLOCK

DATA1

DATA2

DATA1

DATA0

IN11

IN22

IN33

IN44

IN55

IN66

IN77

IN88

OUT118

OUT316

OUT415

OUT5 14

OUT613

OUT712

OUT811

OUT217

COM D 10GND9

U7

ULN2803A

IN11

IN22

IN33

IN44

IN55

IN66

IN77

IN88

OUT118

OUT3 16

OUT415

OUT514

OUT613

OUT712

OUT8 11

OUT217

COM D10

GND9

U10

ULN2803A

C5R1

C5G2

H53

C6R4

C6G5

H66

C7R7

C7G8

H79

C8R10

C8G11

H8 12

H413

C4G14

C4R15

H3 16

C3G17

C3R18

H219

C2G20

C2R21

H122

C1G23

C1R24

8X8 - 60MM2COLOUR

U8

Matrix-8x8-60mm-2colour

VCC

VCC

GND

GND

OE13

RCLK12

SER14

SRCLR10

SRCLK11

QA15

QB1

QC2

QD3

QE 4

QF5

QG6

QH7

QH'9

VCC16

GND8

U6

74HC595B1ROE

13

RCLK12

SER14

SRCLR10

SRCLK11

QA15

QB1

QC 2

QD3

QE4

QF5

QG6

QH 7

QH'9

VCC16

GND8

U9

74HC595B1R

VCC

VCC

VCC

VCC

GND

GND

OE

OE

LATCH

LATCH

CLOCK

CLOCK

DATA3

DATA4

DATA3

DATA2

IN11

IN22

IN33

IN44

IN55

IN66

IN77

IN88

OUT118

OUT316

OUT415

OUT514

OUT613

OUT712

OUT811

OUT217

COM D10

GND9

U12

ULN2803A

IN11

IN22

IN33

IN44

IN55

IN66

IN77

IN88

OUT118

OUT316

OUT415

OUT514

OUT613

OUT712

OUT811

OUT217

COM D10

GND9

U15

ULN2803A

C5R1

C5G2

H53

C6R4

C6G5

H66

C7R7

C7G8

H79

C8R10

C8G11

H812

H413

C4G14

C4R15

H316

C3G17

C3R18

H219

C2G20

C2R21

H122

C1G23

C1R24

8X8 - 60MM2COLOUR

U13

Matrix-8x8-60mm-2colour

VCC

VCC

GND

GND

OE13

RCLK12

SER14

SRCLR10

SRCLK11

QA15

QB1

QC2

QD3

QE4

QF5

QG6

QH7

QH'9

VCC16

GND8

U11

74HC595B1ROE

13

RCLK12

SER14

SRCLR10

SRCLK11

QA15

QB1

QC2

QD3

QE4

QF5

QG6

QH7

QH'9

VCC16

GND8

U14

74HC595B1R

VCC

VCC

VCC

VCC

GND

GND

OE

OE

LATCH

LATCH

CLOCK

CLOCK

DATA5

DATA4

OE13

RCLK12

SER14

SRCLR10

SRCLK11

QA15

QB 1

QC2

QD3

QE4

QF5

QG 6

QH7

QH'9

VCC16

GND8

U16

74HC595B1R

VCC

OELATCH

CLOCK

DATA

GND

VCC

VCC

VCC

VCC

VCC

VCC

VCC

VCC

VCC

H1

H2

H3

H4

H5

H6

H7

H8

H1H2H3H4H5H6H7H8

1KR9

VCC

OELATCHCLOCKDATA

1KR1

VCC

1KR4

VCC

1KR5

VCC

DATA5

DATA0

Q1

Q2

Q3

Q4

Q5

Q6

Q7

Q8

Mạch động lực led ma trận

H. CHƯƠNG TRÌNH LẬP TRÌNH

#include <regx52.h>#define latch P1_6#define data1 P1_5#define clock P1_7#define enable P1_4 char code NUM[]={ // bang ma du lieu 0xFF, 0xDF, 0xAB, 0xAB, 0xAB, 0x87,//a 0xFF, 0x80, 0xB7, 0xBB, 0xBB, 0xC7,//b 0xFF, 0xC7, 0xBB, 0xBB, 0xBB, 0xDF,//c 0xFF, 0xC7, 0xBB, 0xBB, 0xB7, 0x80,//d 0xFF, 0xC7, 0xAB, 0xAB, 0xAB, 0xE7,//e 0xFF, 0xF7, 0x81, 0xF6, 0xFE, 0xFD,//f 0xFF, 0xF3, 0xAD, 0xAD, 0xAD, 0xC3,//g 0xFF, 0x80, 0xF7, 0xFB, 0xFB, 0x87,//h 0xFF, 0xFF, 0xBB, 0x82, 0xBF, 0xFF,//i 0xFF, 0xDF, 0xBF, 0xBB, 0xC2, 0xFF,//j 0xFF, 0x80, 0xEF, 0xD7, 0xBB, 0xFF,//k 0xFF, 0xFF, 0xBD, 0x81, 0xBF, 0xFF,//l 0xFF, 0x83, 0xFB, 0xE7, 0xFB, 0x87,//m 0xFF, 0x83, 0xF7, 0xFB, 0xFB, 0x87,//n 0xFF, 0xC7, 0xBB, 0xBB, 0xBB, 0xC7,//o 0xFF, 0x83, 0xEB, 0xEB, 0xEB, 0xF7,//p 0xFF, 0xF7, 0xEB, 0xEB, 0xE7, 0x83,//q 0xFF, 0x83, 0xF7, 0xFB, 0xFB, 0xF7,//r 0xFF, 0xB7, 0xAB, 0xAB, 0xAB, 0xDF,//s 0xFF, 0xF7, 0xC1, 0xB7, 0xBF, 0xDF,//t 0xFF, 0xC3, 0xBF, 0xBF, 0xDF, 0x83,//u 0xFF, 0xE3, 0xDF, 0xBF, 0xDF, 0xE3,//v 0xFF, 0xC3, 0xBF, 0xCF, 0xBF, 0xC3,//w 0xFF, 0xBB, 0xD7, 0xEF, 0xD7, 0xBB,//x 0xFF, 0xf3, 0xAF, 0xAF, 0xC3, 0xFF,//y 0xFF, 0xBB, 0x9B, 0xAB, 0xB3, 0xBB,//z

};

/=================================================== unsigned char toltal [7]={0x55,0x00,0x55,0x00,0xff,0x55,0x00};char code temp[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//----------------------------------------------------------unsigned char data_pc[80]={" ***DIEN TU HUY HOANG*** "};unsigned char data_convert[24];unsigned char count_data=31,bien24,speed=1;unsigned int origin;unsigned char colour=0;//----------------------------------------------------------

void delay(unsigned int x){ while (x--){;} ;}//----------------------------------------------------------void Lay24Byte(unsigned int point){ unsigned char i,k,l=0;unsigned char m = point%6; // byte con laiunsigned char n = point/6; // du lieu da lay//-------------------- for (k=m;k<6;k++) { data_convert[l]=NUM[(data_pc[n]-32)*6+k]; l++; } n++;//-------------------- for (i=0;i<3;i++) { for (k=0;k<6;k++) { data_convert[l]=NUM[(data_pc[n]-32)*6+k]; if (n>=count_data)data_convert[l]=255; l++; } n++; }//--------------------

/************* Hàm ngat ***********************************void ngat_noi_tiep(void) interrupt 4 using 0{if (RI) { if (SBUF=='*'){count_data=0;} else { if (SBUF!='#') { if (SBUF !='>') { data_pc[count_data] = SBUF; count_data++; } } } if (SBUF=='#') speed ++; if (speed >10) speed =1; if (SBUF =='>')colour ++; if (colour>2)colour=0; } RI=0;}//----------------------------------------------------)void uart_init(){ // Ham thiet lap truyen thong

TMOD = 0x20; // Thiet lap Timer1, che do 2 tu nap. TH1 = -(0x05); // Thiet lap bau rate = 9600 SCON = 0x50; // 8bit du lieu, 1 start,1 stop

TR1 = 1; // Khoi dong bo tao clock (timer 1)}//----------------------------------------------------void putchar(char a){

TI=0;SBUF= a;while (!TI){}; // Neu co TI =0 thi dung lai TI = 0; // Xoa co TI

}

//----------------------------------------------------void HienThi(unsigned char speed){ unsigned char m,k,t,n; for (origin=0;origin<count_data*6;origin++) { Lay24Byte(origin); for (n=0;n<speed;n++) { P2_5=~P2_5; for (bien24=0;bien24<24;bien24++) { toltal[4]=~data_convert[bien24];

//--------------------------------- if (colour==0) {

if (bien24<8){toltal[1]=temp[bien24%8];toltal[0]=toltal[2]=toltal[3]=toltal[5]=toltal[6]=0;} if (bien24>=8 & bien24<16){toltal[3]=temp[bien24%8];toltal[1]=toltal[0]=toltal[2]=toltal[5]=toltal[6]=0;} if (bien24>=16 & bien24<24){toltal[6]=temp[bien24%8];toltal[1]=toltal[2]=toltal[3]=toltal[0]=toltal[5]=0;}

} else

if (colour==1) {

if (bien24<8){toltal[0]=temp[bien24%8];toltal[1]=toltal[2]=toltal[3]=toltal[5]=toltal[6]=0;} if (bien24>=8 & bien24<16){toltal[2]=temp[bien24%8];toltal[1]=toltal[0]=toltal[3]=toltal[5]=toltal[6]=0;} if (bien24>=16 & bien24<24){toltal[5]=temp[bien24%8];toltal[1]=toltal[2]=toltal[3]=toltal[0]=toltal[6]=0;}A }

else if (colour==2) {

if (bien24<8){toltal[0]=toltal[1]=temp[bien24%8];toltal[2]=toltal[3]=toltal[5]=toltal[6]=0;} if (bien24>=8 & bien24<16){toltal[2]=toltal[3]=temp[bien24%8];toltal[1]=toltal[0]=toltal[5]=toltal[6]=0;} if (bien24>=16 & bien24<24){toltal[5]=toltal[6]=temp[bien24%8];toltal[1]=toltal[2]=toltal[3]=toltal[0]=0;}

} //--------------------------------- //enable=1;

for (k=0;k<7;k++) { t=toltal[k]; for (m=0;m<8;m++) { data1=t&0x01;t=t>>1; clock=0;clock=1; } } latch=0;latch=1;

// enable=0; delay(100);// enable=1;

} } }}

//---------------------------------------------------

//---------------------------------------------------

void main (void){ enable=0;ES=1;EA=1;uart_init();while(1) { HienThi(speed); //putchar(8) }}//---------------------------------------------------