You are on page 1of 81

Trình bày kiến trúc & nguyên lý hoạt động của máy tính theo Von Newmann.

Số ô nhớ tối đa
trên thành ghi
Kiến trúc CPU Memory
Clock [A0÷A15]
Address bus 0000 H
OSC PC MAR ROM

Bộ tạo dao động, xung Regis


Không ghi được,
nhịp càng nhanh thì thay đổi “0”, “1”
Data bus Lưu chương trình cố
thực hiện chương trình bằng cầu chì
càng nhanh nhưng vẫn định, chỉ để đọc
bị giới hạn FFFF H
ACC MDR IAR
Bởi vì PC có trễ truyền Control bus RAM
đạt, không phải tần số ALU DEC Chứa dữ liệu tạm
nào cũng chạy được →
thời
muốn giảm trễ thì do
công nghệ chế tạo
OSC thường là 12MHz, nếu tăng lên 120MHz → thời gian không đáp ứng vì thời gian có
trễ → khắc phục thay đổi công nghệ chế tạo bóng bán dẫn,
黎海潮
• 1 bit trong ROM thể hiện là 1 hoặc 0 (đóng/ngắt cầu chì).
• RAM có cấu trúc là D-FF.
• Nhà sản xuất đã thiết kế ROM từ đầu, không thể thay đổi được → bộ nhớ chỉ đọc.
• Ngoài ghép nối với Memory, CPU còn kết nối với các thành phần khác như TIMER, ADC → đó là VĐK.
• ADDRESS BUS [A0 – A15] → số ô nhớ của Memory (CPU → Memory).
(1 ô nhớ = 1 byte) với VXL 8 bit (0000H …….. FFFFH).
• DATA BUS: số đường dữ liệu chính là đại lượng cho ta biết số bit trong 1 ô nhớ.
• CONTROL BUS: phải có ít nhất 2 đường tín hiệu là Input và Output (I/O). (Đọc/Ghi)
• CPU: + Muốn đem địa chỉ lên BUS thì cần thanh ghi MAR (Memory Address Registor - thanh ghi địa chỉ bộ nhớ).
+ PC là bộ đếm, đưa giá trị ra MAR, MAR chốt lại giá trị đó, đưa lên bus, trỏ đến Memory (ROM) có địa chỉ tương
ứng với MAR.
+ Dữ liệu từ Memory về có 2 dạng (ở ROM hoặc ở RAM).
+ Dữ liệu từ ROM → thanh ghi (IR) (mỗi lần chứa 1 ô nhớ của chương trinh – 1byte) → DEC (bộ giải mã lệnh)
giải mã nội dung trong IR, một mã lệnh chương trình tương ứng với đầu ra của bộ giải mã (tín hiệu) để quyết
định công việc tiếp theo.
+ Mỗi VXL có 1 tập lệnh hữu hạn → liên quan đến DATA BUS (VD: có 8 đường DATA BUS → có 2
• IR: Thanh ghi lệnh, chứa mã lệnh ô nhớ của chương trình
黎海潮
• MDR (Memory Data Registor): là thanh ghi chữa dữ liệu bộ nhớ. Nếu dữ liệu liên quan đến phép toán thì từ MDR
đưa vào bộ ALU.
• Trong VXL có 1 thanh ghi nổi bật là ACC, liên kết trực tiếp với ALU.
• Nội dung trong ROM được truy xuất tuần tự (Các lệnh được thực hiện tuần tự).
• Các thanh ghi, ô nhớ, ngoại vi được truy xuất theo địa chỉ.
Nguyên lý hoạt động
• Dữ liệu (data) cùng với lệnh (instruction) được dùng để xử lý dữ liệu đó, có thể được lưu trữ trên cùng 1 vùng nhớ
của máy tính. Khi khối điều khiển bắt đầu gọi 1 lệnh xử lý, nó sẽ gọi tới PC để trỏ tới địa chỉ của lệnh trong bộ nhớ,
rồi lệnh này sẽ được nạp và thực thi bởi VXL. Địa chỉ của dữ liệu cần xử lý được chứa trong chính lệnh cần thực thi.
Đang lúc tìm nạp và thực thi lệnh, PC sẽ tăng lên để trỏ tới lệnh tiếp theo cần thực thi. Qúa trình này là tuần tự - các
lệnh thực thi một cách tuần tự, tại mỗi thời điểm chỉ có 01 lệnh được thực thi.
• + Luôn hoạt động theo nguyên tắc địa chỉ, khi CPU cần trao đổi thông tin với Memory hay các Port đều thông qua
địa chỉ của nó.
+ CPU thực hiện lệnh một cách tuần tự.
+ Để thực hiện các lệnh rẽ nhánh có điều kiện, phải căn cứ vào cờ nhảy (flag).
Kiến trúc Harvard có điểm khác Von Newmann:
• Có thể truy xuất đồng thời 2 bộ nhớ ROM & RAM còn Von truy xuất lần lượt.
• Thực hiện lệnh nhanh hơn, ưu điểm về hiệu suất nhưng phức tạp về phần cứng.
• Trong Harvad, đường ADDRESS trong RAM ít hơn và ROM nhiều hơn. Pipeline (đường ống)

黎海潮
Bằng cách nào CPU có thể truy nhập tới các phần tử khác nhau thông qua các địa chỉ khác nhau:

Các địa chỉ được biên dịch sang mã máy, được truyền dẫn thông qua bus địa chỉ và nhờ 1 hệ thống mạch logic tổ hợp
làm hệ thống giải mã địa chỉ mà xác định đường đến phần tử tương ứng.

Các lệnh khi đưa vào sẽ qua bộ giải mã (thuộc BIU - Bus Interface Unit: Đơn vị giao tiếp bus) để decode sang mã máy, từ
đó qua data bus đi vào stack. CPU sẽ phát tín hiệu điều khiển đến khối giải mã, từ địa chỉ của lệnh nằm trong stack được
xác định bởi 2 thanh ghi CS:IP để đọc lệnh từ stack. Lệnh được đọc sẽ qua bus dữ liệu đưa vào ALU để thực thi.

Nêu cơ chế mà nhờ đó CPU có thể thực hiện lệnh một cách tuần tự:

Là nhờ bộ đếm chương trình PC. Thanh ghi PC chứa địa chỉ của ô nhớ có nội dung là mã lệnh tiếp theo sẽ được thực
hiện. Khi CPU tìm được mã lệnh thứ n thì PC tự động tăng lên 1 để trỏ vào ô nhớ chứa mã lệnh n+1.

Nêu vai trò của bộ nhớ và CPU trong hệ:

- CPU gồm 3 phần: CU (đơn vị điều khiển, đọc, giải mã, thực hiện lệnh), ALU (khối xử lý toán học & logic) và thanh ghi
(nơi lưu trữ dữ liệu tạm thời). Thực hiện 2 thao tác: tìm nạp lệnh và thực thi lệnh.

- Bộ nhớ lưu chương trình và dữ liệu, chứa các lệnh. Trong cấu trúc Von neuman thì bộ nhớ dữ liệu và bộ nhớ chương trình
có chung không gian nhớ.

黎海潮
Nguyên lý mà nhờ đó CPU có thể thực hiện rẽ nhánh có điều kiện: Vì sao CPU có thể truy cập theo địa chỉ:
Đầu tiên vi xử lý sẽ kiểm tra điều kiện. Nếu điều kiện không thỏa mãn CPU có thể truy nhập theo địa chỉ vì dữ
thì PC tăng lên 1 và thực hiện lệnh tiếp theo. Nếu điều kiện thỏa mãn liệu, chương trình và các IO đều chia sẻ
thì chương trình sẽ nhảy đến nhãn. Lệnh rẽ nhánh có điều kiện xác chung 1 không gian địa chỉ và được đánh
định địa chỉ đích bằng cách định địa chỉ tương đối, tức là xác định địa địa chỉ cụ thể. Nhờ bộ giải mã địa chỉ, CPU
chỉ đích trừ địa chỉ hiện tại được bao nhiêu cộng vào PC. Giới hạn có thể truy nhập đến ô nhớ hay I/O có địa
khoảng cách nhảy từ -128 đến +127 byte kể từ lệnh sau lệnh nhảy có chỉ mong muốn thông qua D_bus.
điều kiện.

Bạn hiểu thế nào khi CPU truy nhập vào ra như 1 ô nhớ hay truy nhập ô nhớ nhờ cổng vào ra:

+ CPU truy nhập cổng vào ra như 1 ô nhớ là: Khi đó các ô nhớ và các cổng vào ra sử dụng chung 1 bộ giải mã địa chỉ
do đó khi CPU truy nhập cổng vào ra thì các cổng vào ra này có địa chỉ như là các ô nhớ, mà theo nguyên lí Von
Neuman thì CPU trao đổi dữ liệu theo nguyên tắc địa chỉ, do đó CPU truy nhập cổng vào ra cũng như là các ô nhớ.

+ Khi truy nhập ô nhớ nhờ cổng vào ra thì lúc này sẽ có 2 bộ giải mã địa chỉ, 1 bộ giải mã địa chỉ cho các ô nhớ, 1 bộ
giải mã địa chỉ cho các Port

黎海潮
Mô tả chi tiết hoạt động thực hiện 1 lệnh của CPU
Gồm 3 bước
• Bước 1: Đọc lệnh
- PC → MAR đặt ADDRESS BUS → trỏ đến ô nhớ trên ROM có địa chỉ tương ứng với MAR (ô nhớ chứa mã
lệnh)
(PC có thể thay đổi được)
- Tín hiệu Read trên CONTROL BUS sẽ tích cực, mã lệnh sẽ được đưa về qua DATA BUS đến thanh ghi IR.
PC++
- VD: PC truy xuất đến ô nhớ chữa mã lệnh 31H (ban đầu PC = 02) → 31H được tuyền qua DATA_BUS sang
IR ở CPU thì lúc đó PC++
• Bước 2: Giải mã lệnh
- Mã lệnh trong thanh ghi IR được đưa vào bộ giải mã lệnh DEC, đầu ra là những giá trị nhị phân (tín hiệu
điều khiển) tương ứng với mã lệnh đầu vào
• Bước 3: Thực hiện lệnh
- Tùy vào tập tín hiệu điều khiển sau khi ra khỏi DEC thì CPU làm công việc tương ứng với mã lệnh đầu
vào.
- VD: MOV A,#50H. Sau khi giải mã lệnh PC=03 → giá trị 50H không chuyển vào DEC và ADDRESS mà
chuyển vào MDR.

Địa chỉ bộ nhớ đánh từ 0000H đến FFFFH, riêng RAM lại đánh địa chỉ từ 00H đến FFH.
黎海潮
→ FF00H thì FF là địa chỉ tuyệt đối còn 00 là địa chỉ tương đối.
F D E F D E F D E CISC Muốn nhiều luồng hơn thì chia nhỏ thời gian thực hiện lệnh ra

ReadDeco Thực Thời gian E


der hiện khác nhau
Có thể áp dụng kỹ
F D E F thuật đường ống
Thời gian E gần
bằng nhau
F D E
Kỹ thuật đường ống áp
RISC
dụng khi thời gian thực
hiện lệnh giống nhau
F D
Áp dụng cho kiến
trúc Harvard

RISC không có lệnh nhân, phức tạp, chỉ có lệnh đơn giản mới có đường ống.

黎海潮
Minh họa truy nhập trực tiếp MOV R0, 50H (50H là địa chỉ ô nhớ trong RAM)
(lấy nội dung của ô nhớ 50 (địa chỉ là 50H) trong RAM, cấp vào thanh ghi R0)
• Encoding: 1 0 1 0 1 r r r (dành cho từ R0 đến R7) (4 bit cao là mã lệnh, 4 bit thấp là địa chỉ/toán hạng)
• Lệnh này: chiếm 2 byte (1 byte là byte lệnh, 1 byte nội dung), thời gian thực hiện là 2 chu kỳ
• Nội dung: Lấy ô nhớ 50H ở RAM để truy xuất.
Chi tiết:
• Đầu tiên con trỏ PC sẽ có nội dung là địa chỉ ô nhớ chứa mã lệnh của lệnh MOV R0, Addr là A8, con trỏ PC sẽ thông qua
mạch giải mã địa chỉ để đưa đến ô nhớ có nội dung là A8 (ở đây mình ví dụ là ô nhớ 15).
• Nội dung của ô nhớ đó (A8) được đưa vào bộ nhớ đệm Buffer. CPU gửi tín hiệu OE cho phép dữ liệu đi từ Buffer đi vào
thanh ghi lệnh IR và bộ giải mã lệnh DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã và biết lệnh này là 2 byte, có tác dụng là chuyển nội dung ở ô nhớ 50H vào thanh
ghi R0 (Có thể tra các điều này trong tập lệnh của MCS- 51).
• Do lệnh này 2 byte nên nó sẽ chờ byte tiếp theo. Lúc này con trỏ PC tăng lên 1, nhờ mạch giải mã địa chỉ trỏ đến ô nhớ
tiếp theo (ô nhớ 16). Tại ô nhớ này sẽ có nội dung là 50H.
• Dữ liệu từ ô nhớ đó (ô số 16) sẽ được đưa vào bộ buffer, sau đó khi có tín hiệu OE sẽ được đưa lên D_bus và đi vào khối
MAR.
• Dữ liệu từ khối MAR (ở đây là 50H) sẽ lại được đưa vào bộ giải mã địa chỉ DEC để trỏ đến ô nhớ 50H.
• Dữ liệu từ ô 50H sẽ lại được đưa xuống Buffer đưa lên D_bus và sau đó sẽ được di chuyển vào thanh ghi R0.
黎海潮
Minh họa trường hợp đọc toán hạng ở chế độ gián tiếp qua thanh ghi (ADD A, @R0)
• Mã lệnh: 0 0 1 0 0 1 1 i (chỉ R0 và R1)
• Lệnh này chiếm 1 byte, thời gian thực hiện lệnh là 01 chu kỳ máy.
• Nội dung: Cộng nội dung của ô nhớ có địa chỉ chứa trong thanh ghi Ri với thanh ghi A. Kết quả lưu
trữ trên thanh ghi A.
• Đầu tiên con trỏ PC có nội dung là ô nhớ chứa mã lệnh này (mã lệnh này là 26H). Con trỏ PC sẽ thông
qua mạch giải mã địa chỉ trỏ đến ô nhớ chứa nội dung 26H.
• Dữ liệu này sẽ được đưa xuống bộ nhớ đệm Buffer, sau đó CPU sẽ thông qua CONTROL BUS truyền
tín hiệu OE cho phép dữ liệu đi từ Buffer qua DATA BUS về thanh ghi lệnh IR và vào bộ giải mã lệnh
DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã lệnh (26H) và biết rằng lệnh này 1 byte, thực hiện nhiệm vụ
cộng nội dung của ngăn nhớ RAM, có địa chỉ được cất trong R0 vào thanh ghi A.
(Ví dụ: Thanh ghi R0 có nội dung là A1 và ô nhớ A1 có nội dung là 12H thì lệnh này có tác dụng cộng
nội dung của ô nhớ A1 hay cộng 12H vào thanh ghi A, kết quả cất ở thanh ghi A)
• Tiếp theo nó sẽ lấy nội dung của thanh ghi R0 đi qua MAR và được đưa vào bộ giải mã địa chỉ. Bộ giải
mã địa chỉ sẽ trỏ đến ô nhớ có địa chỉ là nội dung thanh ghi R0 và đưa dữ liệu ô nhớ đó vào Buffer.
CPU lại đưa tín hiệu OE để cho phép dữ liệu từ Buffer lên DATA BUS đi vào OP2 của khối ALU. Nội
dung thanh ghi A sẽ được đưa vào OP1.
• Khối ALU sẽ thực hiện phép cộng OP1 và OP2 sau đó kết quả được đưa trả về thanh ghi A.
黎海潮
Minh họa trường hợp đọc toán hạng ở chế độ tức thì (MOV A,#50H)
• Mã lệnh: 0111 0 1 0 0
• Lệnh này chiếm 2 byte, thời gian thực hiện lệnh là 1 chu kỳ máy.
• Nội dung: Nạp giá trị 50H vào thanh ghi A.
Mô tả:
• Đầu tiên con trỏ PC sẽ có nội dung là địa chỉ ô nhớ chứa mã lệnh lệnh 74H, con trỏ PC sẽ thông qua
mạch giải mã địa chỉ để đưa đến ô nhớ có nội dung là 74H
• Nội dung của ô nhớ đó (74H) được đưa vào bộ nhớ đệm Buffer. CPU gửi tín hiệu OE cho phép dữ liệu
đi từ Buffer đi vào thanh ghi lệnh IR và bộ giải mã lệnh DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã và biết lệnh này là 2 byte, có tác dụng là chuyển giá trị 50H vào
thanh ghi A .
• Do lệnh này 2 byte nên nó sẽ chờ byte tiếp theo. Lúc này con trỏ PC tăng lên 1, nhờ bộ giải mã địa chỉ
để thiết lập giá trị cho thanh ghi A là 50H
• Dữ liệu sẽ được đưa vào bộ buffer, sau đó khi có tín hiệu OE sẽ được đưa lên D_bus và di chuyển vào
thanh ghi A
• Lưu ý: Ở đây lệnh này là 2 byte, bộ giải mã lệnh DEC sẽ không biết được đâu là mã lệnh (74H) và đâu
là dữ liệu (50H) nó chỉ có thể phân biệt nhờ thứ tự. Nghĩa là 74H đến trước thì nó là mã lệnh và nó có
2 byte nên cái tiếp theo sẽ là nội dung thực hiện lệnh để phân biệt với mã lệnh 50H

黎海潮
Minh hoạ trường hợp đọc toán hạng ở chế độ thanh ghi (SUBB A,R7)
• Encoding: 1 0 0 1 1 r r r (1 0 0 1 1 1 1 1)
• Lệnh này chiếm 1 byte, thời gian thực hiện lệnh là 1 chu kỳ máy.
• Nội dung: Lấy giá trị thanh ghi A trừ đi thanh ghi R7 và trừ cho cờ Carry, kết quả lưu trong thanh ghi A.
Mô tả:
• Đầu tiên con trỏ PC có nội dung là ô nhớ chứa mã lệnh này (mã lệnh này là 9FH). Con trỏ PC sẽ thông qua
mạch giải mã địa chỉ trỏ đến ô nhớ chứa nội dung 9FH(10011111)
• Dữ liệu này sẽ được đưa xuống bộ nhớ đệm Buffer, sau đó CPU sẽ thông qua CONTROL BUS truyền tín
hiệu OE cho phép dữ liệu đi từ Buffer qua DATA BUS về thanh ghi lệnh IR và vào bộ giải mã lệnh DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã lệnh (9FH) và biết rằng lệnh này 1 byte, thực hiện nhiệm vụ trừ nội
dung của thanh ghi A cho thanh ghi R7
• CPU lại đưa tín hiệu OE để cho phép nội dung thanh ghi R7 từ Buffer lên DATA BUS đi vào OP2 của khối
ALU. Nội dung thanh ghi A sẽ được đưa vào OP1 và truy xuất vào bit PSW.7 lưu cờ nhớ C của thanh ghi
PSW
• Khối ALU sẽ thực hiện phép trừ OP1 cho OP2 và trừ đi cờ C lưu trong thanh ghi PSW sau đó kết quả
được đưa trả về thanh ghi A.

黎海潮
Nêu cơ chế ngắt trong hệ vi xử lý, mục đích ?

Ngắt là sự kiện xảy ra trong quá trinh thực hiện chương trình VXL, yêu cầu là
VXL dừng lại việc đang làm và thực hiện lập tức lệnh đó.
‘’1’’
[C ] Cờ báo ngắt (D-FF) kết nối trực tiếp với CPU (là 01 bit)
D
Q
INT 1 C CPU VXL có nhiều nguồn, loại báo ngắt, tổng hợp vào thanh ghi

Reset Khi có sự ngắt xảy ra thì sẽ báo cho CPU

Về mặt thực hiện lệnh, có 1 khoảng thời gian để CPU kiểm tra cờ báo ngắt.
Ngắt che được/ngắt không che được
• RESET tích cực → VXL sẽ nạp lại từ đầu (PC nạp địa chỉ 0000H) dù CPU đang ở bất kỳ trạng thái nào
• Sự kiện ngắt bắt CPU thực hiện ngay gọi là ngắt không che được VCC
5V
+ Bộ dao động lỗi → ngắt không che được ‘’1’’
+ Tính toán chia → ngắt không che được D [C ]
R Q
Ngắt che được: là ngắt CPU thấy nhưng không thực hiện C
• Ngắt không nối với phần cứng thì không quan tâm ‘’1’’
• Có thể lập trình được ngắt/không ngắt [C ] CPU
D
Khi có nhiều lệnh ngắt cùng lúc, không che được ưu tiên Q
cao hơn, nên thực hiện lệnh trước. C
Khi có nhiều lệnh ngắt che được cùng lúc thì thực hiện Reset
黎海潮
theo mức ưu tiên. Mạch so sánh
INT 2
INT 1

Mức ưu tiên ngắt:


• Ngắt ưu tiên cao có thể ngắt được ngắt ưu tiên thấp.
• Ngắt truyền tin là mức ưu tiên cao, ưu tiên ngắt truyền thông hơn ngắt ngoại vi.
• Tất cả phải có thứ tự (trong cùng mức ưu tiên hoặc khác mức ưu tiên).
• Nếu các ngắt có cùng mức ưu tiên xảy ra cùng một lúc thì thực hiện lần lượt theo thứ tự định trước.
• Cờ báo ngắt bật lên, kiểm tra xem các báo ngắt ấy có được phép xảy ra hay không (đối với ngắt che
được, sẽ có 1 bit để làm việc đó).
Véc tơ ngắt: Là địa chỉ mà PC con trỏ chương trình được gán đến các ngắt tương ứng. Địa chỉ đấy nằm
ở trong chương trinh chinh. Lúc đó chương trình nhảy đến 1 vùng khác, chương trình ngắt sẽ được
thực hiện từ giá trị PC ấy.
Để quay lại chương trình chính, cuối chương trình ngắt thực hiện lệnh RETI (CPU nạp lại địa chỉ câu
lệnh tiếp theo trong chương trình chính). Nhưng phải lưu lại địa chỉ từ trước đó thì mới quay lại được
→ cần dùng ngăn xếp.

黎海潮
Giải pháp để cất giữ và khôi phục trạng thái ?
Để cất giữ và khôi phục trạng thái thì ta cần phải cất các cờ, con trò PC hiện tại, các thanh ghi có liên quan đến
chương trình phục vụ ngắt vào ngăn xếp để trong quá trình vxl thực hiện chương trình phục vụ ngắt, các thông
tin này sẽ không bị thay đổi. Sau khi chương trình phục vụ ngắt thực hiện xong ta lại lấy các cờ, PC thanh ghi ra,
khôi phục lại trạng thái, tiếp tục thực hiện chương trình chính.
Ưu điểm và khuyết điểm của cơ chế ngắt trong VXL
• Ưu: giúp chương trình không phải kiểm tra liên tục cờ ngắt nên có thể thoải mái thực hiện các công việc khác
khi không có ngắt xảy ra, không tốn thời gian hỏi vòng, do đó CPU sẽ đỡ tốn năng lượng hơn, chạy nhanh hơn.
• Nhược: Nếu như I/O nào đó trao đổi dữ liệu với số lượng lớn thì các I/O khác ít có cơ hội trao đổi dữ liệu. Qúa
trình lưu và khôi phục trạng thái dễ gây ra lỗi, đặc biệt nếu trong chương trình phục vụ ngắt có tác động đến
ngăn xếp. Chương trình có sử dụng ngắt có hoạt động phức tạp, gây khăn nhầm lẫn cho người dùng.

Liệu có tồn tại hệ VXL hoạt động mà không cần ngăn xếp không cần ngăn xếp không? Giải thích?
• Về lý thuyết thì có thể tồn tại 1 hệ VXL hoạt động mà không cần ngăn xếp nếu như hệ VXL đó chỉ thực hiện
chương trình đơn giản không nhớ, không có nhảy, không rẽ nhánh. Tuy nhiên thực tế 1 hệ VXL được ứng
dụng để thực hiện những việc phức tạp, do đó trên thực tế không bao giờ tồn tại VXL hoạt động không cần
ngăn xếp.
• Theo kiến trúc Von Newmann, tại 1 thời điểm VXL chỉ thực hiện được 1 công việc. Để có thể thực hiện được
các lệnh gọi chương trình con hoặc chương trinh ngắt thì bắt buộc phải có ngăn xếp hoặc 1 cơ chế nào đó
tương tự ngăn xếp để lưu trạng thái làm việc.
黎海潮
Trình bày cách xác định nguồn báo bằng ngắt phần cứng

黎海潮
Vai trò và hoạt động của ngăn xếp
• Ngăn xếp (stack) là một phần của bộ nhớ RAM, dung để lưu địa chỉ của câu lệnh tiếp theo trong chương trình chính khi
xảy ra ngắt.
ROM RAM 1 địa chỉ 16 bit Truy xuất: ngăn xếp
0000H → 1 địa chỉ 2 ô nhớ
1 ô nhớ 8 bit
0050H Con trỏ ngăn xếp SP: các giá trị của SP thể hiện con trỏ đang đầy
0210H đến đâu rồi
Cất vào CTC
ngăn xếp 0211H Stack có thể có nhiều địa chỉ, giới hạn stack là số ngắt lồng nhau
0300H có thể đạt được.
CALL Add – ROM
0600H Stack
RET
Stack hoạt động theo cơ chế Last In First Out (LIFO): những dữ liệu nào được cất vào stack trước thì lấy ra sau, thực hiện
theo nguyên tắc này nhờ vào con trỏ SP (Stack Pointer)
PUSH ACC: giá trị của ACC sẽ được cất vào ngăn xếp và SP++ để trỏ tới ngăn xếp tiếp theo.
POP ACC: lấy ô nhớ mà SP đang trỏ cất vào ACC, SP–
Lưu ý: có bao nhiêu lệnh PUSH thì có bấy nhiêu lệnh POP, PUSH trước thì POP sau.
con trỏ SP mặc định trỏ đến 07H (tức là lệnh cất đầu tiên sẽ cất vào ô nhớ 08H).
Nhiều thanh ghi sử dụng trong cả CTC, CT ngắt thì khi vào CT ngắt, phải cất nó đi, để nó không bị thay đổi khi thực hiện
CT ngắt.

黎海潮
Khi chương trình đang thực hiện câu lệnh, có sự kiện ngắt xảy ra,
Reset
cờ báo ngắt báo với CPU nhưng cờ báo ngắt chưa phải điều kiện Lược đồ hoạt động của VXL khi có
đủ. RESET
Khi cấp nguồn cho VXL → có điện áp
Về mặt thực hiện lệnh, CPU cần 1 khoảng thời gian để kiểm tra cờ Khởi tạo giá trị → Tín hiệu đưa vào chân RESET
mặc định của
báo ngắt, xem bit điều khiển có cho CPU thực hiện hay không. ↔ Bấm nút RESET
thanh ghi
Nếu CPU được thực hiện thì VXL lưu trữ địa chỉ của các câu lệnh
tiếp theo trong chương trính vào ngăn xếp (Stack). Sau đó thực
hiện chương trình con (ngắt). Kiểm tra YES
ngắt không Thực hiện
Sau đó dựa vào loại vecto ngắt là loại gì, rồi chương trình nhảy đến che được
1 vùng khác, thực hiện từ địa chỉ mà PC đang trở đến ngắt đó.
NO
CPU thực hiện chương trình ngắt đến khi gặp lệnh RETURN (RETI)
– nạp lại cho PC các địa chỉ của câu lệnh tiếp theo trong chương Kiểm tra YES
trình chính đã lưu ở trong ngăn xếp, sau đó VXL tiếp tục thực hiện Cho YES
ngắt che
chương trình chính. phép
được
Thực hiện
Lưu ý: nếu có nhiều ngắt thì sẽ dựa vào mức ưu tiên ngắt theo thứ NO NO
tự: ngắt không che được, ngắt che được (có thể lập trình được).
Thường ưu tiên ngắt truyền thông hơn ngắt ngoại vi. Khi có nhiều
lệnh ngắt che được thì thực hiện theo mức ưu tiên, tất cả phải có
Thực hiện Chương
thực tự (kể cả trong cùng mức ưu tiên hoặc khác mức ưu tiên) lệnh
黎海潮 trình chính
Vecto RESET và vecto ngắt có thể trùng nhau không ? Giải thích?
Vecto RESET và vecto ngắt có thể trùng nhau. Bởi vì RESET chính là 1 vecto ngắt. RESET tích cực → VXL sẽ
nạp lại từ đầu (PC nạp địa chỉ 0000H) dù CPU đang ở bất kỳ trạng thái nào. Tra bảng thì vecto RESET có số
hiệu là 00H và là 1 vecto ngắt.

Nêu sự cần thiết của ngắt NMI (ngắt không che)


Ngắt NMI là cần thiết, là ngắt bằng phần cứng dùng để đề phòng những trường hợp ngắt bằng phần mềm
không hoạt động được thì dùng ngắt NMI để dừng chương trình, bảo vệ thiết bị.Hữu dụng trong các trường
hợp VXL gặp sự cố. 8051 có 1 ngắt không che được là RESET.

黎海潮
Kiến trúc phần cứng của hệ vi xử lý (MCS-51)
• 8 bit, có thể thao tác từng bit
• 6 nguồn/ 5 vecto ngắt → có 2 nguồn báo ngắt dung
chung 1 vecto ngắt → phải dựa vào cờ báo ngắt để trỏ
đến Ct ngắt phù hợp.
• Kiến trúc Harvad
• 4 I/O Ports:
+ P0&P2: ghép nối với bộ nhớ ngoài(ADDRESS /DATA)
+ Truyền tin hoặc tạo mức 0 – 5V
• 2 Timer/counter 16 bit

Vai trò của mạch giải mã địa chỉ


Cần có mạch giải mã địa chỉ tạo ra tín hiệu chip select từ
ADDRESS BUS để chọn thiết bị cần giao tiếp trong hệ
thống. (thiết bị ngoại vi) . CPU muốn kết nối với chip bộ
nhớ (hoặc I/O) nào chỉ khi CPU muốn liên lạc với nó,
muốn thực hiện phải nhờ mạch giải mã địa chỉ.
Bằng cách nào CPU có thể trao đổi được với các thiết bị ngoại vi
Mỗi thiết bị ngoại vi được đánh địa chỉ theo kiểu ánh xạ bộ nhớ. Vì vậy CPU có thể thao tác với ngoại vi như thao
黎海潮
tác với 1 ngăn nhớ.
Trình bày phương thức điều khiển vào ra bằng chương trình, điều khiển ở đây là điều khiển gì?

Chờ ngắt trong lúc đó vẫn xử lý chương trình.

Cái đầu điên luôn được hỏi nhiều nhất.


Nếu tín hiệu RQ1 = 1 → I/O 1 luôn được xử
lý mà không quan tâm các RQ khác.
Việc lựa chọn theo 1 lưu đồ nào đó phụ
thuộc vào vấn đề của I/O đó.
Để điều khiển vào ra, ta sử dụng vòng lặp
trong chương trình, để CPU dành ra 1
khoảng thời gian quét dữ liệu ở cổng vào
các cờ ngắt đê xác định xem có ngoại vi nào
cần giao tiếp hay không. Nếu có thì sẽ gọi
các chương trình con để thao tác.

Cách 1:Xử lý tuần tự. Các I/O Cách 2: Sau khi XL I/O nào thì quay
bình đẳng trở lại I/O 1 → I/O 1 được quét nhiều
黎海潮
nhất
Nêu ưu, khuyết điểm của phương thức điều khiển vào ra bằng
chương trình.
Ưu điểm:
IO1: JB P1.0, XL-IO1 (xử lý IO1)
• Tổ chức chương trình theo lưu đồ trên tương đối dễ.
• Dễ cho người viết chương trình kiểm soát lỗi. XL IO1
• Thay đổi mức độ ưu tiên do có thể thay đổi vị trí I/O. LJMP IO2
Nhược điểm: IO2: JB P1.1, XL-IO2 ( xử lý IO2)
• Việc xử lý 1 RQ tiếp theo phải chờ xử lý xong I/O trước đó. XL IO2
• Nếu RQ2 tồn tại trong khoảng thời gian ngắn hơn chương trình xử lý LJMP IO3
I/O1 thì khi xử lý xong I/O1 thì RQ2 không còn → dẫn đến sót dữ liệu.
• Vấn đề càng lớn khi I/O càng nhiều (quản lý càng nhiều, càng nhiều IO3: JB P1.2, XL-IO3 ( xử lý IO2)
I/O thì xác suất xử lý đầu tiên càng thấp). XL IO3
• Có thể chấp nhận xử lý Delay khi chờ xử lý I/O trước. LJMP IO4
• Tốn thời gian hỏi ngoại vi không có nhu cầu trao đổi dữ liệu, làm cho
CPU bị chậm, hoạt động liên tục, tốn năng lượng. ……………….
• Nếu ngoại vi thứ k bị lỗi và luôn tích cực thì các ngoại vi ưu tiên thấp ION: JB P1.N-1, XL-ION ( xử lý
hơn không thể trao đổi dữ liệu. ION)
→ nảy sinh các vấn đề: không ngắt được chương trình I/O, có thể bị trễ SJMP IO1
và thiếu sót dữ liệu.
黎海潮
Trình bày phương thức điều khiển vào ra bằng ngắt
Mỗi tín hiệu RQ sẽ được đưa vào 1 tín hiệu ngắt ngoài và chúng ta sẽ cho phép ngắt ngoài đó xảy ra, khi
có 1 ngắt xảy ra → cờ báo ngắt tự động bật lên, trạng thái cờ duy trì đến khi nào mà
→ tự động xóa cờ báo ngắt đó đi.
vecto PC ấy được nhảy vào vecto ngắt tương ứng.
INT Mỗi ngắt xảy ra tương ứng với chuyện 1 IO có tín hiệu RQ.
Start Mỗi tín hiệu RQ phát sinh ra 1 ngắt, chương trình tương
IO1
ứng trong IO ấy sẽ được xử lý trong CT ngắt
Khởi Cho phép ngắt Mỗi ngắt xảy ra tương ứng với chuyện 1 IO có tín hiệu
tạo các theo kiểu sườn XL IO1 RQ. Mỗi tín hiệu RQ phát sinh ra 1 ngắt, chương trình
xuống, lên, vv tương ứng trong IO ấy sẽ được xử lý trong CT ngắt.
ngắt
Về mặt lý thuyết, mỗi ngắt ngoài tương ứng với 1 IO và
CTC cho phép INT xảy ra và chờ ngắt.
Chờ RETI
Xử lý các IO sẽ đưa các ngắt ngoài tương ứng tại các
ngắt vecto ngắt tương ứng.
Lưu đồ tương tự với IO2, …, IO n
Lưu đồ của chương trình ngắt tương ứng.

黎海潮
Trong xử lý ngắt, xác định tín hiệu RQ bằng cách đọc trạng thái IO đó, xem tín hiệu nào lên mức
1 (thực chất là kiểm tra theo chương trình)

INT
Kiểm tra theo CT, kiểm tra lần lượt tín hiệu nào lên 1 → RQ

Xử lý IO = Xác định xem tín hiệu nào lên 1 thì cái IO đó đang RQ
chương trình

ADDRESS
DATA

IO1 IO2 IO3


VXL RQ1 P1.0 RQ2 P1.1 RQ3 P1.2
INT1
INT2
INT3
黎海潮
Ưu điểm:
• Không bị sót vì chỉ cần có tín hiệu RQ → điều kiện ngắt xảy ra → thì cờ báo ngắt sẽ dựng lên
và tồn tại sau khi RQ không còn tồn tại nữa.
Sau khi xử lý IO nào trước đó xong rồi, quay lại CTC sẽ phát hiệu được cờ báo ngắt của IO sau
bật lên mặc dù có thể tín hiệu RQ không còn tồn tại, thì vẫn xử lý
• Đối với ngắt có thể set mức ưu tiên theo từng ngắt, có cơ chế ngắt trong ngắt với những ngắt
có ưu tiên cao hơn, với những IO có độ quan trọng cao hơn thì ta ưu tiên xử lý.
• Tiết kiệm thời gian, chỉ ngắt với những ngoại vi có yêu cầu → tốc độ CPU tăng, tiết kiệm năng
lượng hơn
Khuyết điểm:
• Nếu ngắt theo sườn thì phải chống nhiễu → phức tạp về mặt phần cứng để lọc nhiễu (loại bỏ
bằng phần cứng, phần mềm, cần phân biệt đâu là sườn, đâu là nhiễu)
• Có thể không chuẩn, cần biết tín hiệu RQ là bao lâu ms.
Cờ được bật lên do sườn xuống của RQ hay là sườn xuống của nhiễu.
• Bị hạn chế về mặt phần cứng, nếu nhiều hơn 2 IO thì phải dùng OR

黎海潮
Trong CTC có chờ ngắt nhưng cái ngắt đó thì ta lại kiểm tra xử lý chương trình → có một sự kết hợp giữa
vào ra bằng ngắt và vào ra bằng chương trình → hợp lại gọi là ngắt mềm (vừa có ngắt, vừa có xử lý)

ADDRESS
DATA

IO1 IO2 IO3


VXL RQ1 P1.0 RQ2 P1.1 RQ3 P1.2
P1.0
P1.1
INT P1.2

黎海潮
Sự giống nhau và khác nhau giữa điều khiển vào ra bằng ngắt với điều khiển vào ra bằng
chương trình?
Giống nhau:
• Việc trao đổi dữ liệu đều phải thông qua CPU, đều điều khiển bằng các câu lệnh do người lập trình
viết ra.
Khác nhau:
• Vào ra bằng ngắt thì cái nào có nhu cầu trao đổi thì mới ngắt, trao đổi ngoại vi còn ở vào ra bằng
chương trình thì nó phải kiểm tra tất cả các ngoại vi theo thứ tự ưu tiên mà không cần biết nó có
nhu cầu trao đổi dữ liệu hay không.
• Vào ra bằng ngắt thì các lệnh điều khiển nằm ở chương trình phục vụ ngắt và CPU gọi nó như 1
chương trình con còn ở vào ra bằng chương trình thì các lệnh điều kiện nằm trong than chương
trình chính.

黎海潮
Trình bày phương thức điều khiển vào ra bằng truy nhập trực tiếp bộ nhớ

IO1 IO2 IO3

CPU A
D
C

BG DMAC Cho phép dữ liệu từ chảy thẳng về


BR Memory, không thông qua CPU.
Bus Request

Memory

Khi IO nào đó muốn cất dữ liệu thì nó đi thẳng vào Memory, DMAC sẽ mở kênh truy cập trực tiếp, không
cần thông qua CPU ↔ tức là việc của DMAC là chỉ cần định ra xem là sẽ cất dữ liệu ấy vào địa chỉ nào.

黎海潮
Để làm việc cất dữ liệu từ IO vào Memory hoặc lấy dữ liệu từ Memory đưa ra IO mà không thông qua CPU
thì CPU phải nhường quyền điều khiển BUS cho DMA để DMA lái dữ liệu đẩy vào hoặc lấy ra.
Để dành quyền sử dụng BUS khi có 1 IO nào đó có chế độ giao tiếp với DMA, thông qua hệ thống BUS điều
khiển, nó sẽ yêu cầu DMA là nó muốn cất dữ liệu vào Memory thì DMA phát ra tín hiệu BR gửi tới CPU.
• BR ở mức cao nghĩa là DMA yêu cầu CPU nhường hệ thống BUS cho DMA. Khi đó CPU sẽ thực hiện xong
lệnh cuối cùng, xong rồi thì phát BG set lên mức cao, đưa các đường bus A,D,C lên trạng thái cao trở.
Nhường quyền điều khiển hệ thống cho DMA
(hiểu là OK xong việc dở rồi đó, nhường quyền cho đó).
• DMAC gửi tín hiệu đến IO cho phép IO trao đổi trực tiếp với Memory.
• Sau khi thực hiện xong thì BR chuyển về mức thấp → khi đó CPU sẽ hiểu DMAC đã xong → CPU lấy lại
quyền điều khiển, đưa các đường bus A, D, C về trạng thái bình thường. BG về mức thấp.
Nêu ưu khuyết điểm của phương thức này, điểm khác chính so với hai phương pháp kia là gì?
Ưu điểm: Tốc độ trao đổi dữ liệu nhanh, đáp ứng được việc trao đổi dữ liệu với số liệu lớn.
Nhược điểm: Phức tạp về mặt phần cứng, giá thành lớn do giá thành DMAC cao.
Điểm khác chính so với 2 phương pháp kia là: cho phép trao đổi trực tiếp giữa IO và Memory mà không
cần thông qua CPU, quá trình trao đổi do DMAC điều khiển chứ không phải CPU điều khiển (CPU không
tham gia quá trình truyền dữ liệu).
黎海潮
Trình bày nguyên lý hoạt động của cổng vào không đối thoại, có đối thoại
• Cổng vào không đối thoại

I/O Buffer VXL Dữ liệu đi vào VXL


OE

I/O đẩy dữ liệu cho VXL.


Trong trường hợp nhiều IO lấy dữ liệu cho VXL, thông qua Buffer (bộ đệm).
IO không biết VXL đọc dữ liệu hay chưa. VXL không biết IO đã cấp dữ liệu cho hay chưa. Vì thế
nên dữ liệu luôn thường trực ở I/O. Khi I/O muốn lấy dữ liệu và tín hiệu OE tích cực thì dữ liệu
được phép đi qua Buffer và đi vào VXL. Nếu OE không tích cực, dữ liệu không đi qua được Buffer.

黎海潮
• Cổng vào có đối thoại

Data
Latch Buffer
I/O D0
ALE OE VXL
Address
IBE

INT
“1” CLR
D Q Control

Q
CLK

MUX

黎海潮
I/O đẩy dữ liệu vào Latch, có tín hiệu báo để thể hiện dữ liệu đẩy ra, tín hiệu báo D0 nối với D-FF làm chân
CLK. (Ví dụ I/O là phần tử ADC, thể hiện dữ liệu từ tương tự sang số). Báo VXL là có dữ liệu rồi đấy
Đầu ra Q nối với ALE của Latch để cho phép dữ liệu đi vào bộ đệm, đồng thời cũng là tín hiệu ngắt của VXL,
VXL thấy có ngắt của I/O nào → I/O đó đẩy dữ liệu ra rồi.
Muốn đọc thì mở OE thông qua địa chỉ được gắn tương ứng với I/O đó.
Address nối với bộ giải mã địa chỉ MUX, đầu ra địa chỉ I/O tương ứng kết hợp với tín hiệu Control → set OE,
mở Buffer → dữ liệu đi vào VXL (VXL đọc dữ liệu thông qua địa chỉ tương ứng).
Lưu ý: tất cả phải thông qua địa chỉ.
Khi OE tích cực rồi thì có nghĩa là mã dữ liệu chuyển vào VXL rồi, đồng thời OE báo với IO là dữ liệu đã
được đọc bằng cách tác động vào chân CLR của D-FF → đầu ra Q tích cực, báo cho I/O qua chân IBE.

Đối với I/O là đẩy dữ liệu ra, set D0 và chờ IBE.


Đối với VXL là chờ ngắt, phát ra địa chỉ đọc của I/O.

黎海潮
Vẽ biểu đồ thời gian của các tín hiệu handshaking STB, IBF

Tinh thần của ghép nối theo kênh là VXL ghép nối với nhiều I/O cùng sử dụng chung 1 kênh song song và mỗi một
I/O có 1 địa chỉ riêng.

黎海潮
Trình bày nguyên lý hoạt động của cổng ra đơn giản, có đối thoại
Cổng ra đơn giản Nguyên lý hoạt động của cổng ra đơn giản

Latch I/O

CPU E

Địa chỉ
Decoder
n bit C
WR

黎海潮
Cổng ra song song có đối thoại
“1”
CLR
Write (WR) Q
Control
CLK

ALE OBF
Data Latch Buffer I/O
VXL OE RD

INT Address
Decoder

Mỗi I/O có 1 địa chỉ riêng


黎海潮
Khi VXL đẩy dữ liệu lên DATA_BUS thì địa chỉ của I/O được xuất ra theo ADDRESS_BUS.
Địa chỉ này tương ứng với I/O nào thể hiện ở phần tử giải mã địa chỉ Decoder. Tín hiệu đầu ra Ax
nào đấy tích cực, mang để điều khiển I/O đó. Đồng thời ta lấy thêm tín hiệu WR trên CONTROL_BUS
để chốt và và mở ALE qua bộ AND trong trường hợp này.
ALE tích cực thì dữ liệu được đẩy vào Buffer. I/O muốn dùng dữ liệu thì chỉ cần mở Buffer. Đồng thời
tín hiệu đầu ra bộ AND dùng để điều khiển báo cho I/O là đã có dữ liệu ở Buffer rồi.
Báo bằng cách sử dụng D-FF, đầu vào D-FF là tín hiệu đầu ra bộ AND (Có tác dụng như xung CLK),
đầu ra Q của D-FF để báo với I/O (nối với OBF).
I/O muốn đọc dữ liệu thì sau khi có OBF thì I/O set Read (RD) Data tích cực → dữ liệu từ Buffer đi
vào I/O → OE tích cực.
I/O phải báo nếu đọc dữ liệu xong rồi, báo bằng cách nói tín hiệu OE với tín hiệu CLR của D-FF. OE
lên “1” thì CLR tích cực → xóa đầu ra Q (từ “1” về “0”) còn Q từ “0” lên “1”, Q dùng để báo cho VXL,
làm tín hiệu INT
Việc của VXL là đẩy dữ liệu ra và chờ ngắt, khi nào có ngắt INT có nghĩa là IO đã đọc dữ liệu rồi.
Latch là phần tử chốt, có cấu tạo tương tự như D-FF.
Buffer là bộ đệm 3 trạng thái. Khi chân OE tích cực thì đầu vào nào thì đầu ra nấy. OE không tích cực
thì Buffer ở trạng thái cao trở.

黎海潮
Vào ra nối tiếp: định nghĩa, mục đích, nguyên lý, chế độ, phương thức, nhịp truyền.
• Định nghĩa: truyền tin nối tiếp là các bit dữ liệu được truyền lần lượt trên 1 đường truyền.
• Mục đích: Truyền dữ liệu đi xa được, dựa trên 2 yếu tố là độ trễ từng bit dữ liệu là như nhau và đóng
gói được dữ liệu, dễ dàng bóc tách. Tiết kiệm đường truyền
• Chế độ: Có 3 chế độ truyền tin nối tiếp
+ Đơn công: dữ liệu truyền theo 1 chiều, dữ liệu truyền từ A đến B, A chỉ truyền, B chỉ nhận.
(giao tiếp chuột/bàn phím với máy tinh). TX TX

TX RX A B
A B RX RX
công tắc chuyển mạch lựa chọn
+ Bán song công: chỉ có 1 đường truyền nhưng có 2 công tắc. A và B có thể truyền hoặc nhận nhưng tại 1
thời điểm có 1 bên truyền và 1 bên nhận.
+ Song công: A&B có thể vừa truyền vừa nhận đồng thời. 8051 cho phép truyền song công.
TX TX

A RX RX B
GD
黎海潮
• Nguyên lý: nguyên lý của truyền tin nối tiếp là sử dụng thanh ghi dịch.
Đầu ra nối tiếp
DATA DATA Thay vì đưa dữ liệu // ra thì đưa
dữ liệu ra thanh ghi dịch → nối
tiếp.
NT
TGD TGD
CLK

VXL I/O TGD, vào nối


tiếp, ra //
TGD, vào//
Muốn truyền được thì phải chung clock
ra nối tiếp.
Thay vì dùng 1 CLK để đẩy 8 bit ra thì cần tới 8 CLK. Phần mềm sử dụng lệnh dịch bit (shift)
Thanh ghi là 1 trường hợp của thanh ghi dịch,vào //, ra //. Cấu tạo của thanh ghi là các D-FF
Mấu chốt là phải có: đường truyền nối tiếp
thanh ghi dịch
có CLK và chung CLK
• Nhịp truyền (boundrate): số bit truyền trong 1 giây (1200/2400/4800/9600)
黎海潮
• Đặc tính học: sử dụng phương pháp truyền không đối xứng. Sử dụng tín hiệu điện áp chênh lệch giữa 1
dây dẫn và đất để thể hiện các trạng thái logic (1 hoặc 0) của 1 tín hiệu.
• Phương thức truyền:
+ Truyền đồng bộ: là cách thức mà bên truyền , bên nhận cùng sử dụng chung tín hiệu CLK, căn cứ vào
sườn xung nhịp của CLK để bên này dịch dữ liệu ra, bên kia nhận dữ liệu vào.
→ xuất hiện các chuẩn như SPI, I2C,…
Đối với 8051 không có SPI, I2C nên muốn truyền dữ liệu theo kiểu đồng bộ SPI, muốn truyền “1” hay
truyền “0” thì phải SET hay CLR chân tương ứng.
VD: muốn truyền 1 thì SET P1.1, phát ra 1 CLk thì tạo CLK của P1.2, muốn làm đồng bộ thì phải lập trình
cho bên nhận: khi có 1 giá trị CLK của P1.2 thì ta đọc P1.1 đấy coi như 1 bit dữ liệu.
→ có thể làm được với 8051 bằng cách làm đúng nguyên lý của các truyền đó, nhanh hay chậm thì do ta
SET tần số của P1.2 đó. Do không có phần cứng SPI, I2C nên VXL phải kiểm soát truyền tin.
→ Chỉ truyền được khoảng vài mét, không truyền đi xa được. Nếu truyền xa 1 tín hiệu CLK, tần số càng
cao thì sóng phản hồi càng lớn → gây méo, sai lệch CLK.

黎海潮
+ Truyền dị bộ: UART, không dùng chung xung CLK Truyền dị bộ thì phải có đóng gói, nhịp
truyền và tốc độ truyền.
Start bit Stop bit
Trong chế độ truyền có thể truyền thêm
1 bit (bit kiểm tra chẵn lẻ). Bit thứ 9 có
TX RX thể là kiểm tra chẵn lẻ theo nghĩa so lại
A B tất cả các bit dữ liệu của 8 bit Data.
Chẵn thì 0, lẻ thì 1
Đây là cách truyền tin thô sơ nhất.
CLK A CLK B
OSC_A OSC_B

Yếu tố đầu tiên để A truyền 1 bit, B nhận 1 bit cùng lúc là tần số phải giống nhau: f_OSC_A = f_OSC_B
Để truyền nhận cùng lúc thì có giải pháp TX luôn ở mức cao, khi truyền TX xuống mức thấp, mức thấp này là
báo B là bên A truyền dữ liệu.
B thấy mức 0 thì hiểu truyền dữ liệu và sẽ chờ qua 1 khoảng thời gian của bit này thì bắt đầu nhận tín hiệu bit
tiếp theo, quy định với nhau là truyền bao bit thì sẽ kết thúc.
Khung truyền (cách đóng gói bản tin):
1 bit – Start bit (tạo sườn xuống, B là có dữ liệu rồi, bật xung CLK lên đi để nhận (không tính vào dữ liệu))
8 bit – Data bit
黎海潮
1 bit – Stop bit (chuyển từ mức thấp lên mức cao)
Có thể dùng cổng song song để vào ra nối tiếp được không? Giải thích?
Đối với cổng vào ra nối tiếp thì cần có thanh ghi dịch 8 bit để tách byte dữ liệu thanh 8 bit nối
tiếp. Tuy nhiên ở cổng vào ra song song thì thường không có thanh ghi dịch do đó không thể sử
dụng cổng song song để truyền tin nối tiếp.

Nêu mặt hạn chế của chuẩn RS232C, các khắc phục
• Hạn chế:
+ Trong RS232 thì mức logic “1” được biểu diễn từ “3V - 12V” còn mức “0” được biểu diễn từ “-12V - -3V”.
Mức điện áp này không phù hợp với các chip TTL phổ biến vì vậy cần có giải pháp.
+ Không thể truyền dữ liệu ở khoảng cách xa vì dễ bị nhiễu tín hiệu.
• Giải pháp:
+ Dùng mạch trung gian MAX232 để chuyển đổi các mức điện áp RS232 về các điện áp TTL được chấp
nhận bởi các chân TxD và RxD của 8051. Các IC MAX232 nhìn chung được coi như các bộ điều khiển
đường truyền.
+ Có thể sử dụng các chuẩn khác như RS485, RS422… hoặc phải có các biện pháp chống nhiễu phù hợp.

黎海潮
Trình bày về cổng vào ra nối tiếp trong hệ MCS-51
• Cổng nối tiếp 8051 thực hiện chuyển đổi dữ liệu từ song song → nối tiếp khi phát và từ nối tiếp →
song song khi thu.
• Hoạt động theo chế độ song công
• Chuyển đổi dữ liệu qua phần cứng: thanh ghi dịch.
• TxD (P3.0) – phát dữ liệu, RxD (P3.1) – thu dữ liệu, SCON, SBUF dung để truy xuất.
SCON gồm: → bit trạng thái – báo sự kết thúc thu – phát 1 ký tự.
bit điều khiển – thiết lập chế độ hoạt động.
SBUF như 1 bộ đệm, muốn byte dữ liệu truyền qua TxD thì nó cần đặt dữ liệu trong SBUF. Tương tự
SBUF lưu 1 byte dữ liệu khi nó được nhận qua đường RxD của 8051. Byte dữ liệu khi được ghi vào
SBUF thì nó sẽ được định khung với bit Start và bit STOP rồi truyền qua TxD. Khi SBUF nhận được các
bit dữ liệu từ RxD thì nó sẽ mở khung loại trừ các bit start, Stop.

黎海潮
Bit thứ 9 (Mode 2 or
3 truyền được)
Bit thứ 9 (Mode 2 or
3 nhận được)

Cờ truyền

Cờ nhận
Cho phép nhận

黎海潮
SM0 SM1 Mode Mô tả Tốc độ truyền (baud rate)
0 0 0 Dữ liệu nối tiếp vào và đưa ra qua RXD. TXD đưa ra xung Cố định (1/12 tần số dao động)
CLK dịch. 8 bit dữ liệu được truyền/nhận (bit đầu là LSB)

0 1 1 10 bit được truyền (qua TXD) hoặc nhận (qua RXD): bit Thay đổi
Start (0), 8 bit dữ liệu (bit đầu LSB) và bit Stop (1). Khi
nhận, bit Stop đi vào RB8 trong Special Function Register
SCON
(UART – 8 bit).
1 0 2 11 bit được truyền (TXD) hoặc nhận (RXD): bit Start (0), 8 Cố định (1/32 hoặc 1/64 tần số dao
bit dữ liệu (bit đầu LSB), bit dữ liệu thứ 9và bit Stop (1). động).
On Transmit, the 9th data bit (TB8 in SCON) can be
assigned the value of 0 or 1. Or, for example, the parity (P,
in the PSW) could be moved into TB8. On receive the 9th
data bit goes into RB8 in Special Function Register SCON,
while the stop bit is ignored. (UART 9 – bit )

1 1 3 11 bit are transmitted (through TXD) or receive (through In fact, Mode 3 is the same as Mode 2
RXD): a start bit (0), 8 data bits (LSB first), a in all respects except the baud rate.
programmable 9 data bit and a stop bit (1)
th The baud rate in Mode 3 is variable.
(UART 9 – bit)
黎海潮
Trình bày rõ cách sử dụng bit Parity trong trường hợp này.
• Bit Parity (P) là bit kiểm tra tính chẵn lẻ, nằm trong thanh ghi đặc biệt PSW. Bit này được nạp vào
bit TB8 ở thanh ghi SCON bằng phần mềm. Bit có giá trị 1 khi số lượng các bit 1 trong một nhóm
bit là lẻ, còn bit P có giá trị 0 khi số lượng các bit 1 trong một nhóm bit là chẵn.
• Ta định sẵn byte dữ liệu có bit P là bit chẵn mà ở bên thu lại là lẻ thì kết luận dữ liệu đã bị truyền
sai, nhưng nếu ở bên thu là chẵn thì chưa kết luận.
• Ví dụ để kiểm tra chẵn lẻ ta dùng đoạn lệnh:
MOV C,P
CPL C
MOV TB8, C
MOV SBUF, A

黎海潮
Vào ra nối tiếp dị bộ: định nghĩa, mục đích, phương pháp đồng bộ
• Định nghĩa: Vào ra nối tiếp dị bộ là phương pháp truyền mỗi lần 1 byte thay vì truyền mỗi lần 1
khối dữ liệu. Xung CLK riêng rẽ ở từng bộ phận truyền và nhận
• Mục đích: Là khi phát tín hiệu không phải phát theo xung CLK đồng bộ, giảm mức độ phức tạp của
mạch
• Phương pháp đồng bộ: Đóng gói bản tin thanh khung truyền, thêm các bit khởi đầu và kết thúc,
ngoài ra còn có các bit kiểm tra chẵn lẻ
f_OSC_A = f_OSC_B
Start bit Stop bit Khung truyền (cách đóng gói bản tin):
1 bit – Start bit (tạo sườn xuống, B là có dữ
liệu rồi, bật xung CLK lên đi để nhận (không
TX RX
A B tính vào dữ liệu))
8 bit – Data bit
1 bit – Stop bit (chuyển từ mức thấp lên mức
cao)
CLK A CLK B
OSC_A OSC_B

黎海潮
Hãy trình bày về tổ chức bộ nhớ trong hệ MCS-51
Kiến trúc bộ nhớ của 8051 là kiến trúc Harvard
Bộ nhớ trong hệ MCS-51 chia làm 2 phần: Bộ nhớ chương trình và bộ nhớ dữ liệu (tách rời nhau)
Program Memory (Read Only – ROM)
FFFFH
• Nếu có những câu lệnh mà địa chỉ cao hơn thì sử dụng ROM
ngoài.
• Chương trình chính cần đặt 2 địa chỉ ngoài vùng thực hiện
chương trình ngắt để tranh việc bị ghi đè (vecto ngắt).
Chương trình chính Chương trình ngắt
ORG 0003H
00FFH …..........
RETI

0000H
Đặt chương trình chính sau 0050H để tránh bị trùng với vecto ngắt.
EA = 1: sử dụng bộ nhớ trong
EA = 0: sử dụng bộ nhớ ngoài. 黎海潮
Địa chỉ > 4K (VD: 1FFFH thì khi truy xuất ở bộ nhớ ngoài nối tiếp ROM)
4K bộ nhớ
+ 0003H: ngắt ngoài 1
0FFFH + 001BH: ngắt Timer 1
………..
05FFH Đặt chương trình chính sau 0050H để tránh bị trùng với vecto ngắt.
CTN: ORG 0003H (CT ở thanh ghi 0003H < 8 byte thì
…………. không bị đè 001BH)
0050H
RETI
ORG 0000H Reset PC về 0000H
0003H LJMP 0050H Nạp PC 0050H để PC bắt đầu
RESET 0000H CTC: ORG 0050H (để bỏ qua QT ngắt)
……….
END
P đưa 8 bit thấp Vừa là bit dữ liệu CONTROL_BUS: ALE và PSEN
P đưa 8 bit cao vừa là bit địa chỉ
黎海潮
Sau khi khởi động, CPU bắt đầu thực hiện chương trinh ở vị trí 0000H.
Mỗi khi xảy ra ngắt, con trỏ của CPU sẽ nhảy đến đúng địa chỉ ngắt tương ứng và thực thi chương
trình tại đó.
Ví dụ: ngắt ngoài 0 sẽ có địa chỉ 0003H, khi xảy ra ngắt ngoài 0 thì con trỏ chương trình sẽ nhảy
đến đúng địa chỉ 0003H để thực thi chương trình tại đó. Nếu trong chương trình ứng dụng không
sử dụng đến ngắt ngoài 0 thì địa chỉ 0003H vẫn có thể dùng cho mục đích khác (sử dụng cho bộ
nhớ chương trình)

黎海潮
Data Memory (Read/Write - RAM)

Cấu trúc bộ nhớ dữ liệu trong chip (chia thanh 3 khối)


FFFFH

00FFH

0000H
CPU sẽ dùng đến các chân
RD và WR khi truy cập
đến bộ nhớ dữ liệu ngoài
Cấu trúc bộ nhớ dữ liệu trong và bộ nhớ dữ liệu ngoài
黎海潮
Truy xuất địa chỉ theo byte (không thể truy xuất
từng bit)
16 ô nhớ = 128 bit → truy xuất định địa chỉ theo bit
20H: 00 → 07H; 2FH: 78H → 7FH
(128 bit thấp của bộ nhớ dữ liệu của MCS-51)

32 bit đầu tiên (00H-1FH) được sử dụng cho


4 bộ của 8 thanh ghi (R0-R7)

PSW: thanh ghi trạng thai (1 bit là 1 cờ trạng thái)


RS0 hoặc RS1 tùy thuộc vào lựa chọn Bank thanh ghi

黎海潮
黎海潮
• 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 (16 byte x 8
bit = 128 bit) và phần còn lại chứa trong các thanh ghi đặc
biệt. Ngoài ra 8051 còn có các port xuất/nhập có thể định
địa chỉ từng bit, điều này làm đơn giản việc giao tiếp bằng
phần mềm với các thiết bị xuất/nhập đơn bit.
• Vùng RAM đa mục đích có 80 byte đặt ở địa chỉ từ 30H
đến 7FH, bên dưới vùng này từ địa chỉ 00H đến 2FH là
vùng nhớ có thể được sử dụng tương tự. Bất kỳ vị trí nhớ
nào trong vùng RAM đa mục đích đều có thể được truy
xuất tự do bằng cách sử dụng các kiểu định địa chỉ trực
tiếp hoặc gián tiếp.

• Bất kỳ vị trí nhớ nào trong vùng RAM đa mục đích đều có thể được truy xuất tự do bằng cách sử dụng
các kiểu định địa chỉ trực tiếp hoặc gián tiếp.
• Cũng như các thanh ghi từ R0 đến R7, ta có 21 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. Cần lưu ý là không phải tất cả 128 địa chỉ từ 80H đến FFH đều được
định nghĩa mà chỉ có 21 địa chỉ được định nghĩa.
黎海潮
Bằng cách nào hệ 8051 truy nhập được nhiều ô nhớ có chung địa chỉ? (trong/ngoài/SFR)
• Có thể truy nhập nhiều ô nhớ có chung địa chỉ vì các vùng không gian nhớ (trong/ ngoài/ SFR) tách
biệt nhau, do đó có thể trùng địa chỉ với nhau. Để truy nhập nhiều ô nhớ có chung địa chỉ, ta có thể
dựa vào tín hiệu điều khiển, hay nói đúng hơn là phân biệt dựa vào câu lệnh.
• VD: MOV dùng với RAM trong, MOVX dùng với RAM ngoài, PSEN dùng với ROM.

黎海潮
Hãy trình bày về bus của hệ vi xử lý
• Hệ thống bus của vi xử lý: VXL có 3 hệ thống bus: Data, Address và Control.
+ Bus là các đường tín hiệu có chức năng liên kết CPU với bộ nhớ và các I/O.
+ A_bus: Khi đọc/ghi bộ nhớ hoặc địa chỉ cổng vào/ra, CPU sẽ đưa ra trên bus này địa chỉ ô nhớ liên
quan/địa chỉ cổng tương ứng. A_bus có chức năng truyền địa chỉ tham chiếu tới các khu vực bộ nhớ và chỉ
ra dữ liệu được lưu trữ ở đâu trong không gian nhớ. Số lượng đường bus liên quan đến không gian nhớ.
+, D_bus: là bus 2 chiều, chức năng là truyền tải thông tin theo 2 chiều giữa CPU và bộ nhớ hoặc các
I/O. Độ rộng bus sẽ xác định được lượng dữ liệu có thể trao đổi trên bus. Các đầu ra nối thẳng với D_bus
đều phải trang bị Buffer để có thể ghép nối và hoạt động với bus này.
+, C_bus: Mỗi tín hiệu điều khiển có 1 chiều nhất định vì khi hoạt động CPU đưa tín hiệu tới các khối
trong hệ, đồng thời CPU cũng nhận tín hiệu từ khối trong hệ để phối hợp hoạt động. Phục vụ truyền tải các
thông tin dữ liệu để điều khiển hoạt động của hệ thống. Biểu hiện là đường mũi tên 2 chiều để chỉ tính 2
chiều của 1 nhôm tín hiệu chứ không phải 1 tín hiệu.
• Điểm khác nhau giữa ghép nối MCS-51 theo cổng và bus là:
+ Ghép nối MCS-51 theo cổng thì không cần có bộ giải mã địa chỉ DEC vì ngoại vi được ghép nối trực
tiếp với các cổng của vi xử lý và các cổng này đã có sẵn địa chỉ. CPU sẽ biết sẵn địa chỉ của ngoại vi cần trao
đổi dữ liệu.
+ Ghép nối MCS-51 theo bus thì cần có mạch giải mã địa chỉ vì ghép nối theo bus thì ghéo nối với nhiều
ngọa vi nên cần DEC để biết I/O nào cần trao đổi dữ liệu khi có nhu cầu.
黎海潮
Hãy cho biết những kiến trúc bus mà bạn biết?
Có 4 kiểu kiến trúc bus là kiểu vòng, dạng đường thẳng, dạng sao và dạng cây.
+ Bus dạng đường thẳng

A CPU - master D Vùng nhớ

B C Thanh ghi

+ Bus dạng vòng

A B
Các phần tử bình đẳng. Mỗi phần tử có 1 khoảng
thời gian
Ví dụ 1s cho 4 phần tử → có 4 khe, mỗi khe 250ms
A muốn truyền cho D thì phải chờ qua B,C
→ lãng phí thời gian, hiệu suất không cao.
D C
黎海潮
+ Bus dạng sao: Có 1 vấn đề là nếu M hỏng → không truyền được dữ liệu nhưng có hiệu suất cao hơn.

A B

D C

+ Bus dạng cây:


G

A D

B C A

E F
黎海潮
Trình bày kỹ thuật quét để giải mã phím.
5V

1 2 3 A
4 5 6 B
7 8 9 C
P1.0 * 0 # D
4 bit làm đầu ra P1.1
xuất mức logic P1.2 Ta nhấn phím số 4 có tọa độ (2;1), các đầu
P1.3 P1.4 đến P1.7 được thiết lập sẵn ở mức tích
VXL cực “1”.
Các đầu ra xuất mức logic từ 0000 đến 1111
P1.4
P1.5 lần lượt và thời gian xuất ra mỗi mức cỡ 2 us,
Đầu vào rất nhỏ so với thời gian giữ phim (cỡ ms) ,
P1.6
P1.7 khi đầu ra xuất tín hiệu 1011 trong lúc giữ
INT
phím số 5 → đầu P1.4 có mức tín hiệu 0, VXL
nhận tín hiệu đầu vào là 0111
→ VXL hiểu là phím số 4 được ấn → trên Led
hiển thị số 4
黎海潮
Có thể dùng kỹ thuật này để xác định mã của hai phím cùng nhấn không? Giải thích?
• Kỹ thuật này có thể xác định mã của 2 phím cùng nhấn.
+ Giả sử ta nhấn đồng thời 2 phím số 4 và số 8
+ P1.4 ÷ P1.7 là đầu vào ở mức “1”.
+ Giả sử lúc đó P1.0 ÷ P1.3 xuất mức 1001 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 0011 → hiểu là
có nhấn có phím ở cột 1 và ở cột 2 được nhấn; thuộc hàng 2 và hàng 4. (khoanh vùng được 4 phím số
4,5,7,8)
+ Sau đó P1.0 ÷ P1.3 xuất ra mức logic 1011 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 0111 → hiểu
là có nhấn có phím ở cột 1 và phím đó thuộc hàng 2 → phát hiện được phím số 4 được nhấn.
+ Tương tự P1.0 ÷ P1.3 xuất ra mức logic 1101 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 1011 →
phát hiện được phím số 8 được nhấn.
Nếu dùng kỹ thuật này theo cách điều khiển bằng ngắt có được không? Giải thích?
Kỹ thuât này có thể dùng theo cách điều khiển bằng ngắt (Thực ra nó giống với cái sơ đồ trên nhưng
khác cái là 4 tín hiệu ở Px.4- Px.7 sẽ đươc gom đưa vào 1 cổng AND, đầu ra của cổng AND sẽ được đưa
vào INT ).

黎海潮
Trình bày kỹ thuật đảo dây giải mã phím
1 2 3 A 5V
4 5 6 B Đảo dây là đảo vai trò đầu ra, đầu vào cho nhau.
7 8 9 C Ban đầu P1.4 ÷ P1.7 là đầu vào ở mức “1”. Giả sử
lúc đó P1.0 ÷ P1.3 xuất mức 1011, nếu ta ấn phím
* 0 # D số 6 thì VXL thu được tín hiệu ở P1.4 ÷ P1.7 là
1101 → hiểu là có nhấn 1 phím ở cột 3.
P1.0
Đảo vai trò, P1.0 ÷ P1.3 thành đầu vào ở mức “1”.
4 bit làm đầu ra P1.1 P1.4 ÷ P1.7 trở thành đầu ra xuất mức 1101, lúc đó
xuất mức logic P1.2 vẫn giữ phím số 6 thì VXL thu được tín hiệu ở P1.0
÷ P1.3 là 1011 → hiểu là có nhấn 1 phím ở hàng 2
P1.3
VXL → kết hợp 2 dữ kiện, VXL sẽ hiểu ở hàng 2 – cột 3 có
phím được nhấn → VXL sẽ hiển thị số 6.
P1.4
P1.5
Đầu vào
P1.6
INT P1.7

黎海潮
Có thể dùng kỹ thuật này để xác định mã của hai phím cùng nhấn không ? Giải thích ?
• Kỹ thuật này không thể xác định được mã của hai phím cùng nhấn.
+ Giả sử ta nhấn đồng thời 2 phím số 4 và số 8
+ P1.4 ÷ P1.7 là đầu vào ở mức “1”.
+ Giả sử lúc đó P1.0 ÷ P1.3 xuất mức 1001 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 0011 → hiểu là có
nhấn có phím ở cột 1 và ở cột 2 được nhấn.
+ Đảo lại, P1.0 ÷ P1.3 là đầu vào ở mức “1”. Lúc đó P1.4 ÷ P1.7 xuất mức 1001 → VXL thu được tín
hiệu ở P1.0 ÷ P1.3 là 1101 → hiểu là có phím ở hàng 3 được nhấn.
→ VXL hiểu có phím số 7, số 8 được nhấn → sai với thực tế.
Kỹ thuật này thích hợp với phương thức điều khiển nào ? Giải thích ?
• Kỹ thuật này thích hợp với phương thức điều khiển bằng ngắt vì việc điều khiển vào ra bằng ngắt cho
phép CPU có thời gian nghỉ, chỉ khi nào có phím ấn lúc đó mới kiểm tra, khác với khi điều khiển bằng
chương trình thì ngay cả khi không có phím nào ấn vẫn kiểm tra.

黎海潮
Nêu các phương pháp có thể để ghép nối giữa vi xử lý và hiển thị LED 7 thanh nhiều chữ số.
• Phương pháp quét LED
Tất cả các led 7 thanh đều được nối chung vào 1 cổng của VXL, mỗi led có 1 nguồn riêng.
Việc cấp nguồn cho các led sẽ được điều khiển bằng chương trình thông qua các transitor
Các led sang luân phiên nhau, tại 1 thời điểm chỉ có 1
led sáng, trong 1s 1 led sáng ≥ 24 lần để xảy ra hiện
tượng lưu ảnh trong mắt

Ưu điểm: phần cứng đơn giản

Nhược điểm: nếu số lượng led lớn thì số lần sáng của
mỗi led trong khoảng thời gian sẽ ít → led sẽ căng mờ
(led tăng → độ sáng giảm) Giải pháp: giảm điện trở
hạn dông,

黎海潮
Sử dụng thanh ghi dịch, độ nhấp nháy > 24 lần/s.
TGD là thanh ghi vào nt ra // hoặc vào // ra nt,…, gồm tập hợp nhiều D-FF.

5V
PNP
P2.0 P2.1 P2.2
74595 AC

MCS -51

IN OUT IN OUT IN OUT


CLK CLK CLK
Gồm 2 đường CLK
và DATA

Cho phép tốc độ MHz

黎海潮
• Phương pháp chốt led 7 thanh (ghép nối theo kênh, đầu ra //)

Nếu có từ 8 led trở xuống thì dùng luôn các


chân của P2 làm tín hiệu ALE, không cần
dùng decoder.

Hệ này có đường dữ liệu chung nối với các led.


Các đèn led được điều khiển bởi lối vào điều khiển chốt
dữ liệu, tùy thuộc vào tín hiệu ALE.

• Hệ nhiều LED có đường dữ liệu nối trực tiếp với cổng MOVX @DPTR, A - lệnh chung của led hiển
thị
Ở hệ này các cổng ra của vi xử lý được nối trực tiếp với 8
anot (hoặc catot tùy vào cách mắc của LED) của LED 7 DPTR – địa chỉ của con led (00XXH) với 00
thanh thông qua 1 con điện trở để hạn dòng. thuộc P2, còn XX thuộc P0.
Nhược điểm của hệ này là rất tốn cổng của vi xử lý, do đó A – mã led 7 thanh của số cần hiện.
chỉ sử dụng với những hệ cần ít LED
黎海潮
Bằng cách nào ta có thể điều khiển để LED hay bóng sợi đốt sáng dần hay tối dần.
Xét 1 LED đơn, để LED sáng thì tùy thuộc vào điện áp đặt lên LED và dòng điện chạy qua LED
Giả sử điện áp định mức của led là 2V, ta có xung vuông điện áp với biên độ là 3V với độ rộng xung
T_ON=50%.T → điện áp trung bình đặt lên led là 1,5V thì led chưa sáng đúng định mức, muốn tăng
giảm độ sáng của led thì ta thay đổi điện áp trung bình đặt lên led → thay đổi độ rộng xung → dựa vào
chương trình trong VXL để thay đổi
Trước hết ta phải lập trình được 1 chương trình tạo xung vuông điện áp có điều chế được độ rộng xung
sau đó mới thay đổi dựa trên thông số tinh toán.
Hoặc cách khác là ta thay đổi điện trở hạn dòng chạy qua led sao cho phù hợp với yêu cầu cần làm.

黎海潮
Hãy mô tả các cách ghép nối giữa VXL và ADC để điều khiển bằng chương trình và bằng ngắt
• Dùng ngắt
- Nối các cổng D0, D1, D2, D3, D4, D5, D6, D7 của ADC vào P0,
- Nối chân WR(SOC) của ADC với chân P2.0
- Nối chân RD(EOC) của ADC với chân P2.1
- Nối chân INTR của ADC vào chân P3.2(INT0) external interrupt
(trong code phải thực hiện : cho phép ngắt toàn cục, cho phép ngắt ngoài, cho phép ngắt theo mức thấp,
code hàm ngắt(chức năng của hàm ấy set RD tích cực , WR không tích cực để đọc dữ liệu từ ADC và
ngưng quá trình chuyển đổi )
- Nối chân CS với đất (CS = 0) hoặc nối CS với P2.2 để để chọn chip nếu sửa dùng nhiều model
ADC(P2.2 có mức logic bằng 0)
• Không dùng ngắt:
Ghép nối cũng tương tự như khi dùng ngắt nhưng code thì không cần cấu hình ngắt và viết hàm ngắt.
Thay vì đó ta phải check liên tục mức logic ở chân INTR của ADC trong chương trình chính để kiểm tra
khi nào quá trình chuyển đổi kết thúc thì ta thực hiện clear WR và set RD tích cực để đọc data.

黎海潮
U2
U1 20 1
VCC CS
19 39 18 2
XTAL1 P0.0/AD0 DB0(LSB) RD
38 17 3
P0.1/AD1 DB1 WR
37 16 4
P0.2/AD2 DB2 CLK IN
18 36 15 5
XTAL2 P0.3/AD3 DB3 INTR
35 14 8
P0.4/AD4 DB4 A GND
34 13 10
P0.5/AD5 DB5 D GND
33 12 9
P0.6/AD6 DB6 VREF/2
9 32 11 19
RST P0.7/AD7 DB7(MSB) CLK R
21 6
P2.0/A8 VIN+
22 7
P2.1/A9 VIN-
23
P2.2/A10
29 24 ADC0804
PSEN P2.3/A11
30 25
ALE P2.4/A12
31 26
EA P2.5/A13
27
P2.6/A14
28
P2.7/A15
1 10
P1.0 P3.0/RXD
2 11
P1.1 P3.1/TXD
3 12
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
5 14
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1
7 16
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
AT89C51

Thuật toán: Ban đầu Các bước trong hàm ngắt:


B1: VXL gửi sườn lên đến chân WR để bắt đầu chuyển đổi. Clear WR để dừng quá trình
B2: Kiểm tra INTR, nếu INTR=1 thì quay lại bước 2 (kiểm tra INTR). Nếu chuyển đổi tương tự sang số.
INTR=0 (quá trinh chuyển đổi kết thúc) thì nhảy đến CTN để thực hiện Set RD để bắt đầu đọc quá trình
đọc dữ liệu từ ADC đọc.
B3: Quay lại B1 để đọc dữ liệu mới từ ADC Thực hiện đọc và ghi kết quả
黎海潮
đọc được từ port P0 vào bộ nhớ.
Nếu cách ghép nối giữa MCS-51 và ADC0800. Biết rằng ADC có các tín hiệu điều khiển: bắt đầu
chuyển đổi – SOC, kết thúc chuyển đổi – EOC và cho phép đa số liệu ra – OE
• B1: CS = 0 truy cập ADC
• B2: Vi xử lý phát tín hiệu làm xung OE không tích cực và phát xung làm chân SOC(WR) của ADC tích
cực (giả sử SOC tích cực bằng sườn lên) bắt đầu quá trình chuyển đổi tương tự ra số
(Nối chân INTR với một cổng bất kỳ trên vi xử lý ví dụ P2.0)
• B3: Vi xử lý duy trì kiểm tra chân INTR(tức là tín hiệu ở P2.0). Nếu INTR xuống thấp(INTR = 0) thì việc
chuyển đổi được hoàn tất và có thể chuyển đổi, sang bước tiếp theo. Nếu INTR còn ở mức cao(INTR =
1) thì tiếp tục thăm dò cho đến khi nó xuống thấp.
• B4: Sau khi chân INTR xuống thấp, CS = 0, vi xử lý gửi 1 tín hiệu(sườn xuống) đến SOC(WR) làm cho
WR không tích cực (mục đích là dừng quá trình quá trình chuyển đổi) và gửi 1 sườn xuống(trường
hợp chân OE tích cực theo sườn xuống) đến chân OE(RD) của ADC để vi xử lý nhận tín hiệu số sau khi
chuyển đổi từ ADC.
• B5: Để vi xử lý đọc byte tiếp theo quay lại bước 2

黎海潮
Hãy trình bày các bước cần thiết để một yêu cầu về ngắt từ INT0 của hệ MCS-51 có thể xảy ra

Hệ MCS-51 có 2 ngắt phần cứng ở bên ngoài là chân P3.2 (INT0) và chân P3.3 (INT1) điều khiển bởi thanh ghi
IE. Có 2 mức hoạt động ngắt cho các ngắt phần cứng là : Ngắt theo mức và ngắt theo sườn.
• Ngắt theo mức
Chân INT0 bình thường ở mức cao và nếu có 1 tín hiệu mức thấp được cấp tới thì chúng ghi nhãn ngắt. Sau đó
bộ VĐK dừng tất cả mọi công việc nó đang thực hiện và nhảy đến bảng vecto ngắt để phục vụ ngắt, sau đó IO
phải gửi tín hiệu xóa cờ tràn .
Chú ý : chân ngắt phải được giữ ở mức thấp cho đến khi bắt đầu thực hiện trình phục vụ ngắt ISR. Nếu chân
INT0 được đưa trở lại mức cao trước khi bắt đầu thực hiện ISR thì sẽ chẳng có ngắt nào xảy ra. Do vậy, để bảo
đảm việc kích hoạt ngắt phần cứng tại các chân INT0 phải đảm bảo rằng thời gian tồn tại tín hiệu mức thấp là
khoảng 4 chu trình máy
Tín hiệu mức thấp tại chân INT0 phải được lấy đi trước khi thực hiện lệnh cuối cùng của chương trình phục vụ
ngắt, nếu không một ngắt khác sẽ lại được tạo ra, và vi điều khiển sẽ thực hiện ngắt liên tục.
Tuy nhiên trong quá trình kích hoạt ngắt theo mức thấp nên nó lại phải đưa lên mức cao trước khi ISR thực
hiện lệnh cuối cùng và lại theo bảng dữ liệu từ nhà sản xuất thì “nếu chân INT0 vẫn ở mức thấp sau lệnh cuối
cùng của trình phục vụ ngắt thì một ngắt khác lại sẽ được kích hoạt”. Điều này do một thực tế là ngắt theo mức
không được chốt
黎海潮
• Ngắt theo sườn xuống
Ngắt theo sườn là ngắt sẽ xảy ra khi có một sườn xuống xuất hiện trên các chân ngắt của vi điều khiển. Điều
này làm cho ngắt theo sườn khắc phục được nhược điểm của ngắt theo mức như ta đã thấy ở trên
Thanh ghi TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Các bit TCON.0 và TCON.2 được coi như là các bit IT0 và IT1 tương ứng. Đây là các bit xác định kiểu ngắt theo
sườn xung hay theo mức xung của các ngắt phần cứng trên chân INT0 và INT1 tương ứng.
Khi bật lại nguồn cả 2 bit này đều có mức 0 để biến chúng thành ngắt theo tín hiệu mức thấp.
Có thể điều khiển một trong số chúng lên cao để chuyển ngắt phần cứng bên ngoài thành ngắt theo sườn.
Các bit TCON.1 và TCON.3 còn được gọi là IE0 và IE1 tương ứng. Các bit này được 8051 dùng để bám kiểu
ngắt theo sườn xung, nếu các bit IT0 và IT1 bằng 0 thì có nghĩa là các ngắt phần cứng là ngắt theo mức thấp và
các bit IE0 và IE1 sẽ không dùng đến.
Khi có chuyển dịch sườn xung trên chân INT0 (hay INT1) thì 8051 đánh dấu (bật lên cao) các bit IEx trên
thanh ghi TCON và nhảy đến bảng vector ngắt và bắt đầu thực hiện trình phục vụ ngắt ISR
Chỉ trong khi thực hiện lệnh cuối của trình phục vụ ngắt ISR thì các bit IEx mới được 8051 tự động xóa, và các
chân ngắt lại hoạt động bình thường.
黎海潮
Hãy lập trình để ngắt T0 có mức ưu tiên cao hơn INT0
• Mặc định thứ tự ưu tiên ngắt lần lượt là
INT0 (ngắt ngoài 0); TF0 (ngắt timer 0); INT1(ngắt ngoài 1); TF1(ngắt timer1 ); RI + TI (ngắt
truyền thông nối tiếp)
Khi INT0, TF0, INT1, TF1, RI(TI) được kích hoạt cùng một lúc. 8051 thực hiện theo thứ tự INT0
TF0 INT1 TF1 RI(TI)
• Chúng ta có thế thay thế trình tự mức ưu tiên trên bằng cách gán mức ưu tiên cao hơn cho bất kỳ
một trong các ngắt. Điều này được thực hiện bằng cách lập trình cho thanh ghi IP( Interrupt
Priority)
IP có địa chỉ tại by B8H IP.4 là bit mức ưu tiên cho truyền thông nối tiếp
IP.3 là bit mức ưu tiên cho timer1 IP.2 là bit mức ưu tiên cho ngắt ngoài 1
IP.1 là bit mức ưu tiên cho ngắt timer0 IP.0 là bit mức ưu tiên cho ngắt ngoài 0
Set bit = 1 thì ngắt đó có mức ưu tiên cao, set bit = 0 thì ngắt đó có ưu tiên mức thấp
• Để lập trình ngắt T0 có mức ưu tiên cao hơn ngắt INT0
Thì chỉ cần dùng lệnh SETB IP.1 hoặc lệnh MOV IP, #00000010B
(Khi đó IP.1 = 1, IP.0 = 0 thì ngắt timer 0 có mức ưu tiên cao hơn ngắt ngoài 0)
黎海潮
Mạch thời gian trong hệ MCS-51 của Intel: mô tả các thanh ghi liên quan
Các chế độ hoạt động và ứng dụng của các chế độ đó.
Sử dụng ngắt với mạch thời gian thế nào ?
8051 có 2 bộ Timer/Counter 16 bit: Timer 0 và Timer 1 với 4 chế độ hoạt động.
Trong hàm Timer, thanh ghi được tăng thêm sau mỗi chu kỳ máy. Do đó có thể coi như đếm chu kỳ máy. Do chu
kỳ máy = 12 chu kỳ dao động → Timer có tốc độ đếm = 1/12 tần số dao động.
8051 có 2 thanh ghi TMOD và TCON.
THn: thanh ghi 8 bit chứa byte cao của bộ đếm. TLn: thanh ghi 8 bit chứa byte thấp của bộ đếm.
TRn: bit cho phép Timer hoạt động: TRn = 0 → Timer ngừng hoạt động
TRn = 1 → Timer được phép hoạt động
M1, M0: 2 bit xác định 4 mode của Timer. TFn: bit cờ báo tràn bộ đếm.
C/Tn: bit thiết lập Timer hoặc Counter: C/T = 0 → Timer lấy xung Clock từ on-chip oscillator (xung của VXL)
C/T = 1 → Timer lấy xung từ bên ngoài qua Port Tn (chế độ Counter)
GATE: kết hợp với TRn để điều khiển bộ đếm: GATE = 0 → Timer chỉ hoạt động khi TRn = 1 và INTn HIGH
GATE = 1 → Timer hoạt động khi TRn = 1

黎海潮
• Thanh ghi TMOD

黎海潮
• Bit GATE nhận 2 giá trị là 0 hoặc 1, nó dùng để lựa chọn chế độ điều khiển. GATE= 0 chỉ chạy khi bit
TRx = 1. Khi đó Timer chọn chế độ điều khiển bằng phần mềm. Bit GATE= 1, khi đó Timer chọn chế
độ điều khiển bằng phần cứng → điều khiển bằng ngắt
• Bit C/T cho phép lựa chọn chế độ Timer hay Counter.
• 2 bit M1 và M0 dùng để lựa chọn chế đô cho Timer
• Mode 0: chế độ 13 bit trong đó 5 bit cao được đặt trước. (tìm hiểu 5 bit đặt trước này là thế nào,
thầy cô có thể hỏi)
• Mode 1: chế độ 16 bit sử dụng cả THx và TLx đếm từ 0000H đến FFFFH
• Mode 2: chế đồ Auto reload là bộ định thời 8 bit do đó chỉ có thể đếm từ 00H đến FFH vào thanh
ghi THx của bộ định thời còn TLx là thanh ghi đếm. Ở đây TLx sẽ chứa giá trị bắt đầu nghĩa là khi
TLx đếm đến giá trị max thì bộ đếm sẽ tự động đếm lại bắt đầu từ giá trị nằm ở thanh ghi TLx.
• Mode 3: 2 thanh ghi THx, TLx là 2 bộ đếm độc lập 8 bit (chế độ này ít dùng).

黎海潮
• Thanh ghi TCON

- TF1/ TF0: báo tràn cho T/C1 và T/C0. TR1 TR0: khời chạy cho T/C1 T/C0.
黎海潮
• Mode 0

+ 8 bit cao là thanh ghi THx


+ 5 bit thấp là 5 bit MSB của thanh ghi TLx (3 bit thấp của thanh ghi TLx không sử dụng).
+ TFx = 1 khi nội dung của bộ đếm tràn
黎海潮
黎海潮
Mode 2 configures the Timer register as an 8 bit Counter (TL1) with automatic reload, as shown in
Figure. Overflow from TL1 not only sets tf1, but also reloads TL1 with the contents of TH1, which is
preset by software. The reload leaves TH1 unchanged.
黎海潮
• Mode 3
+ Nếu Timer 0 ở Mode 3:
- Bộ Timer/Counter 8 bit sử dụng TL0 → tác động đến TF0
- Bộ Timer 8 bit sử dụng TH0 → tác động đến TF1
+ Nếu Timer 1 ở Mode 3:
- Dừng hoạt động và nội dung của thanh ghi TH1 và TL1 không thay đổi,
+ Trong khi Timer 0 ở Mode 3:
- Timer 1 vẫn có thể hoạt động binh thường ở Mode0, 1, 2 và không thể sử dụng TF1 (vì được Timer TH0 sử
dụng)
Timer 1 in Mode 3 simply holds its count. The effect is the same as setting TR1 = 0. Timer 0 in Mode 3
establishes TL0 and TH0 as two separate counters. The logic for Mode 3 on Timer 0 is shown in Figure. TL0
uses the Timer 0 control bits: C/T, GATE, TR0, INTO and TF0. TH0 is locked into a timer function (counting
machine cycles) and takes over the use of TR1 and TF1 from Timer1, Thus, TH0 now controls the “Timer 1”
interrupt.
Mode 3 is provided for applications requiring an extra 8 bit timer of counter. With Timer 0 in Mode 3, an 8051
can look like it has three Timer/Counter. When Timer0 is in Mode 3, Timer 1 can be turned on and off by
switching it out of and into its own Mode 3, or can still be used by the serial port as a baud rate generator, of in
fact, in any application not requiring an interrupt

黎海潮
黎海潮
Ứng dụng của các Mode trong Timer
Quét led, tạo xung pwm, đo tần số, định thời…
• Do mạch sử dụng thạch anh có tần số 12MHz => tần số xung nhịp cấp cho bộ timer/counter là
(1/12)*12=1MHz (Mỗi xung clock mất 1us).
• Do yêu cầu xung có tần số f = 2KHz =>T = 1/f = 0.5ms = 500us. =>Cần cho bộ timer/counter đếm 500
lần.
• Độ rộng mức 1 chiếm 70% => mình sẽ set chân P2.0 lên 1 timer/counter và cho đếm 350 lần.
• Độ rộng mức 0 chiếm 30% => tiếp theo, clear chân P2.0 về 0 và cho timer/counter đếm 150 lần.

• Ở đây sẽ chọn timer/counter 0, để thực hiện bài toán này. Do giá trị gán cho thanh ghi đếm vượt quá
255 nên mình sẽ sử dụng timer/counter 0 ở mode 黎海潮16 bit (TMOD = 0x01)
Sử dụng ngắt với mạch thời gian như thế nào:
• Để sử dụng ngắt với mạch thời gian, ta sử dụng 4 bit IE1/0 IT1/0 của thanh ghi
TCON
• Các bit IT1/0 là các bit xác định mức ngắt phần cứng cho 2 chân INT1 và INT0. Khi
Reset thi 2 bit này bằng 0 nghĩa là ngắt mức thấp.
• IE0 và IE1 dùng để xác định kiểu ngắt kích sườn phát xung. Nếu IT1 và IT0 bằng
không thì IE1 và IE0 không có tác dụng. Các bit IE1 và IE0 dùng để chốt sường phát
xung từ cao xuống thấp trên INT1 và INT0
• Khi có chuyển trang thái sườn xung trên INT1 và INT0 thì 8051 chuyển các bit IE1
IE0 từ 0 lên 1.

黎海潮

You might also like