Giao Tiếp Uart Với Máy Tính

Share:
*

*

*
*
*
*
*
*

*

*

Bản cập nhật mạch đồng hồ 60 LED Full Color F8


Bài viết: 326/326 Thành viên: 9.997 Đang online: 4 Khách hôm nay: 497 Khách hôm qua: 3.479 Tổng khách: 12.916.638

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.....

Bạn đang đọc: Giao tiếp uart với máy tính

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ộ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:

BitTên bitĐịa chỉChức năng
7SM09FHXác định chế độ truyền - Bit 0
6SM19EHXác định chế độ truyền - Bit 1
5SM29DHTruyền thông đa xử lý
4REN9CHCho phép nhận
3TB89BHSử dụng trong chế độ 2 và 3
2RB89AHSử dụng trong chế độ 2 và 3
1TI99HCờ truyền - Lên 1 khi truyền xong 1 byte
0RI98HCờ 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:

SM0SM1Chế độKhung dữ liệuTốc độ baud
0008bit Shift RegisterOSC/12
0118bit UARTBởi TIMER 1 (*)
1029bit UARTOSC/64 (*)
1139bit UARTBởi TIMER 1 (*)

(*)Lưu ý:Tốc độ truyền chỉ ra trong bảng này được tăng gấp đôi nếu bitPCON.7(bit SMOD) được thiết lập lên 1, mặc định của hệ thống làPCON.7=0.

Xem thêm: Hướng Dẫn Đo Tụ Điện Dung Hiệu Quả Nhất, Hướng Dẫn Cách Đo Điện Dung Hiệu Quả Nhất

Trong bốn chế độ trên ta chỉ quan tâm đếnchế độ 1. Khi chế độ 1 được chọn thì dữ liệu được đóng khung thành10 bit: gồm1 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éptốc độ baud thay đổivà được thiết lập bởiTimer1của 8051.

- Bit SM2

BitSM2là bitD5của thanh ghiSCON. 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, đặtSM2 = 0vì 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 (bitD4của thanh ghiSCON). Khi bitRENcao thì nó cho phép 8051 nhận dữ liệu trên chânRxDcủ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ọngtrong thanh ghiSCON.

-Bit TB8 và RB8

BitTB8vàRB8được dùng trong chế độ nối tiếp2và3. Ta đặtTB8=0và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ế độ2và3thì có 9 bit dữ liệu được truyền đi hoặc nhận về. BitTB8sẽ chứa bit dữ liệu thứ 9 khi truyền, còn bitRB8sẽ chứa bit dữ liệu thứ 9 khi nhận, trong chế độ nối tiếp1thì bitRB8này nhận một bản sao của bitStopkhi 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ềnTIvà ngắt nhậnRIlà các bitD1vàD0của thanh ghiSCON. Các bit này làcực kỳ quan trọngcủa thanh ghiSCON:

·Khi 8051 kết thúc truyền một ký tự 8 bit thì nó bậtTIđể báo rằng nó sẵn sàng truyền một byte khác. BitTIđược bật lên trước bitStop.

·Khi 8051 nhận được dữ liệu nối tiếp qua chânRxDvà 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 KhiSMOD = 0thì 8051 chia1/12tần số thạch anh cho32và sử dụng nó cho bộTimer1để thiết lập tốc độbaud. Đây làgiá trị mặc địnhcủaSMODkhi 8051 bật nguồn.-Khi SMOD = 1 KhiSMOD = 1thì 8051 chia1/12tần số thạch anh cho16(thay vì chia cho32như khi SMOD = 0) và đây là tần số đượcTimer1dùng để thiết lập tốc độbaud.Để xác định giá trị cài đặt trongTH1để tạo ra một tốc độbaudnhất định, chúng ta có thể sử dụng các phương trình sau đây (giả sử bitPCON.7=0):TH1 = 256 - ((Crystal / (12*32)) / Baud) = 256 - ((Crystal / 384) / Baud)(1)NếuPCON.7=1thì 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.059Mhzvà 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ụngphươ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 baudvới một tinh thể thạch anh tần số11.059MHzchúng ta phải:1. Cấu hìnhchế độ 12. Cấu hìnhTimer 1chế độ 2(8-bit tự động nạp lại).3. Cài đặtTH1giá trị253(0xFD).

Code của chúng ta sẽ như sau:

#include #include void delay(unsigned int t){//Ctr delay 50ms dung timer0 unsigned int i; for(i=0;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 SBUF=s;//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/grimaceworks.com_giao-tiep-uart.zip

Bài viết liên quan