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...
  • Gặp mặt Phó chủ tịch nước Kim Ngân

    Gặp mặt Phó chủ tịch nước Kim Ngân

    Festival sáng tạo trẻ toàn quốc lần thứ V
    Gặp mặt Phó chủ tịch nước Kim Ngân tại văn phòng Quốc Hội

  • Đồng hồ viền 60 LED nháy theo giây

    Đồng hồ viền 60 LED nháy theo giây

    Phiên bản đồng hồ sáng tạo nhất, tích hợp rất nhiều tính năng vào trong một chiếc đồng hồ. Hiển thị ngày theo dương lịch, hiển thị giờ, hiển thị nhiệt độ, 8 hiệu ứng viền nháy theo giây, hẹn giờ đa chức năng, báo giờ,...

  • Robot khiêu vũ theo nhịp nhạc

    Robot khiêu vũ theo nhịp nhạc

    Sản phẩm sáng tạo đã đạt giải sáng tạo trẻ do tỉnh Bắc Giang tổ chức và giải Festival sáng tạo trẻ toàn quốc năm 2012

  • Mạch bảo vệ thông minh qua điện thoại

    Mạch bảo vệ thông minh qua điện thoại

    Thiết bị chống trộm và điều khiển thông minh qua mạng GSM bằng tin nhắn và gọi điện. Sản phẩm đã đạt giải nhất cuộc thi sáng tạo năm 2012 do tỉnh Bắc Giang tổ chức.

  • LED DANCE PRO - LED nháy theo nhạc

    LED DANCE PRO - LED nháy theo nhạc

    Nháy 24 cột bằng Matrix 8x24, chạy chữ khi không có nhạc, thay đổi nội dung qua giao tiếp RS232. Sản phẩm đang trong quá trình phát triển...

BÀI VIẾT NỔI BẬT
Xin chào! Tôi là Ếch Sáng Tạo :-)
Hỗ trợ trực tuyến

Vũ Văn Thái

Chia sẻ trang:



Chuyên mục
Bài mới
Xem nhiều
Thống kê
  • Bài viết: 125/125
  • Thành viên: 4.260
  • Đang online: 1
  • Khách hôm nay: 256
  • Khách hôm qua: 792
  • Tổng khách: 350.444
  • Lượt: 730.306
  • Bắt đầu: 12/05/2013
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: 3.913

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ý!

  • Bài viết cùng chuyên mục
    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: 1.867
    Bài 11: Lập trình quét LED 7 đoạn và nút nhấn Bài 11: Lập trình quét LED 7 đoạn và nút nhấn
    Đăng bởi: Vũ Văn Thái - Thời gian: 19-12-2013, 11:02
    Chuyên mục: Học lập trình 8051 - Lượt xem: 4.823
    Bài 10: Giao tiếp I2C cho vi điều khiển 8051 Bài 10: Giao tiếp I2C cho vi điều khiển 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 27-11-2013, 16:06
    Chuyên mục: Học lập trình 8051 - Lượt xem: 4.187
    Bài 9: Lập trình giao tiếp LCD 16x2 Bài 9: Lập trình giao tiếp LCD 16x2
    Đăng bởi: Vũ Văn Thái - Thời gian: 24-11-2013, 16:32
    Chuyên mục: Học lập trình 8051 - Lượt xem: 4.345
    Bài 7: Lập trình ngắt vi điều khiển 8051 Bài 7: Lập trình ngắt vi điều khiển 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 03-11-2013, 12:15
    Chuyên mục: Học lập trình 8051 - Lượt xem: 3.533
    Bài 6: Lập trình giao tiếp IC ghi dịch 74HC595 Bài 6: Lập trình giao tiếp IC ghi dịch 74HC595
    Đăng bởi: Vũ Văn Thái - Thời gian: 11-10-2013, 14:51
    Chuyên mục: Học lập trình 8051 - Lượt xem: 6.374
    Bài 5: Lập trình nút nhấn đơn giản Bài 5: Lập trình nút nhấn đơn giản
    Đăng bởi: Vũ Văn Thái - Thời gian: 26-09-2013, 15:32
    Chuyên mục: Học lập trình 8051 - Lượt xem: 3.592
    Bài 4: Lập trình LED đơn chạy chữ Happy New Year 2014 đơn giản Bài 4: Lập trình LED đơn chạy chữ Happy New Year 2014 đơn giản
    Đăng bởi: Vũ Văn Thái - Thời gian: 13-09-2013, 14:51
    Chuyên mục: Học lập trình 8051 - Lượt xem: 11.421
    Bài 3: Viết chương trình con - Lập trình C cơ bản Bài 3: Viết chương trình con - Lập trình C cơ bản
    Đăng bởi: Vũ Văn Thái - Thời gian: 22-06-2013, 15:29
    Chuyên mục: Học lập trình 8051 - Lượt xem: 2.127
    Bài 2: Xuất dữ liệu mảng ra Post vi điều khiển - Lập trình C cơ bản Bài 2: Xuất dữ liệu mảng ra Post vi điều khiển - Lập trình C cơ bản
    Đăng bởi: Vũ Văn Thái - Thời gian: 06-06-2013, 20:49
    Chuyên mục: Học lập trình 8051 - Lượt xem: 1.990
    Chào mừng thanhphuocspkt đã 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 nguyencuong18720, thanhcong0208, ngoxuanhoa, giathutk, ducthiet, dungnbhut, thanhcong1992, vantruong825, vietanh, thangtghnaa, thanhcong, triRodger, trinhquynhanh_09, langtugio, kedaohoa, anhthe, ← Gửi tin nhắn chúc mừng
    Múi giờ: UTC+07:00 - Asia/Ho Chi Minh ***** Thời gian xử lý trang: 0.034 giây - Cache: Sẵn sàng!