Lập trình Truyền thông nối tiếp với 8051

Truyền thông nối tiếp là một phương thức truyền dữ liệu giữa các thiết bị thông qua một giao diện chuẩn. Trong bài viết này, chúng ta sẽ tìm hiểu về việc lập trình truyền thông nối tiếp với vi điều khiển 8051.

Giới thiệu về RS232

RS232 là một chuẩn giao diện được sử dụng rộng rãi cho truyền thông nối tiếp. Bài viết này sẽ giúp bạn hiểu về truyền dữ liệu nối tiếp đồng bộ, không đồng bộ, cách đóng khung dữ liệu và các bước lập trình truyền thông nối tiếp cho vi điều khiển 8051.

Cài đặt tốc độ baud

Tốc độ baud là số bit truyền trong một giây. Để việc truyền và nhận dữ liệu không đồng bộ xảy ra thành công, các thiết bị tham gia phải “thống nhất” về khoảng thời gian dành cho một bit truyền, hay nói cách khác, tốc độ truyền phải được cài đặt như nhau trước.

Ví dụ, nếu tốc độ baud được đặt là 19200, thì thời gian dành cho một bit truyền là 1/19200 ~ 52.083us.

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 bit start, 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: 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.
  • Data (dữ liệu): dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận.
  • Parity bit: là bit dùng để kiểm tra dữ liệu truyền có đúng không (một cách tương đối).
  • 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.

Chuẩn giao diện RS232

Cổng RS232 là giao diện chuẩn để kết nối các thiết bị nối tiếp. Trên cổng RS232, chúng ta có các chân như DCD, RxD, TxD, DTR, GND, DSR, RTS, CTS, RI.

Để kết nối một chuẩn RS232 bất kỳ đến một vi điều khiển 8051, ta cần 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 áp TTL sẽ được chấp nhận bởi các chân TxD và RxD của 8051 và ngược lại.

Lập trình truyền dữ liệu nối tiếp

Để lập trình 8051 để truyền và nhận dữ liệu nối tiếp, chúng ta cần thực hiện các bước sau:

  1. Thiết lập chế độ truyền và nhận bằng cách cấu hình các thanh ghi TMOD và SCON.
  2. Thiết lập tốc độ baud bằng cách cài đặt giá trị cho thanh ghi TH1.
  3. Bật Timer1 để khởi động quá trình truyền và nhận dữ liệu.
  4. Gửi dữ liệu bằng cách ghi giá trị vào thanh ghi SBUF.
  5. Nhận dữ liệu bằng cách đọc giá trị từ thanh ghi SBUF.

Đây là một ví dụ minh họa về cách lập trình 8051 để nhận dữ liệu nối tiếp với tốc độ baud 9600 và bật LED trên Port 2 tương ứng.

#include 

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;
      }
    }
  }
}

Chúc các bạn thành công!

FEATURED TOPIC