Wednesday 28 November 2018

Bài 5. Truyền Thông Nối Tiếp UART

Giới thiệu                      

Giao tiếp nối tiếp có nghĩa là truyền dữ liệu từng chút một tại một thời điểm, khi truyền thông song song, số lượng bit có thể được truyền tại một thời điểm phụ thuộc vào số lượng dòng dữ liệu có sẵn để liên lạc.
Hai phương thức giao tiếp nối tiếp là
  • Truyền thông đồng bộ: Chuyển dữ liệu hàng loạt trong cấu trúc khung tại một thời điểm
  • Truyền thông không đồng bộ: Truyền dữ liệu byte trong cấu trúc khung tại một thời điểm
8051 đã được xây dựng trong UART với RXD (nhận dữ liệu nối tiếp pin) và TXD (dữ liệu nối tiếp truyền pin) trên PORT3.0 và PORT3.1 tương ứng.

Giao tiếp không đồng bộ

Giao tiếp nối tiếp không đồng bộ được sử dụng rộng rãi để truyền byte theo định hướng.
Cấu trúc khung trong giao tiếp không đồng bộ:
  • START bit: Đó là một chút mà bắt đầu giao tiếp nối tiếp và nó luôn luôn thấp.
  • Gói bit dữ liệu : Các bit dữ liệu có thể là gói 5 đến 9 bit. Thông thường, chúng tôi sử dụng gói dữ liệu 8 bit, luôn được gửi sau bit START.
  • STOP bit : Đây là một hoặc hai bit. Nó được gửi sau khi gói dữ liệu bit để cho biết kết thúc khung. Stop bit luôn logic cao.
Trong khung giao tiếp nối tiếp không đồng bộ, bit START đầu tiên được theo sau bởi byte dữ liệu và ở bit STOP cuối cùng, tạo thành một khung 10 bit. Đôi khi bit cuối cùng cũng được sử dụng như bit chẵn lẻ.
8051 Cấu trúc khung nối tiếp

Tốc độ truyền dữ liệu

Tiêu chuẩn giao diệnTốc độ truyền dữ liệu được đo bằng bit trên giây (bps). Trong hệ nhị phân, nó cũng được gọi là tốc độ truyền (số lần thay đổi tín hiệu mỗi giây). Tốc độ truyền chuẩn được hỗ trợ là 1200, 2400, 4800, 19200, 38400, 57600 và 115200. Thông thường hầu hết thời gian 9600 bps được sử dụng khi tốc độ không phải là vấn đề lớn.
  • 8051 giao tiếp nối tiếp có mức điện áp TTL là 0 v cho logic 0 và 5 v cho logic 1.
  • Trong máy tính và hầu hết các thiết bị cũ cho giao tiếp nối tiếp, giao thức RS232 với đầu nối DB9 được sử dụng. Giao tiếp nối tiếp RS232 có các mức điện áp khác nhau hơn 8051 giao tiếp nối tiếp. tức là +3 v đến +25 v cho logic zero và -3 v đến -25 v cho logic 1. 
  • Vì vậy, để giao tiếp với giao thức RS232, chúng ta cần phải sử dụng chuyển đổi mức điện áp như MAX232 IC.
  • Mặc dù có 9 chân trong đầu nối DB9, chúng tôi không cần phải sử dụng tất cả các chân. Chỉ cần kết nối 2 Tx (Truyền), Rx thứ 3 (Nhận) và pin GND thứ 5.
        Giao diện nối tiếp 8051
Giao diện nối tiếp 8051

Lập trình UART 8051

Baud Rate tính toán:
  • Để đáp ứng các tốc độ truyền chuẩn thường tinh thể với 11,0592 MHz được sử dụng.
  • Như chúng ta đã biết, 8051 chia tần số pha lê cho 12 để có tần số chu trình máy là 921,6 kHz.
  • Khối UART nội bộ 8051 chia tần số chu trình máy này là 32, cho tần số 28800 Hz được UART sử dụng.
  • Để đạt được tốc độ truyền 9600, tần số 28800 Hz một lần nữa sẽ được chia cho 3.
  • Điều này đạt được bằng cách sử dụng Timer1 ở chế độ-2 (chế độ tải lại tự động) bằng cách đặt 253 trong TH1 (8-bit reg.)
  • Vì vậy, 28800 Hz sẽ được chia cho 3 như bộ đếm thời gian sẽ tràn sau mỗi 3 chu kỳ .
  • chúng ta có thể đạt được tốc độ truyền khác nhau bằng cách đặt hệ số phân chia vào thanh ghi TH1.
      
Hệ số phân chia để đạt được tốc độ truyền khác nhau
Tốc độ truyền
TH1 (Hex)
9600
FD
4800
FA
2400
F4
1200
E8

Đăng ký giao tiếp nối tiếp

SBUF: Đăng ký bộ đệm nối tiếp
Đây là thanh ghi dữ liệu liên lạc nối tiếp được sử dụng để truyền hoặc nhận dữ liệu qua nó.
8051 SBUF Đăng ký

SCON: Đăng ký kiểm soát nối tiếp
Thanh ghi điều khiển nối tiếp SCON được sử dụng để cài đặt chế độ hoạt động truyền thông nối tiếp. Nó cũng được sử dụng để điều khiển các hoạt động truyền và nhận.
8051 SCON Đăng ký

Bit 7: 6 - SM0: SM1 : Trình chỉ định chế độ nối tiếp
Chế độ
SM0
SM1
Chế độ
0
0
0
1/12 của chế độ đăng ký thay đổi tần số dao động cố định tốc độ truyền
1
0
1
UART 8 bit với bộ đếm thời gian 1 được xác định tốc độ truyền
2
1
0
UART 9 bit với 1/32 tốc độ truyền cố định của Osc
3
1
1
UART 9 bit với bộ đếm thời gian 1 được xác định tốc độ truyền

Thông thường chế độ-1 (SM0 = 0, SM1 = 1) được sử dụng với 8 bit dữ liệu, 1 bit bắt đầu và 1 bit dừng.
Bit 5 - SM2: cho Giao tiếp đa xử lý
        Bit này cho phép tính năng liên lạc đa bộ xử lý ở chế độ 2 & 3.
Bit 4 - REN: Nhận Kích hoạt
        1 = Nhận cho phép
        0 = Nhận vô hiệu hóa
Bit 3 - TB8: Truyền bit thứ 9
        Đây là bit thứ 9 được truyền ở chế độ 2 & 3 (chế độ 9 bit)
Bit 2 - RB8: Nhận bit thứ 9
Đây là lần thứ 9 nhận bit ở chế độ 2 & 3 (chế độ 9 bit), ở chế độ 1, nếu SM2 = 0 thì RB8 giữ bit dừng nhận được
Bit 1 - TI: Truyền cờ ngắt
Bit này cho biết quá trình truyền hoàn tất và được thiết lập sau khi truyền byte từ bộ đệm. Thông thường TI (Transmit Interrupt Flag) được đặt bằng phần cứng ở cuối bit 8 ở chế độ 0 và ở đầu bit dừng ở các chế độ khác.
Bit 0 - RI: Nhận cờ ngắt
Bit này cho biết việc tiếp nhận hoàn tất và được thiết lập sau khi nhận được byte hoàn chỉnh trong bộ đệm. Thông thường RI (Nhận cờ ngắt) được đặt bằng phần cứng ở chế độ nhận ở cuối bit 8 ở chế độ 0 và tại bit dừng nhận thời gian ở các chế độ khác.

Các bước lập trình

  1. Định cấu hình hẹn giờ 1 ở chế độ tự động tải lại.
  2. Tải TH1 với giá trị theo tốc độ truyền yêu cầu, ví dụ: đối với tải 9600 tốc độ truyền 0xFD. (-3 trong số thập phân)
  3. Tải SCON với chế độ nối tiếp và bit điều khiển. ví dụ cho chế độ 1 và cho phép nhận, tải 0x50.
  4. Bắt đầu timer1 bằng cách đặt bit TR1 thành 1.
  5. Tải dữ liệu truyền trong thanh ghi SBUF.
  6. Chờ cho đến khi dữ liệu được tải hoàn toàn được truyền đi bằng cách bỏ phiếu TI flag.
  7. Khi cờ TI được thiết lập, hãy xóa nó và lặp lại từ bước 5 để truyền thêm dữ liệu.

Thí dụ
Hãy chương trình 8051 (ở đây AT89C51) để gửi dữ liệu ký tự “kiểm tra” serially ở tốc độ 9600 baud ở chế độ 1

Chương trình truyền dữ liệu nối tiếp


#include <reg51.h>  /* Include x51 header file */

void UART_Init()
{
 TMOD = 0x20;  /* Timer 1, 8-bit auto reload mode */
 TH1 = 0xFD;  /* Load value for 9600 baud rate */
 SCON = 0x50;  /* Mode 1, reception enable */
 TR1 = 1;  /* Start timer 1 */
}

void Transmit_data(char tx_data)
{
 SBUF = tx_data;  /* Load char in SBUF register */
 while (TI==0);  /* Wait until stop bit transmit */
 TI = 0;   /* Clear TI flag */
}

void String(char *str)
{
 int i;
 for(i=0;str[i]!=0;i++) /* Send each char of string till the NULL */
 {
  Transmit_data(str[i]); /* Call transmit data function */
 }
} 

void main()
{
 UART_Init();  /* UART initialize function */
 String("test");  /* Transmit 'test' */
 while(1);
}

Ngắt nối tiếp 8051

8051 UART có ngắt nối tiếp. Bất cứ khi nào dữ liệu được truyền hoặc nhận, cờ ngắt nối tiếp TI và RI được kích hoạt tương ứng.
Ngắt nối tiếp 8051 có địa chỉ vectơ (0023H), nơi nó có thể nhảy để phục vụ ISR (thường xuyên dịch vụ ngắt) nếu ngắt toàn cầu và nối tiếp được bật.
Chúng ta hãy xem cách thức làm gián đoạn nối tiếp sẽ được sử dụng trong lập trình truyền thông nối tiếp.
Các bước lập trình
  1. Đặt hẹn giờ 1 ở chế độ tải lại tự động.
  2. Tải TH1 với giá trị theo tốc độ truyền yêu cầu, ví dụ: đối với tải 9600 tốc độ truyền 0xFD.
  3. Tải SCON với chế độ nối tiếp và bit điều khiển. ví dụ cho chế độ 1 và cho phép tải tiếp nhận 0x50.
  4. Bắt đầu timer1 bằng cách đặt bit TR1 thành 1.
  5. Bật bit ngắt toàn cục và nối tiếp, tức là EA = 1 và ES = 1.
  6. Bây giờ bất cứ khi nào dữ liệu được nhận hoặc truyền, cờ ngắt sẽ được thiết lập và bộ điều khiển sẽ nhảy tới ISR ​​nối tiếp.
  7. Lưu ý rằng cờ TI / RI phải được xóa bằng phần mềm trong ISR.
Lưu ý: Đối với ngắt truyền và tiếp nhận, cùng một địa chỉ vectơ ngắt được gán, vì vậy khi bộ điều khiển nhảy tới ISR, chúng ta phải kiểm tra xem nó có bị ngắt Tx hay Rx gián đoạn bởi trạng thái bit TI và RI.

Thí dụ
Hãy chương trình 8051 (ở đây AT89C51) để nhận dữ liệu ký tự serially ở tốc độ 9600 baud ở chế độ 1 và gửi dữ liệu nhận được trên cổng 1 bằng cách sử dụng ngắt nối tiếp.
  • Trong ví dụ này, sau khi nhận được byte, cờ RI được đặt sẽ tạo ra ngắt nối tiếp.                    
  • Sau khi ngắt, 8051 sẽ nhảy tới thường trình ISR nối tiếp.
  • Trong thói quen ISR, chúng tôi sẽ gửi dữ liệu đến cổng 1.

Chương trình gián đoạn nối tiếp


#include <reg51.h>  /* Include x51 header file */

void Ext_int_Init()    
{
 EA  = 1;  /* Enable global interrupt */
 ES = 1;    /* Enable serial interrupt */   
}

void UART_Init()
{
 TMOD = 0x20;  /* Timer 1, 8-bit auto reload mode */
 TH1 = 0xFD;  /* Load value for 9600 baud rate */
 SCON = 0x50;  /* Mode 1, reception enable */
 TR1 = 1;  /* Start timer 1 */
}

void Serial_ISR() interrupt 4    
{
 P1 = SBUF;  /* Give received data on port 1 */
 RI = 0;   /* Clear RI flag */
} 

void main()
{
 P1 = 0x00;  /* Make P1 output */
 Ext_int_Init();   /* Call Ext. interrupt initialize */
 UART_Init();
 while(1);
}

1 comment:

  1. Lucky 7 Casino & Hotel - Mapyro
    Lucky 7 Casino & Hotel is situated 광명 출장마사지 in the centre of downtown Houston, and provides 경기도 출장마사지 a gaming area with live entertainment, gaming,  광명 출장샵 Rating: 4.3 평택 출장샵 · ‎25 reviews · 정읍 출장안마 ‎Price range: $$

    ReplyDelete