CHƢƠNG 5 BỘ ĐẾM/ĐỊNH THỜI VÀ UART TRONG 8051
5.6. Tốc độ baud cho cổng nối tiếp
Trong phần này chúng ta sẽ nghiên cứu về các thanh ghi truyền thông nối tiếp của 8051 và cách lập trình chúng để truyền và nhận dữ liệu nối tiếp với cổng COM của PC. Để cho phép truyền dữ liệu giữa máy tính PC và hệ thống 8051 mà khơng có bất kỳ lỗi nào thì chúng ta phải biết chắc rằng tốc độ baud của 8051 phải phù hợp với tốc độ baud của cổng COM.
8051 truyền và nhận dữ liệu nối tiếp theo nhiều tốc độ khác nhau. Tốc độ truyền của nó có thể lập trình đƣợc. Điều này đƣợc thực hiện nhờ sự trợ giúp của bộ định thời Timer1. Trƣớc khi ta đi vào bàn cách làm điều đó nhƣ thế nào thì ta sẽ xét quan hệ giữa tần số thạch anh và tốc độ baud trong 8051.
Nhƣ đã đề cập ở trên, tần số của thạch anh đƣợc chia cho 12 để tính tần số máy. Trong trƣờng hợp XTAL = 11.0592MHz thì tần số máy là 921.6KHz. Mạch điện truyền thông nối tiếp UART chia tiếp tần số máy cho 32 một lần nữa trƣớc khi nó đƣợc dùng bộ định thời Timer1 để tạo ra tốc độ baud (28.8KHz). Muốn Timer1 đặt tốc độ baud thì nó phải đƣợc lập trình về chế độ mode 2 (chế độ thanh ghi 8 bit tự động nạp lại). Để có tốc độ baud tƣơng thích với PC ta phải nạp TH1 theo các giá trị trong bảng dƣới đây:
Tốc độ baud TH1 (thập phân) TH1 (Hexa)
9600 -3 FD
4800 -6 FA
2400 -12 F4
1200 -24 F8
Bảng 5. 4 Bảng tốc độ baud
5.6.1. Thanh ghi điều khiển và các chếđộ hoạt động của cổng nối tiếp 5.6.1.1. Thanh ghi SBUF 5.6.1.1. Thanh ghi SBUF
SBUF là thanh ghi 8 bit đƣợc dùng riêng cho truyền thông nối tiếp trong 8051. Đối với một byte dữ liệu cần truyền qua đƣờng TxD thì nó phải đƣợc đặt trong thanh ghi SBUF. Tƣơng tự nhƣ vậy, SBUF giữ một byte dữ liệu khi nó đƣợc nhận bởi đƣờng RxD của 8051. SBUF có thể đƣợc truy cập bởi mọi thanh ghi bất kỳ trong 8051
Ví dụ: MOV SBUF,#“D” ; Nạp vào SBUF giá trị 44H là mã ACSII của D MOV SBUF,A ; Chép nội dung của A vào SBUF
MOV A,SBUF ; Chép nội dung của SBUF vào A
Khi một byte đƣợc ghi vào SBUF nó sẽ đƣợc đóng khung với các bit Start, Stop và đƣợc truyền nối tiếp qua chân TxD. Tƣơng tự nhƣ vậy, khi các bit đƣợc nhận nối tiếp từ RxD thì 8051 mở khung để loại bỏ các bit Start, Stop để lấy ra một byte dữ liệu đặt vào thanh ghi SBUF.
5.6.1.2. Thanh ghi điều khiển nối tiếp SCON
Thanh ghi SCON là thanh ghi 8 bit đƣợc dùng để lập trình việc đóng khung bit bắt đầu Start, bit dừng Stop và các bit dữ liệu.
Mô tả các bit của thanh ghi SCON:
SM0 SM1 SM2 REN TB8 RB8 T1 R1
99
SM0, SM1:
M0 và M1 đƣợc dùng để xác định đóng khung dữ liệu bằng cách xác định số bit của một ký tự và các bit Start, Stop. Các tổ hợp của chúng là:
SM0 SM1 Serial Mode Explanation Baud Rate
0 0 0 8-bit Shift Register Oscillator / 12 0 1 1 8-bit UART Set by Timer 1 1 0 2 9-bit UART Oscillator/ 32 1 1 3 9-bit UART Set by Timer 1
Bảng 5. 5 Các chếđộ truyền nối tiếp
SM2: Cho phép khả năng đa xử lý. Trong phạm vi bài giảng này, SM2 đƣợc đặt bằng 0 vì khơng
sử dụng 8051 trong môi trƣờng đa xử lý.
REN: Đây là bit cho phép thu (Receive Enable). Bit REN cũng đƣợc tham chiếu bằng SCON.4
vì SCON là thanh ghi đánh địa chỉ theo bit. Khi bit REN = 1 thì 8051 thu dữ liệu trên chân RxD.
TB8: TB8 đƣợc dùng cho chế độ độ nối tiếp 2 và 3. Trong các chế độ này, 9 bit dữ liệu đƣợc truyền đi trong đó 8 bit dữ liệu và bit thứ 9 đƣợc lấy từ TB8. Nếu TB8 = 1, các bit dữ liệu sẽ lần lƣợt đƣợc ghi ra cổng nối tiếp và đƣợc theo sau cùng bởi bit TB8. Nếu TB8 = 0, bit thứ 9 sẽ không đƣợc sử dụng.
RB8: RB8 cũng hoạt động trong chế độ 2 và 3 tƣơng tự nhƣ TB8 nhƣng ở chiều nhận. Khi 9 bit
dữ liệu nhận trong chế độ 2 và 3, 8 bit đầu tiên đƣợc đặt vào SBUF, bit thứ 9 đƣợc lƣu trong RB8.
TI và RI: Các bit ngắt truyền TI và ngắt thu RI là các bit D1 và D0 của SCON. Khi 8051 kết
thúc truyền một ký tự 8 bit thì nó bật TI để báo rằng nó sẵn sàng truyền một byte khác. Bit TI đƣợc bật lên trƣớc bit Stop. Khi 8051 nhận dữ liệu nối tiếp qua chân RxD thì nó tách các bit Start và Stop để lấy ra 8 bit dữ liệu để đặt vào SBUF. Sau khi hồn tất, nó bật cờ RI để báo 8051 cần đọc nhanh giá trị trƣớc khi một byte khác đi tới.
5.6.1.3. Khởi động và truy xuất các thanh ghi
Khi lập trình 8051 để truyền các byte ký tự nối tiếp thì cần thực hiện các bƣớc sau đây:
- Nạp thanh ghi TMOD giá trị 20H để báo sử dụng Timer1 ở chế độ 2 thiết lập chế độ baud - Nạp thanh ghi TH1 các giá trị để thiết lập tốc độ baud.
- Nạp thanh ghi SCON giá trị 50H báo chế độ nối tiếp 1 để đóng khung 8 bit dữ liệu, 1 bit Start và 1 bit Stop.
- Bật TR1 = 1 để khởi động Timer 1. - Xóa bit TI bằng lệnh “CLR TI”.
- Bit cờ TI đƣợc hiển thị bằng lệnh “JNB TI, xx” để báo ký tự đã đƣợc truyền hoàn tất chƣa.
- Để truyền ký tự tiếp theo quay trở về bƣớc 5.
Ví dụ: Viết chƣơng trình cho 8051 để truyền nối tiếp ký tự “A” với tốc độ 4800 baud liên tục. Giải:
MOV TMOD,#20H ; Chọn Timer1, chế độ 2 (tự động nạp lại) MOV TH1,#-6 ; Chọn tốc độ baud 4800
MOV SCON,#50H ; Truyền 8 bit dữ liệu, 1 bit Stop SETB TR1 ; Khởi động Timer1
AGAIN: MOV SBUF,#“A” ; Nạp ký tự A
HERE: JNB TI,HERE ; Chờ đến bit cuối cùng CLR TI ; Xóa bit TI cho ký tự kế tiếp SJMP AGAIN ; Tiếp tục gửi lại ký tự A
Ví dụ: Viết chƣơng trình để truyền chữ “YES” nối tiếp liên tục với tốc độ 9600 baud (8 bit dữ
liệu, 1 bit Stop)
Giải:
MOV TMOD,#20H ; Chọn bộ Timer1, chế độ 2 MOV TH1,#-3 ; Chọn tốc độ 9600 baud
MOV SCON,#50H ; Truyền 8 bit dữ liệu, 1 bit Stop SETB TR1 ; Khởi động Timer1
AGAIN: MOV A,#“Y” ; Truyền ký tự “Y” ACALL TRANS
MOV A,#“E” ; Truyền ký tự “E” ACALL TRANS
MOV A,#“S” ; Truyền ký tự “S” ACALL TRANS
SJMP AGAIN
; Chƣơng trình con truyền dữ liệu nối tiếp
TRANS: MOV SBUF,A ; Nạp SBUF
HERE: JNB TI,HERE ; Chờ cho đến khi truyền bit cuối CLR TI
RET
Trong 8051, để nhận các byte ký tự nối tiếp ta thực hiện các bƣớc sau đây:
- Nạp giá trị 20H và thanh ghi TMOD để báo sử dụng bộ Timer 1, chế độ 2 (8 bit, tự động nạp lại) để thiết lập chế độ baud.
101 - Nạp giá trị 50H vào thanh ghi SCON để báo sử dụng chế độ truyền nối tiếp.
- Bật TR1 = 1 để khởi động Timer 1.
- Xóa cờ ngắt RI bằng lệnh “JNB RI, xx” để xem toàn bộ ký tự đã đƣợc nhận chƣa - Khi RI đƣợc thiết lập thì trong SBUF đã có 1 byte.
- Để nhận ký tự tiếp theo ta quay trở về bƣớc 5.
Ví dụ: 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 bit dữ liệu và 1 bit Stop.
Giải:
MOV TMOD,#20H ; Chọn bộ Timer1, chế độ 2 MOV TH1,-6 ; Chọn tốc độ 4800 baud MOV SCON,#50H ; Chọn khung dữ liệu 8 bit SETB TR1 ; Khởi động bộ Timer1 HERE: JNB R1,HERE ; Đợi nhận toàn bộ ký tự
MOV A,SBUF ; Lƣu ký tự vào thanh ghi A MOV P1,A ; Gửi ra cổng P1
CLR RI ; Sẵn sàng nhận byte kế tiếp SJMP HERE ; Tiếp tục nhận dữ liệu