You are on page 1of 31

ĐẠI HỌC QUỐC GIA TP.

HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN-ĐIỆN TỬ
BỘ MÔN KỸ THUẬT ĐIỆN TỬ

CHƯƠNG 5

Lập trình C cho 8051


(Phần 2)
Bùi Minh Thành
Bộ môn Kỹ thuật Điện tử - ĐHBK Tp. HCM

1 CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
1. Điều khiển ngoại vi
a) Timer
b) Cổng nối tiếp
c) Ngắt
2. Bài tập

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
2
Nội dung
1. Điều khiển ngoại vi
a) Timer
b) Cổng nối tiếp
c) Ngắt
2. Bài tập

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
3
Giới thiệu
• Hàm sau dùng để tạo trễ theo đơn vị ms (Cho
tần số xung nhịp của 8051 là 12Mhz). Ví dụ
muốn trễ 1s ta gọi Delay_ms(1000);
Hàm này được phát
triển bằng cách sử
dụng chức năng
Performance Analyzer
của Keil C

• Rất khó để tạo khoảng thời gian trễ chính xác


nếu không có sự hỗ trợ của Compiler.
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4
Giới thiệu
• Hàm DELAY_ms(1000);

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
5
Giới thiệu
• Timer cho phép ta định khoảng thời gian trễ chính xác và dễ dàng
hơn. Để thiết lập chế độ hoạt động và điều khiển các timer (timer
0, 1), ta phải tác động lên hai thanh ghi TMOD và TCON
MSB Thanh ghi TMOD LSB
GATE C/T M1 M0 GATE C/T M1 M0
Timer1 Timer0
GATE: bit mở cổng
1 – Timer dùng để đo độ rộng xung trên chân INT0(INT1). Timer chạy khi INT và bit TR ở
mức cao.
0 – Timer dùng để định thời hoặc đếm sự kiện. Timer chạy khi bit TR ở mức cao.
C/T: Bit chọn counter hay timer
0 - Chế độ định thời với tốc độ đếm bằng 1/12 tốc độ xung clock hệ thống.
1 - Chế độ đếm sự kiện (thông qua chân T0 hoặc T1) với tốc độ đếm tối đa là 500kHz với
thạch anh 12MHz.
M1, M0: dùng để xác định chế độ hoạt động của timer.
00 - chế độ 0, timer 13 bit.
01 - chế độ 1, timer 16 bit.
10 - chế độ 2, timer 8 bit, tự động nạp lại giá trị đầu.
11 - chế độ 3, tách timer. TL0 là timer 8 bit, điều khiển bởi các bit chế độ của timer0, TH0 là
timer 8 bit, điều khiển bởi các bit chế độ của timer1.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
6
Thanh ghi TCON
MSB Thanh ghi TCON LSB
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TFx: Cờ báo tràn của timer, đặt lên 1 bởi phần cứng khi timer tràn, được xoá về 0
bằng phần mềm hoặc bằng phần cứng nếu cờ tràn làm cho chương trình phục vụ
ngắt (ISR) được gọi.
TRx: Bit điều khiển timer chạy. Được đặt/xoá bằng phần mềm để cho timer
dừng/chạy.
(x = 1: timer1, x = 0: timer0)
IEx: Cờ cạnh ngắt ngoài. Đặt bởi phần cứng khi phát hiện cạnh xuống ở chân INTx,
xoá bằng phần mềm hoặc phần cứng khi CPU chỉ đến ISR.
ITx: Cờ kiểu ngắt. Được thiết lập bằng phần mềm:
1 - Ngắt ngoài tích cực cạnh xuống.
0 - Ngắt ngoài tích cực mức thấp.
(x = 1: ngắt ngoài 1, x = 0: ngắt ngoài 0)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
7
Các ví dụ
VD1: Viết chương trình để bật tắt các bit của port 1 liên tục với một
khoảng thời gian trễ (sử dụng timer 0)

Cho thạch anh 12Mhz. Tính khoảng


thời gian trễ của hàm T0Delay()?

FFFFH-3500H+1=CB00H=51968
1 ms  51968  52ms

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
8
Các ví dụ
VD2: Một SW được nối vào P1.0 và LED được nối vào P1.7. Viết
chương trình giám sát trạng thái SW và tạo các xung sau trên chân P1.7
SW=0: 500 Hz;
SW=1: 750 Hz. Dùng timer với thạch anh 11.059Mhz

f = 500Hz -> T = 2000us -> Tdelay = 1000us = 921TM= 399H TM


TH0:TL0 = FFFF + 1 – 399 = FC67H

f = 750Hz -> T = 1333us -> Tdelay = 666us = 614TM = 266H TM


TH0:TL0 = FFFF + 1 – 266A = FD9AH

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
9
VD 2

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
10
VD 3
VD3: Viết chương trình tạo xung 1Hz trên chân P1.7. Thạch anh 12Mhz

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
11
Counter
VD4: Giả sử xung 1Hz được nối đến chân T1 (P3.5) của timer. Viết chương trình
cho counter 1 hoạt động ở mode 2 đếm lên và hiển thị giá trị của TL1 lên P1.

TH1
P1
TL1 LEDs

P3.5
1Hz T1

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
12
Counter
VD4: Giả sử xung 1Hz được nối đến chân T1 (P3.5) của timer. Viết chương trình
cho counter 1 hoạt động ở mode 2 đếm lên và hiển thị giá trị của TL1 lên P1.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
13
Nội dung
1. Điều khiển ngoại vi
a) Timer
b) Cổng nối tiếp
c) Ngắt
2. Bài tập

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
14
Giới thiệu
• Hai thanh ghi truy cập đến cổng nối tiếp là SBUF và SCON
MSB Thanh ghi SCON LSB
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0,SM1: xác định chế độ hoạt động cho cổng nối tiếp.
00 - chế độ 0, cổng nối tiếp trở thành thanh ghi dịch, dữ liệu vào và ra trên chân RXD, chân TXD
là ngõ ra của xung nhịp dịch. Tốc độ baud cố định và bằng 1/12 lần tần số mạch dao động trên chip.
01 - chế độ 1, hoạt động ở chế độ UART 8 bit, tần số thay đổi được, chỉnh bằng timer.
10 - chế độ 2, hoạt động ở chế độ UART 9 bit, tần số cố định và bằng 1/12 tần số dao động trên
chip.
11 - chế độ 3, UART 9 bit, tần số thay đổi được, chỉnh bằng timer.
SM2: sử dụng trong truyền thông đa xử lý trong các chế độ 2 và 3. sẽ không được kích hoạt nếu bit 9 của
bộ thu là 0.
REN: bit cho phép bộ thu, phải đặt lên 1 để thu các ký tự.
TB8: bit truyền 8, là bit thứ 9 được phát đi trong các chế độ 2 và 3. Được đặt xóa bằng phần mềm.
RB8: bit nhận 8, là bit thứ 9 nhận được.
TI: cờ ngắt phát. Được đặt lên 1 khi kết thúc truyền ký tự, xoá bằng phần mềm.
RI: cờ ngắt thu. Được đặt lên 1 khi kết thúc nhận ký tự, xoá bằng phần mềm.

• Ngoài ra còn có bit SMOD thuộc thanh ghi PCON để điều khiển tỷ lệ của tốc độ
baud
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
CuuDuongThanCong.com https://fb.com/tailieudientucntt
15
Hoạt động
• Bước 1: Cài đặt chế độ hoạt động trong thanh ghi SCON
• Bước 2: Thiết lập tốc độ baud (tốc độ tràn của timer 1)
• Bước 3: Đọc/ghi byte dữ liệu (SBUF)
• Bước 4: Đợi RI/TI được bật lên 1

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
16
Ví dụ
Viết chương trình dùng để truyền ký tự “A” nối tiếp với tốc độ baud là
4800. Sử dụng 8-bit dữ liệu và 1 stop bit

Solution :
#include <reg51.h>
void main(void) {
TMOD=0x20; SCON=0x50;
TH1=0xFA; //4800 baud rate
TR1=1;
while (1) {
SBUF=‘A’;
while (!TI);
TI=0;
}
}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
17
Nội dung
1. Điều khiển ngoại vi
a) Timer
b) Cổng nối tiếp
c) Ngắt
2. Bài tập

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
18
Giới thiệu
• Trong 8051 có tất cả 5 nguồn ngắt gồm: ngắt
ngoài 0, ngắt timer0, ngắt ngoài 1, ngắt timer1
và ngắt của cổng nối tiếp.
• Khi sử dụng cần quan tâm đến hai thanh ghi:
– Thanh ghi cho phép ngắt (IE)
– Thanh ghi điều khiển chế độ ưu tiên (IP)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
19
Thanh ghi IE và IP
MSB Thanh ghi IE LSB
EA -- ET2 ES ET1 EX1 ET0 EX0
EA: Cấm hoặc cho phép tất cả các ngắt không bị che.
ET2: Cấm hoặc cho phép ngắt timer2 (8052).
ES: Cấm hoặc cho phép ngắt từ cổng nối tiếp.
ET1: Cấm hoặc cho phép ngắt timer1.
EX1: Cấm hoặc cho phép ngắt ngoài 1.
ET0: Cấm hoặc cho phép ngắt timer0.
EX0: Cấm hoặc cho phép ngắt ngoài 0.
(0 = Cấm, 1 = cho phép)

MSB Thanh ghi IP LSB


-- -- PT2 PS PT1 PX1 PT0 PX0

PT2: Ưu tiên cho ngắt timer2 (8052). PT0: Ưu tiên cho ngắt timer0.
PS: Ưu tiên cho ngắt nối tiếp. PX0: Ưu tiên cho ngắt ngoài 0.
PT1: Ưu tiên cho ngắt timer1. (mức 0 = không ưu tiên, mức 1 = ưu tiên)
PX1: Ưu tiên cho ngắt ngoài 1.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
20
Địa chỉ vector ngắt
Interrupt Vector address Interrupt number

External 0 0003h 0

Timer 0 000Bh 1

External 1 0013h 2

Timer 1 001Bh 3

Serial 0023h 4

Cú pháp chương trình phục vụ ngắt:

void ngat_noi_tiep(void) interrupt 4 using 1 {


/* Cac lenh can thuc thi */
}
interrupt 4 using 1 dùng để khai báo cho trình biên dịch biết đây là ISR của cổng
nối tiếp (interrupt 4) và trong chương trình nếu cần sử dụng các thanh ghi R0-R7
thì sẽ sử dụng trong vùng bank 1 (using 1).

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
21
Ngắt timer
VD1: Tạo xung vuông trên chân P1.0 dùng ngắt timer

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
22
Ngắt timer
VD 2: Viết chương trình liên tục đọc 1 bit từ dữ liệu từ P1.0 và xuất
nó ra P1.3. Trong khi đó đồng thời tạo xung vuông có chu kz 200us
trên chân P1.7.
Sử dụng timer 0 để tao xung, giả sử thạch anh là 11.059MHz.

8051
Sử dụngTimer 0, mode 2.
100ms /1.085ms =92
P1.3 LED
TH0=256-92=164=A4H

200ms
Switch P1.0
P1.7

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
23
VD 2

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
24
Ngắt timer và cổng nối tiếp
VD3: Viết chương trình liên tục đọc 1 bit dữ liệu từ P1.0
và xuất nó ra P1.3. Trong khi đó liên tục:
- Tạo xung vuông có chu kz 400us trên chân P1.7
- Gửi k{ tự ‘A’ đến cổng nối tiếp
Sử dụng ngắt timer 0 để tạo xung vuông, thạch anh
11.059Mhz, tốc độ baud là 9600
8051

P1.3 LED

200ms
Switch P1.0
P1.7
Serial Port TxD
Bộ môn Kỹ Thuật Điện Tử - ĐHBK
CuuDuongThanCong.com https://fb.com/tailieudientucntt
25
VD 3

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
26
Nội dung
1. Điều khiển ngoại vi
a) Timer
b) Cổng nối tiếp
c) Ngắt
2. Bài tập

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
27
LCD2
LM032L

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

RS 4
5
EN 6

7
8
9
10
11
12
13
14
C1 C2 GND
33p 33p VDD

X1 U1
19 AD[0..7]
XTAL1 AD[0..7]
A[8..15]

AD7
AD6
AD5
AD4
AD3
AD2
AD1
AD0
12MHz
18
A[8..15] U2
XTAL2
3 2
D0 Q0
30 4 5
ALE D1 Q1
31 7 6
EA D2 Q2
R3 9
RST PSEN
29 8
D3 Q3
9
220R 13 12
D4 Q4
14 15
D5 Q5
17 16
D6 Q6
1 10 18 19
P1.0 P3.0/RXD D7 Q7
2 11
P1.1 P3.1/TXD
R1 3 12 1
P1.2 P3.2/INT0 OE
4 13 11
P1.3 P3.3/INT1 LE
220R 5 14 EN
P1.4 P3.4/T0
6 15 RS 74LS373
P1.5 P3.5/T1
D1 R2 7
P1.6 P3.6/WR
16
LED-BIRG 8 17
P1.7 P3.7/RD
220R
D2 8051
LED-BIRG PROGRAM=TN8051.hex
SRCFILE=P1_toggle.c

U4
A13 1 15
A14 2
A Y0
14 U3:A
B Y1
A15 3 13 2
C Y2
12 1
Y3
11 3
Y4
6 10
E1 Y5
4 9 74LS28
E2 Y6
5 7
E3 Y7
74LS138

Bộ môn Kỹ Thuật Điện Tử - ĐHBK CuuDuongThanCong.com https://fb.com/tailieudientucntt


28
Bài tập
Bài tập 1: Viết chương trình hiển thị “Hello world”
lên LCD 16x2
Bài tập 2: Viết chương trình đếm số lần nhấn nút
(từ 000 đến 255) và hiển thị lên LCD 16x2
Bài tập 3: Viết chương trình tạo xung 1Khz, duty
cycle là 40% trên chân P1.7, trong khi đó liên tục
phát chuỗi k{ tự “Hello world” ra LCD 16x2.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
29
Bài tập
Bài tập 4: Viết chương trình nhận một k{ tự từ
cổng nối tiếp
- Nếu k{ tự này từ a – z thì chuyển sang hoa A – Z rồi
phát ra cổng nối tiếp.
- Ngược lại thì phát nó ra cổng nối tiếp.
- Trong khi đó liên tục tao xung vuông 500Hz trên chân
P1.3
Yêu cầu dùng ngắt cổng nối tiếp, thạch anh 12Mhz, tốc độ
baud 9600.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
30
Tài liệu tham khảo
• Hồ Trung Mỹ, Vi xử l{, Nhà xuất bản Đại học Quốc Gia
Tp. HCM - 2003
• I. Scott MacKenzie , The 8051 Microcontroller, 2nd
Edition, Prentice-Hall, 1995
• Derek Molloy, EE402 - Lecture note
• Slide bài giảng thầy Hồ Trung Mỹ
• Thomas W.Schultz, C and the 8051 – Second Edition.
• Dogan Ibrahim, Microcontroller Projects in C for the
8051, Newnes – 2000.
• Và nhiều tài liệu trên mạng.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK


CuuDuongThanCong.com https://fb.com/tailieudientucntt
31

You might also like