Lập trình giao tiếp UART và RS232
Hôm nay chúng ta sẽ tìm hiểu về truyền thông nối tiếp, tại sao chúng ta phải học cái này vì cái này dc ứng dụng rất nhiều như giao tiếp với các module, cảm biến, máy tính, các vdk với nhau.....
Chuẩn giao tiếp UART khác với RS232 ở mức điện áp ở chỗ UART thể hiện mức logic 0 (0V) và logic 1 (3-5V), còn với RS232 là -12V đến -3V là mức 1 và +3V đến +12V là mức 0 , từ -3V đến +3V là vùng cấm - ko xác định. Sự chênh lệch điện áp như vậy thì làm sao chúng có thể kết nối dc với nhau nhỉ??????? Để trả lời câu hỏi này ngta đã chế tạo ra IC MAX232 đây là IC cho phép ta kết nối UART với RS232
Dưới đây là mạch MAX232 để giao tiếp với cổng COM của máy tính: Chú ý chân cẳng tụ cho chính xác
Máy tính ko có cổng COM (laptop) sử dụng mạch USB to COM dùng ic PL2303:
Nếu hai con IC có cùng chung mức điện áp logic 3-5V (Chuẩn UART) hoặc theo chuẩn RS232 thì ko cần phải có MAX232 !!!!!!!!!!
Chú ý khi giao tiếp UART và RS232 ta phải nối theo kiểu bắt chéo tức TX của con này với RX của con kia và TX của con kia với RX của con này, kiểu bắt tay TX1-RX2 và RX1-TX2 nối sai sẽ ko truyền nhận dc dữ liệu.
Như chúng ta đã biết VDK họ 8051 được tích hợp sẵn 1 cổng UART cho lên chúng ta ko cần quan tâm nó dc chế tạo ntn mà chỉ cần biết chân TX (P3.1) là chân truyền dữ liệu và RX (P3.0) là nhận dữ liệu.
Trong truyền thông nối tiếp có 2 cách truyền là đồng bộ và ko đồng bộ. Đồng bộ là 2 bên thống nhất với nhau về cách truyền cũng như dữ liệu truyền còn Không đồng bộ là chỉ 1 đường truyền cho một quá trình, dữ liệu dc truyền theo khung dữ liệu đã được chuẩn hóa bởi các thiết bị nên không cần đường xung nhịp báo trước dữ liệu đến.
Ở đây ta sẽ tìm hiểu về truyền dữ liệu ko đồng bộ 1 bit start và 1 bit stop vì chỉ sử dụng duy nhất 2 dây TX và RX để truyền nhận dữ liệu, với cách truyền này ta phải cài đặt tốc độ truyền cho 2 bên phải giống nhau. Các tốc độ: 2400, 4800, 9600, 14400, 19200... Thông thường là tốc độ 9600 tuỳ ứng dụng của bạn.
Cơ bản là đã hiểu sơ sơ rồi ta bắt đầu vào phần lập trình cho VDK 8051. Như trên ta sẽ lấy ví dụ về tốc độ 9600 để code.
Để lập trình dc ta phải tìm hiểu 1 số thanh ghi: SBUF, SCON, PCON:
+ SBUF là thanh ghi lưu dữ liệu truyền, thực chất là 2 thanh ghi truyền và nhận nhưng nó có cùng 1 tên.
+ Thanh ghi SCON là thanh ghi thiết lập chế độ truyền:
Bit | Tên bit | Địa chỉ | Chức năng |
7 | SM0 | 9FH | Xác định chế độ truyền - Bit 0 |
6 | SM1 | 9EH | Xác định chế độ truyền - Bit 1 |
5 | SM2 | 9DH | Truyền thông đa xử lý |
4 | REN | 9CH | 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 - Lên 1 khi truyền xong 1 byte |
0 | RI | 98H | Cờ nhận - Lên 1 khi nhận xong 1 byte |
Các bit SM0 và SM1 là bit xác định chế độ đóng khung truyền:
SM0 | SM1 | Chế độ | Khung dữ liệu | Tốc độ baud |
0 | 0 | 0 | 8bit Shift Register | OSC/12 |
0 | 1 | 1 | 8bit UART | Bởi TIMER 1 (*) |
1 | 0 | 2 | 9bit UART | OSC/64 (*) |
1 | 1 | 3 | 9bit UART | Bởi TIMER 1 (*) |
(*) 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 SM2 là bit D5 của thanh ghi SCON. 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 bitREN 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=0vì 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ề. BitTB8 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 ghi SCON. 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 RxD và 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.
Thanh ghi PCON có bit SMOD:
- 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. Đây là giá trị mặc định của SMOD khi 8051 bật nguồn.
- Khi SMOD = 1
Khi SMOD = 1 thì 8051 chia 1/12 tần số thạch anh cho 16 (thay vì chia cho 32như khi SMOD = 0) và đây là tần số được Timer1 dùng để thiết lập 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 độ 9600 baud, thì ta sử dụng phương trình 1:
TH1 = 256 - ((Crystal / 384) / Baud)
TH1 = 256 - ((11059000/384) / 9600)
TH1 = 256 - ((28800) / 9600)
TH1 = 256-3 = 253
Ví dụ 2: Cho các trường hợp khó xác định giá trị nạp
Vậy: để có được tốc độ 9600 baud với một tinh thể thạch anh tần số11.059MHz chúng ta phải:
1. Cấu hình chế độ 1
2. Cấu hình Timer 1 ở chế độ 2 (8-bit tự động nạp lại).
3. Cài đặt TH1 giá trị 253 (0xFD).
Code của chúng ta sẽ như sau:
#include <REGX51.H>
#include <string.h>
void delay(unsigned int t){//Ctr delay 50ms dung timer0
unsigned int i;
for(i=0;i<t;i++){
TH0=0x3c; //-50000us
TL0=0xb0;
TR0=1;
while(!TF0); //cho timer0 tran
TF0=TR0=0;
}
}
void send(unsigned char *s){//Ham gui chuoi ki tu qua UART
unsigned char n,i;
n=strlen(s); //Dem xem co bao nhieu ky tu
for(i=0;i<n;i++){//Vong lap gui tung ky tu 1
SBUF=s[i];//Gui 1 byte
while(!TI); TI=0;//xoa co truyen
}
}
void ngat_uart()interrupt 4 //Ngat nhan du lieu tu uart
{
if(RI){
P1=SBUF; //Xuat du lieu ra Post 1
}
RI = 0; //Xoa co nhan
}
void main(void){
TMOD=0x21; //Timer 1 che do 8bit nap lai tu dong, timer0 cho delay che do 16bit
SCON=0x50;//01010000 che do 1, cho phep nhan
TH1=TL1=0xFD;//Nap 253 tao baud 9600 ko nhan doi baud
TR1=1; //khoi dong timer1
ES=1; //Ngat UART
EA=1; //Cho phep ngat
delay(20);
send("He thong san sang !!! \r");
delay(20);
send("Moi ban nhap ky tu bat ky tu ban phim: \r");
while(1){
//ko lam gi ca
}
}
Tải code và mô phỏng: http://www.mediafire.com/download/pbpj6oj4exa9661/SangTaoClub.Net_giao-tiep-uart.zip