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.
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:
- Vi_dieu_khien_8051_ Assembly_10_TruyenThongNoiTiep.pdf