Giải thích chương trình:
Về cơ bản thì chương trình này chỉ khác là dùng LCD để hiển thị được các ký tự từ máy
tính gởi xuống vì LCD hiển thị ký tự mã ASCII.
Do LCD sử dụng là 16x2 có thể hiển thị được 16 ký tự nên bạn có thể gởi được 16 ký tự
hiển thị trên LCD cùng 1 lúc, nếu gởi nhiều hơn thì các ký tự thứ 17 sẽ không nhìn thấy.
Ở bài minh hoạ này ta đã gởi dữ liệu từ máy tính xuống hiển thị trên LCD nhưng chưa
thực hiện gởi dữ liệu từ vi điều khiển lên máy tính. Bài tiếp theo ta sẽ minh hoạ cho cả 2 chiều.
10.6.4 TRUYỀN VÀ NHẬN DỮ LIỆU GIỮA PIC16F887 VÀ MÁY TÍNH
Bài 10-3: Một hệ thống truyền dữ liệu giữa máy tính và vi điều khiển PIC 16F887: máy
tính sẽ gởi dữ liệu xuống vi điều khiển, vi điều khiển sẽ nhận dữ liệu và hiển thị
trên LCD ở hàng 2. Khi nhấn 1 phím bất kỳ của bàn phím ma trận 4x4 thì mã
phím đó hiển thị trên LCD ở hàng 1, đồng thời gởi về máy tính.
Máy tính sử dụng phần mềm Terminal.
Tốc độ truyền là 9600 baud
264 trang |
Chia sẻ: hachi492 | Ngày: 08/01/2022 | Lượt xem: 493 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Giáo trình Vi điều khiển PC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
g số còn lại: chú ý 2PR có giá trị 8 bit từ 0 đến 255, còn
2TMRPV có 3 giá trị là chia 1, chia 4 và chia 16.
Chọn hệ số chia lớn nhất là 16 hay 162 TMRPV
Khi đó tìm giá trị còn lại 2PR :
250
16*50*4
000,800
**4
]1)2[(
2
ns
ns
PVT
PERIOD
PR
TMROSC
PWM
Vậy 2492 PR .
Lệnh khởi tạo cho timer2 là: setup_timer_2(T2_DIV_BY_16, 249, 1)
Tính hệ số chu kỳ:
Hệ số chu kỳ thay đổi sẽ làm giá trị trung bình của tín hiệu thay đổi, hệ số chu kỳ nhỏ nhất
là bằng 0 khi đó tín hiệu ra CCPx ở mức 0, hệ số chu kỳ tăng làm tín hiệu xuất hiện và giá trị
trung bình tăng, hệ số chu kỳ lớn nhất bằng chu kỳ của PWM.
Cho hệ số chu kỳ bằng chu kỳ để tính toán giới hạn hệ số chu kỳ:
Ñaïi hoïc sö phaïm kyõ thuaät Nguyeãn Ñình Phuù
188 Chöông 9. Ñieàu cheá ñoä roäng xung pwm.
MAXPWMPWM PERIODCYCLEDUTY __
Ta có công thức: 2**)4:5:(_ TMROSCPWM PVTCCPxCONCCPRxLCYCLEDUTY
Ta tìm giá trị lớn nhất của 4:5: CCPxCONCCPRxL .
Suy ra:
22
_
**
_
)4:5:(
TMROSC
PWM
TMROSC
MAXPWM
PVT
PERIOD
PVT
CYCLEDUTY
CCPxCONCCPRxL
1000
16*50
000,800
*
)4:5:(
2
ns
ns
PVT
PERIOD
CCPxCONCCPRxL
TMROSC
PWM
Giá trị điều khiển theo yêu cầu là 100.
Cấp độ 0 là 0, cấp độ 1 là 100, cấp độ 2 là 200, cấp độ cực đại là 1000.
Mạch điều khiển:
Hình 9-14. Mạch điều khiển thay đổi cường độ sáng của đèn dùng PWM.
Hình 9-15. Các dạng tín hiệu thay đổi cường độ sáng của đèn dùng PWM.
Lưu đồ:
Nguyeãn Ñình Phuù Ñaïi hoïc sö phaïm kyõ thuaät
Chöông 9. Ñieàu cheá ñoä roäng xung pwm. 189
BEGIN
THIẾT LẬP TỐC ĐỘ CẤP 1 CHO PWM
ĐIỀU KHIỂN LED SÁNG
KHỞI TẠO PWM, PORT
END
Hình 9-16. Lưu đồ điều khiển đèn sáng dùng PWM.
Chương trình:
#INCLUDE
UNSIGNED INT16 BIEN_TOC_DO;
VOID MAIN()
{
SET_TRIS_C(0X00);
SETUP_CCP1(CCP_PWM);
SETUP_TIMER_2(T2_DIV_BY_16,249,1);
BIEN_TOC_DO=100;
SET_PWM1_DUTY(BIEN_TOC_DO);
WHILE(TRUE){}
}
Giải thích chương trình:
Chương trình chính thực hiện các yêu cầu:
Khởi tạo portC là xuất, chọn chế độ PWM, khởi tạo Timer2 hoạt động đếm xung nội với các
thông số đã tính bao gồm: chọn bộ chia trước là 16, hằng số nạp cho thanh ghi PR2 là 249, chọn
bộ chia sau là 1.
Gán biến tốc độ bằng 100, tương ứng cấp tốc độ là 1. Khởi tạo hệ số công tác để tạo xung
cấp tốc độ 1, thực hiện while.
9.5.2 ĐIỀU KHIỂN ĐỘ SÁNG CỦA ĐÈN 10 CẤP DÙNG PWM
Bài 9-2: Sử dụng PWM của PIC 16F887 để điều khiển 1 đèn led. Cho tần số tụ thạch anh là
20MHz. Cho chu kỳ PWM là 0,8ms.
Hãy tính toán các thông số và viết chương trình điều khiển led thay đổi độ sáng 10
cấp bằng 2 nút nhấn UP và DW. Không tính cấp độ 0.
Hiển thị cấp độ dạng số nhị phân ở các led đơn nối với portD.
Giá trị thay đổi cho 1 cấp là 10.
Tính toán: giống bài 9-1
Theo tính toán thì thông số thay đổi hệ số chu kỳ từ 0 đến 1000.
Theo yêu cầu của bài thì giá trị thay đổi mỗi cấp là 10, khi đó: cấp độ 0 là 0, cấp độ 1 là 10,
cấp độ 2 là 20, cấp độ 10 là 100. Các giá trị từ 100 đến 1000 thì không sử dụng. Lý do khi chạy
thực nghiệm thì từ 0 đến 100 ta nhìn thấy cường độ sáng của led thay đổi, còn từ 110 đến 1000 thì
không còn quan sát được bằng mắt thường nữa.
Mạch điều khiển:
Ñaïi hoïc sö phaïm kyõ thuaät Nguyeãn Ñình Phuù
190 Chöông 9. Ñieàu cheá ñoä roäng xung pwm.
Hình 9-17. Mạch thay đổi cường độ sáng của đèn dùng PWM và 2 nút nhấn.
Lưu đồ:
KIỂM TRA GIỚI HẠN ĐỂ CHO PHÉP
TĂNG 1 CẤP ĐỘ (CỰC ĐẠI BẰNG 10)
NHẤN UP?
S
Đ
NHẤN DW?
KIỂM TRA GIỚI HẠN ĐỂ CHO PHÉP
GIẢM 1 CẤP ĐỘ (CỰC TIỂU BẰNG 0)
Đ
S
BEGIN
THIẾT LẬP TỐC ĐỘ CẤP 0 CHO PWM
ĐIỀU KHIỂN LED
KHỞI TẠO PWM, PORT
Hình 9-18. Lưu đồ điều khiển đèn sáng dùng PWM và 2 nút nhấn.
Chương trình:
#INCLUDE
#DEFINE UP PIN_A3
#DEFINE DW PIN_A4
UNSIGNED INT CAPDO=0;
VOID PHIM_UP ()
{
IF (!INPUT(UP))
{
DELAY_MS (20);
IF(!INPUT(UP))
{
Nguyeãn Ñình Phuù Ñaïi hoïc sö phaïm kyõ thuaät
Chöông 9. Ñieàu cheá ñoä roäng xung pwm. 191
IF (CAPDO<10)
{
CAPDO++;
SET_PWM1_DUTY(CAPDO*10);
OUTPUT_D(CAPDO);
DO {} WHILE (!INPUT(UP));
}
}
}
}
VOID PHIM_DW ()
{
IF (!INPUT(DW))
{
DELAY_MS (20);
IF(!INPUT(DW))
{
IF (CAPDO>0)
{
CAPDO--;
SET_PWM1_DUTY(CAPDO*10);
OUTPUT_D(CAPDO);
DO{}WHILE (!INPUT(DW));
}
}
}
}
VOID MAIN()
{
SET_TRIS_C(0X00);
SET_TRIS_A(0xFF);
SET_TRIS_D(0X00);
OUTPUT_D(CAPDO);
SETUP_CCP1(CCP_PWM);
SETUP_TIMER_2(T2_DIV_BY_16,249,1);
SET_PWM1_DUTY(CAPDO*10);
WHILE(TRUE)
{
PHIM_UP();
PHIM_DW();
}
}
Giải thích chương trình:
Chương trình chính thực hiện các yêu cầu:
Khởi tạo các port, PWM, Timer2 và tốc độ theo số cấp ban đầu là 0.
Vòng lặp while thực hiện kiểm tra nhấn phím UP và DW.
Chương trình con phím UP kiểm tra nếu có nhấn thì tiến hành chống dội và kiểm tra nếu
chưa bằng cấp 10 thì tăng cấp độ lên 1, cập nhật tốc độ mới, xuất ra port để biết cấp tốc độ đang
thực hiện.
Chương trình con phím DW kiểm tra nếu có nhấn thì tiến hành chống dội và kiểm tra nếu
chưa bằng cấp 0 thì giảm bớt 1 cấp độ, cập nhật tốc độ mới, xuất ra port để biết cấp tốc độ đang
thực hiện.
Bài tập 9-1: Hãy thiết kế mạch và viết chương trình giống bài 9-2 nhưng không hiển thị cấp tốc
độ ở led đơn mà hiển thị ở 2 led 7 đoạn và có thêm 1 nút Stop khi nhấn thì tắt led.
9.5.3 ĐIỀU KHIỂN THAY ĐỔI TỐC ĐỘ ĐỘNG CƠ DC DÙNG PWM
Ñaïi hoïc sö phaïm kyõ thuaät Nguyeãn Ñình Phuù
192 Chöông 9. Ñieàu cheá ñoä roäng xung pwm.
Bài 9-3: Sử dụng PWM của PIC 16F887 để điều khiển thay đổi tốc độ động cơ DC. Cho tần
số tụ thạch anh là 20MHz. Cho chu kỳ PWM là 0,8ms. Động cơ dùng nguồn 24V
DC, dòng 3A.
Hãy tính toán các thông số và viết chương trình điều khiển động cơ thay đổi tốc độ
10 cấp bằng 2 nút nhấn UP và DW. Nút Stop khi nhấn thì động cơ ngừng, không
tính cấp độ 0.
Hiển thị cấp độ trên LCD.
Giá trị thay đổi cho 1 cấp là 100.
Tính toán: giống bài 9-1
Mạch điều khiển:
Hình 9-19. Mạch điều khiển thay đổi tốc độ động cơ dùng PWM.
Đề bài yêu cầu điều khiển động cơ DC dùng nguồn 24V DC và dòng là 3A thì ta phải dùng
thêm mạch giao tiếp công suất mới đủ dòng và áp điều khiển động cơ.
Có rất nhiều IC giao tiếp nhưng trong tài liệu này chọn 1 IC khá phổ biến là L298 có thể
điều khiển áp lên đến 48V DC và dòng tổng lên đến 4A – theo datasheet.
Bên trong L298 có 2 mạch điều khiển nên có thể điều khiển được 2 động cơ, mỗi động cơ
2A.
Trong sơ đồ mạch ở trên thì 2 mạch điều khiển mắc song song nên mới có khả năng cấp
dòng 3A cho động cơ.
Có 5 tín hiệu điều khiển nhưng do mắc song song 2 mạch công suất nên chỉ còn 3.
Tín hiệu cho phép ENA: khi ở mức 0 thì không cho phép bất chấp 2 tín hiệu còn lại, mức 1
thì cho phép động cơ quay tuỳ thuộc vào 2 tín hiệu còn lại.
Bảng 9-2. Các trạng thái điều khiển động cơ DC.
TT ENA CCP1 CCP2 TRẠNG THÁI ĐỘNG CƠ
1 0 X X NGỪNG
2 1 0 0 NGỪNG
3 1 1 1 NGỪNG
4 1 1 0 QUAY THUẬN
5 1 0 1 QUAY NGHỊCH
Nguyeãn Ñình Phuù Ñaïi hoïc sö phaïm kyõ thuaät
Chöông 9. Ñieàu cheá ñoä roäng xung pwm. 193
Có 2 led mắc song song với động cơ đế báo hiệu chiều quay của động cơ.
Hai tín hiệu CCP1 và CCP2 điều khiển 2 tín hiệu IN của IC L298 với mục đích có thể điều
khiển động cơ quay thuận, quay ngược và có thể thay đổi được tốc độ ở cả 2 chế độ quay thuận và
ngược.
Lưu đồ:
KIỂM TRA GIỚI HẠN ĐỂ CHO PHÉP
TĂNG 1 CẤP ĐỘ (CỰC ĐẠI BẰNG 10)
HIỂN THỊ TỐC ĐỘ TRÊN LCD
NHẤN UP?
S
Đ
NHẤN DW?
KIỂM TRA GIỚI HẠN ĐỂ CHO PHÉP
GIẢM 1 CẤP ĐỘ (CỰC TIỂU BẰNG 0)
HIỂN THỊ TỐC ĐỘ TRÊN LCD
Đ
S
BEGIN
THIẾT LẬP TỐC ĐỘ CẤP 0 CHO PWM
ĐIỀU KHIỂN ĐỘNG CƠ
HIỂN THỊ LCD HÀNG 1
KHỞI TẠO PWM, PORT,
LCD
NHẤN STOP?
CẤP TỐC ĐỘ = 0, ĐỘNG CƠ NGỪNG
HIỂN THỊ TỐC ĐỘ TRÊN LCD = 0
Đ
S
Hình 9-20. Lưu đồ điều khiển thay đổi tốc độ động cơ dùng PWM.
Chương trình:
#INCLUDE
#INCLUDE
#DEFINE UP PIN_A3
#DEFINE DW PIN_A4
#DEFINE STOP PIN_A5
#DEFINE MOTOR_ENA PIN_C0
const unsigned char HANG1[16]={"DK TOC DO DONGCO"};
SIGNED INT CAPDO=0, I;
VOID HIENTHI_CAP_TOCDO ()
{
LCD_COMMAND(ADDR_LINE2+14); DELAY_US(10);
LCD_DATA(CAPDO/10+0X30);
LCD_DATA(CAPDO%10+0X30);
}
VOID PHIM_UP()
{
IF (!INPUT(UP))
{
DELAY_MS (20);
IF(!INPUT(UP))
{
IF (CAPDO<10)
{
CAPDO++; SET_PWM1_DUTY(CAPDO*10);
HIENTHI_CAP_TOCDO ();
DO {} WHILE (!INPUT(UP));
}
}
}
}
VOID PHIM_DW()
{
IF (!INPUT(DW))
{
Ñaïi hoïc sö phaïm kyõ thuaät Nguyeãn Ñình Phuù
194 Chöông 9. Ñieàu cheá ñoä roäng xung pwm.
DELAY_MS (20);
IF(!INPUT(DW))
{
IF (CAPDO>0)
{
CAPDO--; SET_PWM1_DUTY(CAPDO*10);
HIENTHI_CAP_TOCDO ();
DO {} WHILE (!INPUT(DW));
}
}
}
}
VOID PHIM_STOP()
{
IF (!INPUT(STOP))
{
CAPDO=0;
SET_PWM1_DUTY(CAPDO*10);
HIENTHI_CAP_TOCDO ();
}
}
VOID MAIN()
{
SET_TRIS_C(0X00); SET_TRIS_D(0X00); SET_TRIS_E(0X00);
SETUP_CCP1(CCP_PWM);
SETUP_TIMER_2(T2_DIV_BY_16,249,1);
SET_PWM1_DUTY(CAPDO*10);
LCD_SETUP();
LCD_COMMAND(ADDR_LINE1); DELAY_US(10);
FOR (I=0;I<16;I++) { LCD_DATA(HANG1[I]);}
OUTPUT_HIGH(MOTOR_ENA);
HIENTHI_CAP_TOCDO ();
WHILE(TRUE)
{
PHIM_UP();
PHIM_DW();
PHIM_STOP();
}
}
Giải thích chương trình:
Chương trình chính thực hiện các yêu cầu:
Khởi tạo các port, PWM, Timer2 và tốc độ theo số cấp ban đầu là 0.
Khởi tạo LCD, hiển thị thông tin cho hàng 1.
Cho phép motor sẵn sàng hoạt động và hiển thị cấp độ ban đầu là 0.
Vòng lặp while thực hiện kiểm tra nhấn phím UP, DW và STOP.
Chương trình con phím UP kiểm tra nếu có nhấn thì tiến hành chống dội và kiểm tra nếu
chưa bằng cấp 10 thì tăng cấp độ lên 1, cập nhật tốc độ mới, hiển thị ra LCD cấp tốc độ đang thực
hiện.
Chương trình con phím DW kiểm tra nếu có nhấn thì tiến hành chống dội và kiểm tra nếu
chưa bằng cấp 0 thì giảm bớt 1 cấp độ, cập nhật tốc độ mới, hiển thị ra LCD cấp tốc độ đang thực
hiện.
Chương trình con phím STOP kiểm tra nếu có nhấn thì tiến hành cho cấp tốc độ bằng 0, cho
động cơ ngừng, hiển thị LCD cấp tốc độ bằng 0.
Nguyeãn Ñình Phuù Ñaïi hoïc sö phaïm kyõ thuaät
Chöông 9. Ñieàu cheá ñoä roäng xung pwm. 195
Bài tập 9-2: Hãy hiệu chỉnh bài 9-3 sao cho khi nhấn nút STOP thì động cơ ngừng đồng thời
đảo chiều động cơ.
Khi động cơ quay thuận thì hiển thị “FOR” trên LCD ở 3 ký tự đầu hàng 2.
Khi động cơ quay ngược thì hiển thị “REV” trên LCD ở 3 ký tự đầu hàng 2.
Bài tập 9-3: Hãy hiệu chỉnh bài 9-3 với 2 nút nhấn UP, DW bây giờ có tên là START, INV.
Khi nhấn START thì động cơ quay tốc độ tự động tăng dần từng cấp sau mỗi giây
cho đến khi đạt cấp 10. Chiều quay mặc nhiên ban đầu là quay thuận.
Khi nhấn INV thì động cơ ngừng ngay và đảo chiều quay.
Nút thứ 3 là STOP chỉ khi nhấn thì động cơ giảm tốc cho đến khi ngừng, mỗi lần
giảm 1 cấp cho đến khi bằng 0.
Khi động cơ quay thuận thì hiển thị “FOR” trên LCD ở 3 ký tự đầu hàng 2.
Khi động cơ quay ngược thì hiển thị “REV” trên LCD ở 3 ký tự đầu hàng 2.
Bài tập 9-4: Hãy hiệu chỉnh bài 9-3 thay vì dùng 3 nút nhấn thì dùng bàn phím ma trận 4x4 nối
với portB.
Khi động cơ quay thuận thì hiển thị “FOR” trên LCD ở 3 ký tự đầu hàng 2.
Khi động cơ quay ngược thì hiển thị “REV” trên LCD ở 3 ký tự đầu hàng 2.
Bài tập 9-5: Hãy hiệu chỉnh bài 9-3 thay vì dùng 3 nút nhấn thì dùng bàn phím ma trận 4x4 nối
với portB.
11 phím số có mã từ 0x0 đến 0xA dùng để điều khiển 11 cấp tương ứng, khi nhấn
số 0 thì động cơ ngừng, khi nhấn phím số 1 thì động cơ chạy cấp tốc độ 1, khi nhấn
phím số 2 thì động cơ chạy cấp 5, tương tự cho các phím còn lại. Chỉ chạy 1
chiều.
Bài tập 9-6: Hãy thêm vào bài tập 9-5 các yêu cầu sau:
Khi nhấn phím có mã là 0x0B thì đảo chiều động cơ, hiển thị FOR và Rev tương
ứng trên LCD.
Khi nhấn phím có mã là 0x0d mà động cơ đang chạy thì không có tác dụng, nếu
động cơ đang ngừng thì tự động quay theo chiều đã chọn và tăng tốc cho đến khi
đạt cực đại, thời gia tăng mỗi cấp là 1 giây.
Khi nhấn phím có mã là 0x0e mà động cơ đang ngừng thì không có tác dụng, nếu
động cơ đang chạy thì tự động giảm tốc cho đến khi ngừng, thời gia giảm mỗi cấp
là 1 giây.
Bài tập 9-7: Hãy thiết hệ thống điều khiển 2 motor để kéo 2 bánh xe của 1 chiếc xe 3 bánh bằng
4 nút nhấn TỚI, LÙI, PHẢI, TRÁI.
Khi nhấn nút TỚI thì xe chạy tới, nếu tiếp tục nhấn và giữ thì xe chạy tăng tốc, khi
không còn nhấn thì xe ngừng. Nếu muốn chạy tiếp thì nhấn lại.
Khi nhấn nút LÙI thì xe chạy lùi, nếu tiếp tục nhấn và giữ thì xe chạy lùi tăng tốc,
khi không còn nhấn thì xe ngừng. Nếu muốn chạy tiếp thì nhấn lại.
Ñaïi hoïc sö phaïm kyõ thuaät Nguyeãn Ñình Phuù
196 Chöông 9. Ñieàu cheá ñoä roäng xung pwm.
Khi nhấn nút PHẢI thì xe vừa chạy tới vừa quẹo phải: động cơ bên phải chạy cấp
độ 1, động cơ bên trái chạy cấp độ tăng dần nếu tiếp tục nhấn và giữ, sự chênh lệch
này làm xe quẹo phải.
Khi nhấn nút TRÁI thì xe vừa chạy tới vừa quẹo trái: động cơ bên trái chạy cấp độ
1, động cơ bên phải chạy cấp độ tăng dần nếu tiếp tục nhấn và giữ, sự chênh lệch
này làm xe quẹo trái.
Thiết kế mạch dùng 2 PWM của vi điều khiển PIC16F887 dùng transistor và relay,
mỗi PWM điều khiển 1 động cơ. Relay có chức năng đảo chiều. PWM có chức
năng thay đổi tốc độ.
9.6 CÂU HỎI ÔN TẬP – TRẮC NGHIỆM
9.5.4 CÂU HỎI ÔN TẬP
Câu 9-1: Hãy cho biết tên các thanh ghi liên quan đến khối CCP của vi điều khiển PIC16F887.
Câu 9-2: Hãy cho biết ứng dụng của PWM trong điều khiển động cơ.
9.5.5 CÂU HỎI MỞ RỘNG
Câu 9-3: Hãy so sánh vi điều khiển không tích hợp chức năng PWM và có tích hợp PWM trong
điều khiển thay đổi tốc độ động cơ DC.
9.5.6 CÂU HỎI TRẮC NGHIỆM
Chöông 10
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
198 Chöông 10. Truyeàn döõ lieäu uart.
10.1 GIỚI THIỆU
Truyền dữ liệu nối tiếp có nhiều tiện ích trong điều khiển nên hầu hết các vi điều khiển
đều tích hợp, ở chương này chúng ta sẽ khảo sát nguyên lý hoạt động truyền dữ liệu đồng bộ
và không đồng bộ, cách viết chương trình truyền dữ liệu cho các ứng dụng.
Sau khi kết thúc chương này bạn có thể sử dụng được truyền dữ liệu nối tiếp của các vi
điều khiển.
10.2 TỔNG QUAN VỀ CÁC KIỂU TRUYỀN DỮ LIỆU
Có nhiều kiểu truyền dữ liệu phổ biến tích hợp trong các họ vi điều khiển bao gồm:
Truyền dữ liệu nối tiếp đồng bộ và bất đồng bộ (USART Universal Synchronous
Asynchronous Receiver and Transmitter).
Truyền dữ liệu giữa các vi điều khiển với các thiết bị ngoại vi (SPI Serial
Peripheral Interface).
Truyền dữ liệu 2 dây (I2C: Inter-Integrated Circuit).
Ở kiểu truyền nối tiếp đồng bộ thì có 1 đường dữ liệu và 1 đường xung clock, thiết bị nào
cấp xung clock thì thiết bị đóng vai trò là chủ, thiết bị nhận xung clock đóng vai trò là tớ, tốc
độ truyền dữ liệu phụ thuộc vào tần số xung clock.
Ở kiểu truyền nối tiếp bất đồng bộ thì có 1 đường phát dữ liệu và 1 đường nhận dữ liệu,
không còn tín hiệu xung clock nên gọi là bất đồng bộ. Để truyền được dữ liệu thì cả bên phát
và bên nhận phải tự tạo xung clock có cùng tần số và thường gọi là tốc độ truyền dữ liệu
(baud), ví dụ 2400baud, 4800baud, , 2400baud có nghĩa là truyền 2400 bit trên 1 giây.
Hai kiểu truyền SPI và I2C sẽ được trình bày ở chương tiếp theo.
10.3 TRUYỀN DỮ LIỆU NỐI TIẾP ĐỒNG BỘ VÀ KHÔNG ĐỒNG BỘ
Truyền dữ liệu đồng bộ gồm các đường truyền dữ liệu (DT) và tín hiệu xung clock (CK)
– chức năng của CK dùng để dịch chuyển dữ liệu, mỗi 1 xung ck là 1 bit dữ liệu được truyền
đi.
Trong hệ thống truyền dữ liệu đồng bộ, hệ thống nào cung cấp xung CK thì đóng vai trò
là master (chủ) – những hệ thống còn lại nhận xung ck đóng vai trò là slave (tớ).
Tốc độ truyền dữ liệu chính là tốc độ của xung ck – chính là tần số xung ck.
Ví dụ tần số xung ck là 1MHz thì tốc độ truyền dữ liệu là 1MBPS – 1M baud.
HT1
MASTER
TD
HT2
SLAVE
CK
TD
CK
GND GND
HT1
TxD
HT2
CK
TxD
RxD
RxD
CK
GND GND
Hình 10-1. Hệ thống truyền đồng bộ. Hình 10-2. Hệ thống truyền bất đồng bộ.
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 199
Truyền dữ liệu không đồng bộ giống như hệ thống truyền dữ liệu đồng bộ nhưng không
có xung CK. Không còn phân biệt chủ và tớ – các hệ thống là ngang cấp.
Mỗi 1 xung ck là 1 bit dữ liệu được truyền đi – bây giờ không còn xung Ck thì làm sao
để truyền dữ liệu?
Để truyền dữ liệu thì mỗi hệ thống phải có 1 mạch dao động tạo xung CK – hai hệ thống
sẽ có 2 mạch dao động độc lập nhưng phải cùng tần số hay cùng tốc độ.
10.4 TRUYỀN DỮ LIỆU CỦA VI ĐIỀU KHIỂN PIC 16F887
10.4.1 GIỚI THIỆU TRUYỀN DỮ LIỆU EUSART
Vi điều khiển PIC16F887 có khối truyền dữ liệu đồng bộ, bất đồng bộ đa năng cải tiến.
Khối truyền dữ liệu nối tiếp đa năng bao gồm bộ phát xung clock tạo tốc độ truyền, các thanh
ghi dịch và bộ đệm dữ liệu rất cần thiết để thực hiện truyền hoặc nhận dữ liệu nối tiếp một
cách độc lập.
Khối EUSART cũng có thể xem là giao tiếp truyền dữ liệu nối tiếp SCI (Serial
Communication Interface), có thể định cấu hình cho truyền dữ liệu bất đồng bộ song công
hoặc đồng bộ bán song công.
Truyền dữ liệu song công được sử dụng để truyền dữ liệu giữa các hệ thống ngoại vi như
thiết bị đầu cuối CRT và máy tính.
Truyền dữ liệu đồng bộ bán song công được sử dụng để truyền dữ liệu giữa các hệ thống
ngoại vi như các bộ ADC, DAC, bộ nhớ nối tiếp Eeprom hoặc các bộ vi điều khiển. Các thiết
bị này thường không có nguồn xung clock bên trong để tạo tốc độ baud nên cần phải sử dụng
nguồn xung clock từ bên ngoài.
Khối truyền dữ liệu của PIC16F887 có khả năng:
Hoạt động truyền và dữ liệu song công bất đồng bộ.
Bộ đệm nhận chứa được 2 kí tự.
Bộ đệm phát chứa 1 kí tự.
Có thể lập trình chiều dài dữ liệu 8 bit hoặc 9 bit.
Có khối phát hiện địa chỉ 9 bit
Có khối phát hiện bộ đệm nhận bị tràn
Có khối phát hiện lỗi khung của kí tự nhận về.
Có thể hoạt động chế độ chủ ở kiểu truyền dữ liệu đồng bộ bán song công.
Có thể hoạt động chế độ tớ ở kiểu truyền dữ liệu đồng bộ bán song công.
Có thể lập trình chọn cực cho xung clock ở chế độ truyền đồng bộ.
Khối EUSART được sử dụng cho các cấu trúc mở rộng theo sau, thích hợp cho hệ thống
bus mạng kết nối cục bộ (LIN: Local Interconnect Network):
Tự động phát hiện và thiết lập tốc độ baud.
Có khối đánh thức PIC khỏi chế độ ngủ.
Phát kí tự ngừng 13 bit.
10.4.2 KHỐI PHÁT DỮ LIỆU ESUART CỦA PIC16F887
Sơ đồ khối của khối phát như hình 10-3.
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
200 Chöông 10. Truyeàn döõ lieäu uart.
Thiết lập truyền dữ liệu bất đồng bộ
Thiết lập giá trị cho cặp thanh ghi SPBRGH và SPBRG và BRGH và bit BRG16
để có tốc độ baud mong muốn.
Cho phép truyền dữ liệu bất đồng bộ bằng cách xóa bit SYNC làm bit SPEN lên 1.
Nếu truyền dữ liệu 9 bit thì thiết lập bit cho phép TX9 lên 1.
Làm bit TXEN lên 1 để cho phép truyền dữ liệu.
Nếu muốn sử dụng ngắt thì cho bit TXIE lên 1, cho phép ngắt ngoại vi và cho
phép ngắt toàn cục.
Nếu truyền dữ liệu 9 bit thì phải gán giá trị bit thứ 9 cho bit TX9D
Tiến hành nạp giá trị cần truyền vào thanh ghi TXREG, khi đó quá trình truyền dữ
liệu sẽ bắt đầu.
Hình 10-3. Sơ đồ khối của khối phát dữ liệu của PIC16F887.
Dạng sóng truyền dữ liệu bất đồng bộ như hình 10-4.
Hình 10-4. Dạng sóng truyền dữ liệu.
Giải thích dạng sóng:
Dạng sóng tín hiệu thứ hai là BRG: là tín hiệu tạo xung clock để dịch dữ liệu được phát
liên tục.
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 201
Dạng sóng tín hiệu thứ nhất: là khi thực hiện lệnh ghi dữ liệu cần truyền byte thứ nhất
vào thanh ghi TXREG.
Dạng sóng thứ tư cho biết trạng thái của cờ báo ngắt TXIF: tín hiệu từ 1 xuống 0 rồi lên 1
trở lại cho biết trạng thái thanh ghi bộ đệm còn rỗng, thời gian xuống mức 0 chỉ tồn tại 1 chu
kỳ.
Dạng sóng thứ năm cho biết trạng thái của bit TRMT: tín hiệu từ 1 xuống 0 để cho biết
quá trình dịch dữ liệu bắt đầu và trở lại mức 0 khi đã dịch xong dữ liệu.
Dạng sóng thứ ba là ngõ xuất dữ liệu nối tiếp ra ngoài: bit đầu tiên được phát là bit Start,
tiếp theo là bit dữ liệu thứ 0, 1, , đến bit dữ liệu cuối cùng là bit thứ 7 nếu truyền 8 bit, là bit
thứ 8 nếu truyền 9 bit, bit cuối cùng là bit Stop.
Dạng truyền thứ 2 như hình 10-5, ở kiểu này thì truyền 2 byte:
Hình 10-5. Dạng sóng truyền 2 byte dữ liệu.
Giải thích dạng sóng:
Dạng sóng tín hiệu thứ nhất: là khi thực hiện lệnh ghi dữ liệu cần truyền byte thứ nhất
vào thanh ghi TXREG, sau đó thực hiện tiếp byte thứ 2. Bộ đệm có thể chứa 2 byte để truyền
đi.
Dạng sóng thứ tư cho biết trạng thái của cờ báo ngắt TXIF: tín hiệu từ 1 xuống 0 rồi lên 1
trở lại cho biết trạng thái thanh ghi bộ đệm còn rỗng 1 byte, sau đó nhận tiếp byte thứ 2 thì tín
hiệu này xuống lại mức 0 và ở luôn mức 0 vì bộ đệm đầy. Sau khi truyền xong 1 byte thì bộ
đệm rỗng nên tín hiệu này lên 1 trở lại, ta có thể ghi dữ liệu để phát tiếp.
Dạng sóng thứ ba là ngõ xuất dữ liệu nối tiếp ra ngoài: sẽ phát lần lượt từng byte.
10.4.3 CÁC THANH GHI TXSTA VÀ RCSTA CỦA PIC16F887
Hoạt động của khối ESUART được điều khiển thông qua 3 thanh ghi như sau:
Thanh ghi điều khiển và trạng thái của khối phát (TXSTA – transmit Status and
Control).
Thanh ghi điều khiển và trạng thái của khối nhận (RCSTA – transmit Status and
Control).
a. Thanh ghi điều khiển và trạng thái của khối phát TXSTA
Tổ chức của thanh ghi như hình sau:
CSRS TX9 TXEN SYNC SENDB BRGH TRMT TX9D
R/W(0) R/W(0) R/W(0) R/W(0) R/W(0)R/W(0) R/W(0) R(1)
Hình 10-6. Thanh ghi TXSTA.
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
202 Chöông 10. Truyeàn döõ lieäu uart.
Bảng 10-1. Tóm tắt chức năng các bit trong thanh ghi TXSTA.
Bit Kí hiệu Chức năng (cho phép = 1; cấm = 0)
TXSTA.7 CSRS Clock Source Select bit:
Ở chế độ bất đồng bộ thì không có tác dụng.
Ở chế độ bất đồng bộ thì có chức năng:
CSRS = 1: Hoạt động ở chế độ chủ - phát xung clock.
CSRS = 0: Hoạt động ở chế độ tớ - nhận xung clock.
TXSTA.6 TX9 9 bit Transmit Enable bit.
TX9 = 1: thì truyền dữ liệu 9 bit.
TX9 = 0: thì truyền dữ liệu 8 bit.
TXSTA.5 TXEN Transmit Enable bit:
TXEN = 1: cho phép phát dữ liệu.
TXEN = 0: cấm phát dữ liệu.
TXSTA.4 SYNC EUSART mode select bit:
SYNC = 1: Cho phép truyền đồng bộ.
SYNC = 0: Cho phép truyền bất đồng bộ.
TXSTA.3 SENDB Send Break Character bit
Ở chế độ không đồng bộ:
SENDB = 1: gởi ngắt đồng bộ cho truyền dữ liệu tiếp theo
SENDB = 0: báo hiệu truyền ngắt đồng bộ đã hoàn tất.
Ở chế độ đồng bộ: không có tác dụng.
TXSTA.2 BRGH High Baud Rate Select bit:
BRGH=1: chế độ tốc độ cao.
BRGH=0: chế độ tốc độ thấp.
Ở chế độ đồng bộ: không có tác dụng.
TXSTA.1 TRMT Bit xác định trạng thái của thanh ghi TSR.
TRMT xuống mức 0 khi đang truyền dữ liệu.
TRMT lên 1 khi đã truyền xong.
TXSTA.0 TX9D Bit lưu dữ liệu phát thứ 9.
b. Thanh ghi điều khiển và trạng thái của khối nhận RCSTA
Tổ chức của thanh ghi như hình sau:
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
R/W(0) R/W(0) R/W(0) R(0) R(x)R/W(0) R/W(0) R(0)
Hình 10-7. Thanh ghi RCSTA.
Bảng 10-2. Tóm tắt chức năng các bit trong thanh ghi RCSTA.
Bit Kí hiệu Chức năng (cho phép = 1; cấm = 0)
RCSTA.7 SPEN Serial Port Enable bit:
SPEN = 1: cho phép port nối tiếp (cấu hình các chân RX/TD và TX/CK là các
chân cho truyền dữ liệu nối tiếp).
SPEN = 0: thì cấm.
RCSTA.6 RX9 9 bit Receive Enable bit.
RX9 = 1: thì cho phép nhận dữ liệu 9 bit.
RX9 = 0: thì cho phép nhận dữ liệu 8 bit.
RCSTA.5 SREN Single Receive Enable bit:
Ở chế độ không đồng bộ: không có tác dụng.
Ở chế độ đồng bộ - chủ
SREN = 1: cho phép nhận đơn.
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 203
SREN = 0: cấm nhận đơn. Bit SREN bị xóa sau khi quá trình nhận hoàn tất.
Ở chế độ đồng bộ - tớ: không có tác dụng.
RCSTA.4 CREN Continuous Receive Enable bit:
Ở chế độ không đồng bộ:
CREN = 1: Cho phép nhận.
CREN = 0: Cấm nhận.
Ở chế độ đồng bộ:
CREN = 1: Cho phép nhận liên tục cho đến khi bit CREN bị xóa.
CREN = 0: Cấm nhận liên tục.
RCSTA.3 ADDEN Address Detect Enable bit
Ở chế độ không đồng bộ 9 bit:
ADDEN = 1: Cho phép phát hiện địa chỉ, cho phép ngắt và nạp bộ đệm nhận
khi bit RSR lên 1.
ADDEN = 0: cấm bộ phát hiện địa chỉ, tất cả các byte được nhận và bit thứ 9
có thể dùng làm bit kiểm tra chẵn lẻ.
Ở chế độ không đồng bộ 8 bit: không có tác dụng.
RCSTA.2 FERR Framing Error bit:
FERR =1: xảy ra lỗi khung dữ liệu.
FERR =0: không có lỗi khung xảy ra.
RCSTA.1 OERR Overrun Error bit
OERR = 1: xảy ra lỗi tràn.
OERR = 0: không xảy ra lỗi tràn.
RCSTA.0 RX9D Ninth bit of Receive Data.
Bit này dùng để lưu dữ liệu nhận về của bit thứ 9 hoặc có thể là bit kiểm tra
chẵn lẻ.
10.4.4 KHỐI NHẬN DỮ LIỆU ESUART CỦA PIC16F887
Sơ đồ khối nhận dữ liệu của khối EUASRT như hình 10-8.
Hình 10-8. Sơ đồ khối của khối nhận dữ liệu của PIC16F887.
Dữ liệu nhận vào ở chân RX/DT và điều khiển khối khôi phục dữ liệu. Khối khôi phục
dữ liệu là khối dịch tốc độ cao hoạt động gấp 16 lần tốc độ baud, trong khi đó thanh ghi nhận
dữ liệu (RSR: Receive Shift Register) hoạt động dịch dữ liệu cùng với tốc độ baud.
Khi tất cả 8 bit hoặc 9 bit dữ liệu được dịch vào thì ngay lập tức sẽ được truyền cho bộ
đệm chứa được 2 kí tự dạng FIFO, nếu có thêm một ký tự nữa mà phần mềm chưa đọc 2 byte
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
204 Chöông 10. Truyeàn döõ lieäu uart.
đã nhận thì sẽ phát sinh lỗi tràn. Phần mềm không thể truy xuất bộ đệm FIFO và thanh ghi
RSR mà chỉ được phép truy xuất thanh ghi RCREG.
Khởi tạo quá trình nhận dữ liệu:
Thiết lập giá trị cho cặp thanh ghi SPBRGH và SPBRG và BRGH và bit BRG16
để có tốc độ baud mong muốn.
Cho phép truyền dữ liệu bất đồng bộ bằng cách xóa bit SYNC làm bit SPEN lên 1.
Nếu nhận dữ liệu 9 bit thì thiết lập bit cho phép RX9 lên 1.
Làm bit CREN lên 1 để cho phép nhận dữ liệu.
Nếu muốn sử dụng ngắt thì cho bit RCIE lên 1, cho phép ngắt ngoại vi và cho
phép ngắt toàn cục.
Cờ báo ngắt RCIF sẽ lên 1 khi một kí tự chuyển từ RSR sang bộ đệm, ngắt sẽ phát
sinh nếu được phép.
Đọc thanh ghi trạng thái nhận RCSTA để kiểm tra các cờ báo lỗi.
Nhận dữ liệu 8 bit từ thanh ghi RCREG.
Nếu có lỗi tràn xảy ra thì xóa bit cho phép nhận CREN
Khởi tạo quá trình nhận dữ liệu ở chế độ phát hiện 9 bit địa chỉ: chế độ này thường được
dùng trong hệ thống truyền theo chuẩn RS-485.
Thiết lập giá trị cho cặp thanh ghi SPBRGH và SPBRG và BRGH và bit BRG16
để có tốc độ baud mong muốn.
Cho phép truyền dữ liệu bất đồng bộ bằng cách xóa bit SYNC làm bit SPEN lên 1.
Nếu muốn sử dụng ngắt thì cho bit RCIE lên 1, cho phép ngắt ngoại vi và cho
phép ngắt toàn cục.
Nếu nhận dữ liệu 9 bit thì thiết lập bit cho phép RX9 lên 1.
Cho phép phát hiện địa chỉ 9 bit bằng cách cho bit ADDEN lên 1.
Làm bit CREN lên 1 để cho phép nhận dữ liệu.
Cờ báo ngắt RCIF sẽ lên 1 khi một kí tự chuyển từ RSR sang bộ đệm, ngắt sẽ phát
sinh nếu được phép.
Đọc thanh ghi trạng thái nhận RCSTA để kiểm tra các cờ báo lỗi. Bit thứ 9 luôn là
1.
Nhận dữ liệu 8 bit từ thanh ghi RCREG, phần mềm sẽ tiến hành kiểm tra địa chỉ
của thiết bị.
Nếu có lỗi tràn xảy ra thì xóa bit cho phép nhận CREN.
Nếu đúng địa chỉ của thiết bị thì tiến hành xóa bit ADDEN để cho phép nhận dữ
liệu vào bộ đệm và phát sinh ngắt.
Dạng sóng nhận dữ liệu như hình 10-9:
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 205
Hình 10-9. Dạng sóng nhận dữ liệu.
Dạng sóng tín hiệu thứ nhất: là dữ liệu nhận về ở chân RX/DT, có 3 kí tự được nhận liên
tục.
Dạng sóng tín hiệu thứ hai: cho biết sau khi nhận xong 1 kí tự (nhận xong bit stop) thì
nạp lưu vào thanh ghi bộ đệm.
Dạng sóng tín hiệu thứ ba: cho biết tín hiệu RCIDL xuống mức 0 khi phát hiện bit start
và lên 1 khi phát hiện bit stop.
Dạng sóng tín hiệu thứ năm: cho biết cờ nhận RCIF lên mức 1 khi nhận được 1 kí tự và
xuống mức 0 khi đã tiến hành đọc xong các kí tự đã nhận.
Dạng sóng tín hiệu thứ sáu: cho biết bit báo lỗi tràn OERR lên mức 1 khi nhận tới 3 kí tự.
Dạng sóng tín hiệu thứ bảy: cho biết khi xóa bit CREN thì xóa luôn bit báo lỗi tràn
OERR.
Dạng sóng tín hiệu thứ tư: cho biết tiến hành đọc 2 byte dữ liệu (đã mất 1 byte), khi đọc
xong thì xóa luôn cờ báo ngắt.
10.4.5 THANH GHI TẠO TỐC ĐỘ BAUD CỦA PIC16F887
Tổ chức của thanh ghi điều khiển tốc độ baud (BAUDCTL – Baud Rate Control) như
hình 10-10.
ABDOVF RCIDL - SCKP BRG16 - WUE ABDEN
R/W(0) R/W(0) R/W(0)R(0) R(1) R/W(0)
Hình 10-10. Thanh ghi BAUDCTL.
Bảng 10-3. Tóm tắt chức năng các bit trong thanh ghi BAUDCTL.
Bit Kí hiệu Chức năng (cho phép = 1; cấm = 0)
BAUDCTL.7 ABDOVF Auto – Baud detect Overflow bit: bit tự động phát hiện tràn tốc độ baud
Ở chế độ không đồng bộ:
ABDOVF = 1: cho biết timer tạo tốc độ baud tự động bị tràn.
ABDOVF = 1: cho biết timer tạo tốc độ baud tự động không bị tràn.
Ở chế độ đồng bộ: không có tác dụng.
BAUDCTL.6 RCIDL Receive Idle Flag bit: bit cờ ngừng nhận
Ở chế độ không đồng bộ:
RCIDL = 1: cho biết bộ nhận đang ngừng – lên 1 khi phát hiện bit stop.
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
206 Chöông 10. Truyeàn döõ lieäu uart.
RCIDL = 0: cho biết bắt đầu nhận bit start cho đến bit dữ liệu cuối cùng.
Ở chế độ đồng bộ: không có tác dụng.
BAUDCTL.4 SCKP Synchronous Clock Polarity bit:
Ở chế độ không đồng bộ:
SCKP = 1: phát dữ liệu đảo đến chân TX/CK.
SCKP = 0: phát dữ liệu không đảo đến chân TX/CK.
Ở chế độ đồng bộ:
SCKP = 1: dữ liệu được dịch khi có cạnh lên của xung clock.
SCKP = 0: dữ liệu được dịch khi có cạnh xuống của xung clock.
BAUDCTL.3 BRG16 16 bit Baud Rate generator bit
BRG16 = 1: sử dụng bộ tạo tốc độ baud 16 bit.
BRG16 = 0: sử dụng bộ tạo tốc độ baud 8 bit.
BAUDCTL.1 WUE Wake – up Enable bit: bit cho phép đánh thức CPU
Ở chế độ không đồng bộ:
WUE = 1: cho phép bộ nhận chờ cho đến khi có xung cạnh xuống. Sẽ
không có kí tự nào được nhận nếu bit RCIF thiết lập ở mức 1. WUE sẽ
tự động xóa sau khi bit RCIF lên 1.
WUE = 0: Bộ nhận hoạt động bình thường.
Ở chế độ đồng bộ: không có chức năng.
BAUDCTL.0 ABDEN Auto-Baud Detect Enable bit: bit cho phép phát hiện tốc độ baud tự
động.
ABDEN = 1: cho phép hoạt động tốc độ baud tự động.
ABDEN = 0: không cho phép hoạt động tốc độ baud tự động
Bộ phát tốc độ baud (Baud Rate Generator) là timer 8 bit hoặc 16 bit để tạo tốc độ cho
hoạt động truyền dữ liệu ESUART đồng bộ và bất đồng bộ.
Mặc nhiên thì khối tạo tốc độ baud BRG hoạt động chế độ 8 bit, nếu cho bit BRG16 bằng
1 thì hoạt động chế độ 16 bit.
Cặp thanh ghi SPBRGH và SPBRG xác định chu kỳ tạo tốc độ baud của timer.
Trong chế độ truyền đồng bộ thì bộ nhân chu kỳ tốc độ baud được xác định bởi cả 2 bit
BRGH trong thanh ghi TXSTA và bit BRG16 trong thanh ghi BAUDCTL.
Trong chế độ truyền bất đồng bộ thì bộ nhân chu kỳ tốc độ baud chỉ được xác định bởi
bit BRGH.
Bảng 10-4. Tóm tắt các công thức tính tốc độ baud.
Ứng với từng trạng thái của 3 bit SYNC, BRG16 và BRGH mà có các công thức tính tốc
độ baud tương ứng. Trong công thức tính tốc độ baud thì n là giá trị của cặp thanh ghi
SPBRGH và SPBRG.
Ví dụ 10-1: Hãy tính giá trị n của cặp thanh ghi để tốc độ truyền là 9600BAUD, sử dụng
thạch anh có tần số 16MHz, hoạt động bất đồng bộ, bộ phát tốc độ BRG 8 bit.
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 207
Công thức tính tốc độ baud:
)1]:([64)1(64
SPBRGSPBGRH
F
n
F
TDBAUDTDTDL OSCOSC
Tính giá trị của cặp thanh ghi:
041,251
960064
16000000
1
64
:
TDBAUD
F
SPBRGSPBGRH OSC
Giá trị để nạp cho cặp thanh ghi là 25, khi đó tốc độ thực là:
9615
)125(64
16000000
)1]:([64
SPBRGSPBGRH
F
TDBAUD OSCTINH
Sai số so với tốc độ 9600 là: %16,0
9600
96009615
TDBAUD
TDBAUDTDBAUD
SAISO TINH
10.5 CÁC LỆNH TRUYỀN DỮ LIỆU EUSART CỦA PIC16F887
Các lệnh của ngôn ngữ lập trình C liên quan đến ngắt bao gồm:
10.5.1 LỆNH SETUP_UART(BAUD, STREAM)
Cú pháp: setup_uart(baud, stream), setup_uart(baud), set_uart_speed(baud,[stream])
Thông số: baud, stream có thể là 1 hoặc 2 hằng số: hằng số thứ nhất là tốc độ, hằng số thứ 2
là tên của cổng giao tiếp nếu hệ thống có nhiều cổng giao tiếp EUART để phân
biệt. Nếu chỉ có 1 thì không cần thông số thứ 2.
Chức năng: thiết lập tốc độ baud cho EUART.
Có hiệu lực: cho tất cả các vi điều khiển PIC.
Ví dụ 10-2: thiết lập tốc độ 9600 baud: setup_uart(9600);
10.5.2 LỆNH PUTS(STRING)
Cú pháp: puts(string)
Thông số: string là chuỗi ký tự gởi đi.
Chức năng: có chức năng gởi từng kí tự ra port nối tiếp, sau khi gởi xong chuỗi kí tự thì tự
động gởi thêm kí tự RETURN (có mã là 13) và kí tự xuống hàng (LINE-FEED
có mã là 10).
Có hiệu lực: cho tất cả các vi điều khiển PIC.
Ví dụ 10-3: puts(“ | HELLO| ”);
10.5.3 LỆNH Value = Getc(),Value = Fgetc(Stream), Value = Getch(), Value =
Getchar()
Cú pháp: value = getc(),value = fgetc(stream), value = getch(), value = getchar()
Thông số: stream là tên của cổng EUART nếu có.
Chức năng: có chức năng chờ cho đến khi có kí tự gởi đến thì nhận.
Có hiệu lực: cho tất cả các vi điều khiển PIC.
Ví dụ 10-4: kitu = getch();
10.5.4 LỆNH value = KBHIT()
Cú pháp: value = KBHIT()
Thông số: không có
Chức năng: có chức năng trả về kết quả đúng nếu có kí tự đã nhận và trả về kết quả sai nếu
không có kí tự.
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
208 Chöông 10. Truyeàn döõ lieäu uart.
Có hiệu lực: cho tất cả các vi điều khiển PIC.
Ví dụ 10-5: if (KBHIT) kitu = getch(); // nếu có kí tự thì nhận
10.6 ỨNG DỤNG TRUYỀN DỮ LIỆU EUSART CỦA PIC16F887
Phần này trình bày các ứng dụng truyền dữ liệu đơn giản của PIC16F887, qua các ứng
dụng này giúp bạn biết sử dụng chức năng truyền dữ liệu của PIC16F887.
10.6.1 TRUYỀN DỮ LIỆU GIỮA PIC16F887 VÀ MÁY TÍNH ĐIỀU KHIỂN LED
Bài 10-1: Một hệ thống truyền dữ liệu giữa máy tính và vi điều khiển PIC 16F887: máy
tính sẽ gởi dữ liệu xuống vi điều khiển, vi điều khiển sẽ nhận dữ liệu và gởi ra
portD nối với 8 led đơn. Máy tính sử dụng phần mềm Terminal.
Tốc độ truyền là 9600 baud.
Sơ đồ mạch: như hình 10-11.
Hình 10-11. Hệ thống truyền dữ liệu giữa máy tính và vi điều khiển.
Trong sơ đồ mạch có dùng IC2 có tên là MAX232 dùng để chuyển đổi tín hiệu RS232
của cổng COM của máy tính thành chuẩn TTL để tương thích với vi điều khiển, xem hình 10-
12.
Hình 10-12. Dạng sóng các mức 1 và 0 của chuẩn RS232.
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 209
Mức logic 0 của chuẩn RS232 có điện áp 12V, mức logic 1 có điện áp -12V, chuẩn này
khác với chuẩn TTL nên phải chuyển đổi.
IC MAX232 có tích hợp 2 bộ chuyển đổi, trong mạch này chỉ dùng 1 bộ chuyển đổi. Các
tụ điện trong mạch theo sổ tay của IC do nhà chế tạo cung cấp.
Truyền dữ liệu UART thường dùng cổng giao tiếp là 9 chân có tên là COM1 (trước dùng
cổng 25 chân nhưng đã bỏ). Chú ý khi vẽ mạch in (PCB) thì bạn phải chọn cổng COM 9 chân
loại hàn vào mạch in và khi chọn linh kiện bạn phải chọn đúng loại cái. Các dây cáp kết nối sử
dụng đầu jack đực nên sẽ giúp bạn kết nối đúng.
Sử dụng portD để điều khiển 8 led đơn, thạch anh sử dụng là 20Mhz.
Lưu đồ: như hình 10-13.
Chương trình: cho vi điều khiển nhận dữ liệu
#INCLUDE
#USE rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
UNSIGNED INT8 RDATA=0;
VOID MAIN()
{
SET_TRIS_D(0x00); OUTPUT_D(RDATA);
WHILE(TRUE)
{
IF(KBHIT())
{
RDATA = GETCH();
OUTPUT_D(RDATA);
}
}
}
BEGIN - PC
KHỞI TẠO PHẦN MỀM
TERMINAL
CHỌN CỔNG, CHỌN TỐC ĐỘ
GỞI DỮ LIỆU
BEGIN - VĐK
KHỞI TẠO TRUYỀN DỮ LIỆU,
PORT
NHẬN DỮ LIỆU GỞI RA PORT0
CÓ DỮ LIỆU
S
Đ
Hình 10-13. Lưu đồ điều khiển truyền dữ liệu.
Giải thích chương trình:
Hàng thứ 1 là khai báo thư viện sử dụng giống các bài đã viết.
Hàng thứ 2 khai báo thiết lập truyền dữ liệu gồm 3 thông số: chọn tốc độ truyền là 9600
baud, chọn port phát dữ liệu là chân thứ 6 của portC, chọn port nhận dữ liệu là chân thứ 7 của
portC.
Theo sơ đồ chân thì 2 chân RC6 và RC7 là TD và RD nhưng bạn cũng có thể chọn chân
khác để kết nối cũng được, khi đó bạn phải hiệu chỉnh mạch điện và cả chương trình.
Trong vòng lặp while thì tiến hành kiểm tra xem nếu có dữ liệu thì tiến hành nhận và xuất
ra portD.
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
210 Chöông 10. Truyeàn döõ lieäu uart.
10.6.2 PHẦN MỀM TRUYỀN DỮ LIỆU TERMINAL TRÊN MÁY TÍNH
Để truyền dữ liệu từ máy tính xuống vi điều khiển thì ta phải tiến hành xây dựng 1
chương trình, tuy nhiên để đơn giản thì ta sử dụng phần mềm đã có phổ biến là Terminal.
Giao diện phần mềm Terminal như hình 10-14.
Hình 10-14. Giao diện phần mềm Terminal để gởi dữ liệu.
Bạn phải xem trong “Device Manager” để xem cổng COM đang sử dụng là COM thứ bao
nhiêu và tiến hành chọn cho đúng cổng COM port, trong tài liệu này máy tính sử dụng cổng
COM5.
Tốc độ mặc nhiên của phần mềm là 9600 baud.
Bạn tiến hành chọn mục “Connect”, sau khi kết nối thành công thì tên của nút nhấn trở
thành “Disconnect”.
Hàng trắng bên dưới bạn đánh ký tự cần gởi và nhấn enter thì phần mềm sẽ gởi xuống
máy tính. Trong hình thì đã gởi ký tự số 2.
Phần mềm Terminal gởi ký tự ở dạng mã ASCII. Khi gởi số 2 thì máy tính sẽ gởi mã
ASCII của số 2 là 0x32, dữ liệu điều khiển portD sẽ là 00110010.
Mục đích của bài này cho các bạn thấy cách viết chương trình truyền dữ liệu khá đơn
giản, các bài tiếp theo sẽ hiển thị được nhiều ký tự và rõ rang hơn ví dụ bạn gởi số 2 trên máy
tính thì bạn có thể nhìn thấy được số 2 hiển thị trên LCD bên vi điều khiển, bạn có thể gởi 1
chuỗi nhiều ký tự.
10.6.3 TRUYỀN DỮ LIỆU GIỮA PIC16F887 VÀ MÁY TÍNH HIỂN THỊ LCD
Bài 10-2: Một hệ thống truyền dữ liệu giữa máy tính và vi điều khiển PIC 16F887: máy
tính sẽ gởi dữ liệu xuống vi điều khiển, vi điều khiển sẽ nhận dữ liệu và hiển thị
trên LCD. Máy tính sử dụng phần mềm Terminal.
Tốc độ truyền là 9600 baud.
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 211
Sơ đồ mạch: như hình 10-15.
Hình 10-15. Hệ thống truyền dữ liệu giữa máy tính và vi điều khiển, hiển thị LCD.
Sơ đồ mạch dùng LCD để hiển thị được mã ASCII để tương thích với máy tính.
Lưu đồ: như hình 10-16.
BEGIN - PC
KHỞI TẠO PHẦN MỀM
TERMINAL
CHỌN CỔNG, CHỌN TỐC ĐỘ
GỞI DỮ LIỆU
BEGIN - VĐK
KHỞI TẠO TRUYỀN DỮ LIỆU,
KHỞI TẠO PORT, LCD
NHẬN DỮ LIỆU HIỂN THỊ TRÊN LCD
CÓ DỮ LIỆU
S
Đ
Hình 10-16. Lưu đồ điều khiển truyền dữ liệu, hiển thị trên LCD.
Chương trình: cho vi điều khiển nhận dữ liệu
#INCLUDE
#INCLUDE
#USE rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
UNSIGNED INT8 RDATA=0,I;
const unsigned char HANG1[16]={"GIAO TIEP MAY TINH"};
VOID MAIN()
{
SET_TRIS_E(0x00); SET_TRIS_D(0x00);
LCD_SETUP();
LCD_COMMAND(ADDR_LINE1); DELAY_US(10);
FOR (I=0;I<16;I++) { LCD_DATA(HANG1[I]);}
LCD_COMMAND(ADDR_LINE2); DELAY_US(10);
WHILE(TRUE)
{
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
212 Chöông 10. Truyeàn döõ lieäu uart.
IF(KBHIT())
{
RDATA = GETCH();
LCD_DATA(RDATA);
}
}
}
Giải thích chương trình:
Về cơ bản thì chương trình này chỉ khác là dùng LCD để hiển thị được các ký tự từ máy
tính gởi xuống vì LCD hiển thị ký tự mã ASCII.
Do LCD sử dụng là 16x2 có thể hiển thị được 16 ký tự nên bạn có thể gởi được 16 ký tự
hiển thị trên LCD cùng 1 lúc, nếu gởi nhiều hơn thì các ký tự thứ 17 sẽ không nhìn thấy.
Ở bài minh hoạ này ta đã gởi dữ liệu từ máy tính xuống hiển thị trên LCD nhưng chưa
thực hiện gởi dữ liệu từ vi điều khiển lên máy tính. Bài tiếp theo ta sẽ minh hoạ cho cả 2 chiều.
10.6.4 TRUYỀN VÀ NHẬN DỮ LIỆU GIỮA PIC16F887 VÀ MÁY TÍNH
Bài 10-3: Một hệ thống truyền dữ liệu giữa máy tính và vi điều khiển PIC 16F887: máy
tính sẽ gởi dữ liệu xuống vi điều khiển, vi điều khiển sẽ nhận dữ liệu và hiển thị
trên LCD ở hàng 2. Khi nhấn 1 phím bất kỳ của bàn phím ma trận 4x4 thì mã
phím đó hiển thị trên LCD ở hàng 1, đồng thời gởi về máy tính.
Máy tính sử dụng phần mềm Terminal.
Tốc độ truyền là 9600 baud.
Sơ đồ mạch: như hình 10-17.
Hình 10-17. Hệ thống truyền dữ liệu giữa máy tính và vi điều khiển, có LCD, bàn phím.
Sơ đồ mạch them phần giao tiếp bàn phím ma trận 4x4 để thực hiện chức năng khi nhấn
phím nào thì mã phím đó sẽ hiển thị trên LCD đồng thời gởi về máy tính.
Lưu đồ: như hình 10-18.
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 213
BEGIN - PC
MỞ PHẦN MỀM TERMINAL
CHỌN CỔNG, CHỌN TỐC
ĐỘ
GỞI DỮ LIỆU
BEGIN - VĐK
KHỞI TẠO TRUYỀN DỮ
LIỆU, KHỞI TẠO PORT,
LCD
NHẬN DỮ LIỆU HIỂN THỊ TRÊN LCD
CÓ DỮ LIỆU
S
Đ
NHẤN PHÍM
XỬ LÝ, HIỂN THỊ TRÊN LCD, GỞI ĐI
Đ
S
Hình 10-18. Lưu đồ điều khiển truyền dữ liệu, có thêm LCD và bàn phím.
Chương trình:
#INCLUDE
#INCLUDE
#INCLUDE
#USE rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
UNSIGNED INT8 RDATA=0, MP, TDATA, VITRI_H1=0, VITRI_H2=0;
VOID MAIN()
{
SET_TRIS_E(0x00); SET_TRIS_D(0x00);
SET_TRIS_B(0xF0); PORT_B_PULLUPS(0XF0);
LCD_SETUP();
LCD_COMMAND(ADDR_LINE1); DELAY_US(10);
LCD_DATA("GIAO TIEP MAY TINH");
WHILE(TRUE)
{
IF(KBHIT())
{
LCD_COMMAND(ADDR_LINE2+VITRI_H2);
DELAY_US(10);
RDATA = GETCH();
LCD_DATA(RDATA);
IF (VITRI_H2==15) VITRI_H2=0;
ELSE VITRI_H2++;
}
MP= KEY_4X4();
IF (MP!=0XFF)
{
LCD_COMMAND(ADDR_LINE1+VITRI_H1);
DELAY_US(10);
IF (MP<10) TDATA = MP+0X30;
ELSE TDATA = MP+0X37;
PUTC(TDATA);
LCD_DATA(TDATA);
IF (VITRI_H1==15) VITRI_H1=0;
ELSE VITRI_H1++;
}
}
}
Giải thích chương trình:
Chương trình chính thực hiện 2 yêu cầu:
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
214 Chöông 10. Truyeàn döõ lieäu uart.
Yêu cầu thứ 1: Kiểm tra nếu có dữ liệu từ máy tính gởi xuống thì tiến hành hiển thị ở
hàng 2.
Yêu cầu thứ 2: Gọi chương trình con quét ma trận phím, nếu có phím nhấn thì tiến hành
kiểm tra nếu các phím số có mã từ 0 đến 9 thì chuyển sang mã ASCII bằng cách cộng them
0x30 rồi hiển thị và gởi về máy tính, nếu là các phím có mã từ 0x0A đến 0x0F thì cộng thêm
0x37 để chuyển thành các ký tự tương ứng từ A đến F để hiển thị trên LCD và gởi về máy tính.
Do mỗi hàng chỉ hiển thị được 16 ký tự và 2 hàng độc lập về địa chỉ nên phải thiết lập địa
chỉ trước khi gởi dữ liệu, khi gởi 1 ký tự ra LCD thì địa chỉ tăng lên 1, khi bằng 16 thì cho địa
chỉ về 0 để về lại đầu hàng.
10.6.5 TRUYỀN VÀ NHẬN DỮ LIỆU GIỮA PIC16F887 VÀ MÁY TÍNH DÙNG
NGẮT ĐỂ NHẬN DỮ LIỆU
Bài 10-4: Một hệ thống truyền dữ liệu giữa máy tính và vi điều khiển PIC 16F887: máy
tính sẽ gởi dữ liệu xuống vi điều khiển, vi điều khiển sẽ nhận dữ liệu và hiển thị
trên LCD ở hàng 2. Khi nhấn 1 phím bất kỳ của bàn phím ma trận 4x4 thì mã
phím đó hiển thị trên LCD ở hàng 1, đồng thời gởi về máy tính.
Máy tính sử dụng phần mềm Terminal.
Tốc độ truyền là 9600 baud. Sử dụng ngắt để nhận dữ liệu.
Sơ đồ mạch: như hình 10-19.
Hình 10-19. Hệ thống truyền dữ liệu giữa máy tính và vi điều khiển, có LCD, bàn phím.
Sơ đồ mạch them phần giao tiếp bàn phím ma trận 4x4 để thực hiện chức năng khi nhấn
phím nào thì mã phím đó sẽ hiển thị trên LCD đồng thời gởi về máy tính.
Lưu đồ: như hình 10-20.
Chương trình:
#INCLUDE
#INCLUDE
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 215
#INCLUDE
#USE rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
UNSIGNED INT8 RDATA=0, MP, I, TDATA, VITRI_H1=0, VITRI_H2=0;
const unsigned char HANG1[16]={"GIAO TIEP MAY TINH"};
#INT_RDA
void interrupt_UART()
{
IF(KBHIT())
{
LCD_COMMAND(ADDR_LINE2+VITRI_H2);
DELAY_US(10);
RDATA = GETCH();
LCD_DATA(RDATA);
IF (VITRI_H2==16) VITRI_H2=0;
ELSE VITRI_H2++;
}
}
VOID MAIN()
{
SET_TRIS_E(0x00); SET_TRIS_D(0x00);
SET_TRIS_B(0xF0); PORT_B_PULLUPS(0XF0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
LCD_SETUP();
LCD_COMMAND(ADDR_LINE1); DELAY_US(10);
FOR (I=0;I<16;I++) { LCD_DATA(HANG1[I]);}
WHILE(TRUE)
{
MP= KEY_4X4();
IF (MP!=0XFF)
{
LCD_COMMAND(ADDR_LINE1+VITRI_H1);
DELAY_US(10);
IF (MP<10) TDATA = MP+0X30;
ELSE TDATA = MP+0X37;
PUTC(TDATA);
LCD_DATA(TDATA);
IF (VITRI_H1==16) VITRI_H1=0;
ELSE VITRI_H1++;
}
}
}
BEGIN - PC
MỞ PHẦN MỀM TERMINAL
CHỌN CỔNG, CHỌN TỐC
ĐỘ
GỞI DỮ LIỆU
BEGIN - VĐK
KHỞI TẠO TRUYỀN DỮ
LIỆU, KHỞI TẠO PORT,
LCD
NHẬN DỮ LIỆU HIỂN THỊ TRÊN LCD
CÓ DỮ LIỆU
S
Đ
NHẤN PHÍM
XỬ LÝ, HIỂN THỊ TRÊN LCD, GỞI ĐI
Đ
S
Hình 10-20. Lưu đồ điều khiển truyền dữ liệu, có thêm LCD và bàn phím.
Giải thích chương trình:
Nguyeãn Ñình Phuù Boä moân ñieän töû coâng nghieäp ù
216 Chöông 10. Truyeàn döõ lieäu uart.
Chương trình chính thực hiện 2 yêu cầu:
Yêu cầu thứ 1: Kiểm tra nếu có dữ liệu từ máy tính gởi xuống thì tiến hành hiển thị ở
hàng 2.
Yêu cầu thứ 2: Gọi chương trình con quét ma trận phím, nếu có phím nhấn thì tiến hành
kiểm tra nếu các phím số có mã từ 0 đến 9 thì chuyển sang mã ASCII bằng cách cộng them
0x30 rồi hiển thị và gởi về máy tính, nếu là các phím có mã từ 0x0A đến 0x0F thì cộng thêm
0x37 để chuyển thành các ký tự tương ứng từ A đến F để hiển thị trên LCD và gởi về máy tính.
Do mỗi hàng chỉ hiển thị được 16 ký tự và 2 hàng độc lập về địa chỉ nên phải thiết lập địa
chỉ trước khi gởi dữ liệu, khi gởi 1 ký tự ra LCD thì địa chỉ tăng lên 1, khi bằng 16 thì cho địa
chỉ về 0 để về lại đầu hàng.
Bài tập 10-1: Hãy hiệu chỉnh chương trình bài 10-3 dùng ngắt để nhận dữ liệu.
Bài tập 10-2: Một hệ thống điều khiển dùng 2 vi điều khiển PIC 16F887: vi điều khiển A có
portD nối với 8 led đơn, vi điều khiển B cũng có portD nối với 8 led. Dữ liệu 8
bit từ vi điều khiển A điều khiển portD sáng dần rồi tắt dần hai chiều, đồng thời
gởi sang vi điều khiển B để hiển thị ra 8 led.
Hai vi điều khiển giao tiếp bất đồng bộ tốc độ 9600 baud.
Hãy vẽ sơ đồ mạch, viết lưu đồ và chương trình.
Bài tập 10-3: Một hệ thống điều khiển dùng 2 vi điều khiển PIC16F887: vi điều khiển A kết
nối với 2 nút nhấn ON và OFF, vi điều khiển B nối với 8 led. Khi nhấn ON thì
vi điều khiển A gởi dữ liệu sang vi điều khiển B làm 8 led đơn sáng, khi nhấn
OFF thì gởi mã làm 8 led tắt.
Hai vi điều khiển giao tiếp bất đồng bộ tốc độ 9600 baud.
Hãy vẽ sơ đồ mạch, viết lưu đồ và chương trình.
10.7 CÂU HỎI ÔN TẬP – TRẮC NGHIỆM
10.6.1 CÂU HỎI ÔN TẬP
Câu 10-1: Hãy cho biết tên các thanh ghi liên quan đến truyền dữ liệu của vi điều khiển
PIC16F887.
Câu 10-2: Hãy cho biết chức năng của các bit trong thanh ghi TXSTA của vi điều khiển
PIC16F887.
Câu 10-3: Hãy cho biết chức năng của các bit trong thanh ghi RCSTA của vi điều khiển
PIC16F887.
Câu 10-4: Hãy cho biết chức năng của các bit trong thanh ghi BAUDCTL của vi điều khiển
PIC16F887.
10.6.2 CÂU HỎI MỞ RỘNG
Câu 10-5: Hãy tìm hiểu truyền dữ liệu của vi điều khiển PIC18F4550 và so sánh với
PIC16F887.
10.6.3 CÂU HỎI TRẮC NGHIỆM
Câu 10-1: Vi điều khiển PIC 16F887 có mấy chế độ truyền dữ liệu ESUART:
(a) 2 (b) 3 (c) 4 (d) 5
Ñaïi Hoïc Sö Phaïm Kyõ Thuaät Khoa Ñieän – Ñieän Töû
Chöông 10. Truyeàn döõ lieäu uart. 217
Câu 10-2: Vi điều khiển PIC 16F887 khi truyền đồng bộ thì các tín hiệu có tên là:
(a) RxD, TxD (b) RxD, CK (c) TD, CK (d) TD, TK
Câu 10-3: Vi điều khiển PIC 16F887 khi truyền bất đồng bộ thì các tín hiệu có tên là:
(a) RxD, TxD (b) RxD, CK (c) TD, CK (d) TD, TK
Câu 10-4: Vi điều khiển PIC 16F887 thì thanh ghi nào thiết lập tốc độ truyền dữ liệu:
(a) TXSTA (b) RCSTA (c) BAUDCTL (d) TMOD
Câu 10-5: Trong công thức tính tốc độ của PIC16F887 thì biến “FOSC” là:
(a) Tần số dao động của timer T1 (b) Tần số dao động của tụ thạch anh
(c) Tần số dao động của timer T0 (d) Tần số dao động của ADC
Câu 10-21: Cặp thanh ghi nào của PIC16F887 lưu giá trị để tạo tốc độ baud:
(a) TXSTA, RCSTA (b) BAUDCTL, RCSTA
(c) TSPBGRH, SPBRGL (d) TSPBGRH, SPBRG
Câu 10-22: Vi điều khiển PIC 16F887 sử dụng timer nào để thiết lập tốc độ truyền dữ liệu:
(a) T0 (b) T1
(c) T2 (d) Không dùng timer
Câu 10-23: Bit cho phép ngắt và cờ ngắt nhận dữ liệu của PIC 16F887:
(a) RCIF, TXIF (b) TXIE, TXIF
(c) RCIE, RCIF (d) TXIE, RCIE
Câu 10-24: Bit cho phép ngắt và cờ ngắt phát dữ liệu của PIC 16F887:
(a) RCIF, TXIF (b) TXIE, TXIF
(c) RCIE, RCIF (d) TXIE, RCIE
10.6.4 BÀI TẬP
TÀI LIỆU THAM KHẢO
[1]. MICROCHIP – PIC 16F87X DATASHEET, 1997
[2]. MICROCHIP – PICmicro Mid- Range MCU family reference Manual, 1997
[3]. AVTAR SINGH – WALTER A TRIEBEL, “The 8088 Microprocessor –
Programming, interfacing, software, hardware, and Applications” , Prentice Hall
International Editions.
[4]. DOUGLAS V. HALL, “Microprocessor and Interfacing Programming, and
hardware”, McGraw – Hill International Editions.
[5]. John Uffenbeck, “The 8088/8086 family : Designing, programming and interfacing”,
Prentice Hall, 1987
[6]. James L. Antonakos, “The 68000 Microprocessor: hardware and software
principles and applications”, Prentice Hall fifth edition 2004.
[7]. Jack L. Davies, “The Innovative 80x86 – Volume I: the 80286 Microprocessor,
architecture”, Prentice Hall.
[8]. Jack L. Davies, “Z80 Family CPU user manual”, www.zilog.com.
[9]. MetaLink Corporation Chandler – Arizona, “8051 Cross Assembler User’s
Manual”, 1996
[10]. “MCS51 Microcontroller Family User’s Manual”, 1994
[11]. “M68332 User’s Manual”
[12]. Hồ Trung Mỹ, Vi Xử Lý, Nhà xuất bản Đại Học Quốc Gia Tp HCM
[13]. Ngô Diên Tập, Kỹ Thuật AVR, Nhà xuất bản KH & KT – 2003.
[14]. Văn Thế Minh, Kỹ Thuật vi xử lý, Nhà xuất bản giáo dục – 1997.
[15]. Các tài liệu của các vi điều khiển ATMEL, MICROCHIP.
Các file đính kèm theo tài liệu này:
- giao_trinh_vi_dieu_khien_pc.pdf