Giáo trình Vi điều khiển 8051 Assembly - Chương 10: Truyền thông nối tiếp của 8051

Các máy tính truyền dữ liệu theo hai cách: Song song và nối tiếp. Trong truyền

dữ liệu song song thường cần 8 hoặc nhiều đường dây dẫn để truyền dữ liệu đến một

thiết bị chỉ cách xa vài bước. Ví dụ của truyền dữ liệu song song là các máy in và các

ổ cứng, mỗi thiết bị sử dụng một đường cáp với nhiều dây dẫn. Mặc dù trong các

trường hợp như vậy thì nhiều dữ liệu được truyền đi trong một khoảng thời gian ngắn

bằng cách dùng nhiều dây dẫn song song nhưng khoảng cách thì không thể lớn được.

Để truyền dưdx liệu đi xa thì phải sử dụng phương pháp truyền nối tiếp. Trong truyền

thông nối tiếp dữ liệu được gửi đi từng bít một so với truyền song song thì một hoặc

nhiều byte được truyền đi cùng một lúc. Truyền thông nối tiếp của 8051 là chủ đề của

chương này. 8051 đã được cài sẵn khả năng truyền thông nối tiếp, do vậy có thể

truyền nhánh dữ liệuvới chỉ một số ít dây dẫn.

pdf17 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 5486 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình Vi điều khiển 8051 Assembly - Chương 10: Truyền thông nối tiếp của 8051, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 
XTAL = 10.0592MHz. 
3. Nạp giá trị 50H vào thanh ghi SCON để báo sử dụng chế độ truyền nối tiếp 1 là 
dữ liệu được đóng gói bởi 8 bít dữ liệu, 1 bít Start và 1 bít Stop. 
4. Bật TR1 = 1 để khởi động Timer1. 
5. Xoá cờ ngắt RI bằng lệnh “CLR RI” 
6. Bít cờ RI được hiển thị bằng lệnh “JNB RI, xx” để xem toàn bộ ký tự đã được 
nhận chưa. 
7. Khi RI được thiết lập thì trong SBUF đã có 1 byte. Các nội dung của nó được 
cất lưu vào một nơi an toàn. 
8. Để nhận một ký tự tiếp theo quay trở về bước 5. 
Ví dụ 10.4: 
 Hãy lập trình cho 8051 để nhận các byte dữ liệu nối tiếp và đặt chúng vào cổng 
P1. Đặt tốc độ baud là 4800, 8 bít dữ liệu và 1 bít Stopl. 
Lời giải: 
 MOV TMOD, #20H ; Chọn bộ Timer1, chế độ 2 (tự động nạp lại) 
 MOV TH1, # - 6 ; Chọn tốc độ 4800 baud 
MOV SCON, #50H ; Chọn khung dữ liệu 8 bít Stop, bít. 
 SETB TR1 ; Khởi động bộ Timer1 
 HERE: JNB R1, HERE ; Đợi nhận toàn bộ lý tự vào hết 
 MOV A, SBUF ; Lưu cất ký tự vào thanh A 
 MOV P1, A ; Gửi ra cổng P.1 
 CLR RI ; Sẵn sàng nhận byte kế tiếp 
 SJMP HERE ; Tiếp tục nhạn dữ liệu 
Ví dụ 10.5: 
 Giả sử cổng nối tiếp của 8051 được nối vào cổng COM của máy tính IBM CP 
và mà đang sử chương trình Termina. Exe để gửi và nhận dữ liệu nối tiếp. Cổng P1 và 
P2 của 8051 được nố tới các đầ LED và các công tắc chuyển mạch tương ứng. Hãy 
viết một chương trrình cho 8051. 
a) Gửi thông báo “We Are Ready” (chúng tôi đã sẵn sàng) tới máy tính PC. 
b) Nhận bất kỳ dữ liệu gì được PC gửi đến và chuyển đến các đèn LED đang nối đến 
các chân của cổng P1. 
c) Nhận dữ liệu trên các chuyển mạch được nối tới P2 và gửi nó tới máy tính PC nối 
tiếp. Chương trình phải thực hiện một lần a), nhưng b) và c) chạy liên tục với tốc độ 
4800 baud. 
Lời giải: 
 ORG 0 
 MOV P2, #0FFH ; Lấy cổng P2 làm cổng vào 
 MOV TMOD, #20H ; Chọn bộ Timer1, chế độ 2 (tự động nạp lại) 
 MOV TH1, # 0FAH ; Chọn tốc độ 4800 baud 
 MOV SCON, #50H ; Tạo khung dữ liệu 8 bít, 1bít Stop cho phép 
 REN. 
 SETB TR1 ; Khởi động bộ Timer1 
 MOV DPTR, #MYDATA ; Nạp con trỏ đến thông báo 
 H - 1: CLR A 
 MOVC A, ‘A + DPTR ; Lấy ký tự 
 JZ DPTR ; Nếu ký tự cuối cùng muốn gửi ra 
 ACALL SEND ; Nếu chưa thì gọi chương trình con SEND 
 INC DPTR ; Chạy tiếp 
 SJMP H - 1 ; Quay lại vòng lặp 
 B - 1: MOV A, P2 ; Đọc dữ liệu trên cổng P2 
 ACALL RECV ; Truyền nó nối tiếp 
 ACALL RECV ; Nhận dữ liệu nối tiếp 
 MOV F1, A ; Hiển thị nó ra các đền LED 
 SJMP B - 1 ; ở lại vòng lặp vô hạn 
 ; Truyền dữ liệu nối tiếp ACC có dữ liệu 
 SEND: MOV SBUF, A ; Nạp dữ liệu 
 H- 2: JNB TI, H - 2 ; ở lại vòng lặp vô hạn 
 CLR TI ; Truyền dữ liệu nối tiếp 
 RET ; Nhận dữ liệu 
 ; Truyền dữ liệu nối tiếp ACC có dữ liệu 
 RECV: JNB RI, RECV ; Nạp dữ liệu 
 MOV A, SBUF ; ở lại đây cho đến khi gửi bít cuối cùng 
 CLR RI ; Sẵn sàng cho ký tự mới 
 RET ; Trở về mời gọi 
 ; Nhận dữ liệu nối tiếp trong ACC 
 RECV: JNB RI, RECV ; Đợi ở đây nhận ký tự 
 MOV A, SBUF ; Lưu nó vào trong ACC 
 CLR RI ; Sẵn sàng nhận ký tự mã tiếp theo 
 RET ; Trở về nời gọi 
 ; Ngăn xếp chưa thông báo 
 MYDATA: DB “Chúng tôi đã sẵn sàng” 0 
 END 
10.3.5.1 Tầm quan trọng của cờ RT. 
 Khi nhận các bít quan chân RxD của nó thì 8051 phải đi quan các bước sau: 
1. Nó nhận bít Start báo rằng bít sau nó là bít dữ liệu đầu tiên cần phải nhận. 
P1
 TxD 
 RxD 
P2
To
PC
COM
port
8051 
SW 
LED 
2. Ký tự 8 bít được nhận lần lượt từng bít một. Khi bít cuối cùng được nhận thì 
một byte được hình thành và đặt vào trong SBUF. 
3. Khi bít Stop được nhận thì 8051 bật RT = 1 để báo rằng toàn bộ ký tự được 
nhận và phải lấy đi trước khi nó bị byte mới nhận về ghi đè lên. 
4. Bằng việc kiểm tra bít cờ RI khi nó được bật lên chúng ta biết rằng một ký tự 
đã được nhận và đang nằm trong SBUF. Tại sao nội dung SBUF vào nơi an toàn 
trong một thanh ghi hay bộ nhớ khác trước khi nó bị mất. 
5. Sau khi SBUF được ghi vào nơi an toàn thì cờ RI được xoá về 0 bằng lệnh 
“CLR RI” nhằm cho các ký tự kế tiếp nhận được đưa vào SBUF. Nếu không làm 
được điều này thì gây ra mất ký tự vừa nhận được. 
Từ mô tả trên đây ta rút ra kết luận rằng bằng việc kiểm tra cờ RI ta biết 8051 
đã nhận được một byte ký tự chưa hay rồi. Nếu ta không sao được nội dung của thanh 
ghi SBUF vào nơi an toàn thì có nguy cơ ta bị mất ký tự vừa nhận được. Quan trọng 
hơn là phải nhớ rằng cờ RI được 8051 bật lên như lập trình viên phải xoá nó bằng lệnh 
“CLR RI”. Cũng nên nhờ rằng, nếu ta sao nội dung SBUF vào nơi an toàn trước khi 
RI được bật ta mạo hiểm đã sao dữ liệu chưa đầy đủ. Bít cờ RI có thể được kiểm tra 
bởi lệnh “JNB RI, xx” hoặc bằng ngắt sẽ được bàn ở chương 11. 
10.3.6 Nhân đôi tốc độ baud trong 8051. 
 Có hai cách để tăng tốc độ baud truyền dữ liệu trong 8051. 
1. Sử dụng tần số thạch anh cao hơn. 
2. Thay đổi một bít trong thanh ghi điều khiển công suất PCON (Power Control) 
như chỉ ra dưới đây. 
 Phương án một là không thực thi trong nhiều trường hợp vì tần số thạch anh 
của hệ thống là cố định. Quan trọng hơn là nó không khả thi vì tần số thạch anh mới 
không tương thích với tốc độ baud của các cổng COM nối tiếp của IBM PC. Do vậy, 
ta sẽ tập trung thăm dò phương án hai, có một cách nhân đôi tần số baud bằng phần 
mềm trong 8051 với tần số thạch anh không đổi. Điều này được thực hiện nhờ thanh 
ghi PCON, đây là thanh ghi 8 bít. Trong 8 bít này thì có một số bít không được dùng 
để điều khiển công suất của 8051. Bít dành cho truyền thông là D7, bít SMOD (chế độ 
nối tiếp - serial mode). Khi 8051 được bật nguồn thì bít SMOD của thanh ghi PCON ở 
mức thấp 0. Chúng ta có thể đặt nó lên 1 bằng phần mềm và do vậy nhân đôi được tốc 
độ baud. Thứ tự các lệnh được sử dụng để thiết lập bít D7 của PCON lên cao như sau 
(thanh ghi PCON là thể đánh địa chỉ theo bít). 
 MOV A, PCON ; Đặt bản sao của PCON vào ACC 
 SETB ACC.7 ; Đặt D7 của ACC lên 1. 
 MOV PCON, A ; Bây giờ SMOD = 1 mà không thay đổi bất kỳ bít nào khác. 
 Để biết tốc độ baud được tăng lên gấp đôi như thế nào bằng phương pháp này 
ta xét vai trò của bít SMOD trong PCON khi nó là 0 và 1. 
a) Khi SMOD = 0. 
 Khi SMOD = 0 thì 8051 chia 1/12 tần số thạch anh cho 32 và sử dụng nó cho 
bộ Timer1 để thiết lập tốc độ baud. Trong trường hợp XTAL = 11.0592MHz thì ta có: 
Tần số chu trình máy kHz6.921
12
MHz0592.11
== và Hz800.28
32
kHz6.921
= vì SMOD = 
0. 
 SM0D GF0 GF0 PD IDL 
D7 D0 
 Đây là tần số được Timer1 sử dụng để đặt tốc độ baud. Đây là cơ sở cho tất cả 
ví dụ từ trước đến giờ vì nó là giá trị mặc định của 8051 khi bật nguồn. Các tốc độ 
baud đối với SMOD = 0 được cho trong bảng 10.4. 
b) Khi SMOD = 1. 
 Với tần số cố định thạch anh ta có thể nhân đôi tốc độ baud bằng cách đặt bít 
SMOD = 1. Khi bít D7 của PCON (bít SMOD) được đưa lên 1 thì 1/12 tần số XTAL 
được chia cho 16 (thay vì chia cho 32 như khi SMOD = 0) và đây là tần số được 
Timer dùng để thiết lập tốc độ baud. Trong trường hợp XTAL = 11.0592MHz ta có: 
 Tần số chu trình máy kHz6.921
12
MHz0592.11
== và kHz600.57
16
kHz6.921
= vì 
SMOD = 1. 
 Đây là tần số mà Timer1 dùng để đặt tốc độ baud. Bảng 10.5 là các giá trị cần 
được nạp vào TH1 cùng với các tốc độ baud của 8051 khi SMOD = 0 và 1. 
 Bảng 10.5: So sánh tốc độ baud khi SMOD thay đổi. 
Tốc độ baud TH1 (thập phân) TH1 (Hex) 
SMOD = 0 SMOD = 1 
-3 
-6 
-12 
-24 
FD 
DA 
F4 
E8 
9600 
4800 
2400 
1200 
19200 
9600 
4800 
2400 
Ví dụ 10.6: 
 giả sử tần số XTAL = 11.0592MHz cho chương trình dưới đây, hãy phát biểu 
a) chương trình này làm gì? b) hãy tính toán tần số được Timer1 sử dụng để đặt tốc độ 
baud? và c) hãy tìm tốc độ baud truyền dữ liệu. 
 MOV A, PCON ; Sao nội dung thanh ghi PCON vào thanh ghi ACC 
 SETB ACC.7 ; Đặt D7 = 0 
 MOV PCON, A ; Đặt SMOD = 1 để tăng gấp đôi tần số baud với tần số XTAL cố định 
 ; 
 MOV TMOD, #20H ; Chọn bộ Timer1, chế độ 2, tự động nạp lại 
 MOV TH1, - 3 ; Chọn tốc độ baud 19200 (57600/3=19200) vì SMOD = 1 
 ; 
 MOV SCON, #50H ; Đóng khung dữ liệu gồm 8 bít dữ liệu, 1 Stop và cho phép RI. 
 SETB TR1 ; Khởi động Timer1 
 MOV A, #”B” ; Truyền ký tự B 
 A-1: CLR TI ; Khẳng định TI = 0 
 MOV SBUF, A ; Truyền nó 
 H-1: JNB TI, H-1 ; Chờ ở đây cho đến khi bít cuối được gửi đi 
 SJMP A-1 ; Tiếp tục gửi “B” 
Lời giải: 
a) Chương trình này truyền liên tục mã ASCII của chữ B (ở dạng nhị phân là 0100 
0010) 
b) Với tần số XTAL = 11.0592MHz và SMOD = 1 trong chương trình trên ta có: 
11.0592MHz/12 = 921.6kHz là tần số chu trình máy 
921.6kHz/16 = 57.6kHz là tần số được Timer1 sử dụng để đặt tốc độ baud 
c) 57.6kHz/3 = 19.200 là tốc độ cần tìm 
Ví dụ 10.7: 
 Tìm giá trị TH1 (ở dạng thập phân và hex) để đạt tốc độ baud cho các trường 
hợp sau. 
a) 9600 b) 4800 nếu SMOD = 1 và tần số XTAL = 11.0592MHz 
Lời giải: 
 Với tần số XTAL = 11.0592MHz và SMOD = 1 ta có tần số cấp cho Timer1 là 
57.6kHz. 
a) 57.600/9600 = 6 do vậy TH1 = - 6 hay TH1 = FAH 
b) 57.600/4800 = 12 do vậy TH1 = - 12 hay TH1 = F4H 
Ví dụ 10.8: 
 Hãy tìm tốc độ baud nếu TH1 = -2, SMOD = 1 và tần số XTAL = 
11.0592MHz. Tốc độ này có được hỗ trợ bởi các máy tính IBM PC và tương thích 
không? 
Lời giải: 
 Với tần số XTAL = 11.0592MHz và SMOD = 1 ta có tần số cấp cho Timer1 là 
57.6kHz. Tốc độ baud là 57.600kHz/2 = 28.800. Tốc độ này không được hỗ trợ bởi 
các máy tính IBM PC và tương thích. Tuy nhiên, PC có thể được lập trình để truyền 
dữ liệu với tốc độ như vậy. Phần mềm của nhiều modem có thể làm cho điều này và 
Hyperterminal của Windows 95 cũng có thể hỗ trợ tốc độ này và các tốc độ khác nữa. 
10.3.7 Truyền dữ liệudựa trên các ngắt. 
 Ta phải thấy rằng thật lãng phí để các bộ vi điều khiển phải bật lên xuống các 
cờ TI và RI. Do vậy, để tăng hiệu suất của 8051 ta có thể lập trình các cổng truyền 
thông nối tiếp của nó bằng các ngắt. Đây chính là nội dung chính sẽ bàn luận ở 
chương 11 dưới đây. 
XTAL 
oscillator 
á 12 28800Hz 
921.6kHz 
á 16 
á 32 
57600Hz 
SMOD=0 
SMOD=1 
28800Hz 
11.0592MHz 
To 
timer1 
to set 
baud 
rate 

File đính kèm:

  • pdfVi_dieu_khien_8051_ Assembly_10_TruyenThongNoiTiep.pdf