Tải bản đầy đủ (.pdf) (36 trang)

TÀI LIỆU VI XỬ LÝ 8051 ĐẦY ĐỦ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.03 MB, 36 trang )

Chương 1: Tổng quan về vi xử lý và vi điều khiển
1.1 Giới thiệu chung về vi xử lý và vi điều khiển
1.2 Cấu trúc chung của hệ vi xử lý và vi điều khiển
1.3 Giới thiệu một số dòng vi điều khiển thông dụng
Chương 2: Cấu trúc và lập trình cho 8051
2.1 Cấu trúc và các ngoại vi của 8051
2.2 Ngơn ngữ lập trình cho 8051
2.3 Cấu trúc chương trình và lập trình C cho 8051
2.4 Hoạt động định thời và hoạt động ngắt của 8051
2.5 Ghép nối vi điều khiển với các ngoại vi cơ bản
2.5.1 Lập trình vào/ra với các cổng
2.5.2 Ghép nối và hiển thị với LED 7 thanh và LCD
Chương 3: Đo lường và điều khiển với 8051
3.1. Đo tốc độ, vị trí và lưu lượng sử dụng Encoder.
3.2. Đo lường và điều khiển sử dụng bộ chuyển đổi tương tự - số (ADC) và số tương tự (DAC).
3.3. Đo lường và điều khiển sử dụng các chuẩn giao tiếp nối tiếp
3.3.1 Giao tiếp SPI và I2C
3.3.2 Giao tiếp 1-wire
Tài liệu bắt buộc
1 Đỗ Duy Phú, Giáo trình vi xử lý, Nhà xuất bản giáo dục Việt Nam, 2015

1


Chương 1: Khái quát chung về vi xử lý và vi điều khiển
1.1 Giới thiệu chung về vi xử lý và vi điều khiển
Vi xử lý: (Micro-Processor):

-

CPU viết tắt của chữ Central Processing Unit , tạm dịch là đơn vị xử lí trung tâm.



-

Nhiệm vụ chính của CPU là xử lý các chương trình vi tính và dữ kiện.

-

Vi điều khiển, thực chất, là một hệ thống bao gồm một vi xử lý có hiệu suất đủ
dùng và giá thành thấp (khác với các bộ vi xử lý đa năng dùng trong máy tính) kết
hợp với các khối ngoại vi như bộ nhớ, các mô đun vào/ra, các mô đun biến đổi số
sang tương tự và tương tự sang số,...

CPU có thể được xem như não bộ, một trong những phần tử cốt lõi nhất của máy
vi tính.

CPU có nhiều kiểu dáng khác nhau. Ở hình thức đơn giản nhất, CPU là một con
chip với vài chục chân. Phức tạp hơn, CPU được ráp sẵn trong các bộ mạch với
hàng trăm con chip khác. CPU là một mạch xử lý dữ liệu theo chương trình được
thiết lập trước. Nó là một mạch tích hợp phức tạp gồm hàng triệu transistor
Vi điều khiển: là một máy tính được tích hợp trên một chíp, nó thường được sử dụng để
điều khiển các thiết bị điện tử.

-

Vi điều khiển thường được dùng để xây dựng các hệ thống nhúng. Nó xuất hiện
khá nhiều trong các dụng cụ điện tử, thiết bị điện, máy.
So sánh giữa vi xử lý và vi điều khiển

Embedded System (hệ thống nhúng)


-

Bộ xử lý được gắn (embedded) vào một ứng dụng cụ thể. Một sản phẩm embedded
chỉ sử dụng VXL hoặc VĐK để thực thi 1 công việc duy nhất;

-

Chỉ có một phần mềm ứng dụng
trong ROM;
vd:printer, keyboard, video game player

2

&

thông

thường

được

nộp


1.2 Cấu trúc chung của hệ vi xử lý và vi điều khiển
- CPU cho các máy tính

-

Vd: Intel’s x86, Motorola’s 680x0


(Sơ đồ khối một hệ máy tính căn bản)
1.3 Giới thiệu một số dịng vi điều khiển thơng dụng
Việc sử dụng các loại vi điều khiển và vi xử lý trong các thiết bị điện tử tự động ở Việt
Nam rất đa dạng, phong phú tùy vào yêu cầu kỹ thuật và giá thành sản phẩm.

-

Đối với các thiết bị như các máy ATM, máy giặt thường sử dụng vi điều khiển
8051,

-

Các bộ điều khiển trong robot công nghiệp, trong hệ thống ô tô thường sử dụng
PIC, AVR, PsoC,

- Trong điện thoại sử dụng các chip ARM…
Tiêu chí chọn vi điều khiển:
-

-

Đáp ứng yêu cầu về nhiệm vụ và giá thành thi công
o Tốc độ, lượng bộ nhớ, cổng I/O, timers,
gói, năng lượng tiêu thụ
o Dễ nâng cấp
o Giá thành

kích


cỡ,

đóng

Các cơng cụ phát triển phần mềm: Assember, bộ sửa lỗi, trình dịch C, mơ phỏng,
hỗ trợ kỹ thuật
Thị trường cung cấp sản phẩm tin cậy

3


Chương 2: Cấu trúc và lập trình cho 8051
2.1 Cấu trúc của 8051/ Sơ đồ khối của 8051

-

OSC: Bộ phát xung nhịp đồng bộ cho hệ thống, max: 24Mhz -> quyết định tốc độ xử
lý của 8051 (liên quan đến thời gian/lệnh, Timer, Interrupt );

-

ROM: Bộ nhớ chương trình 4K (lưu các mã lệnh của chương trình), ngày nay lên tới
128K: AVR 128, 1M: STM32F4 -> không cần quá quan tâm).

-

RAM: Bộ nhớ dữ liệu 128 byte(lưu trữ dữ liệu tạm thời, thanh ghi đặc biệt), ngày nay
lên tới 4K: AVR 128, 192K: STM32F4

-


Timer/Counter: Bộ đếm thời gian/bộ đếm xung.

-

I/O Port: Cổng vào/ra (P0, P1, P2, P3: 8 bit ~ 8 chân).

Interrupt Control: khối điều khiển ngắt
BUS Control: khối điều khiển các Bus địa chỉ (Address Bus), Bus dữ liệu (Address
Data), Bus điều khiển (Control Bus).

Serial port: Cổng truyền thông nối tiếp
Các thành viên họ 8051

4


a) Sơ đồ chân của 8051

-

Vcc (40): Chân cung cấp điện (5V)
GND (20): Chân nối đất (0V)
Port 0, Port1, Port 2 là các port xuất nhập 8-bit hai chiều.
Trong bất kỳ hệ thống nào sử dụng 8751, 89C51 hoặc DS5000 ta thường nối cổng P0 tới
các điện trở kéo.

cổng P0 tới các điện trở kéo
Chức năng vào/ra của 8051:
U1


U1
19
18

9

29
30
31

1
2
3
4
5
6
7
8

XTAL1

XTAL2

RST

PSEN
ALE
EA


P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

12V
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1

P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

39
38
37
36
35
34
33
32
21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17


19
18

9

XTAL1
XTAL2

RST

Q1

R1

MPS6531

10k

29
30
31

D1

1
2
3
4
5
6

7
8

LED-RED

PSEN
ALE
EA

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11

P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

AT89C51

AT89C51

Output

Input
5

39
38
37
36
35
34
33
32

21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17

R1
10k


Port 3 là Port xuất nhập 8-bit hai chiều. Port 3 cũng còn làm các chức năng khác của
AT89C51. Các chức năng này được liệt kê như sau:
Chân
Tên
Chức năng
P3.0
RxD
Ngõ vào Port nối tiếp
P3.1

TxD
Ngõ ra Port nối tiếp
P3.2
Ngõ vào ngắt ngoài 0
P3.3
Ngõ vào ngắt ngoài 1
P3.4
T0
Ngõ vào bên ngoài của bộ định thời 1
P3.5
T1
Ngõ vào bên ngoài của bộ định thời 0
P3.6
Điều khiển ghi bộ nhớ dữ liệu ngoài
P3.7
Điều khiển đọc bộ nhớ dữ liệu ngoài

-

Ngõ vào reset (chân 9) Mức cao trên chân này trong 2 chu kỳ máy trong khi bộ dao
động đang hoat động sẽ reset 8051. Mạch reset tác động bằng tay và tự động reset khi
khởi động máy

-

XTAL1 và XTAL2 (18,19) là hai ngõ vào được cấu hình để dùng như một bộ dao động
trên chip

-


EA (chân 31): External Access
o /EA nối mass chỉ định rằng code lưu trên bộ nhớ ngoài
o /PSEN & ALE dùng cho ROM ngồi
o Với 8051, 8031, 8032 thì /EA nối Vcc
o “/”: chỉ định tác động mức thấp

-

-

PSEN (chân 29): Program Store Enable
o Output, cho phép truy xuất bộ nhớ chương trình ngồi
o Nối tới chân /OE của ROM/EPROM
o Khi thực thi chương trình ở ROM nội, /PSEN
mức1

được

giữ



ALE (pin 30:Address Latch Enable
o Là chân output cho phép chốt địa chỉ để giải đa hợp (demultiplexing) bus dữ liệu
và bus địa chỉ
o ALE xuất tín hiệu để chốt địa chỉ (byte thấp địa chỉ 16-bit) vào 1 thanh ghi ngoài
trong
suốt
nửa
đầu

của
chu
kỳ
bộ
nhớ
(memory cycle). Trong nửa chu kỳ bộ nhớ còn lại, P0 sẽ xuất/nhập dữ liệu
o ALE có f=1/6fclock
o Có 1 ngoại lệ: trong thời gian thực thi lệnh MOVX, một xung ALE bị bỏ qua

6


Nguồn cho 8051 hoạt động: 5 VDC

Mạch dao động và Reset.

-

Chân 31 (EA/VPP) của VĐK 8051: Khi thiết kế mạch vi điều khiển khơng sử dụng
bộ nhớ ngồi để chứa chương trình (code) thực thi, cần nối chân (EA/VPP) này lên
nguồn dương (5V). Đây là chân chọn bộ nhớ lưu giữ chương trình thực thi của vi điều
khiển. Khi nối lên +5V là đã chọn thực thi chương trình từ bộ nhớ flash bên trong
VĐK.

-

Trở treo cho PORT P0: Đối với VĐK 8051, khi sử dụng chân của port P0 để điều
khiển thì phải sử dụng trở treo cho các chân port P0. Thường sử dụng trở băng 10k cho
8 chân của port P0.


-

Đưa ra các chân mạch nạp: Đây không phải là điều kiện để mạch hoạt động, nhưng
thiết kế mạch nên vẽ thêm các chân mạch nạp để trong quá trình test code sẽ nạp trực
tiếp onboard (chỉ dùng được với dịng 89S có hỗ trợ chuẩn nạp ISP) sẽ tiện lợi hơn rất
nhiều là khi các bạn cứ phải tháo chip ra vào, dễ làm gãy chân chip.
b) Các ngoại vi của 8051

-

Bàn phím Hex
Qt màn hình LED 7G
Chốt màn hình LED 7G
Giao tiếp với màn hình LCD
Ghép nối với ADC 0804
Ghép nối với DAC 0808
Điều khiển động cơ bước
Ma trận LED
7


-

Các cảm biến

2.2 Ngơn ngữ lập trình cho 8051
Lập trình hợp ngữ Asembly
setb
P2.0
jump

delay_ms
clr
P2.0
setb
P2.1
Lập trình C
P2.0=1
delay_ms (1000);
P2.0=0;
P2.1=1;
2.3 Cấu trúc chương trình và lập trình C cho 8051

Giới thiệu Keil-C

8


2.3.1 Cấu trúc chương trình lập trình C cho 8051

2.3.2 Khai báo biến, các phép toán và các cấu trúc của C / Biến số trong Keil-C

9


Các loại biến:

Lập trình C cho VXL
Hàm trong C
<kiểu_trả_về> <tên_hàm> (<kiểu_tham_biến> <tham_biến> )
vd: int Tong (int a, int b ){

int tong;
tong= a + b;
return tong;
}
Cách gọi hàm:
int c=0;
c= Tong (10, 2); //kết quả c = 12;
Cấu trúc điều khiển cơ bản trong Keil-C
- Cấu trúc so sánh: if, switch

-

Vòng lặp: for, while, do while
Cấu trúc if

Vòng lặp for

if (điều kiện)
{
tập lệnh 1;
}
else
{
tập lệnh 2;
}

for (i = 0; i < n ; i++)
{
khối lệnh;
}

Vịng lặp for vơ tận
for (;;)
{ khối lệnh
}

10


Cấu trúc switch

Vòng lặp while

switch (biểu thức nguyên)
{
case 1: {tập lệnh 1}
break;
case 2: {tập lệnh 2}
break;
….
default: {tập lệnh n}
}

while (biểu thức điều kiện)
{
khối lệnh;
}
Vòng lặp do while
do {
khối lệnh;
} while (biểu thức điều kiện)


Các lệnh xuất/nhập, định địa chỉ trên Keil:
Xuất/ nhập bit:

-

Định nghĩa chân của MCU:
sbit
LED1 = P1^0;
sbit
LED2 = P1^1;
sbit
KEY1 = P1^2;
sbit
KEY2 = P1^3;

-

Xuất /đọc:
LED1 = 0;
LED2 = 1;
LED1 = KEY1;
X = KEY2

-

Xuất/ nhập byte:
Xuất/đọc trực tiếp
P1=0xFF;
// gắn giá trị 0xFF vào cổng P1

P2=15;
// gắn giá trị 15 vào cổng P2
X=P2; // lưu giá trị cổng P2 vào biến X
Y=P0; // lưu giá trị cổng P0 vào biến Y
Xuất đọc gián tiếp: định nghĩa cổng sau đó gắn giá trị với cổng
#define DataPort P2
DataPort = 0xFE; // gắn giá trị 0xFE vào cổng P2
X = DataPort;
// lưu giá trị cổng P2 vào biến X

// bật LED1
// tắt LED2
// gắn giá trị KEY1 vào LED1
// lưu giá trị KEY2 vào biến X

//Khai báo thư viện sử dụng
#include <reg51.h> /*Khai báo thư viện 8051*/
#include <lcd.h>
/*Khai báo sử dụng thư viện LCD*/
#include <math.h>
/*Khai báo dùng thư viện toán*/
#include <absacc.h> /**/
//Định nghĩa biến, khai báo biến toàn cục
#define
Data P0
/*gắn P0 vào biến Data*/
sbit
LED = P2^2; /*gắn LED vào P2^2*/
unsigned char
x,y;

/*khai báo biến toàn cục*/
11


2.3.3 Ứng dụng điều khiển LED đơn bằng nút bấm
C1
U1

1
22pF

CRYSTAL

C2

18

2

C3

19

X1

XTAL1
XTAL2

10nF
22pF

9

R10

29
30
31

10k

330

1
2
3
4
5
6
7
8

330
330
330

RST

PSEN
ALE
EA


P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
AT89S52

Ví dụ 1: Ấn nút đèn P1.0 sáng, buông tay đèn tắt

Ví dụ 2:

12

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12

P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

39
38
37
36
35
34
33
32
21
22
23
24
25
26
27
28
10
11

12
13
14
15
16
17

R4
10k


2. 4. Hoạt động định thời và hoạt động ngắt của 8051
2.4.1 Timer/Counter
- Timer/Counter (T/C) là module định thời/đếm trong hệ thống MCU.

-

MCU 8051 có 2 bộ T/C (Timer0 và Timer1). Đối với MCU 8052 cịn có thêm bộ Timer2.
Chức năng cơ bản của T/C là tạo thời gian trễ và đếm sự kiện.

Ngồi ra các bộ T/C cịn được dùng trong một số ứng dụng như: đo tần số, đo độ rộng
xung, tạo chu kỳ lấy mẫu trong hệ thống điều khiển số, tạo tốc độ baud cho cổng nối
tiếp…
a) Giới thiệu về Timer/counter
Counter (C/T=1) đếm các xung ở chân vi điều khiển (T0/T1). Có thể là xung rời rạc

8051 dùng thạch anh ngoài:

13



Các thanh ghi cho Timer/counter

Thanh ghi TCON: Là thanh ghi 8 bit, có thể truy xuất byte hoặc bit dùng để điều khiển hoạt
động của Timer.

Thanh ghi TMOD: Là thanh ghi 8 bit, chỉ có thể truy xuất byte dùng để xác định chế độ
hoạt động của Timer.

M0, M1: Chọn chế độ hoạt động của Timer/Couter (T/C)

14


Chế độ 0: TLx chỉ được sử dụng 5 bit đầu để ghép với 8bit của THx, tạo thành 13 bit. Thời
gian tối đa có thể định thời là 213 = 8192 us (với thạch anh 12MHz)

Chế độ 1: Thời gian tối đa có thể định thời là 216 = 65536 us.

Chế độ 2: Chế độ 8 bit, tự động nạp lại. Khi đó TLx hoạt động để đếm (định thời), còn THx
chứa giá trị nạp lại. Khi xảy ra tràn, TFx được bật lên, đồng thời cho phép giá trị của THx
được nạp vào TLx

15


Chế độ 3: Bộ định thời/bộ đếm 8 bit. Tuy nhiên chỉ sử dụng hai thanh ghi TH0 và TL0 (TH0
thay vai trị của TH1, TH1 khơng được sử dụng)

GATE, C/ T: điều khiển trạng thái hoạt động cho Timer/Counter.


VD với Timer 0:
• Khi GATE = 0 thì Y1 =1, do đó Y2 = TR0, bộ định thời được khởi động bằng lệnh “
TR0 =1”
• Nếu GATE = 1, Y1= P3.2, do “Y2 = Y1 and TR0 = P3.2 and TR0” do đó việc khởi
động và dừng bộ định thời có thể được thực hiện từ bên ngồi qua chân P3.2 đối với
Timer0. Mặc dù rằng TRx (nói chung cho TR0 và TR1) được bật lệnh bằng lệnh gán
“TRx = 1” thì cũng cho phép ta khởi động và dừng bộ định thời từ bên ngoài tại bất
kỳ thời điểm nào thông qua công tắc chuyển mạch đơn giản.

16


Các bước lập trình cho chế độ 1
- B1. Nạp giá trị TMOD cho thanh ghi báo độ định thời nào (Timer0 hay Timer1) được
sử dụng và chế độ nào được chọn.

-

B2. Nạp các thanh ghi TL và TH với các giá trị đếm ban đầu.

-

B4. Duy trì kiểm tra cờ bộ định thời TF bằng một vòng lặp để xem nó được bật lên 1
khơng. Thốt vịng lặp khi TF được lên cao.

-

B5. Dừng bộ định thời.


B3. Khởi động bộ định thời: Điều này được thực hiện bởi việc gán “TRx =1”. Khi
này bộ định thời bắt đầu đếm tiến.

B6. Xố cờ TF cho vịng kế tiếp.
B7. Quay trở lại bước 2 để nạp lại TL và TH.

Tìm ra được các giá trị cần thiết cho các thanh thi TH và TL:
Ví dụ sau với việc sử dụng tần số dao động XTAL = 12 MHz đối với hệ thống 8051, dung
T/C ở chế độ 1 – 16 bit):
Các bước để tìm các giá trị của các thanh ghi TH và TL:
1. Chia thời gian trễ cần thiết cho 1(us): n
2. Thực hiện 65536 (216) – n với n là giá trị thập phân nhận được từ bước 1.
3. Chuyển đổi kết quả ở bước 2 sang số Hex: ta có YYXX là giá trị Hexa ban đầu cần phải
nạp vào các thanh ghi bộ định thời.
4. Đặt TL = XX và TH = YY.
Ví dụ: XTAL = 12MHz, muôn tạo trễ=1ms, sử dụng chế độ 1, chọn Timer 0, tính giá trị
nạp ban đầu cho thanh ghi TH

-

Bước 1: n=1000;
Bước 2: 65536 – 1000 = 64536;
Bước 3: Đổi số 64536 (hệ số 10) sang hệ Hexa (hệ số 16) = FC18

Bước 4: Do vậy, giá trị nạp vào TH0 là 0xFC Và TL0 là 0x18
void delay_1ms (void) {
//định nghĩa hàm delay
TMOD=0x01;
//chọn timer0 chế độ 1 16Bit
TL0=0x18;

//nạp giá trị cho TL0
TH0=0xFC;
//nạp giá trị cho TH0
TR0=1;
//khởi động timer0
while(!TF0){}
//vòng lặp kiểm tra cờ TF0
TR0=0;
//ngừng timer0
TF0=0;
//xóa cờ TF0
}
Ví dụ chế độ 2
#include<at89x51.h> //khai báo thư viện cho VĐK 89x51
void delay_1ms(void); //khi báo nguyên mẫu hàm con tạo trễ
main()
{
TMOD=0x20; //chọn timer1, chế độ 2, 8Bit, tự nạp lại
17


TH1=0x00; //nạp giá trị cho TH1
TL1=0xFE; //nạp giá trị cho TL1
P1_5=1; //Chân P1_5 ở mức cao
while(1) //vịng lặp vơ hạn
{
Delay_1ms(); //gọi chương trình con tạo trễ
P1_5=~P1_5; //đảo tín hiệu chân P1_5
}
}

Ví dụ về sử dụng counter
#include <REGX52.H>
char chu[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
unsigned char low, high;
main(){
P0=chu[0];
TMOD=0x06; // Counter 0, che do 2
TR0 = 1;
TH0=0x00;
TL0=0x00;
while(1) {
high = TH0;
low = TL0;
if(low>9) TL0=0x00;
P0=chu[low];
}
}

C1
1

10k
22pF

U1
X1

19

CRYSTAL

2

C2

18

XTAL1

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7

XTAL2

22pF
9

29
30
31

C3

RST


P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15

PSEN
ALE
EA

10nF

R10
10k

1
2
3
4
5
6
7
8

P1.0
P1.1
P1.2

P1.3
P1.4
P1.5
P1.6
P1.7

P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

100

39
38
37
36
35
34
33
32
21
22
23
24
25

26
27
28

R17
10k

10
11
12
13
14
15
16
17
Dem

AT89S52

Sơ đồ mô phỏng đếm sự kiện

18


2.4.2 Lập trình ngắt
ĐN Ngắt (Interrupt) : là một số sự kiện khẩn cấp bên trong hoặc bên ngoài bộ vi điều
khiển xảy ra, buộc vi điều khiển tạm dừng thực hiện chương trình hiện tại, phục vụ ngay lập
tức nhiệm vụ mà ngắt yêu cầu – nhiệm vụ này gọi là trình phục vụ ngắt (ISR: Interrupt
Service Routine).
Cấu trúc khai báo trình phục vụ ngắt

void int0_ISR(void) interrupt 0 //using 1
{
}
void timer0_ISR(void) interrupt 1 //using 2
{
}
Ví dụ:
void int1_ISR(void) interrupt 2 // Hàm phụ vụ ngắt ngoài 1
{
}
void timer1_ISR(void) interrupt 3 // Hàm phụ vụ ngắt timer 1
{
}
void uart_ISR(void) interrupt 4 // Hàm phụ vụ ngắt truyền thông UART
{
}
Bảng vector ngắt 8051

19


Thanh ghi hệ thống ngắt
Thanh ghi cho phép ngắt IE

Thanh ghi ưu tiên IP

Cài đặt Interrup
- Đặt chế độ và lựa chọn nguồn ngắt

-


Thiết lập chế độ ưu tiên khi có nhiều ngắt

Cho phép ngắt EA = 1
VD: Cho phép ngắt INT0 và Timer 1
TMOD=0x01; //Timer0 chế độ 1
EX0 = 1;
// cho phép ngắt ngoài 0
ET1=1;
// Cho phép ngắt timer 1
TR0=1;
//Khởi động Timer0
TR0=0;
//Dừng Timer0

20


Ngắt ngồi:
Có hai kiểu ngắt ngồi: ngắt theo mức và theo sườn

-

Theo mức: mặc định của 8051 là ngắt theo mức 0
Theo sườn: sườn âm
Việc lựa chọn kiểu ngắt: sử dụng bit IT0 và IT1 trong thanh ghi TCON

Điều kiện để VĐK nhận biết được ngắt ngoài

(Thời gian tối thiểu của xung ngắt theo mức)


(Thời hạn xung tối thiểu để phát hiện ra các ngắt theo sườn âm)

(Các bước cho phép ngắt)

21


Ngắt Timer

Ví dụ: Hãy viết chương trình điều khiển 3 LED (D1-D3) nhấp nháy ở cổng P1 và hẹn giờ
cứ 10 giây lại bật đèn LED D4 , đèn sẽ tắt sau vài giây. Hãy sử dụng bộ Timer0 để hẹn giờ,
tần số của 8051 là XTAL = 12MHz
C1
U1

1
22pF

CRYSTAL

C2
2

C3

19

X1


18

XTAL1
XTAL2

10nF
22pF
9

R10

29
30
31

10k

D1
330

330
330

D2
D3
D4

330

1

2
3
4
5
6
7
8

RST

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15

PSEN
ALE
EA


P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

2.4.3 Các ứng dụng ngắt và Timer
a) Ứng dụng đếm sản phẩm và hiển thị trên LED 7 thanh
22

39
38
37
36
35
34
33

32
21
22
23
24
25
26
27
28
10
11
12
13
14
15
16
17


C1
10k

U1

1
22pF

X1

19


CRYSTAL
2

C2

18

XTAL1
XTAL2

22pF
9

29
30
31

C3

RST

PSEN
ALE
EA

10nF

R10
10k


1
2
3
4
5
6
7
8

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
AT89S52

b) Điều khiển ngắt theo mức

23

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5

P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

100

39
38
37
36
35
34
33
32
21

22
23
24
25
26
27
28
10
11
12
13
14
15
16
17

R17

R4

10k

10k

GIAM
TĂNG


C1
10k

1

U1

22pF

X1

19

CRYSTAL
2

C2

18

XTAL1
XTAL2

22pF
9

RST

C3
10nF
29
30
31


R10

D1

PSEN
ALE
EA

D2

10k
220
220

1
2
3
4
5
6
7
8

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5

P1.6
P1.7

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

21
22

23
24
25
26
27
28
10
11
12
13
14
15
16
17

AT89S52

c) Lập trình bộ đo tần số sử dụng ngắt ngoài, ngắt Timer

24

100

39
38
37
36
35
34
33

32

Ngat

R17

R19

10k

10k

Thuong


2. 4.4 Giới thiệu bài toán đo tốc độ động cơ sử dụng Encoder

#include <AT89X52.h>
#include <stdio.h>
#define LED1 P2_0
#define LED2 P2_1
#define LED3 P2_2
#define LED4 P2_3
//Khai bao cac ham con
void delay_ms(unsigned int Time);
void hienthi(int n) ;
char nghin,tram, chuc, donvi;
int time=0;
int tocdo,f;
int xung=0;

static unsigned char LED7SEG[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //LED 7 thanh
//Khai bao ham phuc vu ngat ngoai INT0
void ngatINT0() interrupt 0
{
xung++;
}
// Khai bao ham phuc vu ngat Timer 0
void timer0() interrupt 1
{
//
TR0=0;
time++;
25


×