I.Giới thiệu về RS232
Kết thúc bài học này, bạn có thể hiểu:
- Truyền dữ liệu nối tiếp đồng bộ, không đồng bộ
- Đóng khung dữ liệu trong truyền thông không đồng bộ
- Chuẩn giao diện RS232
- Nối ghép 8051 với chuẩn RS232
- Các bước lập trình truyền thông nối tiếp cho 8051
-
- Cài đặt khung truyền
- Cài đặt tốc độ baud
- 1.1 Baud rate
- (tốc độ Baud)Để việc truyền và nhận không đồng bộ xảy ra thành công thì các thiết bị tham gia phải “thống nhất” với nhau về khoảng thời gian dành cho 1 bit truyền, hay nói cách khác tốc độ truyền phải được cài đặt như nhau trước, tốc độ này gọi là tốc độ Baud. Theo định nghĩa, tốc độ baud là số bit truyền trong 1 giây.
- Ví dụ: nếu tốc độ baud được đặt là 19200 thì thời gian dành cho 1 bit truyền là 1/19200 ~ 52.083us.
- 1.2 Frame (khung truyền)
- Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data cũng được quy định bởi khung truyền.
Hình 2 là một ví dụ của một khung truyền của UART (truyền thông nối tiếp không đồng bộ): khung truyền này được bắt đầu bằng 01 start bit, tiếp theo là 08 bit data, sau đó là 01 bit parity dùng kiểm tra dữ liệu và cuối cùng là 02 bits stop. Công việc này được gọi là đóng gói dữ liệu. Chúng ta sẽ đi vào tìm hiểu các thành phần có trong một khung truyền:
- Start bit
Start là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Start là bit bắt buộc phải có trong khung truyền, và nó là một bit thấp (0).
- Data (dữ liệu)
Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Data không nhất thiết phải là gói 8 bit, với 8051 ta có thể quy định số lượng bit của data là 08 hoặc 09 bit. Trong truyền thông nối tiếp UART, bit có trọng số nhỏ nhất (LSB – Least Significant Bit, bit bên phải) của data sẽ được truyền trước và cuối cùng là bit có trọng số lớn nhất (MSB – Most Significant Bit, bit bên trái).
- Parity bit
Parity là bit dùng để kiểm tra dữ liệu truyền có đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số “1” trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số “1” trong parity lẻ luôn là số lẻ.
Parity bit không phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi khung truyền.
- Stop bits
Stop bits là 01 hoặc nhiều bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bit bắt buộc xuất hiện trong khung truyền, trong 8051 có thể là 01 hoặc 02 bit, và chúng là các bit cao (1).
-
- Truyền thông nối tiếp trong 8051
- 2.1 Phần cứng
- 2.1.1 Các chân RxD và TxD trong 8051
- Trong 8051 có hai chân được dùng cho truyền và nhận dữ liệu nối tiếp. Hai chân này được gọi là TxD và RxD, là một phần của cổng P3 (đó là P3.0-chân 10 và P3.1-chân 11). Các chân này hoạt động với mức logic TTL (mức logic cao “1” được gán cho Vcc và mức logic thấp được gán cho 0v).
Vì các máy tính được sử dụng rất rộng rãi để truyền thông với các hệ thống vi điều khiển, do vậy ta chủ yếu tập trung vào truyền thông nối tiếp của 8051 với cổng COM – RS232 của PC.
II. Chuẩn giao diện RS232
- Các chân của cổng RS232
Số chân | Mô tả | |
1
2 3 4 5 6 7 8 9 |
Data carrier detect (DCD)
Received data (RxD) Transmitted data (TxD) Data terminal ready (DTR) Signal ground (GND) Data set ready (DSR) Request to send (RTS) Clear to send (CTS) Ring indicator (RI) |
Tránh tín hiệu mạng dữ liệu
Dữ liệu được nhận Dữ liệu được gửi Đầu dữ liệu sẵn sàng Đất của tín hiệu Dữ liệu sẵn sàng Yêu cầu gửi Xoá để gửi Báo chuông |
Bảng 1: Các tín hiệu của các chân đầu nối DB – 9 trên máy tính.
1. Nối ghép 8051 tới RS232
Chuẩn RS232 được thiết lập trước họ logic TTL rất lâu do vậy điện áp đầu vào và đầu ra của nó không tương thích với mức TTL.
Trong RS232 thì mức logic 1 được biểu diển từ điện áp – 3v đến -25v trong khi đó mức 0 thì ứng với điện áp + 3v đến +25v làm cho điện áp – 3v đến + 3v là không xác định. Vì lý do này để kết nối một chuẩn RS232 bất kỳ đến một hệ vi điều khiển 8051 thì ta phải sử dụng các bộ biến đổi điện áp (như MAX232) để chuyển đổi các mức điện áp RS232 về các mức điện ápTTL sẽ được chấp nhận bởi các chân TxD và RxD của 8051 và ngược lại. Các IC MAX232 nhìn chung được coi như các bộ điều khiển đường truyền.
Một điểm mạnh của IC MAX232 là nó dùng điện áp nguồn +5v cùng với điện áp nguồn của 8051. Hay nói cách khác ta có thể nuôi 8051 và MAX232 với cùng một nguồn +5v, mà không phải dùng hai nguồn nuôi khác nhau.
IC MAX232 có hai bộ điều khiển đường truyền để nhận và truyền dữ liệu như trình bày trên hình 5. Các bộ điều khiển được dùng cho chân TxD được gọi là T1 vàT2, cho chân RxD gọi là R1 và R2. Trong nhiều ứng dụng thì chỉ có 1 cặp được dùng. Ví dụ: ở hình dưới ta chỉ dùng đến T2 và R2 được dùng làm 1 cặp đối với TxD vàRxD của 8051, còn cặp R1 và T1 thì không cần đến.
Để ý rằng trong IC MAX232, T1 có gán T1in (chân 11) và T1out (chân 14):
- Chân T1inlà ở phía TTL và được nối tới chân RxD của bộ vi điều khiển.
- Chân T1outlà ở phía RS232 được nối tới chân RxD của đầu nối DB củaRS232.
- Bộ điều khiển R1 cũng có gán R1in (chân 13) và R1out (chân 12):
- Chân R1in(chân số 13) là ở phía RS232 được nối tới chân TxD ở đầu nối DB của RS232.
- Chân R1out(chân số 12) là ở phía TTL được nối tới chân RxD của bộ vi điều khiển.2.2 Lập trình phần mềm
- 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.
- 2.2.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 muốn truyền qua đường TxD thì nó phải được đặt trong thanh ghi SBUF. Tương tự, SBUF cũng giữ một byte dữ liệu khi nó được nhận từ đường RxD của 8051:
- Khi một byte được ghi vào thanh ghi SBUFnó sẽ được đóng khung với các bit Start, Stop và được truyền nối tiếp quan chân TxD.
- Khi các bit được nhận nối tiếp từ RxDthì 8051 mở khung đó để loại trừ các bit Start, Stop để lấy ra một byte từ dữ liệu nhận được và đặt byte đó vào thanh ghi SBUF.
- 2.2.2 Thiết lập chế độ truyền bằng thanh ghi SCON
- Điều đầu tiên chúng ta phải làm là gì khi sử dụng cổng nối tiếp tích hợp của 8051? Rõ ràng là cấu hình cho nó. Điều này cho phép chúng ta báo với 8051 biết: bao nhiêu bit dữ liệu chúng ta muốn truyền, tốc độ truyền. Vậy làm thế nào xác định các điều đó? Nhờ thanh ghi SCON, là thanh ghi 8 bit được dùng để lập trình việc đóng khung dữ liệu, xác định các chế độ làm việc của truyền thông nối tiếp. SCON là thanh ghi có thể đánh địa chỉ theo bit.
Dưới đây là mô tả các bit khác nhau của thanh ghi SCON:
Bit | tên | Địa chỉ | Chức năng |
7 | SM0 | 9Fh | Xác định chế độ cổng nối tiếp (bit 0) |
6 | SM1 | 9Eh | Xác định chế độ cổng nối tiếp (bit 1) |
5 | SM2 | 9Dh | Cho phép truyền thông đa xử lý |
4 | REN | 9Ch | Bit cho phép nhận |
3 | TB8 | 9Bh | Sử dụng trong chế độ 2 và 3 |
2 | RB8 | 9Ah | Sử dụng trong chế độ 2 và 3 |
1 | TI | 99h | Cờ truyền: được bật sau khi truyền song 1 byte |
0 | RI | 98h | Cờ nhận: được bật sau khi nhận đủ 1 byte |
Hình 6: Thanh ghi điều khiển cổng nối tiếp SCON.
- Các bit SM0, SM1
Đây là các bit D7 và D6 của thanh ghi SCON. Chúng được dùng để xác định các chế độ đóng khung dữ liệu, có 4 chế độ:
SM0 | SM1 | Chế độ | Khung dữ liệu | Tốc độ baud |
0 | 0 | 0 | 8- bit shift register | Oscillator /12 |
0 | 1 | 1 | 8-bit UART | Cài đặt bởi timer 1 |
1 | 0 | 2 | 9-bit UART | Oscillator/64 |
1 | 1 | 3 | 9-bit UART | Cài đặt bởi timer 1 |
Hình 7: Các chế độ xác định bởi 2 bit SM0 và SM1
Lưu ý: tốc độ truyền chỉ ra trong bảng này được tăng gấp đôi nếu bit PCON.7 (bit SMOD) được thiết lập lên 1, mặc định của hệ thống là PCON.7=0.Trong bốn chế độ trên ta chỉ quan tâm đến chế độ 1. Khi chế độ 1 được chọn thì dữ liệu được đóng khung thành 10 bit: gồm 1 bit Start, sau đó là 8 bit dữ liệu, và cuối cùng là 1 bit Stop. Quan trọng hơn là chế độ nối tiếp 1 cho phép tốc độ baud thay đổi và được thiết lập bởi Timer1 của 8051.
- Bit SM2
Bit này cho phép khả năng đa xử lý của 8051. Đối với các ứng dụng của chúng ta, đặt SM2 = 0 vì ta không sử dụng 8051 trong môi trường đa xử lý.
- Bit REN
REN (Receive Enable) là bit cho phép nhận (bit D4 của thanh ghi SCON). Khi bit REN cao thì nó cho phép 8051 nhận dữ liệu trên chân RxD của nó. Và kết quả là nếu ta muốn 8051 vừa truyền vừa nhận dữ liệu thì bit REN phải được đặt lên 1. Bit này có thể được dùng để khống chế mọi việc nhận dữ liệu nối tiếp và nó là bit cực kỳ quan trọng trong thanh ghi SCON.
- Bit TB8 và RB8
Bit TB8 và RB8 được dùng trong chế độ nối tiếp 2 và 3. Ta đặt TB8=0 vàRB8=0 vì nó không được sử dụng trong các ứng dụng của mình.
Nói thêm, trong chế độ 2 và 3 thì có 9 bit dữ liệu được truyền đi hoặc nhận về. Bit TB8 sẽ chứa bit dữ liệu thứ 9 khi truyền, còn bit RB8 sẽ chứa bit dữ liệu thứ 9 khi nhận, trong chế độ nối tiếp 1 thì bit RB8 này nhận một bản sao của bit Stop khi một dữ liệu 8 bit được nhận, và ta cũng không cần quan tâmJ.
- Các bit TI và RI
Các bit ngắt truyền TI và ngắt nhận RI là các bit D1 và D0 của thanh ghiSCON. Các bit này là cực kỳ quan trọng của thanh ghi 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 được dữ liệu nối tiếp qua chân RxDvà nó tách các bit Start và Stop để lấy ra 8 bit dữ liệu để đặt vào SBUF, sau khi hoàn tất nó bật cờRI để báo rằng nó đã nhận xong 1 byte và cần phải lấy đi kẻo dữ liệu bị mất. Cờ RI được bật khi đang tách bit Stop.
- 2.2.3 Thiết lập tốc độ baud trong 8051
- Một khi các chế độ cổng nối tiếp đã được cấu hình, việc tiếp theo là chương trình cần phải cấu hình tốc độ baud cho các cổng nối tiếp. Điều này chỉ áp dụng cho chế độ Serial Port 1 và 3. Còn ở chế độ 0 và 2, tốc độ truyền được xác định dựa trên tần số dao động của thạch anh
- Trong chế độ 0: tốc độ truyền luôn luôn là tần số dao động chia cho 12. Điều này có nghĩa là nếu bạn đang sử dụng thạch anh tần số 11.059Mhz, tốc độ truyền của chế độ 0 sẽ luôn luôn là 921.583 baud. Trong chế độ 2: tốc độ truyền luôn luôn là tần số dao động chia cho 64, do đó, với thạch anh tần số 11.059Mhz sẽ mang lại một tốc độ truyền 172.797 baud.
- Trong chế độ 1 và 3: tốc độ truyền được xác định bằng cách cài đặt Timer1. Phương pháp phổ biến nhất là cài đặt Timer1 ở chế độ tự động nạp lại 8-bit (chế độ 2) và thiết lập một giá trị nạp lại (cho TH1) để tạo ra một tốc độ truyền.
Như ta đã biết ở trước đây, thì 8051 chia tần số thạch anh cho 12 để lấy tần số chu kỳ máy. Bộ UART truyền thông nối tiếp của 8051 lại chia tần số chu kỳ máy cho32 một lần nữa trước khi nó được dùng bởi bộ định thời Timer1 để tạo ra tốc độ baud:
2. Nhân đôi tốc độ baud trong 8051
Có hai cách để tăng tốc độ baud truyền dữ liệu trong 8051:
- Sử dụng tần số thạch anh cao hơn.
- Thay đổi một bit trong thanh ghi điều khiển công suất PCON(Power Control) như chỉ ra dưới đây.
DL –i timer 1gister đủ 1 byten song 1 byte
D7 D0
SM0D | – | – | – | GF0 | GF0 | PD | IDL |
Hình 9: Thanh ghi PCON
Phương án 1 là không khả thi trong nhiều trường hợp vì tần số thạch anh của hệ thống là cố định. Do vậy, ta sẽ tập trung thăm dò phương án 2: nhân đôi tốc độ 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 bit. Trong 8 bit này thì có một số bit không được dùng để điều khiển công suất của 8051. Bit dành cho truyền thông nối tiếp là bit D7 (bit SMOD). Khi 8051 được bật nguồn thì bit 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.
Để xác định giá trị cài đặt trong TH1 để tạo ra một tốc độ baud nhất định, chúng ta có thể sử dụng các phương trình sau đây (giả sử bit PCON.7=0):
- TH1 = 256 – ((Crystal / (12*32)) / Baud) = 256 – ((Crystal / 384) / Baud) (1)
- Nếu PCON.7=1 thì tốc độ truyền tăng gấp đôi, do đó phương trình trở thành:
- TH1 = 256 – ((2*Crystal / (12*32)) / Baud) = 256 – ((Crystal / 192) / Baud) (2)
Ví dụ 1:
Nếu chúng ta có một tinh thể thạch anh tần số 11.059Mhz và chúng ta muốn cấu hình cho cổng nối tiếp đạt tốc độ 19200 baud, thì ta sử dụng phương trình 1:
- TH1 = 256 – ((Crystal / 384) / Baud)
- TH1 = 256 – ((11059000/384) / 19200)
- TH1 = 256 – ((28799) / 19200)
- TH1 = 256-1,5 = 254,5
Như bạn có thể thấy: để có được tốc độ 19200 baud trên một tinh thể thạch anh 11.059Mhz ta phải cài đặt TH1 một giá trị 254,5. Nhưng giá trị trong các thanh ghi lại là 1 số nguyên. Nếu chúng ta thiết lập là 254, chúng ta sẽ có tốc độ 14400 baud và nếu chúng ta thiết lập là 255, chúng ta sẽ có tốc độ 28800 baud. Như vậy dường như chúng ta không thể cài đặt chính xác tốc độ baud được ?!! L
Nhưng ta lại có một cách khác để cài đặt được tốc độ 19200 baud.J Chúng ta đơn giản chỉ cần đặt bit PCON.7=1 (bit SMOD). Khi đó ta đã tăng gấp đôi tốc độbaud và sử dụng phương trình 2 được đề cập ở trên. Vì vậy chúng ta có:
- TH1 = 256 – ((Crystal / 192) / Baud)
- TH1 = 256 – ((11059000/192) / 19200)
- TH1 = 256 – ((57.699) / 19.200)
- TH1 = 256 – 3 = 253
Vậy: để có được tốc độ 19200 baud với một tinh thể thạch anh tần số11.059MHz chúng ta phải:
- Cấu hình chế độ Serial Port1hoặc 3.
- Cấu hình Timer 1ở chế độ 2(8-bit tự động nạp lại).
- Cài đặt TH1 giá trị 253(FDH).
- Set bit PCON.7=1(SMOD) để tăng gấp đôi tốc độ truyền (19200 baud).
3. Lập trình 8051 để truyền dữ liệu nối tiếp
Để lập trình 8051 truyền các byte ký tự nối tiếp thì cần phải thực hiện các bước sau đây:
- Nạp thanh ghi TMODgiá trị 20H: báo rằng sử dụng Timer1 ở chế độ 2 để thiết lập chế độ baud.
- Nạp thanh ghi TH1các giá trị phù hợp để thiết lập chế độ baud truyền dữ liệu nối tiếp.
- Nạp thanh ghi SCONgiá 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 Timer1.
- Xoá bit cờ truyền dữ liệu: TI=0.
- Byte ký tự cần phải truyền được ghi vào SBUF.
- Bit cờ truyền TIđược kiểm tra bằng một vòng lặp để đợi đến lúc dữ liệu được truyền xong (cờ TI=1).
- Để truyền ký tự tiếp theo quay trở về bước 5.
4. Lập trình 8051 để nhận dữ liệu nối tiếp
Để lập trình 8051 nhận các byte ký tự nối tiếp thì phải thực hiện các bước sau đây:
- Nạp giá trị 20Hvào thanh ghi TMOD: báo sử dụng bộ Timer1, chế độ 2 (8 bit, tự động nạp lại) để thiết lập tốc độ baud.
- Nạp TH1các giá trị phù hợp để thiết lập tốc độ baud.
- Nạp giá trị 50Hvào thanh ghi SCON để báo sử dụng chế độ truyền nối tiếp 1: dữ liệu được đóng gói bởi 8 bit dữ liệu, 1 bit Start và 1 bit Stop.
- Bật TR1=1để khởi động Timer1.
- Xoá cờ nhận RI: RI=0.
- Bit cờ nhận RIđược kiểm tra bằng một vòng lặp để đảm bảo toàn bộ ký tự đã được nhận đủ (khi RI=1).
- Khi RIđược thiết lập thì trong SBUF đã có 1 byte. Các nội dung của nó cần được đọc ngay để tránh mất mát.
- Để nhận một ký tự tiếp theo quay trở về bước 5.
Hãy quan sát ví dụ sau để thực hành:
Ví dụ :
Hãy lập trình cho 8051 để nhận các byte dữ liệu nối tiếp tốc độ 9600 baud và bật các Led trên Port 2 tương ứng: Máy tính gửi xuống số 1: 1 Led sáng, số 2: 2 Led sáng, … , số 3: Led1 tắt, số 3 : led 2 tắt
Đây là code :
#include <REGX51.H> void uartinit() { SM0=0; SM1=1; TMOD=0X20; TH1=0XFD; TR1=1; TI=1; REN=1; } void uart_write(char c) { while(TI==0); TI=0; SBUF=c; } char uart_read_data() { return RI; } char uart_read() { RI=0; return SBUF; } void uart_write_text(char * str) { unsigned char i=0; while(str[i]!=0) { uart_write(str[i]); i++; } } void main() { P3_2=P3_3=0; uartinit(); while(1) { if( uart_read_data()) { if(uart_read()=='1') { P3_2=1; } if(uart_read()=='2') { P3_3=1; } if(uart_read()=='3') { P3_2=0; } if(uart_read()=='4') { P3_3=0; } } } }
Các bạn tạo một project: copy code vào tạo file mô phỏng như hình và nạp code vào:
Chúc các bạn thành công nhớ