Chào mừng đến với Câu Lạc Bộ Sáng Tạo
Chia sẻ kinh nghiệm
Kết nối đam mê
Đang cập nhật thời gian...
BÀI VIẾT NỔI BẬT
Xin chào! Tôi là Ếch Sáng Tạo :-)
Chia sẻ trang




Chuyên mục
Bài mới
Xem nhiều
Thống kê
  • Bài viết: 334/334
  • Thành viên: 10.085
  • Đang online: 3
  • Khách hôm nay: 2.401
  • Khách hôm qua: 3.625
  • Tổng khách: 16.185.357
Bài viết
Bài 8: Lập trình giao tiếp UART và RS232 - SangTaoClub.Net
Bài 8: Lập trình giao tiếp UART và RS232
Đăng bởi: Vũ Văn Thái - Thời gian: 17-11-2013, 10:25
Chuyên mục: Học lập trình 8051 - Lượt xem: 31.365

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

Lập trình giao tiếp UART và RS232

Máy tính ko có cổng COM (laptop) sử dụng mạch USB to COM dùng ic PL2303:

Lập trình giao tiếp UART và RS232

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:

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

Lập trình giao tiếp UART và RS232

 

Tải code và mô phỏng: http://www.mediafire.com/download/pbpj6oj4exa9661/SangTaoClub.Net_giao-tiep-uart.zip


  • Bạn chưa đăng nhập, không thể viết bình luận!
    Bấm vào đây để Đăng nhập hoặc Đăng ký!
  • muabuon1993 lúc 12-11-2014, 16:49
    AD ơi sắp tới em định làm đồ án tốt nghiệp về giao tiếp giữa 8051 và Module GPS NEO-6M-0-001 bằng chuẩn giao tiếp
    UART. có gì mong AD giúp đỡ nhé


    Nội dung
  • Trang 1/1: 1

    Bài viết cùng chuyên mục
    Điều khiển tốc độ động cơ Motor DC sử dụng PWM Điều khiển tốc độ động cơ Motor DC sử dụng PWM
    Đăng bởi: kienvuce - Thời gian: 04-11-2021, 22:40
    Chuyên mục: Học lập trình 8051 - Lượt xem: 3.116
    Chia sẻ bộ thư viện Driver chuẩn cho LCD Gphone và Home Phone Chia sẻ bộ thư viện Driver chuẩn cho LCD Gphone và Home Phone
    Đăng bởi: Vũ Văn Thái - Thời gian: 22-02-2017, 14:54
    Chuyên mục: Học lập trình 8051 - Lượt xem: 6.628
    Led 7 thanh 4 số điều khiển bằng nút bấm Led 7 thanh 4 số điều khiển bằng nút bấm
    Đăng bởi: HoangQuan69 - Thời gian: 09-10-2016, 15:08
    Chuyên mục: Học lập trình 8051 - Lượt xem: 5.923
    Chia sẻ Code đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307 Chia sẻ Code đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307
    Đăng bởi: Vũ Văn Thái - Thời gian: 13-05-2015, 09:00
    Chuyên mục: Học lập trình 8051 - Lượt xem: 28.677
    Bài 15: Lập trình quét phím matrix 4x4 hiển thị lên LCD 16x2 Bài 15: Lập trình quét phím matrix 4x4 hiển thị lên LCD 16x2
    Đăng bởi: Vũ Văn Thái - Thời gian: 20-11-2014, 08:57
    Chuyên mục: Học lập trình 8051 - Lượt xem: 31.758
    [Share] Code giao tiếp Graphic LCD 12864 SPI của máy GPHONE ZTE [Share] Code giao tiếp Graphic LCD 12864 SPI của máy GPHONE ZTE
    Đăng bởi: Vũ Văn Thái - Thời gian: 12-11-2014, 22:06
    Chuyên mục: Học lập trình 8051 - Lượt xem: 19.260
    [Share] Code C đo nhiệt độ dùng DS18B20 hiển thị lên LED 7 thanh [Share] Code C đo nhiệt độ dùng DS18B20 hiển thị lên LED 7 thanh
    Đăng bởi: Vũ Văn Thái - Thời gian: 12-11-2014, 09:02
    Chuyên mục: Học lập trình 8051 - Lượt xem: 19.583
    Bài 14: Đo nhiệt độ dùng cảm biến DS18B20 với 8051 Bài 14: Đo nhiệt độ dùng cảm biến DS18B20 với 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 19-10-2014, 10:11
    Chuyên mục: Học lập trình 8051 - Lượt xem: 25.420
    Bài 13: Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051 Bài 13: Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 22-08-2014, 22:18
    Chuyên mục: Học lập trình 8051 - Lượt xem: 45.996
    Bài 12: Tạo xung PWM dùng ngắt timer 8051 Bài 12: Tạo xung PWM dùng ngắt timer 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 02-03-2014, 20:45
    Chuyên mục: Học lập trình 8051 - Lượt xem: 24.102
    
    Chào mừng hieutrang đã tham gia câu lạc bộ sáng tạo!
    Vũ Văn Thái - vuthai
    Hôm nay là sinh nhật của thien_tai_bk, nguyenvanly10153023, congnam1994, Tubaden, phamvanle, tranhung_09, kakaricardo, kakuta827, minhtrieudtv, tranconganhtu, ngochoanvfone, vantung2004, huynhngoctan_04dhdt, superprofessorA30, ntt762001, huynhngoctan95, phamnhatcuongddt, quangthang25, nguyenhuuphuoc2096, tan00123, gauxam, hvhieu, music1234, huynhngoctan, malacuda, NguyenCuong, caotrungtruc2041996, Quachdaik, Nhattanfc, minhk45, hoangthuong052, trancaoson181945, tuphuong, sangtaoclup_96, khaiptc2, Ngoctram27, no1bestrivenpt, ← Gửi tin nhắn chúc mừng
    Múi giờ: UTC+07:00 - Asia/Ho Chi Minh ***** IP của bạn: 3.145.8.141 ***** Status: Cache Update thành công!