Professional Documents
Culture Documents
GIỚI THIỆU
1.1. Lịch sử phát triển
Năm 1971, hãng Intel ñã cho ra ñời bộ vi xử lí (microprocessor) ñầu tiên trên
thế giới tên gọi là Intel-4004, nhằm ñáp ứng nhu cầu cấp thiết của một công ty kinh
doanh là hãng truyền thông BUSICOM. Intel-4004 là kết quả của một ý tưởng
quan trọng trong kỹ thuật vi xử lí số. ðó là một kết cấu logic mà có thể thay ñổi
ñược chức năng của nó bằng chương trình ngoài chứ không phát triển theo hướng
tạo ra một cấu trúc cứng chỉ thực hiện một số chức năng nhất ñịnh như trước ñây.
Sau ñó, các bộ vi xử lí mới liên tục ñược ñưa ra thị trường và ngày càng ñược
phát triển, hoàn thiện hơn trong các thế hệ sau :
+ Cũng vào năm 1971, hãng Intel ñưa ra bộ vi xử lí 8-bit ñầu tiên với tên
Intel-8008.
+ Năm 1975, Intel chế tạo bộ vi xử lí 8-bit 8080 và 8085.
+ Cũng vào khoảng thời gian 1975, một loạt các hãng khác trên thế giới
cũng ñã giới thiệu các bộ vi xử lí tương tự: 6800 của Motorola, 1801 của RCA, kế
ñến là 6502 của hãng MOS Technology và Z80 của hãng Zilog.
Vào năm 1976 Intel giới thiệu bộ vi ñiều khiển (microcontroller) 8748, một
chip tương tự như các bộ vi xử lí và là chip ñầu tiên trong họ vi ñiều khiển MCS-
48. IC này và các IC khác tiếp theo của họ MCS-48 ñã nhanh chóng trở thành
chuẩn công nghiệp trong các ứng dụng hướng ñiều khiển (control-oriented
application).
Số Transistor
Pentum IV
“Prescott 125M”
Pentum IV
(42M) 100.000K
Pentum III
(9.5M)
80486 10.000K
Pentum II
(1.2M)
80386 (7.5M)
1000K
(275K)
80286 100K
8080 (134K)
(6K) 8088 10K
4004
(29K)
(2.3K)
1.2. Bộ vi xử lý
Viết tắt là MicroProcessor, là hạt nhân của hệ vi xử lý, còn gọi là CPU(Central
Unit Control), nắm quyền kiểm soát các thành phần có trong hệ thống, thực hiện
mọi thao tác liên quan ñến các phép tính toán, xử lý, gia công, biến ñổi các dạng
tín hiệu nhị phân trong hệ dưới sự ñiều khiển của chương trình ñược cài ñặt trong
bộ nhớ trung tâm của hệ vi xử lý.
Bộ vi xử lý thường ñược dùng làm CPU cho các máy tính.
Các bộ vi xử lý thông dụng: Intel 4004 (4 bit), Intel 80x86, Intel 8080, Intel
8085, hä Motorola 680 × 0(68000, 68010, 68020, 68030, 68040 v.v...), Pentium,...
2
lý cao hơn, mặt khác ñường truyền dữ liệu và ñường truyền lệnh ñiều khiển
(chương trình) có thể có dung lượng khác nhau.
Tuy nhiên, các bộ vi ñiều khiển ñược sử dụng trong các sản phẩm tiêu dùng và
các sản phẩm công nghiệp. Không giống như các hệ máy tính ñược xác ñịnh bởi
khả năng ñược lập trình và ñược tái lập trình của chúng, các bộ vi ñiều khiển ñược
lập trình thường trực cho một công việc.
Các hệ máy tính có tỷ lệ RAM-ROM rất cao sao cho các chương trình của
người sử dụng ñược thực thi trong một không gian RAM tương ñối lớn và các
chương trình giao tiếp với phần cứng ñược thực thi trong một không gian ROM
nhỏ.
Các bộ vi ñiều khiển ngược lại có tỷ số ROM-RAM cao. Chương trình ñiều
khiển tương ñối lớn lưu trong ROM trong khi RAM chỉ ñược sử dụng như bộ nhớ
tạm thời.
Các công việc ñược thực hiện bởi các bộ vi ñiều khiển thì không mới. ðiều mới
là các thiết kế ñược thực hiện với ít thành phần hơn so với các thiết kế trước ñó.
Các thiết kế trước ñó yêu cầu hàng chục thậm chí vài trăm IC ñể hiện thực nay chỉ
cần một ít thành phần trong ñó có bộ vi ñiều khiển.
Vấn ñề ở ñây là tốc ñộ, các giải pháp dựa trên bộ vi ñiều khiển không bao giờ
nhanh bằng các giải pháp dựa trên các thành phần rời rạc.
Data bus
CPU
CPU RAM ROM
General- Serial
Purpose RAM ROM I/O Timer COM
Micro- Port Port
Serial
processo I/O Timer COM
r
Port
Address bus
(a) General-Purpose Microcessor (b) Microcontroller
System
Bộ vi xử lý khác bộ vi ñiều khiển ở 3 ñiểm chính: Cấu trúc phần cứng, các ứng
dụng và ñặc trưng của tập lệnh.
3
(Hệ) Vi xử lý Vi ñiều khiển
1.Cấu trúc phần cứng
- CPU ñơn chip, riêng biệt, các thành - CPU, RAM, ROM, I/O và Timer,... nằm
phần thêm vào là RAM, ROM, I/O, trên cùng một chip, tạo nên một hệ máy
Timer bên ngoài ñể tạo thành một hệ vi tính ñầy ñủ.
xử lý. - Cố ñịnh lượng ROM, RAM, I/O port trên
- Lượng ROM, RAM, I/O, Ports tùy ý chip
2.Các ứng dụng
- Chủ yếu dùng làm CPU trong các hệ - Ứng dụng trong các thiết kế nhỏ, cho các
máy vi tính, xử lý thông tin. ứng dụng hướng ñiều khiển (ñơn mục
- Giá thành cao. ñích). Trong quá khứ các thiết kế như vậy
- ða năng, ña mục ñích yêu cầu hàng chục thậm chí hàng trăm vi
mạch số.
- Giá cả thấp.
- Năng lượng tiêu thụ thấp.
- Kích thước nhỏ, gọn.
3. Tập lệnh
- Các lệnh bao quát, mạnh về các kiểu - Các lệnh cung cấp các ñiều khiển xuất
ñịnh ñịa chỉ với các lệnh cung cấp các nhập. Mạch giao tiếp cho nhiều ngõ nhập
hoạt ñộng trên các lượng dữ liệu lớn. và ngõ xuất chỉ sử dụng một bit.
-Các lệnh có thể hoạt ñộng trên các - Có các mạch bên trong và các lệnh dành
1/2byte, byte, từ, từ kép., cung cấp khả cho thao tác xuất nhập, ñịnh thời sự kiện,
năng truy xuất các dãy dữ liệu lớn bằng cho phép và thiết lập các mức ưu tiên cho
cách sử dụng con trỏ hoặc offset. các ngắt ñược tạo ra bởi kích thích bên
ngoài.
- Các lệnh hầu hết ñược thực thi trên từng
byte. Một tiêu chuẩn thiết kế là chương
trình phải ñặt vừa trong ROM nội vì việc
thêm ROM ngoài sẽ làm tăng giá thành
sản phẩm.
Một nhà thiết kế hệ thống sử dụng một bộ vi xử lý công dụng chung chẳng
hạn như Pentium hay 68040 phải bổ sung thêm RAM , ROM, các cổng vào ra và
các bộ ñịnh thời ngoài ñể làm cho chúng hoạt ñộng ñược. Mặc dù việc bổ xung
RAM, ROM và các cổng vào ra bên ngoài làm cho hệ thống cồng cềnh và ñắt hơn,
nhưng chúng có ưu ñiểm là linh hoạt chẳng hạn như người thiết kế có thể quyết
ñịnh về số lượng RAM, ROM và các cổng vào ra cần thiết phù hợp với bài toán
trong tầm tay của mình.
ðiều này không thể có ñược ñối với các bộ vi ñiều khiển. Một bộ vi ñiều
khiển có một CPU (một bộ vi xử lý) cùng với một lượng cố ñịnh RAM, ROM, các
cổng vào ra và một bộ ñịnh thời tất cả trên cùng một chíp. Hay nói cách khác là bộ
4
xử lý, RAM, ROM các cổng vào ra và bộ ñịnh thời ñều ñược nhúng với nhau trên
một chíp; do vậy người thiết kế không thể bổ xung thêm bộ nhớ ngoài, cổng vào ra
hoặc bộ ñịnh thời cho nó. Số lượng cố ñịnh của RAM, ROM trên chíp và số các
cổng vào - ra trong các bộ vi ñiều khiển làm cho chúng trở nên lý tưởng ñối với
nhiều ứng dụng mà trong ñó giá thành và không gian lại hạn chế. Trong nhiều ứng
dụng, ví dụ một ñiều khiển TV từ xa thì không cần công suất tính toán của bộ vi sử
lý 486 hoặc thậm chí như 8086. Trong rất nhiều ứng dụng thì không gian nó
chiếm, công suất nó tiêu tốn và giá thành trên một ñơn vị là những cân nhắc
nghiêm ngặt hơn nhiều so với công suất tính toán. Những ứng dụng thường yêu
cầu một số thao tác vào - ra ñể ñọc các tín hiệu và tắt - mở những bit nhất ñịnh.
ðiều thú vị là một số nhà sản xuất các bộ vi ñiều khiển ñã ñi xa hơn là tích hợp
cả một bộ chuyển ñổi ADC và các ngoại vi khác vào trong bộ vi ñiều khiển.
5
1.6. Các tiêu chí lựa chọn một bộ vi ñiều khiển
Có 4 bộ vi ñiều khiển 8 bit chính. ðó là M6811 của Motorola, 8051 của
Intel, Z80 của Zilog và Pic 16 × của Microchip Technology.
Mỗi một kiểu loại trên ñây ñều có một tập lệnh và thanh ghi riêng duy nhất,
nên chúng không tương thích lẫn nhau. Cũng có những bộ vi ñiều khiển 16 bit và
32 bit ñược sản xuất bởi các hãng sản xuất chíp khác nhau. Với tất cả những bộ vi
ñiều khiển khác nhau như thế này thì lấy gì làm tiêu chuẩn lựa chọn mà các nhà
thiết kế phải cân nhắc? Có ba tiêu chuẩn ñể lựa chọn các bộ vi ñiều khiển là:
1. ðáp ứng ñược yêu cầu ñiều khiển một cách hiệu quả và kinh tế
+ Tốc ñộ, kiểu ñóng vỏ (40 chân DIP, kiểu dán...), kích thước, công suất tiêu
thụ.
+ Dung lượng bộ nhở ROM và RAM trên chip, số cổng I/O, số bộ ñịnh thời...
+ Khả năng dễ dàng nâng cấp (nâng cao hiệu suất, giảm công suất tiêu thụ).
+ Giá thành.
2. Có sẵn các công cụ phát triển phần mềm: Chẳng hạn như các trình biên
dịch ngôn ngữ C, trình mô phỏng và gỡ rối, ñiều kiện hỗ trợ kỹ thuật.
3. Nguồn cung cấp bộ vi ñiều khiển có nhiều và tin cậy.
1.7 Các bước tìm hiểu, học cách sử dụng vi ñiều khiển
- Tìm hiểu về một họ vi ñiều khiển thông dụng: Các kiến thức cơ bản, tập
lệnh, các thao tác vào ra, ñịnh thời, ngắt, giao tiếp ngoại vi,...
- Tìm hiểu tính năng và sử dụng một con vi ñiều khiển thuộc họ trên:
AT89S8252, AT89C51, AT89S51, AT89C52. Download Datasheet, tìm hiểu các
tài nguyên của nó, cách nạp chương trình.
- Học một ngôn ngữ lập trình: Assembly, C. Sử dụng một phần mềm biên
dịch tạo file *.HEX.
- Lắp một mạch nhỏ trên bo mạch thử: Lúc ñầu chỉ cần một vi ñiều khiển và
dao ñộng, reset,...tối thiểu thành phần cần thiết.
- Lập trình các bài toán ñơn giản ñể nạp cho mạch thực hành:
+ Xuất ra các chân.
+ Nháy ñèn LED.
+ ðịnh thời gian bằng Timer.
+ Bấm một nút, ñèn bật/tắt (nhập port, nhập trên từng chân, dùng ngắt
ngoài).
- Thực hiện các bài toán phức tạp hơn:
6
+ Ghép nối với vi mạch mở rộng ngoại vi 8255.
+ ðiều khiển ñộng cơ bước.
+ Hiển thị LCD.
+ Giao tiếp bàn phím.
+ ðiều khiển ñộng cơ một chiều.
+ Giao tiếp máy tính.
7
2. SƠ ðỒ KHỐI VÀ CHÂN
2.1 S¬ ®å khèi
2.3 S¬ ®å ch©n
Chức năng các chân:
32 trong số 40 chân của 8051 có công dụng xuất/nhập, tuy nhiên 24 trong 32
ñường này có 2 mục ñích (công dụng). 32 chân nêu trên hình thành 4 port 8 bit.
* Port 0 (chân 32 ñến 39): Có 2 công dụng: Port xuất/nhập hoặc bus dữ liệu
và bus ñịa chỉ ña hợp (byte thấp của bus ñịa chỉ) cho các thiết kế có bộ nhớ ngoài.
8
* Port 1 (chân từ 1 ñến 8): Chỉ có một công dụng là xuất/nhập, ñể giao tiếp
với các thiết bị ngoại vi.
* Port 2 (chân từ 21 ñến 28): Có 2 công dụng, hoặc làm nhiệm vụ xuất/nhập
hoặc là byte ñịa chỉ cao của bus ñịa chỉ 16-bits cho các thiết kế có bộ nhớ ngoài.
* Port 3 (chân từ 10 ñến 17): Port 3 có hai tác dụng. Nó làm nhiệm vụ như
một cổng xuất nhập thông thường. Khi không hoạt ñộng xuất nhập, mỗi chân của
port 3 ñều có một chức năng riêng.
Bit Tên ðịa chỉ Chức năng
P3.0 RxD B0H Chân nhận dữ liệu của Port nối tiếp
P3.1 TxD B1H Chân phát dữ liệu của Port nối tiếp
P3.2 /INT0 B2H Ngõ vào ngắt ngoài 0
P3.3 /INT1 B3H Ngõ vào ngắt ngoài 1
P3.4 T0 B4H Ngõ vào của bộ ñịnh thời/ñếm 0
P3.5 T1 B5H Ngõ vào của bộ ñịnh thời/ñếm 1
P3.6 /WR B6H ðiều khiển ghi bộ nhớ dữ liệu ngoài
P3.7 /RD B7H ðiều khiển ñọc bộ nhớ dữ liệu ngoài
* Chân cho phép bộ nhớ ngoài /PSEN (chân 29): Chân này thường ñược
nối với chân cho phép xuất /OE (Output Entable) của EPRROM (hoặc của ROM)
ñể cho phép ñọc các byte lệnh. Tín hiệu /PSEN ở lôgic 0 trong suốt thời gian tìm
9
nạp lệnh. Các mã nhị phân của chương trình (opcode) ñược ñọc từ EPROM, qua
bus dữ liệu và ñược chốt vào thanh ghi lệnh IE của 8051 ñể ñược giải mã. Khi
thực thi một chương trình trong ROM nội, /PSEN ở lôgic 1 (logic không tích cực).
* Chân cho phép chốt ñịa chỉ ALE (chân 30):
Là tín hiệu xuất ra ñể giải ña hợp bus ñịa chỉ và bus dữ liệu. Trong 1/2 chu kỳ
ñầu bộ nhớ, chân ALE xuất tín hiệu ñể chốt ñịa chỉ (byte thấp của bus ñịa chỉ 16
bit) vào thanh ghi ngoài khi ta sử dụng port 0 làm byte thấp ñịa chỉ. Trong 1/2 chu
kỳ bộ nhớ còn lại port 0 sẽ xuất/nhập dữ liệu. Tín hiệu ALE có tần số bằng 1/2 tần
số của mạch dao ñộng bên trong chip vi ñiều khiển và có thể làm xung clock cho
các phần còn lại của hệ thống (trường hợp ngoại lệ khi thực hiện lệnh MOVX, 1
xung ALE sẽ bị bỏ qua). Chân ALE còn ñược dùng ñể nhập xung ngõ vào lập trình
cho EPROM hoặc Flash ROM ñối với chip có loại ROM này.
* Chân truy xuất ngoài /EA (chân 31):
Chân này ñược nối lên 5V khi thực thi chương trình trong ROM nội. Chân
này ñược nối ñất khi thực thi chương trình bộ nhớ ngoài. Chú ý ñối với các chip
không có ROM nội /EA phải ñược nối ñất. Các chip họ 8051 có EPROM còn nhận
chân /ALE làm chân nhận ñiện áp cấp ñiện 12V cho việc lập trình EPROM nội.
* Chân RESET (RST) (Chân 9): Dùng ñể thiết lập lại trạng thái ban ñầu của
hệ thống hay gọi tắt là reset hệ thống khi ñược treo ở mức logic 1 ít nhất 2 chu kỳ
máy. Các thanh ghi bên trong của 8051 ñược nạp các giá trị thích hợp cho việc
khởi ñộng lại hệ thống.
* Các chân XTAL1 và XTAL2 (chân 18 và chân 19):
Mạch dao ñộng bên trong chip 8051 ñược ghép với thạch anh bên ngoài ở 2
chân XTAL1 và XTAL2. Thường tần số là 12MHz và các tụ ổn ñịnh có giá trị
trong khoảng 30pF ÷ 33 pF.
10
3. TỔ CHỨC BỘ NHỚ
11
Không gian bộ nhớ nội của 8051 bao gồm: RAM và ROM.
+ RAM nội bao gồm:
- Các dãy (bank) thanh ghi: 00H ÷ 1FH
- Vùng RAM ñịnh ñịa chỉ bit: 20H ÷ 2FH
- Vùng RAM ña mục ñích (ña chức năng): 30H ÷ 7FH
- Các thanh ghi chức năng ñặc biệt (SFR): 80H ÷ FFH
* Có 2 ñặc tính ñáng ghi nhớ là:
+ Các thanh ghi và các port xuất/nhập ñược ñịnh ñịa chỉ theo kiểu ánh xạ bộ
nhớ (memory mapped) và ñược truy xuất như một vị trí trong bộ nhớ.
+ Vùng stack thường trú trong RAM trên chip (RAM nội) thay vì ở trong
RAM ngoài như ñối với các bộ vi xử lý.
3.2 Các dãy thanh ghi
32 vị trí thấp nhất của bộ nhớ chứa các dãy thanh ghi.
- Các lệnh sử dụng các thanh ghi R0 cho ñến R7 trong dãy thanh ghi là những
lệnh ngắn và thực hiện nhanh hơn so với các lệnh tương ñương sử dụng kiểu ñịnh
ñịa chỉ trực tiếp.
VD: MOV A,R5; 1 byte
MOV A,05H; 2 byte
- Các giá trị dữ liệu thường ñược sử dụng nên ñược chứa ở các thanh ghi này.
- Dãy thanh ghi ñang ñược sử dụng ñược gọi là dãy thanh ghi tích cực. Dãy
thanh ghi tích cực có thể ñược thay ñổi bằng cách thay ñổi các bit chọn trong từ
trạng thái chương trình PSW.
3.3 Vùng RAM ñịnh ñịa chỉ bit
8051 chứa 210 vị trí bit ñược ñịnh ñịa chỉ trong ñó 128 bit chứa trong các byte
ở ñịa chỉ từ 20H ñến 2FH (16byte x 8bit = 128bit) và phần còn lại chứa trong các
thanh ghi chức năng ñặc biệt.
Truy xuất các bit riêng rẽ thông qua phần mềm là một ñặc trưng mạnh của hầu
hết các bộ VðK. Các bit có thể ñược set, xóa, AND, OR,... chỉ bằng một lệnh so
với một chuỗi lệnh của VXL.
VD:
VðK: SETB 7FH; //Set bit có ñịa chỉ 7FH bằng 1
VXL: ...
MOV A,2FH; //ðọc cả byte
ORL A,#10000000B; // Set bit
MOV 2FH,A; //Ghi trở lại cả byte
12
3.4 Vùng RAM ña mục ñích
Gồm có 80 bytes ñặt ở ñịa chỉ từ 30H ñến 7FH. Bất kỳ vị trí nhớ nào trong
vùng ña mục ñích ñều có thể ñược truy xuất bằng cách dùng các kiểu ñịnh ñịa chỉ
trực tiếp hoặc gián tiếp.
Ví dụ: + MOV A,5FH; //ðọc nội dung tại ñịa chỉ 5FH của RAM nội vào
thanh ghi chứa A. Kiểu ñịnh ñịa chỉ trực tiếp.
+ MOV R0,#5FH; //Gán cho thanh ghi R0 giá trị 5FH
MOV A,@R0; //ðọc nội dung tại ñịa chỉ ñược chứa trong R0 vào
thanh ghi A. Thanh ghi R0 làm nhiệm vụ là con trỏ dữ liệu.
13
4. CÁC THANH GHI CHỨC NĂNG ðẶC BIỆT (SFR)
Các thanh ghi chức năng ñặc biệt SFR chiếm phần trên của RAM nội từ ñịa chỉ
80H ñến FFH.
Hầu hết các thanh ghi chức năng ñặc biệt ñược truy xuất bằng kiểu ñịnh ñịa chỉ
trực tiếp, một số SFR ñược ñịnh ñịa chỉ từng bit và ñịnh ñịa chỉ từng byte.
+ Các thanh ghi của CPU:
- ACC : Accumulator.
-B : B Register
- PSW : Program Status Word.
- SP : Stack Pointer.
- DPTR : Data Pointer (DHL, DPL).
+ Các thanh ghi ñiều khiển ngắt:
- IE : Interrupt Enable (Cho phép ngắt).
- IP : Interrupt Priority.
+ Các cổng vào/ra:
- P0, P1, P2, P3.
+ ðiều khiển bộ ñịnh thời:
- TMOD : Timer Mode (Chọn mode ñịnh thời).
- TCON : Timer Control (ðiều khiển ñịnh thời).
- TH0 : Timer 0 hight byte (Byte cao của bộ ñịnh thời 0).
- TL0 : Timer 0 low byte (Byte thấp của bộ ñịnh thời 0).
- TH1 : Timer 1 hight byte (Byte cao của bộ ñịnh thời 1).
- TL1 : Timer 1 low byte (Byte thấp của bộ ñịnh thời 1).
+ ðiều khiển các hoạt ñộng nối tiếp:
- SCON : Serial Port Control.
- SBUF : Serial Data Register.
14
+ Thanh ghi ñiều khiển nguồn:
- PCON : Power Control.
4.1 Thanh ghi PSW
Thanh ghi từ trạng thái chương trình, hay còn gọi là thanh ghi cờ. PSW có 8
bit nhưng chỉ có 6 bit ñược 8051 sử dụng. Trong ñó 4 trong số các cờ là cờ ñiều
kiện, nghĩa là chúng báo một số ñiều kiện ñược thiết lập do kết quả thực hiện một
lệnh. Bốn cờ này là: Cờ nhớ CY (Carry), Cờ phụ AC (Auxiliary Carry), cờ chẵn lẻ
P (parity) và cờ tràn OV (Over Flow).
15
* RS0, RS 1 - REGISTERS SELECT
- Dùng ñể xác ñịnh dãy thanh ghi tích cực.
- Chúng ñược xóa khi Reset.
* CỜ TRÀN - OV
- ðược set bằng 1 sau phép toán cộng hoặc trừ nếu có xuất hiện một tràn số
học. Khi các số có dấu cộng hoặc trừ, phần mềm có thể kiểm tra bit tràn OV ñể xác
ñịnh kết quả có nằm trong tầm hay không.
- Với các số có dấu, kết quả nhỏ hơn -128 hoặc lớn hơn +127 sẽ set cờ tràn OV
= 1. Với các số không dấu, OV = 1 khi kết quả vượt quá 255.
Ví dụ:
0F thập phân 15
+ 7F + 127
------- ---------
8E 142
Kết quả 8EH biểu diễn số -114 không ñúng với kết quả mong muốn là 142 nên
sẽ set OV = 1.
* CỜ KIỂM TRA CHẴN LẺ - PARITY
- Kiểm tra chẵn lẻ cho thanh chứa A. Phản ánh số bit 1 trong thanh ghi A là
chẵn hay lẻ. Nếu thanh ghi A chứa một số chẵn các bit 1 thì P = 0, còn chứa một
số lẻ các bit 1 thì P = 1.
- Số các bit trong thanh chứa A cộng với bit P luôn luôn là một số chẵn.
- Bit chẵn lẻ ñược sử dụng kết hợp với các chương trình xuất/nhập nối tiếp
trước khi truyền dữ liệu hoặc ñể kiểm tra chẵn lẻ sau khi nhận dữ liệu.
VÍ DỤ
88 10001000 9C 10011100
+ 93 + 10010011 + 64 + 01100100
------- --------------- -------- -------------
11B 00011011 100 00000000
C = 1 vì có nhờ từ D7 C = 1 vì có nhờ từ D7
AC = 0 vì ko có nhớ từ D3 sang D4 AC = 1 vì có nhớ từ D3 sang D4
P = 0 vì số bit 1 trong A là 4 (chẵn) P = 0 vì số bit 1 trong A là 0 (chẵn)
16
MOV A,#38H MOV A,#FFH
ADD A,#2FH ADD A,#1
38 00111000
+ 2F + 00101111
------- ---------------
67 01100111 A = 00H, C = 1, AC = 1
C = 0 vì ko có nhờ từ D7
AC = 1 vì có nhớ từ D3 sang D4
P = 1 vì số bit 1 trong A là 5 (lẻ)
X : Có thể là 0 hoặc 1.
4.2 Thanh ghi B
- ðịa chỉ F0H, ñược dùng chung với thanh chứa A trong các phép toán nhân,
chia.
MUL AB ; Nhân 2 số 8-bit không dấu chứa trong A&B, kết quả 16-bit
chứa
vào cặp thanh ghi B:A (A chứa byte thấp và B chứa byte
cao).
DIV AB ; Chia A bởi B, thương số cất trong A và số dư cất trong B.
- Thanh ghi B còn ñược xử lý như một thanh ghi nháp.
17
4.3 Con trỏ Stack
Ngăn xếp là một vùng của bộ nhớ RAM ñược CPU sử dụng ñể lưu thông tin
tạm thời. Thông tin này có thể là dữ liệu hoặc ñịa chỉ. CPU cần không gian lưu trữ
này vì số các thanh ghi bị hạn chế.
Thanh ghi ñược dùng ñể trỏ ñến ngăn xếp gọi là con trỏ ngăn xếp SP (Stack
Pointer). Con trỏ ngăn xếp rộng 8 bit, tức là có thể trỏ các ñịa chỉ từ 00H ñến FFH.
- Stack pointer chứa ñịa chỉ của dữ liệu hiện ñang ở ñỉnh stack.
- Các lệnh liên quan ñến stack bao gồm lệnh cất dữ liệu vào stack (làm tăng SP
trước khi ghi dữ liệu) và lệnh lấy dữ liệu khỏi Stack (giảm stack).
- Vùng Stack của 8051 ñược giữ trong RAM nội và ñược giới hạn ñến các ñịa
chỉ truy xuất bởi kiểu ñịnh ñịa chỉ gián tiếp. Nếu ta khởi ñộng SP ñể bắt ñầu vùng
Stack ở ñịa chỉ 60H bằng lệnh:
MOV SP,#5FH
thì vùng stack ñược giới hạn là 32 byte trên 8051 vì ñịa chỉ cao nhất của RAM
trên chip là 7FH.
- Nếu ta không khởi ñộng stack, nội dung mặc ñịnh của thanh ghi này là 07H
khi ñược cấp nguồn nhằm duy trì sự tương thích với 8048. => Thao tác cất vào
stack ñầu tiên sẽ lưu dữ liệu vào vị trí nhớ có ñịa chỉ 08H (vì SP tăng lên 1 trước
khi thao tác cất vào stack ñầu tiên ñược thực thi).
Như vậy, nếu phần mềm ứng dụng không khởi ñộng SP, dãy thanh ghi 1 (và có
lẽ 2,3) không còn hợp lệ vì vùng này ñược sử dụng làm stack.
- Mỗi lần lưu thanh ghi vào ngăn xếp ñược gọi là cất và lệnh tương ứng là
PUSH, còn ngược lại, mỗi lần nạp nội dung ngăn xếp trở lại thanh ghi ñược gọi là
lệnh lấy ra và lệnh tương ứng là POP.
- Các lệnh gọi chương trình con (ACALL, LCALL) và lệnh trở về (RET, RETI)
cũng cất và phục hồi nội dung bộ ñếm chương trình PC (Program Counter) từ
stack.
18
Chạy mô phỏng từng bước một trên phần mềm Keil ñể thấy ñược sự thay ñổi
của các nội dung thanh ghi R6, R1, R4 và các giá trị ñó lần lượt cất vào Stack bắt
ñầu từ ñịa chỉ 80H
Bắt ñầu cất Sau PUSH 6 Sau PUSH 1 Sau PUSH 4
0B 0B 0B 0B
0A 0A 0A 0A F3
09 09 09 12 09 12
08 08 25 08 25 08 25
SP = 07 SP = 08 SP = 09 SP = 0A
20
4.7 Các thanh ghi của port nối tiếp
- Bên trong 8051 có một port nối tiếp ñể truyền thông với các thiết bị nối tiếp
như các thiết bị ñầu cuối hoặc Modem, hoặc ñể giao tiếp với các IC khác có mạch
giao tiếp nối tiếp.
- Thanh ghi SBUF (Serial Data Buffer): ðịa chỉ 99H, ñược gọi là bộ ñệm dữ
liệu nối tiếp, lưu giữ dữ liệu truyền ñi và dữ liệu nhận về.
- Thanh ghi SCON (Serial Port Control): ðịa chỉ 98H, ñiều khiển chọn các chế
ñộ hoạt ñộng khác nhau của port nối tiếp. Thanh ghi này ñược ñịnh ñịa chỉ từng
bit.
4.8 Các thanh ghi ngắt
- 8051 có một cấu trúc ngắt với 2 mức ưu tiên ngắt và 5 nguyên nhân ngắt.
- Thanh ghi cho phép ngắt IE (Interrupt Enable): ñịa chỉ A8H. Các ngắt bị vô
hiệu hóa sau khi Reset hệ thống và sau ñó ñược cho phép bằng cách ghi vào thanh
ghi IE.
- Mức ưu tiên ngắt ñược thiết lập qua thanh ghi ưu tiên ngắt IP (Interrupt
Priority) ở ñịa chỉ B8H.
- Cả 2 thanh ghi này ñều ñược ñịnh ñịa chỉ từng bit.
4.9 Thanh ghi ñiều khiển nguồn
- PCON: ðịa chỉ 87H, chứa các bit ñiều khiển ñược tóm tắt trong bảng sau.
Bit Ký hiệu Mô tả
Bit tăng gấp ñôi tốc ñộ Baud, bit này khi set
PCON.7 SMOD làm cho tốc ñộ baud tăng 2 lần ở các chế ñộ 1,2
và 3 của port nối tiếp.
PCON.6 - Không ñịnh nghĩa
PCON.5 - Không ñịnh nghĩa
PCON.4 - Không ñịnh nghĩa
PCON.3 GF1 Bit cờ ña mục ñích 1
PCON.2 GF0 Bit cờ ña mục ñích 0
Thiết lập chế ñộ nguồn giảm (Power Down),
PCON.1 PD
chỉ ra khỏi chế ñộ bằng hoạt ñộng Reset.
Thiết lập chế ñộ nghỉ (Idle Mode), chỉ ra khỏi
PCON.0 IDL
chế ñộ bằng một ngắt hoặc reset.
21
5. DAO ðỘNG VÀ HOẠT ðỘNG RESET
5.1 Dao ñộng
Họ 8051 có một bộ dao ñộng trên chip nhưng vẫn cần có một ñồng hồ ở bên
ngoài ñể kích hoạt. Bộ dao ñộng thạch anh bên ngoài ñược nối tới các chân vào
XTAL1 (chân 19) và XTAL2 (chân 18). Khi mắc dao ñộng thạch anh, phải có 2 tụ
ñiện 30pF, một ñầu nối tới XTAL1 và XTAL2, ñầu kia nối ñất.
C2
XTAL2 XTAL2
NC
C1 EXTERRNAL
XTAL1 OSCILLATAO XTAL1
30pF R
GND GND
Họ 8051 có nhiều phiên bản tốc ñộ khác nhau. Tốc ñộ ñược hiểu là tần số cực
ñại của bộ dao ñộng nối tới chân XTAL, ví dụ, chip 24MHz, 12MHz,... Mạch dao
ñộng bên ngoài không nhất thiết là bộ dao ñộng thạch anh mà cũng có thể dùng bộ
dao ñộng TTL. Khi ñó bộ dao ñộng ñược nối tới chân XTAL1, còn chân XTAL2
ñể hở.
Thường ñược sử dụng nhất là bộ dao ñộng thạch anh tần số 11,0592MHz nhằm
tương thích với cổng nối tiếp của IBM PC.
22
23
J2A
0
J1 J3 13
12 25
GND 1 1 11 24
P1.6(MISO) 2 2 10 23
P1.7(SCK) 3 3 9 22
P1.5(MOSI) 4 4 8 21
RESET 5 5 7 20
6 19
5 18
4 17
3 16
2 15
1 14
1,5K
PRINTER PORT
+5V +5V
U1 +5V
1K 1 40
2 P1.0/T2 VCC
3 P1.1/T2-EX 39
1K
4 P1.2 P0.0/AD0 38
5 P1.3 P0.1/AD1 37
6 P1.4/SS P0.2/AD2 36
7 P1.5/MOSI P0.3/AD3 35
8 P1.6/MISO P0.4/AD4 34
P1.7/SCK P0.5/AD5 33
9 P0.6/AD6 32
RST P0.7/AD7
10 31 +5V
+5V 11 P3.0/RXD EA/VPP
12 P3.1/TXD 30
13 P3.2/INT0 ALE/PROG
14 P3.3/INT1 29
15 P3.4/T0 PSEN
16 P3.5/T1 28
C3 SW1 17 P3.6/WR P2.7/A15 27
P3.7/RD P2.6/A14 26
10uF 18 P2.5/A13 25
1K XTAL2 P2.4/A12 24
19 P2.3/A11 23
+5V XTAL1 P2.2/A10 22
20 P2.1/A9 21
GND P2.0/A8
R46
1K
10K AT89S8252
Y1 +5V
0
0
12MHz
C2 C1
30pF 30pF
0 0
24
6. HOẠT ðỘNG TÌM NẠP LỆNH CỦA CPU
Một chương trình hợp ngữ bao gồm một chuỗi các dòng lệnh hợp ngữ.
CPU, trái tim của hệ máy tính, quản lý tất cả các thao tác trên dữ liệu. Hầu hết
các CPU chỉ bao gồm một tập các mạch logic thực hiện liên tục hai thao tác: tìm
nạp lệnh và thực thi lệnh.
CPU có khả năng hiểu và thực thi các lệnh dựa trên một tập các mã nhị phân,
gọi là tập lệnh. Mỗi một mã nhị phân biểu diễn một thao tác ñơn giản.
Bên trong CPU bao gồm:
+ Một tập các thanh ghi (Register): Có nhiệm vụ lưu giữ tạm thời các thông
tin.
+ Một ñơn vị số học ALU (Arithmetic-logic unit): Có nhiệm vụ thao tác trên
các thông tin.
+ Một ñơn vị giải mã và ñiều khiển (Instruction decode and control unit): Có
nhiệm vụ xác ñịnh các thao tác cần thực hiện và thiết lập các hoạt ñộng cần thiết ñể
thực hiện thao tác.
+ Thanh ghi lệnh (Instruction Register): Lưu giữ mã nhị phân của lệnh ñể
ñược thực thi.
+ Bộ ñếm chương trình PC (Program Counter): Lưu giữ ñịa chỉ của lệnh kế
tiếp trong bộ nhớ cần ñược thực thi. Mỗi khi CPU nhận mã lệnh từ bộ nhớ ROM,
thì bộ nhớ chương trình ñược tăng lên 1 ñể trỏ ñến lệnh kế tiếp. Bộ ñếm chương
trình của 8051 rộng 16 bit, ñiều ñó có nghĩa là 8051 có thể truy cập ñược ñịa chỉ
chương trình từ 0000 ñến FFFFH, tổng cộng có 64KByte.
25
Các bước CPU tìm nạp lệnh ñược thực hiện theo thứ tự sau:
1- Nội dung của PC ñược ñặt lên bus ñịa chỉ.
2- Tín hiệu ñiều khiển READ chuyển sang trạng thái tích cực.
3- Dữ liệu (Opcode của lệnh) ñược ñọc từ ROM (RAM) và ñưa lên bus dữ
liệu.
4- Opcode ñược chốt vào thanh ghi lệnh bên trong CPU.
5- PC ñược tăng ñể chuẩn bị tìm nạp lệnh kế tiếp từ bộ nhớ.
26
Giai ñoạn thực thi lệnh bao gồm việc giải mã opcode và tạo ra các tín hiệu ñiều
khiển. Các tín hiệu này ñiều khiển việc xuất nhập giữa các thanh ghi nội với ALU
và thông báo ñể ALU thực hiện các thao tác ñã ñược xác ñịnh.
Một chuỗi các lệnh ñược kết hợp ñể thực hiện một công việc có ý nghĩa gọi là
một chương trình (program) hay phần mềm (software). Mức ñộ mà những công
việc ñược thực hiện ñúng và có hiệu quả phần lớn ñược xác ñịnh bởi chất lượng
của phần mềm, không phải bởi sự phức tạp của CPU.
27
7. CÁC MODE ðỊNH ðỊA CHỈ
- Khi một lệnh ñược thực thi và lệnh này yêu cầu dữ liệu, một câu hỏi ñược ñặt
ra là "Dữ liệu chứa ở ñâu?" Câu trả lời cho câu hỏi này tạo ra các kiểu (mode) ñịnh
ñịa chỉ của 8051.
- Các kiểu ñịnh ñịa chỉ là phần cần thiết cho toàn bộ tập lệnh của mỗi một bộ vi
xử lý, bộ vi ñiều khiển. Các kiểu ñịnh ñịa chỉ cho phép ta xác ñịnh rõ nguồn và
ñích của dữ liệu theo nhiều cách khác nhau phụ thuộc vào tình huống lập trình.
- Có 8 kiểu ñịnh ñịa chỉ:
+ Thanh ghi (Register).
+ Trực tiếp (Direct).
+ Gián tiếp qua thanh ghi (Indirect).
+ Tức thời (Immediate).
+ Tương ñối (Relative).
+ Tuyệt ñối (Absolute).
+ Dài (Long).
+ Chỉ số (Indexed).
28
80H ÷ FFH FSR
- ðịa chỉ của dữ liệu ñược chỉ ra trực tiếp trong lệnh.
- Chế ñộ ñịnh ñịa chỉ trực tiếp có thể dùng ñể truy cập toàn bộ không gian của
bộ nhớ trong RAM. Tuy nhiên, thực tế chế ñộ này thường ñược dùng ñể truy cập
các ngăn nhớ RAM từ ñịa chỉ 30H ñến 7FH.
6.3 ðịnh ñịa chỉ gián tiếp
- Làm cách nào nhận biết một biến khi ñịa chỉ của biến ñã ñược xác ñịnh, ñược
tính toán hoặc ñược sửa ñổi trong khi một chương trình ñang chạy? Tình huống
này phát sinh khi ta quản lý các vị trí nhớ liên tiếp, các ñiểm nhập ñược ñịnh chỉ số
trong các bảng chứa trong RAM, các số chính xác hoặc các ký tự.
- Giải pháp là sử dụng kiểu ñịnh ñịa chỉ gián tiếp.
- Ở chế ñộ này, thanh ghi ñược dùng ñể trỏ ñến dữ liệu có trong bộ nhớ. Nếu dữ
liệu ở trên chip thì các thanh ghi R0 và R1 ñược sử dụng, hoạt ñộng như những con
trỏ (pointer). Kiểu ñịnh ñịa chỉ gián tiếp ñược nhận biết dựa vào ký hiệu @.
Một trong những ưu ñiểm của chế ñộ ñịnh ñịa chỉ gián tiếp thanh ghi là cho
phép truy cập dữ liệu linh hoạt hơn so với chế ñộ ñịnh ñịa chỉ trực tiếp.
6.4 ðịnh ñịa chỉ tức thời
- Khi toán hạng nguồn là một hằng số thay vì là một biến, hằng số này có thể
ñưa vào lệnh và ñây là byte dữ liệu tức thời.
- Trong hợp ngữ, các toán hạng tức thời ñược nhận biết nhờ vào ký tự # ñặt
trước chúng. Tất cả các lệnh sử dụng kiểu ñịnh ñịa chỉ tức thời ñều sử dụng hằng
dữ liệu 8-bit làm dữ liệu tức thời. Có một ngoại lệ khi ta khởi ñộng con trỏ dữ liệu
16-bit DPTR, hằng dữ liệu 16-bit ñược cần ñến.
Ví dụ:
MOV A,#65H
MOV R6,#55H
MOV DPTR,#2343H
MOV P1,#0FH
29
VÍ DỤ (Cho 4 kiểu ñịnh ñịa chỉ trên):
Viết chương trình ñể sao giá trị 55H vào các ngăn nhớ RAM tại ñịa chỉ từ 40H
ñến 44H sử dụng:
a) Chế ñộ ñịnh ñịa chỉ trực tiếp.
b) Chế ñộ ñịnh ñịa chỉ gián tiếp không dùng vòng lặp.
c) Chế ñộ gián tiếp có dùng vòng lặp.
Giải:
a) MOV A,#55H ; Nạp vào thanh chứa giá trị 55H
MOV 40H,A ; Ghi A vào thanh ghi có ñịa chỉ 40H
MOV 41H,A ; Ghi A vào thanh ghi có ñịa chỉ 41H
MOV 42H,A ; Ghi A vào thanh ghi có ñịa chỉ 42H
MOV 43H,A ; Ghi A vào thanh ghi có ñịa chỉ 43H
MOV 44H,A ; Ghi A vào thanh ghi có ñịa chỉ 44H
b)
MOV A,#55H ; Nạp vào A giá trị 55H
MOV R0,#40H ; Nạp vào con trỏ R0 = 40H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến
INC R0 ; Tăng con trỏ. Bây giờ R0 = 41H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (41H)
INC R0 ; Tăng con trỏ. Bây giờ R0 = 42H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (42)
INC R0 ; Tăng con trỏ. Bây giờ R0 = 43H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (43)
INC R0 ; Tăng con trỏ. Bây giờ R0 = 44H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (44)
c)
MOV A,#55H ; Nạp vào A giá trị 55H
MOV R0,#40H ; Nạp vào con trỏ R0 = 40H
MOV R2,#05 ; Nạp bộ ñếm R2 = 5 (tương ứng số ô nhớ)
AGAIN:
MOV @R0,A ; Sao A vào thanh ghi do R0 trỏ ñến
INC R0 ; Tăng con trỏ
DJNZ R2,AGAIN ; Giảm bộ ñếm R2 và lặp lại cho ñến khi R2 =
0 thì
kết thúc
30
6.5 ðịnh ñịa chỉ tương ñối, ñịnh ñịa chỉ tuyệt ñối, ñịnh ñịa chỉ dài
- Các kiểu ñịnh ñịa chỉ tương ñối, tuyệt ñối và ñịnh ñịa chỉ dài ñược sử dụng
cho các lệnh nhảy.
- Một ñịa chỉ tương ñối (hay còn gọi là offset) là một giá trị 8-bit có dấu. Giá trị
này ñược cộng với bộ ñếm chương trình ñể tạo ra ñịa chỉ của lệnh tiếp theo cần
ñược thực thi. Tầm nhảy ñược giới hạn là -128 byte ñến 127 byte (8-bit có dấu).
- ðịnh ñịa chỉ tuyệt ñối chỉ ñược sử dụng với các lệnh ACALL và AJMP. ðây
là các lệnh 2-byte cho phép rẽ nhánh chương trình trong trang 2K hiện hành của bộ
nhớ chương trình bằng cách cung cấp 11bit thấp của ñịa chỉ ñích.Trong ñó 3 bit
cao (A8-A10) ñưa vào opcode và 8 bit thấp (A0-A7) thành lập byte thứ 2 của lệnh.
5 bit cao của ñịa chỉ từ A11-A15 không ñổi.
- Kiểu ñịnh ñịa chỉ dài chỉ ñược dùng cho các lệnh LCALL và LJMP. Các lệnh
3 byte này chứa ñịa chỉ ñích 16-bit (byte 2 và byte 3 của lệnh).
6.6 ðịnh ñịa chỉ chỉ số
- Sử dụng một thanh ghi nền (hoặc bộ ñếm chương trình hoặc con trỏ dữ liệu)
và một offset (thanh chứa A) tạo thành dạng ñịa chỉ hữu dụng cho lệnh JMP hoặc
MOVC.
- Trong nhiều ứng dụng, các bảng nhảy hoặc các bảng tìm kiếm ñược tạo ra dễ
dàng bằng cách sử dụng kiểu ñịnh ñịa chỉ chỉ số.
31
8. TẬP LỆNH CỦA 8051
Các khái niệm:
- Chương trình là chuỗi các lệnh mà MC phải xử lý, thực hiện.
- Lập chương trình là soạn thảo các lệnh bằng ngôn ngữ lập trình ñể thực hiện
một algorith (thuật toán) cụ thể.
Chương trình = Thuật toán + Cơ sở dữ liệu.
- Ngôn ngữ lập trình:
+ Bậc cao: C, Pascal, C++...
+ Bậc thấp:
* Mã máy: Mỗi một lệnh tương ứng với một mã nhị phân gọi là mã
lệnh, do nhà sản xuất quy ñịnh. MC chỉ hiểu ñược các lệnh ở dạng mã máy. Các
lệnh có thể chiếm 1 byte, 2 byte hoặc 3 byte.
* Mã ngữ: Các lệnh ñược mô tả ở dạng biểu trưng (Symbol). Symbol
có thể là từ viết tắt như MOV, ADD,... hoặc là ký hiệu các khối chức năng ở dạng
Graphic.
- Chương trình dịch: Ví dụ Assembler, thực hiện dịch từ mã ngữ sang mã máy.
- Hệ lệnh của MC: Là tập các lệnh mà người lập trình có thể sử dụng ñể lập
trình, và người lập trình chỉ có thể sử dụng các lệnh trong hệ lệnh mà thôi.
- Mỗi họ MC có một tập lệnh riêng, chương trình viết cho MC họ nào thì chỉ
chạy cho họ ñó.
Tập lệnh của 8051 ñược chia làm 5 nhóm
+ Nhóm lệnh số học.
+ Nhóm lệnh logic.
+ Nhóm lệnh di chuyển dữ liệu.
+ Nhóm lệnh xử lý bit.
+ Nhóm lệnh rẽ nhánh.
Các chữ viết tắt dùng trong tập lệnh
Rn : ðịnh ñịa chỉ thanh ghi sử dụng R0 - R7.
direct : ðịa chỉ trực tiếp 8 bit trong RAM nội (00H-FFH).
@Ri : ðịnh ñịa chỉ gián tiếp sử dụng thanh ghi R0 hoặc R1.
source : Toán hạng nguồn, có thể là Rn, hoặc direct hoặc @Ri.
dest : Toán hạng ñích, có thể là Rn, hoặc direct hoặc @Ri.
#data : Hằng số 8 bit chứa trong lệnh.
#data16 : Hằng số 16 bit.
bit : ðịa chỉ trực tiếp (8 bit) của 1 bit.
32
rel : offset 8-bit có dấu.
addr11 : ðịa chỉ 11 bit trong trang hiện hành.
addr16 : ðịa chỉ 16 bit.
INC source
INC A
INC Rn
(source) ← (source) + 1
INC direct
INC @Ri
INC DPTR
DEC A
DEC Rn
(source) ← (source) - 1
DEC direct
DEC @Ri
Nhân các số nguyên không dấu 8-bit chứa trong A
MUL AB và B. Byte thấp của tích số 16-bit cất trong A, byte
cao cất trong B.
Chia số nguyên không dấu 8-bit chứa trong A vớ
DIV AB số nguyên không dấu 8-bit chứa trong B. Thương s
cất trong A, còn số dư cất trong B.
Hiệu chỉnh thập phân nội dung của thanh chứa ñố
DA A
với phép cộng.
33
7.2 Nhóm lệnh logic
LỆNH MÔ TẢ
ANL des,source
ANL A,Rn
ANL A,direct Thực hiện AND từng bit giữa 2 toán hạng ñượ
ANL A,@Ri chỉ ra trong lệnh và lưu kết quả vào toán hạng ñích.
ANL A,#data (des) ← (des) AND (source)
ANL direct,A
ANL direct,#data
ORL des,source
ORL A,Rn
ORL A,direct
Thực hiện OR từng bit giữa 2 toán hạng ñược ch
ORL A,@Ri
ra trong lệnh và lưu kết quả vào toán hạng ñích.
ORL A,#data
(des) ← (des) OR (source)
ORL direct,A
ORL direct,#data
ORL C,bit
XRL A,Rn
XRL A,direct
XRL A,@Ri
XOR
XRL A,#data
XRL direct,A
XRL direct,#data
CLR A Xóa A
CPL A Lấy bù A
RL A Quay trái A
RLC A Quay trái A kể cả cờ nhớ
RR A Quay phải A
RRC A Quay phải A kể cả cờ nhớ
SWAP A Hoán ñổi 2 nibble (2 nửa 4-bit) của A
MOV dest,A
MOV Rn,A
34
MOV direct,A
MOV @Ri,A
MOV dest,source
MOV Rn,direct
MOV Rn,#data
MOV direct,Rn
MOV direct,direct
MOV direct,@Ri
MOV direct,#data
MOV @Ri,direct
MOV @Ri,#data
MOV DPTR,#data16
MOVX A,@Ri
MOVX A,@DPTR Di chuyển ở bộ nhớ ngoài. 2 loại ñịa chỉ: ñịa chỉ
MOVX @Ri,A gián tiếp 8-bit (R0 hoặc R1) và ñịa chỉ 16-bit.
MOVX @DPTR,A
MOVC A,@A+DPTR
Bảng nhảy
MOVC A,@A+PC
PUSH direct
Cất vào và lấy dữ liệu ra từ stack
POP direct
XCH A,Rn
XCH A,direct Trao ñổi giữa các byte
XCH A,@Ri XCHD A,@Ri : Trao ñổi các digit thấp
XCHD A,@Ri
CLR C
CLR bit
SETB C Xóa bit
SETB bit Set bit bằng 1
CPL C Lấy bù bit
CPL bit AND bit với C
ANL C,bit AND NOT bit với C
ANL C,/bit (not bit) OR bit với C
ORL C,bit OR NOT bit với C
ORL C,/bit (not bit) Di chuyển bit ñến bit.
MOV C,bit
MOV bit,C
35
7.5 Nhóm lệnh ñiều khiển rẽ nhánh
LỆNH MÔ TẢ
ACALL addr11 Gọi không ñiều kiện một chương trình con ñặt tạ
LCALL addr16 ñịa chỉ ñược chỉ ra trong lệnh.
RET Quay trở về từ chương trình con
RETI Quay về từ trình phục vụ ngắt
AJMP addr11 Nhảy (chuyển việc thực thi chương trình) không
LJMP addr16 ñiều kiện ñến ñịa chỉ ñược chỉ ra trong lệnh.
SJMP rel Nhảy ngắn, rẽ nhánh không ñiều kiện.
JMP @A+DPTR Nhảy gián tiếp.
Nhảy ñến ñịa chỉ(hoặc nhãn) chỉ ra trong lệnh n
JZ rel nội dung A bằng 0.
Jump if zero
Nhảy ñến ñịa chỉ(hoặc nhãn) chỉ ra trong lệnh n
JNZ rel nội dung A khác 0.
Jump if not zero
Nếu bit ñược chỉ ra trong lệnh ñược set bằng 1,
JB bit,rel nhảy ñến ñịa chỉ ñược chỉ ra trong lệnh. Ngược lạ
thực hiện lệnh tiếp theo.
Nếu bit ñược chỉ ra trong lệnh bằng 0, nhảy ñến
JNB ñịa chỉ ñược chỉ ra trong lệnh. Ngược lại, thực hiệ
lệnh tiếp theo.
Nếu bit ñược chỉ ra trong lệnh bằng 1, xóa bit v
JBC nhảy ñến ñịa chỉ ñược chỉ ra trong lệnh. Ngược lạ
thực hiện lệnh tiếp theo.
CJNE dest,source,rel
So sánh và nhảy ñến ñịa chỉ (hoặc label) ñược ch
CJNE A,direct,rel
ra trong lệnh nếu dest và source không bằng nhau.
CJNE A,#data,rel
Nếu bằng nhau, thực hiện lệnh tiếp theo.
CJNE @Ri,#data,rel
Compare and jump if not equal
CJNE Rn,#data,rel
Giảm byte chỉ ra bởi toán hạng ñầu tiên trong l
và rẽ nhánh ñến ñịa chỉ ñược chỉ ra nếu kết quả sau
DJNZ Rn,rel
khi giảm khác 0. Nếu kết quả sau khi giảm bằng 0
DJNZ direct,rel
thì thực hiện lệnh tiếp theo.
Decrease and jump if not zero
NOP Không làm gì
36
9. LẬP TRÌNH VÀO/RA (I/O)
Bốn cổng P0, P1, P2 và P3 ñều có 8 chân và tạo thành cổng 8 bit. Tất cả các
cổng khi Reset ñều ñược cấu hình làm cổng ra và ở mức logic 1.
Trở kháng
Output Input Input
cao (hở
mạch)
Control 0
0 0 1 1
1 1
1
1
1
0
0
0
1
Ví dụ:
MOV A,#FFH
MOV P1,A ; ðặt P1 làm cổng vào bằng cách
ghi "1" vào tất cả các bit của cổng
BACK: MOV A,P1 ; Nhận dữ liệu từ cổng P1
MOV P0,A ; Gửi nó ñến cổng P0
SJMP BACK ; Lặp lại
Việc Reset hệ thống sẽ set tất cả các bit của cổng, do vậy các chân của port có
thể ñược dùng làm ngõ nhập mà không cần phải set cổng một cách tường minh.
Tuy nhiên, nếu một bộ chốt của port bị xóa (như CLR P1.5), chân của port không
thể làm nhiệm vụ tiếp theo là ngõ nhập trừ khi trước tiên ta phải set bộ chốt ñó
(SETB P1.5).
39
9.2 Cấu trúc của cổng P0
Như chỉ ra trên hình vẽ, bộ ñiều khiển xuất của P0 (và P2) có thể ñóng vào
ñường ADDR/DATA bởi tín hiệu CONTROL trong trường hợp truy cập bộ nhớ
ngoài.
Cổng P0 có dạng cực máng ñể hở (open-drain), ñây là ñiểm khác với các cổng
P1,P2 và P3. Khái niệm cực máng ñể hở cũng tương tự như cực collector ñể hở,
tuy nhiên ở ñây áp dụng cho các chip dạng MOS. Do vậy, ñể có thể vừa làm ñầu
vào, vừa làm ñầu ra thì mỗi chân phải ñược nối tới một ñiện trở kéo lên 10K ở bên
ngoài.
40
Hoạt ñộng vào/ra của cổng P0 tương tự như cổng P1.
A0 - A7
A0 - A7
A8 - A15
1/2 ñầu của chu kỳ tìm nạp lệnh ở ROM ngoài: µC gửi ñịa chỉ tới
ROM, 74HC573 chốt byte thấp của ñịa chỉ tại ñầu ra Q. P0 làm
nửa thấp của bus ñịa chỉ.
41
ðọc lệnh từ ROM
Chốt
1/2 sau của chu kỳ tìm nạp lệnh ở ROM ngoài: 74HC573 chốt và giữ
ổn ñịnh byte thấp của ñịa chỉ tại ñầu ra Q. µC ñọc lệnh từ ROM, P0
làm bus dữ liệu.
42
Port 2 giảm bớt ñược chức năng làm nhiệm vụ cung cấp byte cao của ñịa chỉ
trong các hệ thống tối thiểu thành phần, hệ thống không dùng bộ nhớ chương trình
ngoài và chỉ có một dung lượng nhỏ bộ nhớ dữ liệu ngoài.
Trong hình vẽ minh họa ở trên, 8051 kết nối với RAM ngoài với dung lượng
nhớ là 1KB (1024byte = 210 → chỉ cần 10 bit ñể xác ñịnh ñịa chỉ).
43
9.4 Cấu trúc của cổng P3
44
10. TẠO TRỄ
ðể thực hiện một lệnh thì cần một số chu kỳ ñồng hồ. Ở họ 8051, các chu kỳ
ñồng hồ này ñược gọi là các chu kỳ máy (machine cycle). ðộ dài của chu kỳ máy
của họ 8051 phụ thuộc vào tần số của bộ dao ñộng thạch anh nối với hệ thống
8051. Bộ dao ñộng thạch anh cùng với ñồng hồ trên chip cung cấp xung ñồng hồ
cho 8051. Tần số của dao ñộng thạch anh thường nằm trong khoảng 4MHz ñến
30MHz phụ thuộc vào tốc ñộ chip và nhà sản xuất. Thường ñược sử dụng nhất là
bộ dao ñộng thạch anh tần số 11,0592MHz nhằm tương thích với cổng nối tiếp của
IBM PC.
Một chu kỳ máy gồm một chuỗi (sequence) 6 trạng thái (State), ñược ñánh số từ
S1 ñến S6. Mỗi trạng thái bao gồm 2 chu kỳ xung dao ñộng. Do vậy 1 chu kỳ máy
gồm 12 chu kỳ dao ñộng thạch anh, bằng 1µs nếu tần số dao ñộng là 12MHz.
Ví dụ 1
Hãy tìm chu kỳ máy trong trong trường hợp 3 tần số dao ñộng thạch anh sau
ñây:
a) 11,0592MHz b) 16MHz c) 20MHz
Giải
a) Thời gian của 1 chu kỳ dao ñộng: T = 1/(11,0592*106) = 9,04*108
Chu kỳ máy: 12* T = 1,085µs
b) Chu kỳ máy: 12/(16*106) = 0,75µs
c) Chu kỳ máy: 12/(20*106) = 0,6µs
Ví dụ 2
Hệ thống 8051 có tần số dao ñộng thạch anh là 11,0592MHz. Hãy tìm thời gian
cần thiết ñể thực hiện các lệnh sau ñây:
a) MOV R3,#55H b) DEC R3 c) DJNZ R2, rel
d) LJMP; e) SJMP f) NOP
g) MUL AB
45
Giải
Chu kỳ máy tính ñược là 1,085µs. Trong phụ lục (B) về tập lệnh (Tống Văn
On) ta tra ñược số chu kỳ máy của các lệnh trên, vậy ta có:
Thông thường, thời gian tạo trễ ñược xác ñịnh dựa vào thời gian thực hiện các
lệnh bên trong vòng lặp và bỏ qua các lệnh bên ngoài vòng lặp.
46
Giá trị lớn nhất mà một thanh ghi 8-bit lưu giữ ñược là 255, do vậy trong một
số trường hợp ñể hiệu chỉnh ta dùng thêm lệnh NOP (1 chu kỳ máy).
Ví dụ 4 Tạo thời gian trễ lớn dùng vòng lặp lồng nhau.
Chu kỳ máy
DELAY:
MOV R2,#200H 1
AGAIN: MOV R3,#250H 1
HERER: NOP 1
NOP 1
DJNZ R3,HERE 2
DJNZ R2,AGAIN 2
RET; (Lệnh trở về của DELAY) 1
47
11. LẬP TRÌNH TIMER/COUNTER
11.1 Giới thiệu
- 8051 có hai bộ ñịnh thời 16-bit, mỗi bộ có 4 chế ñộ hoạt ñộng. Bộ ñịnh thời
thứ 3 với 3 chế ñộ hoạt ñộng ñược thêm vào ñối với chip 8051. (89C51 có hai bộ
timer/counter 16-bit).
- Các bộ ñịnh thời dùng ñể:
+ ðịnh thời trong một khoảng thời gian.
+ ðếm sự kiện.
+ Tạo tốc ñộ baud cho port nối tiếp của chip 8051.
- Trong các ứng dụng ñịnh thời trong một khoảng thời gian, bộ ñịnh thời ñược
lập trình sao cho sẽ bị tràn sau một khoảng thời gian quy ñịnh và set cờ tràn của bộ
ñịnh thời bằng 1.
- Việc ñếm sự kiện ñược dùng ñể xác ñịnh số lần xuất hiện của một sự kiện. Sự
kiện là một kích thích bên ngoài cung cấp một chuyển trạng thái từ 1 xuống 0 tới
một chân của 8051.
11.2 Các thanh ghi dùng truy xuất Timer/counter
Các bộ ñịnh thời của 8051 ñược truy xuất bằng cách sử dụng 6 thanh ghi chức
năng ñặc biệt sau:
49
Chọn các chế ñộ ñịnh thời
M1 M0 Chế ñộ Mô tả
0 0 0 Chế ñộ ñịnh thời 13-bit.
0 1 1 Chế ñộ ñịnh thời 16-bit.
1 0 2 Chế ñộ tự ñộng nạp lại 8-bit.
1 1 3 Chế ñộ ñịnh thời chia xẻ.
Ngắt
Cờ
tràn
50
b) Chế ñộ 1
- Là bộ ñịnh thời 16-bit, có cấu hình giống bộ ñịnh thời 13-bit.
*Cách xác ñịnh giá trị cần nạp vào bộ ñịnh thời (nạp cho TH và TL)
Giả sử chúng ta ñã biết thời gian trễ cần có, vậy giá trị nạp cho các thanh ghi
TH và TL là bao nhiêu? Tần số dao ñộng thạch anh: 11.0592MHz. Các bước thực
hiện sử dụng máy tính Calculator của Windows như sau:
1- Chọn máy tính Calculator từ Windows và ñặt chế ñộ tính về số thập phân
Decimal.
2- Nhập từ bàn phím thực hiện chia thời gian trễ cho 1,085µs ñược một số
thập phân n.
3- Chuyển số âm "- n." sang số Hexa, ta ñược một số yyxxH là giá trị Hexa
cần nạp cho các thanh ghi của bộ ñịnh thời.
4- ðặt TL = xx và TH = yy.
Giải thích: Các bộ ñịnh thời ñếm lên và thiết lập cờ tràn bằng 1 khi xảy ra tràn
số ñếm từ FFFFH xuống 0000H, vậy thì một khoảng thời gian nµs có thể ñược
ñịnh thời bằng cách khởi ñộng TL và TH chứa số ñếm nhỏ hơn 0000H một lượng
là n, nghĩa là "-n".
Ví dụ
Giả sử tần số XTAL = 11,0592MHz. Hãy xác ñịnh giá trị nạp vào các thanh ghi
TH và TL nếu cần trễ thời gian là 5ms. Hãy viết chương trình cho bộ Timer 0 ñể
tạo ra xung trên chân P2.3 có ñộ rộng 5ms.
51
Giải
Vì tần số XTAL = 11,0592MHz nên bộ ñếm tăng giá trị sau mỗi chu kỳ
1,085µs. ðể có ñộ rộng xung là 5ms thì số nhịp ñồng hồ là:
n = 5ms/1,085µs = 4608.
Giá trị cần nạp vào TH và TL ñược tính bằng cách: Lấy 65536 - 4608 = 60928,
ñổi số này ra Hexa ta có EE00.
Do vậy, giá trị cần nạp vào TH là EE và cần nạp vào TL là 00.
Chương trình:
CLR P2.3 ; Xóa bit P2.3
MOV TMOD,#01 ; Chọn Timer 0, chế ñộ 1 (16 bit).
LOOP: MOV TL0,#0 ; Nạp TL = 00.
MOV TH0,#0xEE ; Nạp TH = EE.
SETB TR0 ; Bắt ñầu ñịnh thời
AGAIN: JNB TF0,AGAIN ; Chờ tràn, nhảy nếu bit TF0 chưa ñược set bằng 1
CLR TR0 ; Dừng bộ ñịnh thời
CLR TF0 ; Xóa cờ tràn TF0 cho vòng sau
CPL P2.3 ; Lấy bù chân P2.3
SJMP LOOP ; Lặp lại
END
c) Chế ñộ 2 (auto-reload)
- Chế ñộ 2 là chế ñộ tự nạp lại 8-bit. Byte thấp của bộ ñịnh thời (TLx) hoạt
ñộng ñịnh thời 8-bit trong khi byte cao của bộ ñịnh thời lưu giữ giá trị nạp lại.
52
- Khi số ñếm tràn từ FFh xuống 00H, không chỉ cờ tràn của bộ ñịnh thời ñược
set lên 1 mà giá trị trong THx còn ñược nạp vào TLx, việc ñếm sẽ tiếp tục từ giá trị
này cho ñến khi xảy ra 1 tràn (FFh → 00h) kế tiếp,...
Ví dụ:
Viết chương trình tạo sóng vuông 10KHz trên chân P1.0 sử dụng bộ ñịnh thời
0.
Giải
- Sóng vuông 10KHz có chu kỳ 100µs với thời gian ở mức cao là 50µs và thời
gian ở mức thấp là 50µs. Vì khoảng thời gian này nhỏ hơn 256 (28) nên ta sử dụng
chế ñộ 2.
- Một tràn xảy ra sau mỗi 50µs yêu cầu một giá trị số ñếm nhỏ hơn 00h một
lượng là +50 phải nạp và nạp lại cho TL0, nghĩa là giá trị nạp cho TH0 là -50
(<FF).
Chương trình:
ORG 0x0030H
MOV TMOD,#02 ; Chọn chế ñộ 2 (Chế ñộ tự nạp lại 8-bit)
MOV TH0,# -50 ; TH0 chứa giá trị nạp lại -50
SETB TR0 ; Bắt ñầu ñịnh thời
LOOP: JNB TF0,LOOP ; Nhảy nếu TF0 = 0 (chờ tràn)
CLR TF0 ; Xóa cờ tràn
CPL P1.0 ; ðổi trạng thái bit P1.0
SJMP LOOP ; Lặp lại
END
Overflow
1/12OSC TL0 TF0
flag
P1 ðến
LED
P3.5
ORG 0030H
MOV TMOD,#01100000B ; Chọn bộ ñếm 1, chế ñộ 2, C/T=1
MOV TH1,#0 ; Xóa TH1, bắt ñầu ñếm lên từ giá trị
0.
SETB P3.5 ; Lấy ñầu vào là chân T1
AGAIN: SETB TR1 ; Bắt ñầu ñếm
BACK: MOV A,TL1 ; ðọc giá trị ñếm của TL1 vào A
MOV P2,A ; Hiển thị số ñếm ra cổng P1
JNB TF1,BACK ; Kiểm tra cờ tràn
CLR TR1 ; Dừng bộ ñếm
CLR TF1 ; Xóa cờ tràn
SJMP AGAIN ; Lặp lại
END
Ví dụ 2
Giả sử có một dãy xung có tần số 1Hz ñược nối tới chân ñầu vào P3.4. Hãy viết
chương trình hiển thị bộ ñếm 0 lên màn hình LCD. Giá trị ban ñầu của TH0 là -60.
Giải
55
ðể hiển thị số ñếm TL trên màn hình LCD ta phải thực hiện chuyển ñổi dữ liệu
8-bit nhị phân về mã ASCII.
chương trình
ACALL LCD_SET_UP ; Khởi ñộng LCD
MOV TMOD,#00000110B ; Chọn Timer0,Mod2,C/T=1
MOV TH0,# - 60 ; Nạp giá trị ñếm 60 xung
SETB P3.4 ; Lấy T0 làm ñầu vào
AGAIN: SETB TR0 ; Bắt ñầu ñếm T0
BACK: MOV A,TL0 ; ðọc giá trị của TL0 vào A
ACALL CONV ; Chuyển ñổi dữ liệu sang ASCII
ACALL DISPLAY ; Hiển thị lên LCD
JNB TF0,BACK ; Chờ tràn
CLR TR0 ; Dừng bộ ñếm
CLR TF0 ; Xóa cờ tràn
SJMP AGAIN ; Lặp lại
; Chuyển ñổi dữ liệu sang ASCII sử dụng các thanh ghi R2,R3,R4
CONV: MOV B,#10
DIV AB ; Chia số cần chuyển ñổi cho 10
MOV R2,B ; Lưu số dư của phép chia vào R2
MOV B,#10
DIV AB ; Chia cho 10 một lần nữa
ORL A,#30H ; ðổi về ASCII
MOV R4,A ; Lưu số thứ nhất vào R4
MOV A,B ; Lấy số thứ 2 vào A
ORL A,#30H ; ðổi số thứ 2 về ASCII
MOV R3,A ; Lưu số thứ 2 vào R3
MOV A,R2 ; Lấy số thứ nhất vào A
ORL A,#30H ; ðổi số thứ 1 về ASCII
MOV R2,A ; Cất vào R2
RET
56
12. LẬP TRÌNH GIAO TIẾP NỐI TIẾP
D7
ðể truyền tin nối tiếp, người ta sử dụng một ñường dữ liệu thay thế cho bus dữ
liệu 8 bit của truyền tin song song. Nhờ vậy không chỉ làm giá thành hạ hơn nhiều
mà còn mở ra một khả năng ñể 2 máy tính ở cách rất xa nhau vẫn có thể truyền
thông với nhau.
ðể tổ chức truyền tin nối tiếp, trước hết byte dữ liệu ñược chuyển thành các bit
nối tiếp nhờ thanh ghi dịch vào song song - ra nối tiếp. Tiếp theo, dữ liệu ñược
truyền qua một ñường truyền dữ liệu ñơn. Ở ñầu thu cũng phải có một thanh ghi
dịch vào nối tiếp - ra song song ñể nhận dữ liệu nối tiếp và sau ñó gói chúng lại
thành từng byte một.
Truyền tin có 2 phương pháp: ðồng bộ và dị bộ. Phương pháp ñồng bộ chuyển
một lần một khối dữ liệu (các ký tự), còn phương pháp dị bộ chỉ truyền từng byte
một. Bộ vi ñiều khiển 8051 ñược xây dựng sẵn một bộ thu phát dị bộ tổng hợp
UART (Universal Asynchronous Receiver Transmitter).
57
- Truyền song công: Mỗi bên ñều vừa có thể phát, vừa có thể thu dữ liệu.
Truyền song công có 2 loại: song công hoàn toàn và bán song công.
+ Bán song công: Tại một thời ñiểm dữ liệu chỉ có thể truyền một
chiều.
+ Song công hoàn toàn: Dữ liệu có thể truyền cả hai chiều ñồng thời.
Bộ phát Bộ phát
Bán song
công
Bộ thu Bộ thu
Bộ phát Bộ phát
Song công
Bộ thu Bộ thu
d7 d0
Goes out last Goes out
first
Hướng truyền dữ liệu
58
Trên hình vẽ là khung truyền một ký tự "A" của mã ASCII, có mã Hexa là 41H,
mã nhị phân truyền ñi là 0100 0001, ñược ñịnh khung giữa một bit khởi ñộng và
một bit dừng.
Trình tự truyền ký tự bắt ñầu với bit khởi ñộng, tiếp theo là bit có trọng số nhỏ
nhất D0, tiếp nữa là các bit còn lại cho ñến bit có trọng số lớn nhất là D7, và cuối
cùng là bit dừng ñể báo rằng ñã kết thúc ký tự "A".
Trên hình vẽ ở ví dụ trên, khi không truyền thì tín hiệu ở mức 1 gọi là dấu
(mark), tín hiệu ở mức 0 gọi là khoảng trống (space).
Trong một số hệ thống trước ñây, do thiết bị thu không nhanh nên cần sử dụng
2 bit dừng ñể thiết bị có ñủ thời gian cho việc truyền byte tiếp theo. Tuy nhiên
trong máy tính PC hiện ñại phổ biến sử dụng một bit dừng.
Ở một số hệ thống, nhằm tăng khả năng bảo toàn của dữ liệu, người ta còn thêm
vào khung dữ liệu một bit kiểm tra lỗi chẵn lẻ. Bit kiểm tra này có thể là bậc chẵn
hoặc bậc lẻ. Bit bậc lẻ có tổng các số 1 của các bit dữ liệu cùng với bit kiểm tra là
một số lẻ. Tương tự, bit bậc chẵn có tổng các số 1 của các bit dữ liệu cùng với bit
kiểm tra là một số chẵn. Nếu trong khung dữ liệu có bit kiểm tra chẵn lẻ, thì bit này
ñược gửi ñi sau bit MSB và trước bit dừng.
Chuẩn RS232
ðể ñảm bảo sự tương thích giữa các thiết bị truyền dữ liệu nối tiếp do các hãng
khác nhau sản xuất, năm 1960 Hiệp hội công nghiệp ñiện tử EIA ñã xây dựng một
chuẩn giao diện ñược gọi là RS232. Ngày nay, RS232 là chuẩn giao diện I/O ñược
sử dụng rộng rãi nhất.
Tuy nhiên, do chuẩn này ra ñời ñã khá lâu, trước khi có họ mạch vi ñiện tử
TTL, vì vậy các mức ñiện áp vào/ra của nó không tương thích với TTL. Ở RS232,
mức logic 1 tương ñương từ -3V ñến -25V, còn mức 0 tương ứng từ +3V ñến
+25V, khoảng từ -3V ñến +3V không xác ñịnh.
59
Do ñó, ñể kết nối RS232 với máy tính ñều phải qua bộ biến ñổi ñiện áp như
MAX232 ñể chuyển mức logic TTL sang mức ñiện áp của RS232 và ngược lại.
Bảng sau ñây giới thiệu sơ ñồ bố trí chân của RS232 dạng DB-9.
1 5
6 9
Kết nối ñơn giản nhất giữa PC và một bộ vi ñiều khiển yêu cầu tối thiểu những
chân sau: TxD, RxD và GND.
TxD TxD
RxD RxD
GND GND
Chân Mô tả Ý nghĩa
1 Data carrier detect (DCD) Tách tín hiệu mang dữ liệu
2 Received data (RxD) Dữ liệu ñược nhận
3 Transmitted data (TxD) Dữ liệu ñược gửi
4 Data terminal ready (DTR) ðầu cuối dữ liệu sẵn sàng
5 Signal ground (GND) ðất của tín hiệu
6 Data set ready (DSR) Dữ liệu sẵn sàng
7 Request to send (RTS) Yêu cầu gửi
8 Clear to send (CTS) Xóa ñể gửi
60
NỐI GHÉP 8051 VỚI RS232
Vc
+ c C3
C1 16 8051
2 +
+ Max232
6 C4 11 11 14 2 5
C2
+
P3.1
T1IIN T1OUT TxD 10 12 13 3
11 14
2 R1OUT R1IIN P3.0
12 13
2
RxD
T2IIN T2OUT DB - 9
10 7
R2OUT R2IIN
9 8
15
TTL side Rs232 side
Max232 có hai bộ ñiều khiển ñường truyền là nhận và truyền dữ liệu. Các bộ
ñiều khiển ñường truyền dùng cho TxD gọi là T1 và T2. Trong nhiều ứng dụng thì
chỉ có một cặp ñược dùng. Ví dụ T1 và R1 ñược dùng với nhau cho trường hợp
TxD và RxD của 8051, còn cặp R2 và T2 thì không dùng ñến.
Bộ ñiều khiển T1 của MAX232 có gán T1in và T1out trên các chân 11 và 14
tương ứng. Chân T1in ở phía TTL và ñược nối tới chân P3.1 (TxD) của bộ vi ñiều
khiển, còn T1out ở phía RS232 và ñược nối tới chân RxD (số 2) của DB-9.
Bộ ñiều khiển ñường R1 cũng có gán R1in và R1out trên các chân 13 và 12 tương
ứng. Chân R1in (số 13) ở phía RS232 và ñược nối tới chân TxD (số 3) của DB-9.
Chân R1out ở phía TTL và ñược nối tới chân RxD (P3.0) của vi ñiều khiển.
MAX232 cần 4 tụ ñiện giá trị từ 1µF ñến 22µF, giá trị thường dùng là 10µF.
61
Mạch UART truyền nối tiếp của 8051 lại chia tần số chy kỳ máy cho 32 một lần
nữa trước khi ñưa ñến Timer 1 ñể tạo ra tốc ñộ baud. Do vậy, 921,6kHz : 32 =
28,8kHz là tần số sẽ ñược dùng ñể xác ñịnh tốc ñộ baud.
28800Hz
XTAL ÷ 12 ÷ 32
oscillator 921.6kHz by UART
Muốn Timer 1 ñặt tốc ñộ baud thì nó phải ñược lập trình về mode 2, ñó là chế
ñộ 8-bit tự ñộng nạp lại. ðể có tốc ñộ baud tương thích với PC ta phải nạp TH1
theo các giá trị cho trong bảng sau ñây.
THANH GHI ðIỀU KHIỂN NỐI TIẾP SCON (ðịnh ñịa chỉ bit)
SM0 và SM1: Các bit D7 và D6 của thanh ghi SCON, dùng ñể xác ñịnh chế ñộ
khung dữ liệu bằng cách xác ñịnh số bit của một ký tự và các bit Start và Stop.
62
SM0 SM1
0 0 Mode 0
0 1 Mode 1: 1 Start, 8 bit Data, 1 Stop
1 0 Mode 2
1 1 Mode 3
SM0 SCON.7
Xác ñịnh chế ñộ làm việc cổng
SM1 SCON.6
SM2 SCON.5 Dùng cho truyền thông giữa các bộ vi xử lý
Bật/tắt bằng phần mềm ñể cho/không cho
REN SCON.4
phép thu.
TB8 SCON.3 Ít sử dụng.
RB8 SCON.2 Ít sử dụng.
Cờ ngắt truyền. ðặt bằng phần cứng khi bắt
TI SCON.1 ñầu bit Sop (kết thúc việc truyền một ký tự) ở
mode 1. Xóa bằng phần mềm.
Cờ ngắt truyền. ðặt bằng phần cứng khi bắt
RI SCON.0 ñầu bit Sop (kết thúc việc nhận một ký tự) ở
mode 1. Xóa bằng phần mềm.
Trong các chế ñộ ở trên, chúng ta chỉ quan tâm ñến chế ñộ 1. Ở chế ñộ 1, dữ
liệu ñược ñịnh khung gồm 8 bit dữ liệu, 1 bit Start, 1 bit Stop ñể tương thích với
cổng COM của IBM PC và các máy tính khác. Chế ñộ 1 cho phép tốc ñộ baud thay
ñổi và do Timer 1 của 8051 thiết lập.
REN
Là bit cho phép thu (Receive Enable), bit SCON.4. Khi bit REN ở mức cao thì
nó cho phép 8051 nhận dữ liệu trên chân RxD. Như vậy, nếu muốn 8051 vừa phát
vừa thu dữ liệu thì bit REN phải ñược ñặt lên 1. Nếu REN = 0 thì bộ thu bị khóa.
TI và RI
Cờ ngắt phát (Transmit Interrupt) và cờ ngắt thu (Receive Interrupt). ðây là 2
bit cờ rất quan trọng của thanh ghi SCON.
Khi 8051 kết thúc việc phát 1 ký tự 8-bit thì cờ TI ñược bật ñể báo rằng bộ vi
ñiều khiển sẵn sàng phát byte tiếp theo. Bit TI ñược bật ngay khi bắt ñầu bit Stop
(truyền xong).
Khi 8051 nhận ñược dữ liệu nối tiếp qua chân RxD thì tiến hành tách các bit
Start và Stop ñể lấy ra 8 bit dữ liệu và ñặt vào thanh ghi SBUF. Sau khi quá trình
này hoàn tất, cờ RI ñược bật ñể báo rằng bộ vi ñiều khiển ñã nhận ñược một byte
và cần phải ñược cất ñi chỗ khác nếu không sẽ bị mất. Cờ RI ñược set khi ñang
tách bit Stop (ngay khi vừa nhận xong).
Ví dụ
Truyền liên tục chữ "YES" với tốc ñộ 9600 baud
giải
MOV TMOD,#20 ; Timer 1, mode 2
MOV TH1,# -3 ; Tốc ñộ 9600 baud
MOV SCON,#50H ; Cho phép thu, mode 1
AGAIN: MOV A,#"Y"
ACALL TRANS ; Truyền ký tự Y
MOV A,#"E"
ACALL TRANS ; Truyền ký tự Y
MOV A,#"S"
ACALL TRANS ; Truyền ký tự Y
SJMP AGAIN ;Tiếp tục lặp lại.
TRANS: MOV SBUF,A
HERE: JNB TI,HERE
CLR TI
RET
64
Thông qua việc kiểm tra cờ TI có thể kiểm soát việc nạp dữ liệu vào thanh ghi
SBUF. Nếu nạp một byte vào SBUF trước khi cờ TI ñược bật thì phần dữ liệu của
byte trước chưa truyền hết sẽ bị mất.
Ngay sau khi truyền xong một ký tự (kiểm tra bằng lệnh JNB TI,...) thì cờ TI
cần ñược xóa về 0 bởi người lập trình nhờ lệnh "CLR TI" ñể báo byte mới có thể
truyền.
Ví dụ
Lập trình cho 8051 ñể nhận các byte dữ liệu nối tiếp và ñặt chúng vào cổng P1.
Tốc ñộ baud là 4800, 8 bit dữ liệu và 1 bit Stop.
Giải
MOV TMOD,#20H ; Timer 1, mode 2
MOD TH1,# -6 ; Tốc ñộ 4800
MOV SCON,#50H ; Cho phép thu, mode 1 của UART
SETB TR1 ; Khởi ñộng Timer 1
HERE: JNB RI, HERE ; ðợi nhận hết toàn bộ ký tự
MOV A,SBUF ; Cất ký tự vào thanh ghi A
MOV P1,A ; Gửi ra cổng P1
CLR RI ; Xóa cờ RI ñể sẵn sàng nhận ký tự
tiếp
SJMP HERE ; Tiếp tục nhận dữ liệu
65
Sau khi nội dung SBUF ñược cất vào một nơi an toàn thì cờ RI cần ñược xóa về
0 bởi người lập trình bằng lệnh "CLR RI" ñể cho phép chuyển vào SBUF các ký
tự vừa nhận ñược tiếp theo. Nếu không thực hiện bước này thì ký tự tiếp theo sẽ bị
mất.
ðể tránh lãng phí thời gian khi bộ vi ñiều khiển liên tục kiểm tra trạng thái và
bật các cờ TI và RI, ta có thể sử dụng ngắt.
66
13. LẬP TRÌNH NGẮT TRONG 8051
Ngắt (interrupt) là sự xảy ra của một ñiều kiện - một sự kiện - làm cho chương
trình chính bị tạm ngưng trong khi ñiều kiện ñược phục vụ bởi một chương trình
khác.
Trong một hệ thống ñược ñiều khiển bởi ngắt, việc ngắt nhằm ñáp ứng một sự
kiện mà sự kiện này xuất hiện không ñồng bộ với chương trình chính ñang ñược
thực thi và chương trình chính (hay nói cách khác là CPU) không biết trước là sẽ bị
ngắt khi nào.
68
13.4 BẢNG VECTOR NGẮT CỦA 8051
Khi một ngắt ñược chấp nhận, giá trị ñược nạp cho bộ ñếm chương trình PC
ñược gọi là vector ngắt. Vector ngắt là ñịa chỉ bắt ñầu của trình phục vụ ngắt của
nguyên nhân ngắt tương ứng.
Ngắt ðịa chỉ ROM Chân
RESET 0000 9
Ngắt phần cứng ngoài (INT0) 0003 12 (P3.2)
Ngắt bộ Timer0 (TF0) 000B
Ngắt phần cứng ngoài 1 (INT1) 0013 13 (P3.3)
Ngắt bộ Timer1 (TF1) 001B
Ngắt COM nối tiếp (RI và TI) 0023
Việc Reset hệ thống ñược chứa trong bảng này vì nó cũng ñược xem như là một
ngắt: chương trình chính bị ngắt và bộ ñếm chương trình PC ñược nạp giá trị mới.
1. RESET: Khi chân Reset ñược kích hoạt thì 8051 nhảy về ñịa chỉ 0000.
2. Hai ngắt dành cho bộ ñịnh thời Timer 0 và Timer 1. ðịa chỉ ở bảng vector
ngắt của hai ngắt này tương ứng với Timer 0 và Timer 1 là 000B và 001B.
3. Hai ngắt phần cứng dành cho các thiết bị bên ngoài nối tới chân 12 (P3.2) và
13 (P3.3) của cổng P3 là INT0 và INT1 tương ứng. Các ngắt ngoài cũng còn ñược
gọi là EX1 và EX2. Vị trí nhớ trong bảng vector ngắt của hai ngắt INT0 và INT1
này là 0003H và 0013H.
4. Truyền thông nối tiếp có một ngắt cho cả thu lẫn phát. ðịa chỉ của ngắt này
trong bảng vector ngắt là 0023H.
Số lượng byte hạn chế dành riêng cho từng ngắt: 8 byte. Ví dụ, ñối với ngắt
INT0 ngắt phần cứng bên ngoài 0 thì có tổng cộng là 8 byte từ ñịa chỉ 0003H ñến
000AH dành cho nó. Tương tự như vậy, 8 byte từ ñịa chỉ 000BH ñến 0012H là
dành cho ngắt bộ ñịnh thời 0 là TI0. Nếu trình phục vụ ngắt ñối mặt với một ngắt
ñã cho mà ngắn ñủ ñặt vừa không gian nhớ ñược. Nếu không vừa thì một lệnh
LJMP ñược ñặt vào trong bảng véc tơ ngắt ñể chỉ ñến ñịa chỉ của ISR, ở trường
hợp này thì các byte còn lại ñược cấp cho ngắt này không dùng ñến.
13.5 ƯU TIÊN NGẮT
Mỗi một nguyên nhân ngắt ñược lập trình riêng rẽ ñể có một trong hai mức ưu
tiên thông qua thanh ghi chức năng ñặc biệt ñược ñịnh ñịa chỉ bit: thanh ghi ưu tiên
ngắt IP (interrupt priority), thanh ghi này có ñịa chỉ byte là 0B8H.
69
Bit Ký hiệu ðịa chỉ bit Mô tả
IP.7 . . Không sử dụng
IP.6 . . Không sử dụng
IP.5 PT2 BDH Ưu tiên ngắt cho bộ ñịnh thời 2
IP.4 PS BCH Ưu tiên ngắt cho port nối tiếp
IP.3 PT1 BBH Ưu tiên ngắt cho bộ ñịnh thời 1
IP.2 PX1 BAH Ưu tiên cho ngắt ngoài 1
IP.1 PT0 B9H Ưu tiên ngắt cho bộ ñịnh thời 0
IP.0 PX0 B8H Ưu tiên cho ngắt ngoài 0
Khi hệ thống ñược thiết lập lại trạng thái ban ñầu, thanh ghi IP sẽ mặc ñịnh tất
cả các ngắt ở mức ưu tiên thấp.
Ý tưởng “các mức ưu tiên ngắt” cho phép một trình phục vụ ngắt ñược tạm
dừng bởi một ngắt khác nếu ngắt mới này có mức ưu tiên cao hơn mức ưu tiên của
ngắt hiện ñang ñược phục vụ. ðối với 8051 chỉ có 2 mức ưu tiên ngắt. Nếu có ngắt
với mức ưu tiên cao xuất hiện, trình phục vụ ngắt cho ngắt có mức ưu tiên thấp
phải tạm dừng (nghĩa là bị ngắt). Ta không thể tạm dừng một chương trình phục vụ
ngắt có mức ưu tiên cao.
Chương trình chính do ñược thực thi ở mức nền và không ñược kết hợp với một
ngắt nào nên luôn luôn bị ngắt bởi các ngắt cho dù các ngắt này có mức ưu tiên
thấp hay cao. Nếu có 2 ngắt với mức ưu tiên ngắt khác nhau xuất hiện ñồng thời,
ngắt có mức ưu tiên cao sẽ ñược phục vụ trước.
Nếu có 2 ngắt cùng mức ưu tiên xuất hiện ñồng thời, chuỗi vòng cố ñịnh sẽ xác
ñịnh ngắt nào ñược phục vụ trước. Chuỗi vòng này sẽ là: Ngắt ngoài 0, ngắt do bộ
ñịnh thời 0, ngắt ngoài 1, ngắt do bộ ñịnh thời 1, ngắt do port nối tiếp, ngắt do bộ
ñịnh thời 2.
Trạng thái của tất cả các nguyên nhân ngắt ñược thể hiện thông qua các bit cờ
tương ứng trong các thanh ghi chức năng ñặc biệt có liên quan. Dĩ nhiên nếu một
ngắt nào ñó không ñược phép, nguyên nhân ngắt tương ứng không thể tạo ra ngắt
nhưng phần mềm vẫn có thể kiểm tra cờ ngắt. Ví dụ như bộ ñịnh thời và port nối
tiếp trong các phần trước sử dụng cờ ngắt một cách rộng rãi dù không có ngắt
tương ứng xảy ra, nghĩa là không sử dụng các ngắt.
Ngắt do port nối tiếp là kết quả OR của cờ ngắt khi thu RI (cờ ngắt thu) với cờ
ngắt khi phát TI (cờ ngắt phát). Ngắt do bộ ñịnh thời 2 ñược tạo ra do cờ tràn của
bộ ñịnh thời TF2 hoặc do cờ từ bên ngoài EXF2.
70
13.6 CÁC BƯỚC KHI CHO PHÉP MỘT NGẮT
Khi Reset thì tất cả mọi ngắt ñều bị cấm (bị che) có nghĩa là không có ngắt nào
sẽ ñược bộ vi ñiều khiển ñáp ứng nếu chúng ñược kích hoạt. Các ngắt phải ñược
kích hoạt bằng phần mềm ñể bộ vi ñiều khiển ñáp ứng chúng. Có một thanh ghi
ñược gọi là cho phép ngắt IE (Interrupt Enable) chịu trách nhiệm về việc cho phép
(không che) và cấm (che) các ngắt. IE là thanh ghi có thể ñịnh ñịa chỉ theo bít.
ðể cho phép một ngắt ta phải thực hiện các bước sau:
1. Bít D7 của thanh ghi IE là EA phải ñược bật lên cao ñể cho phép các bít còn lại
của thanh ghi có hiệu lực.
2. Nếu EA = 1 thì tất cả mọi ngắt ñều ñược phép và sẽ ñược ñáp ứng nếu các bít
tương ứng của chúng trong IE có mức cao. Nếu EA = 0 thì không có ngắt nào
sẽ ñược ñáp ứng cho dù bít tương ứng của nó trong IE có giá trị cao.
Thanh ghi cho phép ngắt IE.
D7 D0
72
Sử dụng bộ Timer 0 ñể tạo ra sóng vuông, tần số của 8051 là XTAL =
11.0592MHz.
GIẢI
START
ORG 0x0000
LJMP MAIN ; Bo qua bang Vecto ngat
ORG 000BH ; Vecto ngat cua Timer 0
CPL P2.1 ; Dao muc logic tren chan P2.1
RETI
ORG 0030H ; Dia chi sau bang vecto ngat
MAIN: MOV TMOD,#20H ; Chon Timer 0, che do 2
MOV P0,#0xFF ; Lay P0 lam cong vao
MOV TH0,#-92; Dat TH0 = A4H cho -92
MOV IE,#10000010B; Cho phep ngat Timer 0
SETB TR0 ; Khoi dong bo Timer 0
BACK: MOV A,P0 ; Nhan du lieu tu cong P0
MOV P1,A ; Chuyen du lieu den cong P1
SJMP BACK ;Tiep tuc nhan du lieu va chuyen
du
; lieu chung nao chua bi TF0
ngat
END
73
14. LẬP TRÌNH HỢP NGỮ
Hợp ngữ (Assembly Language programming) là ngôn ngữ của máy tính có vị
trí giữa ngôn ngữ máy và ngôn ngữ cấp cao. Các ngôn ngữ cấp cao ñiển hình như
Pascal, C sử dụng các từ và các phát biểu dễ hiểu ñối với con người. Ngôn ngữ
máy là ngôn ngữ ở dạng số nhị phân của máy tính. Một chương trình viết bằng
ngôn ngữ máy là một chuỗi các byte nhị phân biểu diễn các lệnh mà máy tính thực
thi ñược.
Hợp ngữ thay thế các mã nhị phân của ngôn ngữ máy bằng các mã gợi nhớ giúp
ta dễ nhớ hơn và dễ lập trình hơn.
Một chương trình viết bằng hợp ngữ không thể ñược thực thi trực tiếp bởi máy
tính. Sau khi viết xong, chương trình này phải trải qua quá trình dịch thành ngôn
ngữ máy. Trình dịch hợp ngữ là chương trình dùng ñể dịch một chương trình hợp
ngữ thành chương trình ngôn ngữ máy.
([Nhãn:] [Mã gợi nhớ] [Toán hạng] [,Toán hạng] [....] [;Chú thích])
LƯU ðỒ
Các ký hiệu thường dùng:
: Hộp xử lý.
: Khối xuất/nhập.
BA CẤU TRÚC
Mọi vấn ñề lập trình ñều có thể ñược thực hiện bằng cách dùng 3 cấu trúc:
- Các phát biểu (Statement).
- Các vòng lặp (Loop).
- Sự lựa chọn (Case).
1. Các phát biểu
Các phát biểu cung cấp cho chúng ta cơ chế cơ bản ñể thực hiện một ñiều gì ñó.
Các khả năng bao gồm việc gán một giá trị cho một biến, hoặc gọi một chương
trình con.
2. Cấu trúc vòng lặp
- WHILE/DO
- REPEAT/UNTIL
3. Cấu trúc lựa chọn
- IF/THEN/ELSE
- CASE
75
15. HƯỚNG DẪN SỬ DỤNG PHẦN MỀM
Phần mềm Keil µVision3 là một chương trình biên dịch cho phép người sử dụng có
thể viết ñược các chương trình ñiều khiển cho họ vi ñiều khiển MSC-51 bằng ngôn ngữ C
và cả ASM. Nó có chứa hầu hết các hàm chuẩn của ANSI-C. ðiều này giúp cho người sử
dụng có thể tận dụng ñược những hàm chuẩn của C ñể viết chương trình cho vi ñiều
khiển. Việc tổ chức chương trình thành các môdun nhỏ cũng rất dễ thực hiện. Chương
trình biên dịch cho ngôn ngữ C của nó chính là Cx51 Compiler.
Cx51 Compiler hỗ trợ tất cả các kiểu dữ liệu chuẩn của C như: char, short, int, long,
float. Ngoài ra nó còn có một vài kiểu dữ liệu ñặc biệt tương thích với họ vi ñiều khiển
MSC-51.
- Kiểu bit: ñây là kiểu dữ liệu chỉ gồm 2 giá trị 0 và 1. Nó ñược sử dụng ñể gán giá
trị cho các thanh ghi hay các ñịa chỉ có thể truy nhập ñược ñến từng bit.
- Kiểu sbit, sfr, sfr16: ðây là các kiểu dữ liệu dùng ñể ñịnh nghĩa cho các thanh ghi
chức năng ñặc biệt. Kiểu sfr dùng ñể ñịnh nghĩa cho các thanh ghi SFR 8-bit. Còn kiểu
sfr16 dùng ñể ñịnh nghĩa cho các thanh ghi SFR 16-bit như thanh ghi RCAP2 dùng ñể
lưu giữ giá trị nạp lại cho Timer 2. Kiểu sbit dùng ñể ñịnh nghĩa từng bit cho các bit
trong các thanh ghi ñặc biệt mà có thể ñịnh ñịa chỉ bit.
Ví dụ khai báo:
Về cách tổ chức bộ nhớ của vi ñiều khiển trong phần mềm Keil C51:
- Bộ nhớ chương trình: ðây là vùng nhớ chỉ ñọc trong vi ñiều khiển. Nó có thể có
dung lượng tới 64KB. Trong phần mềm Keil C51 thì vùng nhớ này ñược ñịnh dạng bằng
từ khoá code.
- Bộ nhớ dữ liệu trong: ðây là vùng nhớ có thể vừa ghi và ñọc. Có 3 kiểu vùng nhớ
dữ liệu ở bên trong vi ñiều khiển. ðó là các kiểu: data, idata, bdata. Vùng nhớ dữ liệu
kiểu data là vùng nhớ chứa 128 byte dữ liệu ñầu tiên của vi ñiều khiển. Vùng nhớ này có
thể truy cập thông qua ñịa chỉ trực tiếp ñược. Vùng nhớ dữ liệu kiểu idata là vùng nhớ
256 byte dữ liệu truy nhập thông qua ñịa chỉ gián tiếp. Vùng nhớ dữ liệu kiểu bdata là
vùng nhớ chứa 16 byte ñịnh ñịa chỉ bit từ ñịa chỉ 20H ñến 2FH.
- Bộ nhớ dữ liệu ngoài: Có 2 kiểu dữ liệu ngoài ở trong Keil C51 là XDATA và
PDATA. XDATA là vùng nhớ dữ liệu ngoài có thể ñịnh ñịa chỉ ñược ñến 64 KB dữ liệu.
PDATA là vùng nhớ chứa từng trang dữ liệu. Mỗi trang dữ liệu ngoài chứa ñược 256
byte. ðể có thể truy cập ñược bộ nhớ dữ liệu ngoài, ta phải dùng từ khoá _at_ ñể ñịnh ñịa
chỉ cho các biến.
float xdata a1 _at_ 0x2000; //Khai báo biến a1 có ñịa chỉ 2000H
Con trỏ trong Keil C51 ñược khai báo giống như khai báo con trỏ trong ngôn ngữ C.
77
int *p; //Con trỏ kiểu int
Con trỏ ñược sử dụng ñể truy cập tới bất cứ phần bộ nhớ nào của vi ñiều khiển. Có
hai cách khai báo sử dụng con trỏ. Generic Pointers là kiểu con trỏ dùng chung. Khai báo
con trỏ sẽ chiếm 3 byte của vùng nhớ dữ liệu mà nó trỏ ñến.
Con trỏ còn có thể khai báo vùng nhớ dữ liệu cho con trỏ.
Ví dụ:
Ngoài ra, Keil C51 còn là chương trình mô phỏng chip rất tốt bằng chương trình
tích hợp dScope. Nó cho phép người sử dụng mô phỏng chương trình viết trong C chạy
trên nền chip giống như thật. Người sử dụng có thể dễ dàng theo dõi giá trị của Timer,
trạng thái các ngắt, ñầu ra cổng nối tiếp, ñầu ra các port P0, ..., P3.
Ngoài các chức năng hỗ trợ mạnh cho việc lập trình với vi ñiều khiển (ñã giới thiệu
ở phần trên), Keil C51 còn là chương trình mô phỏng chip rất tốt bằng chương trình tích
hợp dScope. Nó cho phép người sử dụng mô phỏng chương trình viết trong Keil chạy
trên nền chip giống như thật. Người sử dụng có thể dễ dàng theo dõi giá trị của Timer,
trạng thái các ngắt, ñầu ra cổng nối tiếp, ñầu ra các port P0...P3.
78
II. CÁCH CÀI ðẶT VÀ SỬ DỤNG PHẦN MỀM
1.1. Phần mềm Keil
1.1.1 Cài ñặt
Chạy Files thực thi: Setup->Setup.exe, xuất hiện hộp thoại:
79
Bấm Next ñể tiếp tục.
Tại ñây, bạn chọn thư mục sẽ ñặt chương trình Keil (uV3) và bấm Next.
Gõ vào Serial Number (k1dzp - 5iush - a01ue) như hình dưới. ðiền các thông
tin cần thiết khác.
80
ðiền các thông tin khác, bấm Next.
81
Bấm Finish: Cài ñặt thành công lúc này sẽ xuất hiện biểu tượng của uV2
và uV3 cả hai ñều sử dụng ñược, mở chương trình UV3 vào phần Help, bạn sẽ
ñược:
Ở ñây có thể xem ñược các hướng dẫn chi tiết của nhà sản xuất
82
ðặt tên cho New Project và chọn Save.
Sẽ xuất hiện hộp thoại ñể ta chọn loại chip cần lập trình. Phần mềm này hổ trợ
rất nhiều loại chip, ví dụ nêu ta sử dụng ñể lập trình cho chip vi ñiều khiển
AT89S8252 thì các bước tiến hành như sau: Vào thư mục Atmel sẽ xuất hiện danh
sách các loại chip của hãng Atmel tìm và chọn AT89S8252 và bấm OK.
83
Xuất hiện hôp thoại hỏi: “Bạn có muốn sao chép mã nguồn của 8051 và ñưa
vào Project không? ”. Nếu muốn thì chọn Yes nếu không chọn No. Ở ñây ta chọn No
vì ta ñang soạn thảo file mới. Trên màn hình giao diện click vào biểu tượng Create
new file ñể mở trang soạn thảo mới (hoặc vào File chọn New – Ctrl+N).
Trang soạn thảo sẽ có tên mặc ñịnh là Text1. Vào File chọn Save (Ctrl+S) hoặc
click vào biểu tượng save the active document trên thanh công cụ ñể lưu file mới theo
tên mình ñặt.
84
Click chuột vào Taget1, Click phải chuột vào Source Group1 chọn Add File to
Group ‘Source Group 1’ ñể tạo nhóm cho Project vừa mở.
85
Xuất hiện tên Project ở Source Group 1 như vậy ta ñã tạo Project mới thành
công. Tiến hành soạn thảo chương trình ở ô bên cạnh như hình dưới.
Sau khi ñã soạn thảo xong chương trình ta tiến hành biên dịch chương trinh
sang file Hex ñể nạp cho chip.Quá trình thực hiện như sau:
- Vào Project chọn Options for File ‘thuchanhKeil.asm’.
Lặp lại thao tác như trên sẽ xuất hiện hộp thoại.
86
Chọn Cancel sẽ xuất hiện hộp thoại Options for Taget ‘Taget 1’. Chip
AT89S8252 sử dụng thạch anh có tần số 12MHz nên ở ô Xtal (MHz) hộp thoại Taget
ta gõ vào số 12.
Vào Output ñánh dấu vào ô Create HEX File. Nếu muốn thay ñổi tên file khi
dich ra Hex File thì gõ tên mới vào ô Name of Executable, nếu không thì giữ nguyên.
87
Tiến hành biên dịch: Vào Project lần lượt chọn Translate, Build Taget, Rebuild
all taget file và sau mổi lần chọn phải xem thông báo ở ô Output Windown. Nếu
chương trình không báo lỗi (0 Error, 0 Warning) thì cứ tiếp tục.
88
Quá trình biên dich sang Hex File ñã thành công.
Chạy thử chương trình.
- Vào Debug chọn Start/Stop Debug Session (Ctrl+F5)
Vào Perpherals ñể ñưa ra các port từ P0 ñến P3, các bộ Timer và xem sự hoạt
ñộng của chương trình.
89
1.2. Phần mềm AEC_ISP
1.2.1 Ghép nối vói PC nạp chương trình cho vi ñiều khiển theo phương thức ISP
AEC_ISP là phần mềm của hãng AEC Electronics ASC. ðây là một phương thức
nạp dữ liệu vào vi ñiều khiển rất thuận tiện, không cần mạch nạp riêng. Các chân ña chức
năng từ P1.4 ñến P1.7 của các chip như AT89S8252, AT89S51, AT89S53… thực hiện
giao tiếp ISP này.
Sơ ñồ ghép nối
Ghi chú: Chiều dài cáp nối từ PC ñến KIT tối ña là 1m.
1.2.2 Hướng dẫn sử dụng AEC_ISP
Lưu ý: ðể có thể nạp chương trình cho vi ñiều khiển bằng phần mềm AEC_ISP
thì phần mềm này phải ñược lưu cùng với Hex file trong một thư mục.
Click phải chuột vào biểu tượng của phần mềm AEC_ISP chọn Open sẽ xuất
hiện giao diện.
90
- Thiết lập phương thức nạp chip:
Vào Setup và chọn các chế ñộ phù hợp sau ñó chọn Save setup.
91
Chương trình sẽ ñược dịch sang mã Hexa có dạng như sau.
Chọn Reset ở mức thấp (Low) và xem kết quả chương trình hiển thị trên KIT.
92
16. ðIỀU KHIỂN NGOẠI VI
Một số vi mạch thông dụng thường dùng trong thiết kế ñiều khiển ngoại vi của
vi ñiều khiển:
1. Mạch chốt tín hiệu 74HC573
74HC573 là mạch chốt tín hiệu tốc ñộ cao ñược chế tạo theo công nghệ
CMOS. Các ñặc ñiểm của vi mạch:
- Tốc ñộ truyền tín hiệu từ ñầu vào sang ñầu ra chỉ có 18 ns.
- Dòng ñiện ñầu vào: lớn nhất 1µA.Hoạt ñộng: Khi chân /LE ở mức cao, ñầu
ra Q phụ thuộc vào ñầu vào D. Khi chân /LE ở mức thấp, tín hiệu ñầu vào D ñược
giữ lại ở ñầu ra cho ñến khi nào chân /LE trở lại mức cao. Khi chân /OE ở mức
cao, tất cả các ñầu ra Q ñều ở mức cao.
93
ðây là vi mạch ñược chế tạo theo công nghệ CMOS. Vi mạch này ñược dùng ñể
giải mã ñịa chỉ khi hệ thống có nhiều linh kiện cần ñịnh ñịa chỉ ghép nối. Nó là một
trong những vi mạch phổ biến nhất trong các mạch vi ñiều khiển. Tín hiệu ñầu vào
là các tín hiệu ñịa chỉ và tín hiệu ñiều khiển. Các chân ñầu ra ñảo Yk phụ thuộc vào
các chân tín hiệu ñầu vào A, B, C. Tuy nhiên các tín hiệu ñịa chỉ chỉ ñược giải mã
khi chân G1(E3) ở mức High, còn các chân /G2A(/E1), /G2B(/E2) ở mức Low.
3. Vi mạch MAX232
94
máy tính ñược nối T1IN của MAX232. Tương tự, chân RxD của vi ñiều khiển ñược
nối với chân /T1OUT, còn chân TxD của vi ñiều khiển ñược nối với chân R1IN của
MAX232.
Vi mạch 62256 ñược dùng làm bộ nhớ dữ liệu ngoài cho các vi ñiều khiển.
- A0 ÷ A14: là 15 bit dùng ñể xác ñịnh ñịa chỉ của các vùng nhớ trong RAM.
- /OE: Output Enable, cho phép ñọc dữ liệu từ RAM ra Data Bus.
Bộ nhớ EEPROM nhờ sử dụng phương pháp xóa ñiện nên việc thực hiện gần
như tức thì. Có thể chọn từng Byte trong EEPROM ñể xóa. Có thể lập trình và xóa
nội dung cho EEPROM ngay trên bảng mạch chính mà không cần gở vi mạch ra
khỏi ñế. Do ñó không cần thiết bị nạp và xóa bên ngoài.
- A0 ÷A12: Là 12 bit dùng ñể xác ñịnh ñịa chỉ của các vùng nhớ trong
EEPROM.
- /OE: Output Enable, cho phép ñọc dữ liệu từ EEPROM ra Data Bus.
95
- D0 ÷ D7: là các chân nối vào Data Bus của hệ thống.
ðể có thể hiển thị một cách thuận tiện, linh hoạt các thông số của hệ thống
ñồng thời ñảm bảo ñược tính mỹ thuật, ta chọn màn hình tinh thể lỏng LCD 20x4.
ðây là loại màn tinh thể lỏng gồm có 4 dòng, mỗi dòng có thể hiển thị 20 ký tự, rất
tiện cho người sử dụng trong khi làm việc với KIT.
VCC
VCC
5k
GND VRLCD1
J2_LCD
GND 1
VCC 2
Tin hieu dieu khien 3
4
5
LCD 20 x 4
6
7 PB0 7
7 PB1 8
7 PB2 9
7 PB3 10
7 PB4 11
7 PB5 12
7 PB6 13
DATA BUS 7 PB7 14
15
GND 16
150 RLCD1
VCC
VCC
96
LCD 20x4 có 3 chân ñiều khiển và 8 chân dữ liệu, 3 chân ñiều khiển là RS, R/W, E.
Chân E: ðược gọi là chân “Enable”. Chân này cho phép gửi dữ liệu vào LCD
hay không. ðể có thể gửi dữ liệu vào LCD, ñầu tiên chân này phải ñược ñưa lên
“1”. Sau khi thực hiện xong các lệnh, chân này phải ñưa xuống “0” ñể báo cho biết
rằng LCD ñã thực hiện lệnh và ñang chờ lệnh tiếp theo.
Chân RS: “Register Select”. Khi chân này ở mức “0”, LCD sẽ biết rằng các
dữ liệu truyền ñến nó dùng ñể ñiều khiển như các lệnh xóa màn hình, ñặt vị trí con
trỏ.... Nếu RS ở mức “1” các dữ liệu truyền ñến LCD ñược nó hiểu là các dữ liệu
dạng ký tự cần hiển thị.
Chân R/W: Là chân “Read/Write”. ðể có thể ghi dữ liệu lên LCD, chân này
phải ở mức “0”. Còn ñể ñọc dữ liệu từ LCD thì chân này phải ở mức “1”. Tuy nhiên
trong LCD chỉ có một lệnh ñọc dữ liệu từ LCD, ñó chính là lệnh lấy trạng thái của
LCD ñể báo cho biết nó ñang bận hay không. Chính vì vậy chân này hầu như chỉ ở
mức tín hiệu “0”.
Mỗi lần thực hiện một lệnh, LCD phải mất một khoảng thời gian ñể hoàn tất
việc này. Chính vì vậy khi ra lệnh thực hiện cho LCD, ta phải trễ một khoảng thời
gian. Sau ñó mới ñược thực hiện lệnh tiếp theo. Tuy nhiên phương pháp trễ không
ñược ổn dịnh và chính xác khi tần số thạch anh thay ñổi, còn một phương pháp nữa
là phương pháp kiểm tra LCD ñã sẵn sàng nhận dữ liệu hay chưa bằng cách kiểm tra
bit có trọng số cao nhất D7 - của thanh ghi lệnh (lưu ý là thanh ghi lệnh, tức khi RS
= 0), khi bit này xuống 0 báo hiệu LCD ñã sẵn sàng nhận lệnh tiếp theo. Phương
pháp này có ưu ñiểm là làm việc ổn ñịnh, ñồng bộ và không phải mất thời gian trễ
dư ra không cần thiết.
97
ðể cho LCD có thể hoạt ñộng, ñầu tiên ta phải khởi tạo LCD, báo cho nó biết
số hàng, số ký tự hiển thị trên một hàng. Các dữ liệu ñiều khiển lần lượt ñược
chuyển vào Data Bus của LCD là 38H, 0EH, và 06H. Sau các lệnh khởi tạo LCD
này ta mới có thể hiển thị ký tự lên trên màn hình LCD.
Việc xóa màn hình, ñưa con trỏ về góc trên bên trái có thể thực hiện ñược bằng
các chuyển dữ liệu ñiều khiển 01H vào Data Bus của LCD.
Các thao tác lập trình với LCD sẽ ñược bàn kỹ trong phần xây dựng các bài thí
nghiệm cho KIT.
Mã Lệnh ñến thanh ghi của Mã Lệnh ñến thanh ghi của
(Hexa) LCD (Hexa) LCD
1 Xóa màn hình hiển thị E Bật hiển thị, nhấp nháy con trỏ
2 Trở về ñầu dòng F Tắt con trỏ, nhấp nháy con trỏ
4 Dịch con trỏ sang trái 10 Dịch vị trí con trỏ sang trái
5 Dịch con trỏ sang phải 14 Dịch vị trí con trỏ sang phải
6 Dịch hiển thị sang phải 18 Dịch toàn bộ hiển thị sang trái
7 Dịch hiển thị sang trái 1C Dịch toàn bộ hiển thị sang phải
8 Tắt con trỏ, tắt hiển thị 80 ðưa con trỏ về ñầu dòng thứ nhất (*)
A Tắt hiển thị, bật con trỏ C0 ðưa con trỏ về ñầu dòng thứ hai (*)
C Bật hiển thị, tắt con trỏ 38 Hai dòng và ma trận 5x7
(*) ðịa chỉ của các dòng cụ thể của LCD như sau
Cụ thể, ví dụ ta muốn in kí tự 'A' lên dòng 2 của nữa màn hình 2 (dưới) của
LCD, ta thực hiện:
- ðặt E = 0
98
- Gửi mã lệnh ra LCD: MOV LCD_DATA_PORT, #DONG2
7. Vi mạch 8255
Vi mạch 8255 là một vi mạch chuyên dụng của hãng Intel dùng ñể mở rộng
thêm các cổng giao tiếp cho các vi ñiều khiển cũng như các vi ñiều khiển. Nó ñược
sử dụng rất rộng rãi trong các ứng dụng ñiều khiển bởi tính linh hoạt và ñộ ổn ñịnh
hoạt ñộng. Chip có 3 cổng A, B, C ñược truy cập riêng biệt. Các cổng này ñều có
khả năng lập trình làm cổng vào hoặc ra ñộc lập. Ngoài ra các cổng của 8255 còn có
khả năng bắt tay, do vậy, cho phép giao diện với các thiết bị khác cũng có tín hiệu
bắt tay, ví dụ như máy in.
- PA0 - PA7, PB0-PB7: Cả 8 bit của cổng A, B có thể ñược lập trình thành 8
bit vào, 8 bit ra, hoặc cả 8 bit 2 chiều vào/ra.
- PC0 - PC7: Tất cả các bit của cổng C ñều có thể ñược lập trình thành các bit
vào hoặc các bit ra. 8 bit này cũng có thể ñược chia làm 2 phần: Phần cao (PC4-
PC7) là CU (Uppers bits) và phần thấp (PC0 - PC3) là CL (Lower Bits). Mỗi phần
có thể ñược sử dụng ñộc lập làm ñầu vào hoặc ra. Ngoài ra, từng bit của cổng C từ
PC0 - PC7 cũng có thể ñược lập trình riêng rẽ.
- D0÷
÷D7: Các chân dữ liệu D0-D7 của 8255 ñược nối tới các chân dữ liệu của
bộ vi ñiều khiển ñể cho phép trao ñổi dữ liệu giữa chúng.
- RD, WR: Là hai tín hiệu ñiều khiển tích cực mức thấp và là các chân vào
của 8255. Các chân tín hiệu của /RD /WR của 8031/51 ñược nối ñến các chân này.
99
- RESET: Là tín hiệu vào tích cực mức cao ñược dùng ñể xóa thanh ghi ñiều
khiển. Khi chân RESET ñược kích hoạt thì tất cả các cổng ñược khởi ñộng lại làm
các cổng vào. Trong nhiều thiết kế thì chân này ñược nối tới ñầu ra RESET của bus
hệ thống hoặc ñược nối ñất ñể không bị kích hoạt. Cũng như tất cả các chân vào của
IC, chân này cũng có thể ñể hở.
- A0, A1, /CS: /CS là chân chọn chip, còn A0, A1 cho phép chọn cổng. Các
chân này ñược dùng ñể truy cập các cổng A, B, C hoặc thanh ghi ñiều khiển như
trình bày ở bảng sau:
Bảng 2.7- Bảng chọn cổng của 8255
0 0 0 Cổng A
0 0 1 Cổng B
0 1 0 Cổng C
Các cổng A, B, C của 8255 ñược dùng ñể nhập xuất dữ liệu, còn thanh ghi
ñiều khiển thì ñược lập trình ñể chọn chế ñộ làm việc cho các cổng này. Các cổng
của 8255 ñược lập trình theo các chế ñộ sau:
- Chế ñộ 0 (Mode 0): ðây là chế ñộ vào/ra ñơn giản ở chế ñộ này, các cổng A,
B, CL, CU có thể ñược lập trình làm ñầu vào hoặc ñầu ra. Nên nhấn mạnh rằng, ở
chế ñộ 0 thì tất cả các bit hoặc làm ñầu vào, hoặc làm ñầu ra mà không thể ñiều
khiển riêng rẽ từng bit như các cổng P0- P3 của 8051. Vì các ứng dụng liên quan
ñến 8255 chủ yếu sử dụng chế ñộ này và KIT cũng chỉ sử dụng chế ñộ này nên
chúng ta sẽ tìm hiểu kỹ hơn.
- Chế ñộ 1 (Mode 1): Ở chế ñộ này, cổng A ,B có thể dùng làm cổng vào/ ra
hai chiều với khả năng bắt tay. Tín hiệu bắt tay ñược cấp bởi các bit của cổng C.
100
- Chế ñộ 2 (Mode 2): Ở chế ñộ này, cổng A có thể ñược dùng làm cổng vào/ra
hai chiều với khả năng bắt tay, tín hiệu bắt tay ñược cấp bởi các bit cổng C. Cổng B
có thể ñược dùng như ở chế ñộ vào/ ra ñơn giản hoặc ở chế ñộ bắt tay Mode 1.
- Chế ñộ BSR: ðây là chế ñộ thiết lập / xóa bit (Bit Set/Reset). Ở chế ñộ này
chỉ có những bit riêng rẽ của cổng C có thể lập trình ñược.
8. ADC0809
ADC0809 là vi mạch chuyển ñổi tín hiệu từ tương tự sang số 8 bit. Vi mạch
này ñược chế tạo theo công nghệ CMOS. Bộ chuyển ñổi tương tự số này sử dụng
phương pháp chuyển ñổi xấp xỉ. Sai số của phép chuyển ñổi là 1 bit. Tuy nhiên do
yêu cầu về ñộ chính xác của tín hiệu trong bộ KIT không quá cao nên sai số như
trên là chấp nhận ñược. Sau ñây là một vài ñặc ñiểm của vi mạch ADC0809:
- Nguồn nuôi 5V. Dải tín hiệu lối vào tương tự 5V khi nguồn nuôi là +5V. Có
thể mở rộng thang ño bằng các giải pháp kỹ thuật cho từng mạch cụ thể.
- Dễ dàng giao tiếp với vi ñiều khiển vì ñầu ra có bộ ñệm 3 trạng thái nên có
thể ghép trực tiếp vào kênh dữ liệu của hệ vi ñiều khiển.
- Thời gian chuyển ñổi phụ thuộc vào tần số ñồng hồ cấp vào chân CLK. Với
cấu tạo mạch trên ta có xung cấp vào chân CLK là 1MHz và tốc ñộ chuyển ñổi sẽ là
181µs.
- ðảm bảo sai số tuyến tính trong dải nhiệt ñộ từ – 400C ÷ 85OC.
- ALE: Chân tín hiệu cho phép chốt số liệu ñầu vào.
Hoạt ñộng của ADC0809: ðầu tiên ta phát tín hiệu vào 3 chân A, B, C ñể chọn
cổng vào tương tự. ðể bắt ñầu cho ADC0809 hoạt ñộng, ta phát xung vào chân
Start. Tiếp tục phát xung ALE ñể chốt dữ liệu tương tự ñầu vào. Sau khi quá trình
chuyển ñổi tương tự - số ñã diễn ra xong. ADC0809 sẽ tự phát ra một xung trên
chân EOC ñể báo cho biết ñã kết thúc quá trình chuyển ñổi. ðể dữ liệu ñược ñưa ra
các chân D0 ÷ D7, ta phát một xung vào chân OE của ADC0809, bây giờ có thể ñọc
dữ liệu ñược.
Trong mạch nguyên lý của khối vào/ra ADC - DAC, ADC0809 ñược ñiều
khiển bởi 2 cổng của 8255. Cổng PA của 8255 ñược nối với các chân ra số của
ADC, còn việc phát xung ñiều khiển ADC ñược thực hiện bởi 4 bit thấp của cổng
PC.
9. 74LS93
ðây là bộ ñếm chia ñôi cung cấp xung nhịp cho ADC0809 bằng cánh: Lấy
xung từ chân ALE(30) của AT89S8252 rồi ñược chia 2 bởi bộ ñếm 74LS93. Nếu
tần số thạch anh của AT89S8252 là 12MHz thì xung trên ñầu ra ALE là 2MHz và
xung nhịp của ADC0809 là 1MHz.
102
Hình thực tế và sơ ñồ chân của IC74LS93
10 .DAC0808
DAC0808 là vi mạch chuyển ñổi tín hiệu từ số sang tương tự có ñộ chính xác
8 bit. Tín hiệu tương tự là dòng (Iout) và nếu nối ñiện trở tới chân Iout thì kết quả sẽ
ñược chuyển thành ñiện áp. Dòng tổng ñược cấp bởi chân Iout là một hàm số nhị
phân của các ñầu vào D0 – D7 của DAC0808 và ñược tính theo Iref như sau:
D7 D6 D5 D 4 D3 D 2 D1 D0
I OUT = I REF + + + + + + +
2 4 8 16 32 64 128 256
Dòng ñầu vào IREF phải ñược áp vào chân 14. Dòng IREF thường ñạt giá trị
2mA. Nếu IREF = 2mA, còn tất cả ñầu vào nối với mức cao thì dòng ñiện cực ñại ở
ñầu ra là 1.99mA.
Nếu nối ñiện trở tới chân IOUT thì dòng ñược chuyển thành ñiện áp và có thể
kiểm tra ñầu ra bằng máy hiện sóng. Tuy nhiên, như vậy sẽ làm giảm ñộ chính xác
do bị thay ñổi trở kháng vào của tải. Vì vậy dòng IREF cần ñược cách ly bằng cách
dùng khuyếch ñại thuật toán, ví dụ như HA17741 với ñiện trở hồi tiếp Rf = 5 K.
VCC
R26 C27.3
C27.2 GND
C26 C27.1
470uF
33nF 22K 100nF 100nF
GND GND
GND
U27
12
J27
9
STEP MOTOR
1
15
L298
1 8
3
L297
D30 D31 D32 D33
11
13
14
GND
R27.1 R27.2
0.5 0.5
GND GND
STEPPER MOTOR
104
ðộng cơ bước thực hiện việc chuyển các xung ñiện thành các bước quay mịn
của motor. Do có sự tương ứng 1-1 giữa xung ñiện ñiều khiển và bước quay của
motor nên ñộng cơ bước có ñộ chính xác dịch chuyển cao. Vì vậy ñộng cơ bước
thường ñược sử dụng trong các thiết bị toạ ñộ chính xác như cánh tay robot, máy in,
máy vẽ, thiết bị khoa học...Nguyên lý hoạt ñộng và cấu tạo của ñộng cơ bước ñược
trình bày như sau:
Như hình vẽ trên là loại ñộng cơ bước loại nam châm vĩnh cửu. Roto làm bằng
nam châm vĩnh cửu còn các cuộn dây ñược quấn trên stato. Bước góc của rôto là 900
. ðộng cơ có 4 cực ñược ñặt ở vị trí ñối diện nhau từng cặp một, gồm X , X và
Y , Y . Tuỳ thuộc vào chiều dòng ñiện chạy qua các cuộn dây mà từ trường của stato
Việc thay ñổi thứ tự chiều dòng ñiện chạy qua các cuộn dây theo một trình tự
nhất ñịnh sẽ ñiều khiển ñược ñộng cơ chạy thuận hay chạy ngược như mong muốn.
Và tốc ñộ của ñộng cơ có thể ñược ñiều chỉnh bằng khoảng thời gian trễ giữa hai lần
thay ñổi thứ tự chiều dòng ñiện.
105
Trong mạch nguyên lý có một header 4 ñầu ra ñể ñiều khiển ñộng cơ bước
(Stepper motor). Loại ñộng cơ bước ñược lắp ñặt trên bộ KIT là ñộng cơ bước có
ñiện áp nguồn cấp là 5V và ñộ phân giải là 200, tức là với mỗi nhịp ñiều khiển,
motor bước sẽ quay một góc = 3600/200 = 1,80.
12. L297-L298
Vi mạch L297 tích hợp tất cả các mạch ñiện tử cần thiết ñể ñiều khiển ñộng
cơ bước lưỡng cực và ñơn cực. Sử dụng cùng với cầu công suất kép như L298 tạo ra
một bộ ghép hoàn chỉnh giửa bộ vi xử lý và ñộng cơ bước kiểu lưỡng cực. ðộng cơ
bước kiểu ñơn cực cũng có thể ñiều khiển ñược bằng L297 cộng với 4 cụm công
suất mắc kiểu ðalingtơn.
ðối với ñộng cơ lưỡng cực có dòng ñiện pha không quá 2A thì nên sử dụng
L297 ñồng bộ với L298N, nếu dòng ñiện dưới 1A thì tốt hơn hết là sử dụng L293E
(L293E sẽ rất có lợi khi không cần ñiều khiển ñộ rộng xung). Khi cần dòng ñiện lớn
hơn thì sử dụng bóng bán dẫn công suất hoặc các cặp ðalingtơn. ðối với ñộng cơ
ñơn cực, dãy ðalingtơn như kiểu DLN2075B là phù hợp.
Việc ñiều khiển tốc ñộ ñộng cơ bước phụ thuộc vào tần số phát xung vào chân 18
của vi mạch L297.
106
- Chân 17 dùng ñể chọn chiều quay cho ñộng cơ.
- Chân 10 nối với ñiện áp tham chiếu. Ta có thể nối với +VCC.
Các ñiện trở RS1 và RS2 là các ñiện trở công suất có gái trị 0,5 Omh.
ON/OFF DC MOTOR
IRF9510/TO
RQ1 RQ2
4.7K 4.7K
J4_DC S S
1
2
3
DC1
DC2
P1.0
G Q1 Q2 G
4
D
GND D
D
D
G IRF510/TO G
S Q3 Q4 S
RQ5 R29
P1.1 TL9 TL10 P1.2
107
Sơ ñồ chân IRF 9510/IRF 510
Là một bảng 64 ñiểm LED bố trí theo kiểu ma trận 8 hàng x 8 cột, tại mỗi
ñiểm 2 LED xanh và ñỏ ñấu chung Anôt, mỗi hàng gồm 8 ñiểm cũng ñấu chung
Anôt với nhau. Như vậy ma trận LED có 24 chân: 8 chân Anôt chung, 8 chân ñiều
khiển ñèn xanh và 8 chân ñiều khiển ñèn ñỏ.
ðể có thể hiển thị ñược các số liệu lên LED 7 thanh, ta cần vi mạch giải mã
7447. Vi mạch này có nhiệm vụ chuyển ñổi dữ liệu ñầu vào từ các chân D0 ÷ D3
thành các tín hiệu ñưa ñến các thanh của LED.
108
U3
7 13
1 D0 A 12
2 D1 B 11
6 D2 C 10
D3 D 9
3 E 15
5 LT F 14
RBI G
4
BI/RBO
7447
LED 7 thanh
U5
7
6 a
4 b
2 c
1 d
9 e
10 f
5 g
pt
7 Segs LED
Dòng tiêu thụ của ñèn khá lớn, mỗi ñèn có dòng khoảng 100mA. Chính vì vậy
ta cần có ñiện trở giới hạn dòng giữa vi mạch giải mã 7447 và LED.
109