lập trình c cho 8051 (phần 2) - hcmut.edu.vnbmthanh/vixuly/vxl-ch06-laptrinhc8051_p2.pdf ·...
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• 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 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
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
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 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