lập trình c cho 8051 (phần 2) - hcmut.edu.vnbmthanh/vixuly/vxl-ch06-laptrinhc8051_p2.pdf ·...

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Ử 1 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

Upload: doanh

Post on 07-May-2019

224 views

Category:

Documents


0 download

TRANSCRIPT

ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOAKHOA ĐIỆN-ĐIỆN TỬ

BỘ MÔN KỸ THUẬT ĐIỆN TỬ

11

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

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

Nội dung

1. Điều khiển ngoại via) 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 3

Nội dung

1. Điều khiển ngoại via) 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

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);

• 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.

4

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

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

Giới thiệu

• Hàm DELAY_ms(1000);

5

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

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

6

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

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)

7

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

Các ví dụ

8

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

Các ví dụ

9

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

VD 2

10

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

VD 3

11

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

Counter

12

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.

T1

P3.5

P1

1Hz

TL1

TH1

LEDs

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

Counter

13

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 14

Nội dung

1. Điều khiển ngoại via) 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

Giới thiệu• Hai thanh ghi truy cập đến cổng nối tiếp là SBUF và SCON

• Ngoài ra còn có bit SMOD thuộc thanh ghi PCON để điều khiển tỷ lệ của tốc độ baud

15

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.

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

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

16

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

Ví dụ

17

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 18

Nội dung

1. Điều khiển ngoại via) 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

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)

19

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

Thanh ghi IE và IPMSB 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)

20

MSB Thanh ghi IP LSB

-- -- PT2 PS PT1 PX1 PT0 PX0

PT2: Ưu tiên cho ngắt timer2 (8052).

PS: Ưu tiên cho ngắt nối tiếp.

PT1: Ưu tiên cho ngắt timer1.

PX1: Ưu tiên cho ngắt ngoài 1.

PT0: Ưu tiên cho ngắt timer0.

PX0: Ưu tiên cho ngắt ngoài 0.

(mức 0 = không ưu tiên, mức 1 = ưu tiên)

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

Địa chỉ vector ngắt

21

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

Ngắt timer

VD1: Tạo xung vuông trên chân P1.0 dùng ngắt timer

22

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

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.

23

Switch

LED

P1.0P1.7

8051

P1.3

200ms

Sử dụngTimer 0, mode 2.

100ms /1.085ms =92

TH0=256-92=164=A4H

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

VD 2

24

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

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

25

Switch

LED

P1.0P1.7

8051

P1.3

200ms

TxDSerial Port

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

VD 3

26

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

Nội dung

1. Điều khiển ngoại via) 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 28

A[8..15]

AD[0..7]

AD

0

AD

1

AD

2

AD

3

AD

4

AD

5

AD

6

AD

7

EN

RS

RS

EN

A13

A14

A15

GND

VDD

XTAL218

XTAL119

RST9

P3.0/RXD10

P3.1/TXD11

P3.2/INT012

P3.3/INT113

P3.4/T014

P3.7/RD17

P3.6/WR16

P3.5/T115

AD[0..7]

A[8..15]

ALE30

EA31

PSEN29

P1.01

P1.12

P1.23

P1.34

P1.45

P1.56

P1.67

P1.78

U1

8051

PROGRAM=TN8051.hex

SRCFILE=P1_toggle.c

D03

Q02

D14

Q15

D27

Q26

D38

Q39

D413

Q412

D514

Q515

D617

Q616

D718

Q719

OE1

LE11

U2

74LS373

D7

14

D6

13

D5

12

D4

11

D3

10

D2

9D

18

D0

7

E6

RW

5R

S4

VS

S1

VD

D2

VE

E3

LCD2LM032L

X1

12MHz

C133p

C233p

2

3

1

U3:A

74LS28

A1

B2

C3

E16

E24

E35

Y015

Y114

Y213

Y312

Y411

Y510

Y69

Y77

U4

74LS138

D1LED-BIRG

R1

220R

D2LED-BIRG

R2

220R

R3220R

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

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.

29

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

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.

30

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

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.

31