Tải bản đầy đủ (.pdf) (7 trang)

Hướng dẫn sử dụng Kit 89 - Bài 12 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (568.11 KB, 7 trang )

Hướng dẫn sử dụng Kit 89
Bài 12 : Giao tiếp UART

Mục đích:
Nắm vững giao tiếp Uart.
Yêu cầu:
Xây dựng ứng dụng giao tiếp giữa board 89 và máy tính thông qua cổng COM.

12.1 Nguyên lý giao tiếp UART
Uart RS232 là chuẩn giao tiếp khá phổ biến và được hỗ trợ ở hầu hết các dòng vi
điều khiển vì khoảng cách xa và chi phí thấp. Dòng 8051 hỗ trợ 1 kênh giao tiếp uart.
Dữ liệu được truyền đi trên chân TX gồm 1 start bit (mức 0), data và 1 stop bit
(mức 1).
Tốc độ truyền : đơn vị bit per second (bps) còn gọi là Baud (số lần thay đổi tín
hiệu trong 1 giây – thường sử dụng cho modem). Đối với đường truyền thì Baud và bps
là như nhau.
UART là phương thức truyề
n nhận bất đồng bộ. nghĩa là bên nhận và bên phát
không cần phải có chung tốc độ xung clock (ví dụ : xung clock của vi điều khiển khác
xung clock của máy tính) . Khi đó bên truyền muốn truyền dữ liệu sẽ gửi start bit (bit 0)
để báo cho bên thu biết để bắt đầu nhận dữ liệu và khi truyền xong dữ liệu thì stop bit (bit
1) sẽ được gửi để báo cho bên thu biết kết thúc quá trình truyền.
Khi có start bit thì cả hai bên sẽ dùng chung 1 xung clock (có thể sai khác một ít)
với độ rộng 1 tín hiệu (0 hoặc 1) được quy định bởi baud rate, ví dụ baud rate = 9600bps
nghĩa là độ rộng của tín hiệu 0(hoặc 1) là 1/9600 = 104 ms và khi phát thì bên phát sẽ
dùng baud rate chính xác (ví dụ 9600bps) còn bên thu có thể dùng baud rate sai lêch 1
ít(9800bps chẳng hạn).
Truyền bất đồng bộ sẽ truyển theo từng frame và mỗi frame có cấu trúc như sau:
Stop bit B7 B6 B5 B4 B3 B2 B1 B0 Start bit




Ngoài ra trong frame truyền có thể có thêm bit odd parity (bit lẻ) hoặc even
parity (bit chẵn) để kiểm tra lỗi trong quá trình truyền. Bit parity này có đặc điểm nếu
sử dụng odd parity thì số các bit 1 + odd parity bit sẽ ra 1 số lẻ còn nếu sử dụng even
parity thì số các bit 1 + even parity bit sẽ ra 1 số chẵn.


goes out last goes out first
BKIT HARDWARE CLUB – www.bkit4u.com
63
Hướng dẫn sử dụng Kit 89
12.2 Giao tiếp UART với máy tính
Để giao tiếp COM giữa vi điều khiển và máy tính, ta kết nối mạch theo sơ đồ như
sau:



Do mức điện áp của tín hiệu logic 1/0 ở cổng COM của máy tính khác với vi điều
khiển, nên MAX 232 có tác dụng chuẩn hoá mức điện áp giữa máy tính và điều khiển
trong quá trình truyền nhận dữ liệu. Nếu giao tiếp trực tiếp giữa 2 vi điều khiển, ta không
cần phải sử dụng MAX 232.
BKIT HARDWARE CLUB – www.bkit4u.com
64
Hướng dẫn sử dụng Kit 89


12.3 Viết chương trình
12.3.1 Thanh ghi điều khiển truyền nhận nối tiếp
Vi điều khiển 8051 có hai chân dùng trong truyền nhận nối tiếp là RxD(nhận dữ
liệu ứng với chân P3.0) và TxD(phát dữ liệu ứng với chân P3.1), ngoài ra còn sử dụng bộ

đệm SBUF để lưu dữ liệu thu khi nhận và dữ liệu phát khi truyền và thanh ghi
SCON(Serial Control) để truy xuất port nối tiếp.
Bộ đệm SBUF có địa chỉ byte là 99h, thực tế có hai bộ đệm là bộ đệm thu (chi
đọc) dùng trong nhận dữ liệu và bộ đệm phát (chỉ
ghi) dùng trong phát dữ liệu.
Thanh ghi SCON có địa chỉ byte là 98h là thanh ghi có thể định địa chỉ từng bit
dùng để thiết lập chế độ hoạt động của port nối tiếp và các bit trạng thái chỉ sự kết thúc
việc thu hoặc phát dữ liệu.


Bit Kí hiệu Chức năng
SCON.7 SM0/FE
Cách dùng của bit này được định nghĩa bằng giá trị của bit
SMOD0 trong thanh ghi PCON, nếu SMOD=0, bit này được
đọc và viêt là SM0, nó với bit SM1 định nghĩa chế độ hoạt
động của cổng nối tiếp. Nếu SMOD0=1, bit này được đọc và
viết là FE (khung lỗi). FE được set trong quá trình nhận khi
phát hiện bit dừng không hợp lệ, và nó chỉ được xóa bởi phần
mềm. (chú ý rằng các chế độ UART nên được lập trình(thông
qua SM0 và SM1) khi SMOD0=’0’-chế độ mặc định sau các
quá trình RESET)
BKIT HARDWARE CLUB – www.bkit4u.com
65
Hướng dẫn sử dụng Kit 89
SM1 Cùng với SM0, xác định chế độ làm việc của cổng nối tiếp
SM0,
SM1
Chế độ UART UART 0 Baud Rate
0 0
0: thanh ghi dịch

CCLK/16 (chế độ mặc định sau khi
RESET)
0 1
1: UART 8-bit Thay đổi
1 0
2: UART 9-bit CCLK/32 hoặc CCLK/16
SCON.6
1 1
3: UART 9-bit Thay đổi
SCON.5 SM2
Cho phép truyền thông đa xử lý. Ở Mode 2 và 3, nếu SM2
được lập, RI sẽ không tích cực nếu bit dữ liệu nhận thứ 9 (RB8)
là ‘0’. Ở Mode 0, SM2 nên bằng ‘0’, ở mode 1, SM2 phải bằng
‘0’.
SCON.4 REN
Cho phép thu ở cổng nối tiếp. Thiết lập bởi phần mềm để cho
phép thu. Xóa bởi phần mềm khi không cho phép thu,REN = 1
trong tất cả 4 chế độ tuyền nhận.
SCON.3 TB8
Bit dữ liệu thứ 9 được phát ở mode 2 và 3, lập/xóa bởi phần
mềm khi muốn.
SCON.2 RB8
Bit dữ liệu thứ 9 được nhận ở mode 2 và 3. Ở mode 1(SM2=0),
RB8 là bit dừng được nhận, ở mode 0, RB8 không được định
nghĩa.
SCON.1 TI
Cờ ngắt phát(truyền nối tiếp), lập bởi phần cứng ở cuối bit thứ
8 ở mode 0, hay là ở bit dừng của các chế độ còn lại, phải được
xóa bằng phần mềm. (Xem thêm bit INTL0 ở thanh ghi
SSTAT)

SCON.0 RI
Cờ ngắt thu, lập bởi phần cứng ở cuối bit thứ 8 trong mode 0,
hay khoảng giữa bit dừng ở mode 1. với mode 2 và mode 3,
nếu SMOD0=0, nó được lập gần khoảng giữa bit dữ liệu thứ 9
(bit 8). Nếu SMOD0=1, nó được lập gần khỏang giữa bit dừng.
Phải được xóa bởi phần mềm.

Các chế độ truyền nối tiếp:
• Chế độ 0: ở chế độ này chân RxD sẽ vửa làm nhiệm vụ thu và phát dữ liệu
còn chân TxD làm nhiệm vụ phát xung dịch bit(Shift Clock) vói tốc độ sung
bằng 1/12 tốc độ xung của XTAL.Dữ liệu truyền đi gồm 8 bit với bit LSB
được truyền hoặc nhận trước. Ứng dụng của chế độ này là mở rộng ngõ ra
cho 8051 từ 2 đường TxD,RxD sẽ tạ
o ra 8 đường mở rộng.







8051


TxD(P3.1)


RxD(P3.0)
CLOCK Shift register
Data


BKIT HARDWARE CLUB – www.bkit4u.com
66
Hướng dẫn sử dụng Kit 89
• Chế độ 1: là chế độ truyền với mỗi frame có 10 bits (bit start – 8 bits data –
bit stop) ,tốc độ baud rate có thể thay đổi được tùy vào cách khởi tạo ban
đầu.Có thể nhân đôi tốc độ truyền bằng cách bật PCON.7 = 1.
• Chế độ 2: là chế độ truyền với mỗi frame có 11 bits (bit start – 8 bits data –
bit parity – bit stop),bit parity được đặt trong TB8 khi phát và được đặt
trong RB8 khi thu, tốc độ baud rate ở chế độ này không thay đổi được và
bằng 1/64 dao động của XTAL (1/32 dao động của XTAL nếu PCON.7 =
1).
• Chế độ 3: có chức năng tương tự như chế độ 2 nhưng tốc độ baud rate có
thể thay đổi được như ở chể độ 1.

Tốc độ Baud : Tốc độ (Baud) của cổng 8051 phải phù hợp với máy tính: 100,
150, 300, 600, 1200, 2400, 4800, 9600, 19200. Khuyến cáo dùng thạch anh có tần số
11.0592Mhz để có thể tạo ra tốc độ Baud với sai s
ố thấp (gần như là 0).
12.3.2 Dùng Timer1 tạo Baud rate
Timer 1 được dùng để tạo tốc độ baud cho truyền nối tiếp ,cần phải đặt Timer 1 ở
Mode 2 – 8 bit tự nạp lại, nếu đặt ở chế độ khác sẽ tốn vài chu kỳ máy cho quá trình thiết
lập lại giá trị cho TH1,TL1.
Đặt TH1 theo bảng sao để có tốc độ Baud tương ứng với SMOD = 0 (bit D7 trong
thanh ghi PCON, XTAL = 11.0592 MHz) :

Tốc độ Baud TH1 (Thập phân) TH1 (Hexa)
9600 -3 ED
4800 -6 FA
2400 -12 F4

1200 -24 E8

Tốc độ Baud rate sẽ nhân đôi khi SMOD = 1.
12.3.3 Chương trình truyền nhận UART trên 8051
 Hàm InitTimer1ForUart() sẽ thiết lập Timer1 tạo tốc độ baud cho truyền nối
tiếp

void InitTimer1ForUart()
{
TMOD |= 0x20; // Timer 1 mode 2-autoreload
TL1 = 0;
/* if PCON.7 = 0, TH1 = 256 - ((Crystal / 384) / Baud) */
PCON &= ~(1 << 7);
//TH1 = (-48); // baudrate 600
BKIT HARDWARE CLUB – www.bkit4u.com
67
Hướng dẫn sử dụng Kit 89
//TH1 = (-24); // baudrate 1200
//TH1 = (-12); // baudrate 2400
//TH1 = (-6); // baudrate 4800
TH1 = (-3); // baudrate 9600

/* if PCON.7 = 1, baud is double, TH1 = 256 - ((Crystal / 192) /
Baud) */
//PCON |= (1 << 7);
//TH1 = (-96); // baudrate 600
//TH1 = (-48); // baudrate 1200
//TH1 = (-24); // baudrate 2400
//TH1 = (-12); // baudrate 4800
//TH1 = (-6); // baudrate 9600

//TH1 = (-4); // baudrate 14400
//TH1 = (-3); // baudrate 19200
//TH1 = (-2); // baudrate 28800

TR1 = 1; //timer1 run
}



 Hàm initUart() sẽ thiết lập chế độ hoạt động của port nối tiếp

void initUart()
{
//IE = 0xb0;
//SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI
ES = 1; // enable UART
IP = 0x10; // set priority for serial port
SCON = 0x50; // Uart mode 1,REN = 1
EA = 1; //enable interrupt
}

 Hàm sendChar(unsigned char c)
Để truyền dữ liệu đi, ta chỉ cần ghi giá trị cần truyền vào thanh ghi SBUF. Khi
quá trình truyền kết thúc, cờ ngắt TI sẽ bật lên. Ta sẽ dùng 1 biến cờ trans_busy
để nhận
biết khi nào quá trình truyền kết thúc, và sẽ xoá biến cờ này trong hàm phục vụ ngắt
truyền nối tiếp.

void sendChar(unsigned char c)
{

trans_busy = 1;
SBUF = c;
while(trans_busy);
}
BKIT HARDWARE CLUB – www.bkit4u.com
68
Hướng dẫn sử dụng Kit 89

 Hàm uart_isr() là hàm phục vụ ngắt của truyền nhận nối tiếp :

void uart_isr(void) interrupt 4
{
if (TI == 1) // Truyền dữ liệu
{
/*
Các câu lệnh xử lý khi truyền dữ liệu
*/
trans_busy = 0; //cờ báo hiệu truyền kết thúc
TI = 0; // xoá cờ ngắt TI , kết thúc truyền dữ liệu
}
if (RI == 1) //Nhận dữ liệu
{
/*
Các câu lệnh xử lý khi nhận dữ liệu
*/
data_recv[index] = SBUF; // nhận dữ liệu
RI = 0; // xoá cờ ngắt RI, kết thúc nhận dữ liệu
}
}
Dữ liệu truyền tới vi điều khiển được lưu trong thanh ghi SBUF và khi vi điều

khiển nhận đủ dữ liệu, cờ ngắt RI sẽ bật lên.
BKIT HARDWARE CLUB – www.bkit4u.com
69

×