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

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG PHẦN MỀM KEIL C51 TRONG LẬP TRÌNH VI ĐIỀU KHIỂN

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 (1.03 MB, 39 trang )

YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
1


TÀI LIỆU HƯỚNG DẪN SỬ DỤNG PHẦN MỀM
KEIL_C51
TRONG LẬP TRÌNH VI ĐIỀU KHIỂN






















- Các bước cài đặt và thiết lập cho phần mềm


- Hướng dẫn lập trình và mô phỏng một số chương trình (Điều
xung, Watchdog Timer, Sử dụng các Macro)
- Hướng dẫn lập trình truyền thông nối tiếp (UART, SPI)
- Hướng dẫn lập trình giao tiếp ngoại vi (VĐK - máy tính)
- Cách thiết lập các chế độ Timer, Counter
- Giới thiệu một số lệnh căn bản
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
2

LỜI NÓI ĐẦU

Hiện nay Vi Điều Khiển đã rất phổ biến ở nước ta từ

những sản phẩm đơn
giản như máy nấu nước,nấu cơm tự động… đến những sản phẩm đắt tiền như
máy giặt, máy điều hòa… Nói chung hầu như tất cả những sản phẩm nào có chức
năng giao tiếp với người dùng đều cần một bộ vi điều khiển. Nhưng chỉ khác một
điều là nó được nhà sản xuất lập trình một lần và tung ra hàng loạt và hầu như
chúng ta không có khả năng thay đổi chương trình cho chúng.
Tuy nhiên khi đã nắm bắt được khả năng lập trình cho VĐK ta có thể làm
rất nhiều việc chẳng hạn làm ra những sản phẩm có khả năng giao tiếp người
dùng như đồng hồ hiển thò bằng LCD có chức năng nhập thời điểm báo chuông,
bảng quang báo bằng Led ma trận, các dây chuyền tự động…….và gần gũi thiết
thực nhất là lập trình cho ROBO (đó là một số sản phẩm mà chúng tôi câu lạc bộ
E_CLUP đã thực hiện thành công).
Để lập trình VĐK thì điều đầu tiên là cần một phần mềm lập trình do đó
trong bài viết này tôi sẽ giới thiệu với các bạn phần mềm Keil_C51. Đây là phần
mềm lập trình cho phép bạn sử dụng cả 2 ngôn ngữ Asm và ngôn ngữ C. Kết
hợp với phần giới thiệu tôi sẽ trình bày một số bài lập trình cơ bản đã được viết

hoàn chỉnh và hệ thống. Khi viết bằng ngôn ngữ ASM các bạn sẽ dễ dàng nắm
bắt được cấu trúc bên trong VĐK cách thực thi từng lệnh nên thích hợp với người
mới học, sau khi đã có kinh nghiệm lập trình bạn sẽ dễ dàng chuyển qua ngôn
ngữ C. Để tiện cho người mới học theo dõi tôi đã trình bày dưới dạng ngôn ngữ
ASM và tôi đang hoàn thiện bài hướng dẫn khác bằng ngôn ngữ C.
Vì bản thân tôi cũng mới bắt đầu làm quen với VĐK vài năm và các bài lập
trình chủ yếu được viết trên kinh nghiệm thực tế của tôi nên có thể còn nhiều sai
sót mong được sự góp ý của các bạn để bài viết có thể hoàn thiện hơn. Chúc các
bạn thành công!!!


Biên Hòa 15/03/2008



Lê Tiến Lộc
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
3

I. CÀI ĐẶT PHẦN MỀM KEIL C51:
- Nếu bạn là người yêu thích công việc lập trình Vi Điều Khiển và bạn đang sử dụng những phần
mềm như Pinacal, Crimson…… và bạn gặp những rắc rối như đối với Pinacal thì bạn không thể lập
trình quá 2KB nếu bạn không đăng ký mua bản quyền, Crimson hơi khó xài với những người mới học
lập trình và không hỗ trợ những tính năng mô phỏng. Ở đây tôi sẽ giới thiệu với bạn một phần mềm
với đầy đủ tính năng và có vẻ dễ dàng sử dụng hơn. Với Phần mềm Keil uVision3 bạn có thể xem mô
phỏng dạng tín hiệu ra ở từng chân của Vi Điều Khiển với một màn hình tương tự Oscilloscope. Dễ
dàng và thuận tiện cho việc lập trình hơn với những thư viện khai báo có sẵn trong chương trình.
Bạn có thể tải File Setup trên mạng hoặc liên hệ với chúng tôi để được cung cấp miễn phí. Sau khi có
file Setup bạn nhấp double vào biểu tượng cài đặt như sau để bắt đầu quá trình cài đặt.


Keil C51 v8.05.exe

Sau khi nhấp chuột cửa sổ sau xuất hiện :


- Nhấn Next để tiếp tục việc cài đặt.
- Sau khi nhấn next xuất hiện hộp thoại sau:



- Đánh dấu chọn vào ô check box và chọn next.

Nhấp vào đây để
cài đặt
Check here to
agree
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
4


- Chọn đường dẫn chứa chương trình và nhấn next.


- Điền các thông số vào (có thể là thông số bất kỳ nào đó không cần chính xác), nhấn
next và bắt đầu quá trình cài đặt.
-





YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
5

- Sau khi cài đặt xong nhấn Finish để kết thúc quá trình cài đặt.
• Chưa hết, để có thể sử dụng phần mềm này bạn cần phải CRAK nó. Coppy folder Keil
trong thư mục CRACK và Paste nó lên thư mục mà bạn đã chọn khi cài. Sẽ xuất hiện một
hộp thoại yêu cầu bạn có muốn replace không? Chọn Yes để thay thế. Chú ý là trong quá
trình Crack bạn nên đóng tất cả cửa sổ chương trình lại.



- Mở thư mục Keil vừa thay thế ra chọn file TOOLS


• Đến đây bạn đã hoàn tất quá trình cài đặt!!! Congratulation!!!!

I. THIẾT LẬP PHẦN MỀM:

Tiếp theo, mời bạn làm quen với giao diện của chương trình:
- Khởi động chương trình bằng cách : nhấp double vào biểu tượng trên Desktop hoặc vào
Start -> Program -> chọn biểu tượng của chương trình.


Giao diện chính của chương trình như sau:

Coppy file này trong mục CRACK và Paste nó vào
thư mục cài đặt !!!Thay thế file Keil trong mục vừa

cài bằng file này.
Biểu tượng của
chương trình.
Chọn đúng đường dẫn cho file rồi chọn
save. Trong file cài thường đường dẫn
được chọn mặc đònh là ổ D. Nhưng ta
thường cài ở ổ C nên phải thay đường
đẫn cho chính xác.

YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
6


Bây giờ việc đầu tiên bạn phải làm là tạo 1 Project mới để làm việc.
- Trên thanh menu vào Project -> New Project










- Hộp thoại sau xuất hiện:










Cửa sổ soạn thảo.

Cửa sổ
quản lý
Cửa sổ báo
lỗi
Nút dòch sang file
Hex và kiểm lỗi
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
7
















Nhấn Save hộp thoại sau xuất hiện:


- Sau khi chọn Chip nhấn OK, xuất hiện tiếp hộp thoại sau.


Chọn Yes để đồng ý chuyển những mã code chuẩn 8051 vào Project của bạn. Lúc này bạn có thể
thấy trên cửa sổ chương trình là tên Project mà bạn đặt.
- Sau đó, bạn vào menu Project -> Options for Target ‘Target 1’
Đặt tên Project
vào đây!!!
Chọn Chip mà bạn
đònh dùng
VD: 89C51RD2XX
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
8


Hộp thoại sau xuất hiện:



- Chọn OK.












Sau khi thiết lập xong vào thẻ A51:
Chọn thẻ Output

Nhấn dấu chọn vào
đây để tạo file HEX
Đặt tên cho file
HEX ở đây
Bạn có thể
chọn đường
dẫn cho file
HEX ở đây
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
9


- Nếu không tắt dấu chọn có nghóa là bạn đồng ý đònh nghóa chức năng thanh ghi đặc biệt
theo chuẩn 8051 và không cần khai báo thư viện ở đầu chương trình, tuy nhiên khi chương trình
được viết cho các IC có chức năng đặc biệt thì bạn cần khai báo tên thư viện ở đầu bài lập trình
và tắt dấu chọn ở thẻ này.
- Chọn OK.
- Vậy là bạn đã hoàn tất việc thiết lập phần mềm, có thể bạn thấy hơi phức tạp nhưng
công việc này bạn chỉ phải thiết lập một lần duy nhất.


II. VIẾT MỘT CHƯƠNG TRÌNH VÀ CHẠY MÔ PHỎNG: (hiển thò dưới dạng tín hiệu)

1. Mô phỏng tín hiệu Digital và cách sử dụng Watchdog timer:
- Bây giờ tôi sẽ hướng dẫn bạn viết một chương trình chi tiết từ A->Z .Giả sử ta có một đề bài
là:
Viết một chương trình chớp tắt đèn Standby vì đây là một bài tập nhỏ chỉ cần một vài câu lệnh
nên tôi sẽ thêm vào phần Watchdog Timer để giới thiệu cùng bạn.
- Sau khi mở cửa sổ soạn thảo bạn viết đoạn code sau vào:
để bắt đầu viết code bạn nhấp phải chuột chọn insert ‘#include <REG51F.H>’ đây là thư viện
giúp bạn không phải khai báo các thanh ghi chức năng đặc biệt.

#include <REG51F.H> ;ADD THƯ VIỆN VÀO
START BIT P0.0 ;KHAI BÁO NÚT NHẤN
STOP BIT P0.1
STAND_BY BIT P1.0 ;KHAI BÁO ĐÈN LÀ CHÂN P1.0
WMCON EQU 0A6H ;KHAI BÁO WATCHĐOG TIMER
ORG 0000H ;VETOR RESET
LJMP MAIN ;LỆNH NHẢY TỚI NHÃN MAIN
ORG 000BH ;VETOR NGẮT TRONG TIMER0
LJMP NGAT_T0
;NHẢY ĐẾN TRÌNH PHỤC VỤ NGAT_T0
ORG 001BH ;VETOR NGẮT TRONG TIMER1
LJMP NGAT_T1 ;NHẢY ĐẾN TRÌNH PHỤC VỤ NGAT_T1
ORG 0030H ;VETOR KẾT THÚC
Tắt dấu chọn
ở đây!
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
10


MAIN:
MOV TMOD,#00010001B ;KHAI BÁO SỬ DỤNG TIMER 0 VÀ 1
MOV IE,#10001010B ;KHAI BÁO SỬ DỤNG NGẮT TRONG TIMER 0 VÀ 1
MOV TH0,#HIGH(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE CAO TIMER 0
MOV TL0,#LOW(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE THẤP TIMER 0
MOV TH1,#HIGH(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE CAO TIMER 1
MOV TL1,#LOW(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE THẤP TIMER 1
MOV P0,#0FFH ;ĐƯA CÁC CHÂN CỦA PORT 0 LÊN MỨC 1
MOV R0,#10 ;GIÁ TRỊ TRÌ HOÃN PHỤC VỤ NGẮT T0
CLR TR0 ;TẮT TIMER 0
SETB TR1 ;KHỞI ĐỘNG TIMER 1
LOOP:
JB START ,N2 ;KIỂM TRA NÚT NHẤN START
LCALL DELAY ;DELAY CHỐNG NẢY
JB START,N2
JNB START,$ ;CHỜ NHÃ PHÍM
MOV P1,#00H ;ĐƯA CÁC CHÂN CỦA PORT 1 XUỐNG MỨC 0
SETB TR0 ;KHỞI ĐỘNG TIMER 0
N2:
JB STOP,LOOP ;KIỂM TRA NÚT STOP
LCALL DELAY ;CHỐNG NẢY
JB STOP,LOOP
JNB STOP,$ ;CHỜ NHÃ PHÍM
CLR TR1
SJMP LOOP ;QUAY LẠI ĐỂ BẮT ĐẦU VIỆC QUÉT PHÍM
NGAT_T0: ;TRÌNH PHỤC VỤ NGẮT T0
CLR TR0 ;TẮT TIMER 0
MOV TH0,#HIGH(-1000) ;NẠP LẠI GIÁ TRỊ timer
MOV TL0,#LOW(-1000)

DJNZ R0,EXIT_T0 ;GIẢM R0 ĐỂ CÓ ĐƯC THỜI GIAN CẦN, như trên ta ;đã thiết
lập cứ 1000
µ
s thì tràn timer nhưng ta muốn 0,01s mới đảo Stanby, nên R0=10
CPL STAND_BY ;đảo bit sau 0,01s
MOV R0,#10 ;nạp lại giá trò đếm
EXIT_T0:
SETB TR0 ;khởi động timer 0
RETI ;kết thúc ngắt quay về chương trình chính
NGAT_T1:
CLR TR1
MOV TH1,#HIGH(-1000)
MOV TL1,#LOW(-1000)
MOV WMCON,#01EH ;DAT GIA TRI DEM
MOV WMCON,#0E1H ;KHOI DONG LAI WATCHDOG TIMER
EXIT_T1:
SETB TR1
RETI
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
11

DELAY: ;CHƯƠNG TRÌNH CON DELAY
MOV 33H,#255
DJNZ 33H,$
RET
END
- Vậy là đã xong phần lập trình, chương trình trên có tác dụng như sau: khi nhấn START timer 0
bắt đầu làm việc và khi ngắt xảy ra sẽ giảm giá trò trong R1 cho đến khi R1 bằng 0 thì thực
hiện lệnh đảo bit Standby. Khi STOP được nhấn timer 1 ngưng hoạt động và không còn nạp lại

giá trò cho Watchdog timer dẫn đến tràn và chương trình sẽ bò RESET bởi phần mềm. Có thể
bạn sẽ đặt ra câu hỏi vậy Watchdog timer để làm gì? Đối với đoạn chương trình trên thì chỉ để
bạn hiểu về cách hoạt động của watchdog timer. Còn trong thực tế bạn sẽ cho watchdog timer
chạy như vậy nếu chương trình bạn lỡ bò rơi vào vòng lặp vô tận hay bò treo thì watchdog timer
sẽ tự Reset chương trình lại.
- Bây giờ ta quay lại việc mô phỏng với KEIL, sau khi gõ đoạn code như trên vào màn hình
soạn thảo bạn chọn file Save as, hộp thoại sau xuất hiện và bạn nhớ đặt tên file với đuôi là
.asm (Ví dụ: Standby.asm). Khi lưu thành công bạn sẽ thấy các đoạn code có màu sắc phân
biệt giữa các nhãn, lệnh và đối tượng rất dễ nhìn. Theo tôi bạn nên save file.asm trước khi viết
code vì chương trình sẽ rõ ràng hơn.
- Chạy mô phỏng




B1: Click here

B2: Click here

B3: Click here
để hiển thò
màn hình mô
phỏng
B4: Click here
để thấy các
Ports và timers
B5: : Click here để
hiển thò hộp thoại sau

YELLOW BUTTERFLY 3/15/2008

Created by ELECTRONIC FACULTY Page
12

- Ta có thể xem trạng thái các thanh ghi bằng cách vào View -> Watch & call stack window, cửa
sổ ở góc phải màn hình hiện ra, chọn thẻ Watch, nhấn F2 để nhập thanh ghi cần xem .

- Sau khi thiết lập xong bạn vào menu->Periperals->chọn Port 0 và Port1


- Bây giờ thì đồ thò trên màn hình bạn đã chạy nhấp nhô rồi chứ? Đó là dạng tín hiệu ra trên
chân P1.0 đó!!! Nếu vẫn chưa thấy thì trên màn hình mô phỏng bạn chọn thẻ Zoom/ in hoặc out
để điều chỉnh
- Tiếp theo bạn cũng nhấn nút STOP pin P0.1 để thử xem Watchdog timer có chạy không!
Nhấp vào đâ
y

Chọn chân cần mô
phỏng ->Enter
Sau khi chọn
nhấn Close
Có thể chọn
màu ở đây
Chọn pin P0.0 vì khi lập trình bạn khai báo
Start là pin P0.0, để bắt đầu chạy, lưu ý là sau
khi chọn phải nhã dấu chọn vì trong chương
trình bạn có phần chờ nhã phím!!!
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
13



- Như vậy là các bạn đã biết cách sử dụng Watchdog timer, tạo đèn Standby, chạy mô phỏng
với chương trình Keil
- Tiếp theo ta thử qua khái niệm điều xung và mô phỏng tín hiệu analog.

2. Mô phỏng tín hiệu Analog và cách thiết lập chế độ điều xung:
- Giả sử ta có đề bài: Tạo tín hiệu hình Sin trên chân P1.0 (lưu ý IC của bạn phải hỗ trợ chức
năng này). Hay làm cho một đèn Led sáng dần và tắt dần. Vì bài này cũng tương đối ngắn nên
ta cùng kết hợp với cách sử dụng Timer 2.
- Trong cửa sổ Code bạn nhập đoạn code như sau:

#include <REG51F.H>
XUNG EQU CCAP1H ;P1.4 sử dụng điều xung trên chân P1.4
STAND_BY BIT P3.0
ORG 0000H
LJMP MAIN
ORG 002BH ;Vetor ngắt timer 2
LJMP NGAT_TIMER2
ORG 0030H
LJMP MAIN
MAIN:
MOV CMOD,#0 ;Chế độ 6 chu kì xung nhòp = 1_PER_2 chu kì máy
;Cho phép PCA (programing counter array) hoạt động
MOV CCAPM1,#01000010B ; P1.4 PCA hoạt động chế độ PWM 8 bits
MOV T2MOD,#00000001B ;Khai báo T2MOD,T2CON
MOV T2CON,#00000000B
MOV RCAP2L,#LOW(-5000) ;Nhận byte thấp, byte cao giá trò nạp lại bộ đếm timer2
MOV RCAP2H,#HIGH(-5000)
MOV TH2,#HIGH(-10) ;Nạp giá trò ban đầu cho bộ đếm byte thấp và cao của Timer 2
MOV TL2,#LOW(-10)

MOV IE,#10101010B
MOV R2,#100
;giá trò trì hoãn phục vụ timer 2
SETB TR2 ;Khởi động timer 2
Tín hiệu trở nên phẳng
và cửa sổ báo watchdog
timer đã xảy ra!!!
B1: Click here Để
dừng mô phỏng
B2: Click here Để đóng
cửa sổ mô phỏng
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
14

SETB CR ;Set bit CR cho phép điều xung
MOV R1,#0 ;tạo giá trò ban đầu cho R0 (ở đây ta sử dụng như 1 biến)
SJMP $ ;nhảy tại chổ
NGAT_TIMER2: ;Trình phục vụ ngắt T2
CLR TF2
DJNZ R2,EXIT_T2
MOV R2,#100
CPL STAND_BY
MOV XUNG,R1
INC R1
EXIT_T2:
SETB TR2
RETI
END


- Sau khi lưu bài và biên dòch bạn làm như trên (phần VD watchdog timer) để mô phỏng tín
hiệu ra.


Chọn:
State: để thấy dạng trạng thái
Bit: dạng Digital (tín hiệu dạng số)
Analog: Dạng tương tự
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
15


- Vì điều xung (PWM): có nghóa là điều chế độ rộng xung, nên ở ví dụ trên tùy theo giá trò
trong biến XUNG (CCAP1H biến này được tôi dùng ngắt timer cho thay đổi từ 0 -> 255) sẽ
cho ra độ rộng xung trên chân P1.4 thay đổi liên tục. Đây là một ví dụ cơ bản về điều xung để
một đèn sáng dần lên và tắt dần xuống.

3. Các Macro và cách thiết lập:

REPT count ;count là giá trò số lần lặp (giá trò max là 975 lần)
Macro body ;thân macro là nơi chứa lệnh cần lặp
Endm ;lệnh kết thúc 1 macro
Code mẫu như sau:

REPT 15 ;TAO MACRO LAP LAI 15 LAN
INC R3 ;lặp lại 15 lần lệnh này
ENDM ;KET THUC MACRO
;*************************************************************
IRP parm-name,<parm-list>;TẠO MACRO VỚI TÊN ĐẠI DIỆN

Macro body ;thân macro là nơi chứa lệnh cần tác động đến parm-list
Endm ;lệnh kết thúc 1 macro
Code mẫu như sau:

IRP RENAME,<P2.0,P2.1,P2.2> ;TAO MACRO VOI NAME THAY THE
Nếu chọn State bạn sẽ thấy giữa
0 và 1 còn có dãy t/h khác. Chỉ
điều xung mới có.
Hình dưới là Standby
ta thấy nó chuyển trực
tiếp từ 0 lên 1.

YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
16

CLR RENAME ;xóa các bit trong dấu < >
ENDM ;sau khi thực hiện p2.0,p2.1,p2.2 về mức 0

;*************************************************************
IRPC parm-name,<parm-string> ;tạo macro thay chuỗi ký tự để tác động từng ký tự
Macro body ;thân macro là nơi chứa lệnh cần tác động đến từng ký tự trong chuỗi
Endm ;lệnh kết thúc 1 macro
Code mẫu như sau:

IRPC SENDCHART,BUTTERFLY ;TẠO MACRO THAY CHUỖI KÝ TỰ
MOV A,#'SENDCHART'
MOV P2,A ;P2 LAN LUOT XUAT RA CÁC KÝ TỰ: B,U,T,T,E,R,F,L,Y
ENDM
;*************************************************************

4. Liên kết file:
- Đối với một số chương trình lớn bao gồm nhiều chương trình con, ta có thể dùng tính năng liên
kết file để tiện theo dõi và sữa đổi, thay thế các chương trình con.
- Để liên kết file, trên đầu chương trình chính ta khai báo đường dẫn đến file chứa chương trình
con.
Ví dụ: Trong chương trình chính có dùng đến chương trình con đặt tại đường dẫn
D\data\tienloc\count_line.asm thì trong chương trình chính khai báo như sau:
#include <D\data\tienloc\count_line.asm>

III. NGẮT TRUYỀN THÔNG NỐI TIẾP GIAO TIẾP NGOẠI VI:
1. Dùng chuẩn truyền bất đối xứng UART 8bit:
- Bây giờ tôi sẽ trình bày về cách sử dụng ngắt truyền thông nối tiếp. Trong Vi Điều Khiển
có chức năng ngắt truyền thông nối tiếp để truyền và nhận dữ liệu. Chân TXD(P3.1 phát) và
chân RXD(P3.0 thu). Thanh ghi điều khiển ngắt nối tiếp là SCON và thanh ghi đệm dữ liệu là
SBUF. Đòa chỉ véctor ngắt là 023H, bit cho phép ngắt là ES bit 4 trong thanh ghi IE.
Thanh ghi SCON có 8 bit:
+ Scon.0(RI) đòa chỉ 98H cờ ngắt thu được set khi kết thúc việc thu 1 ký tự
+ Scon.1(TI) đòa chỉ 99H cờ ngắt phát được set khi kết thúc việc phát 1 ký tự
+ Scon.2(Rb8) đòa chỉ 9AH bit thu 8. Bit thứ 9 được nhận ở chế độ 9bit
+ Scon.3(Tb8) đòa chỉ 9BH bit thu 8. Bit thứ 9 được phát
+ Scon.4(REN) đòa chỉ 9CH bit cho phép thu, phải được set=1 để nhận ký tự
+ Scon.5(SM0) đòa chỉ 9DH bit chọn chếù độ
+ Scon.6(SM1) đòa chỉ 9EH bit chọn chếù độ
+ Scon.7(SM2) đòa chỉ 9FH bit chọn chếù độ

Giả sử ta có một yêu cầu giao tiếp dữ liệu giữa 2 VĐK. Một con master làm nhiệm vụ phát dữ
liệu và một con slaver làm nhiệm vụ nhận dữ liệu từ con chủ và đưa dữ liệu đó ra port2

Bài code mẫu cho con Master như sau:
#include <REG51.H>

DATAEXAMBLE EQU 30H

YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
17

ORG 0000H ;dia chi vector reset
LJMP MAIN ;lenh nhay den nhan Main
ORG 0030H ;dia chi vector ket thuc

MAIN:
MOV SCON,#01010010B ;sm0/sm1= 0/1 uart 8bit thay doi t/lap boi bo dinh thoi; bit
;4(REN)=1 bit cho phep thu, bit0(RI) = 0 san sang nhan du ;lieu; bit1(TI)=1 san sang phat du
;lieu
MOV TMOD,#00100000B ;bit5=1 bit4=0 che do 8bit tu dong nap lai cua timer1
MOV TH1,#-3 ;tao toc do baud (voi thach anh 12Mh gia tri Th1= -3 ;thi toc do baud là ;9600)
SETB TR1 ;cho timer1 chay de tao toc do baud
MOV DATAEXAMBLE,#01010101B ;dua mot byte du lieu de chuan bi truyen
LOOP:
LCALL SERIAL ;goi chuong trinh xuat du lieu
SJMP LOOP ;lap lai qua trinh tren
SERIAL:
MOV A,DATAEXAMBLE ;dua byte du lieu vao thanh ghi A
JNB TI,$ ;co TI duoc set ngay sau khi phat xong 1 ky tu
MOV SBUF,A ;dua gia tri thanh ghi A vao thanh ghi SBUF
RET ;SBUF la thanh ghi dem chua du lieu de phat/nhan
End

Bài code mẫu cho con Slave như sau:
#include <REG51.H>


ORG 0000H
LJMP MAIN
ORG 0023H ;VECTOR NGAT PORT NOI TIEP
LJMP NGAT_SERIAL ;NHAY DEN PHUC VU NGAT
ORG 0030H
MAIN:
MOV PCON,#10000000B ;BIT 7 SMOD = 1 TANG TOC DO BAUD*2
MOV SCON,#01010001B
MOV TMOD,#00100000B ;timer1 chế độ 8bit tự động nạp lại
MOV TH1,#-3
MOV IE,#10010000B ;bit4(ES) =1 cho phep ngat port noi tiep; bit7=1cho phep ngat toan cuc
SETB TR1
SJMP $
NGAT_SERIAL: ;Trình phục vụ ngắt port nối tiếp
JNB RI,$ ;co RI duoc set ngay sau khi nhan xong 1 ky tu
CLR RI ;xóa cờ
MOV A,SBUF ;Đưa dữ liệu nhận được vào thanh ghi A
MOV P2,A
;Hiển thò ra Port 2
RETI ;kết thúc ngắt
END
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
18

- Ngoài ra còn các chuẩn truyền UART 9bit để giao tiếp giữa 1 con master và nhiều con Slave
2. Dùng chuẩn truyền đối xứng SPI: ( Serial Peripheral Interface)
- Chuẩn SPI giao tiếp qua MOSI, MISO, SCK, SS
+ MOSI : Master Out Slave In (con chủ truyền qua con tớ) (P1.5)

+ MISO : Master In Slave Out (con tớ truyền qua con chủ) (P1.6)
+ SCK : Shift Clock (xung để dòch dữ liệu sang) (P1.7)
+ SS : Slave Select (P1.4)
- Chuẩn này có 2 chế độ Nomal mode và Enhanced mode
+ Nomal mode: Không có bộ đệm ghi
+ Enhanced mode: Có bộ đệm ghi dùng để truyền liên tiếp nhiều byte.
- Chuẩn này có các thanh ghi chức năng sau:
SPCR (0d5h) SPI Control Register: là thanh ghi điều khiển chế độ SPI
SPIE (Bit7) : bit cho phép ngắt SPI (kết hợp với bit ES trong thanh ghi IE cả hai bit
này lên mức 1 thì ngắt SPI được cho phép xảy ra)
SPE (Bit6) : bit cho phép đònh nghóa chân giao tiếp SPI (MOSI, MISO, SCK, SS )
DORD (Bit5) : bit cho phép chọn chế độ truyền DORD=1 truyền LSB trước;DORD=0
truyền MSB trước.
MSTR (Bit4) : MSTR=1 chọn chế độ Master;MSTR=0 chọn chế độ Slave.
CPOL (Bit3) : CPOL=0 chân SCK ở mức thấp khi không truyền dữ liệu; CPOL=1 chân
SCK ở mức cao khi không truyền dữ liệu.
CPHA (Bit2) : Clock Phase. Bit này kết hợp với CPOL để điều khiển xung clock và mối
quan hệ truyền nhận giữa con chủ và tớ.
SPR0 (Bit1) : Điều khiển tốc độ xung SCK
SPR1 (Bit0) : Điều khiển tốc độ xung SCK
PR0 SPR1
0 0 lock rate/4
0 1 lock rate/16
1 0 lock rate/64
1 1 lock rate/128
SPSR (0AAH) SPI Statute Register: là thanh ghi trạng thái SPI
SPIF (Bit7) : Cờ ngắt SPI khi truyền xong dữ liệu cờ ngắt SPIF được set lên mức 1, và
một ngắt được xảy ra nếu SPIE và ES ở mức 1. Cờ này được xóa bằng cách đọc thanh ghi trạng
thái SPSR và sau đó tác động đọc hoặc ghi lên thanh ghi dữ liệu SPDR.
WCOL (Bit6) : Khi ở chế độ nomal ENH = 0, Bit này bằng 1 trong suốt quá trình ghi dữ

liệu. Nó được xóa bằng cách tác động như SPIF. Khi ở chế độ Enhanced mode bit này = 1 khi bộ
đệm ghi Tx đầy.
LDEN (Bit5) : Bit cho phép load dữ liệu khi ở chế độ Enhanced
DISSO (Bit1) := 1 Không cho phép con tớ xuất dữ liệu; = 0 được nhận dữ liệu
ENH (Bit0) := 0 Nomal mode(không có bộ đệm ghi); = 1 Enhanced mode (chế độ có
bộ đệm ghi, dùng để truyền nhiều byte nối tiếp)

SPDR (86H) SPI Data Register: là thanh ghi dữ liệu SPI
- Gồm 8 bit từ SPD0 đến SPD7. Chứa các dữ liệu gửi hay nhận.
Bài code mẫu cho con Master như sau: dùng chế độ nomal
;TRONG MAIN GUI DU LIEU ;TRONG NGAT DOC DU LIEU VA XOA CO NGAT
#include <AT89s53.inc>
data_example EQU 30H
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
19

data_save EQU 31H
serial_data EQU 32H
org 000h
ljmp Main
org 0023h
ljmp it_SPI
org 0030h

Main:
mov spsr,#10000000b ;bit 1 la dissco =0 dc nhan; bit 0 la chon c/d ENH(1) or normal(0)
MOV data_example,#01010101b ; /* data example */
mov SPCR, #10010101B
CLR P1.4 ; /* enable SLAVE */

SETB ES ; cho phep ngat SPI
;********* Setb SPE cho phep DN chan SPI ***********
mov a,SPCR ;lenh orl or tung bit voi nhau 0 or x = x ; 1 or x = 1 muon set len 1 thi or
;bit can set voi 1 cac bit con lai or voi 0 kq o bi ah
orl a,#01000000b ;SETB SPE, cho pheo dinh nghia chan SPI bit thu 6
of thanh ghi spcr
mov spcr,a ;x or voi 1 = 1 ;x or 0 =x
;************ xoa co truyen spif(7) va wcol(6) ***************
mov a,SPSR ;muon xoa 1 bit ta anl bit do voi 0 cac bit
con lai and voi 1 ko bi ah
anl a,#00111111b ;CLR SPIF xoa co truyen, bit 7 of thanh ghi spsr
; /* clear software transfert flag */ xoa co truyen
mov spsr,a ;x anl voi 0 = 0 ; X ANL 1 = X
MOV R7,SPDR
;************** cho phep ngat toan cuc ***************
SETB EA

LOOP:
SETB 00H
MOV SPDR,data_example
JB 00H,$
MOV P2,serial_data
LJMP LOOP

it_SPI:
;*********xoa co ngat******************************
mov a,SPSR ;muon xoa 1 bit ta anl bit do voi 0 cac bit
con lai and voi 1 ko bi ah
anl a,#00111111b ;CLR SPIF xoa co truyen, bit 7 of thanh ghi spsr
; /* clear software transfert flag */ xoa co truyen

mov spsr,a
;x anl voi 0 = 0
;*******Doc du lieu nhan duoc**********************
MOV serial_data,SPDR ; /* read receive data */
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
20

CLR 00H ;BIT DAÁU
RETI
End

Baøi code maãu cho con SLAVE nhö sau:
#include <AT89s53.inc>
data_example EQU 30H
data_save EQU 31H
serial_data EQU 32H
org 000h
ljmp Main
org 023h
ljmp it_SPI
org 0030h

Main:
mov spsr,#10000000b ;bit 1 la dissco =0 dc nhan; bit 0 la chon c/d ENH(1) or normal(0)
mov SPCR, #10000101B ; initialize SPI SLAVE BIT4=0; interrupt ENabled BIT7=1,CHO
;PHEP HD SPI BIT6=1 pin enable, ; MSB first, polarity 0, phase 1, ; clock rate /16
; /* enable master */ cho phep chon con chu SAN SAng TRUYEN
SETB ES
;********* Setb SPE cho phep DN chan SPI ***********

mov a,SPCR
orl a,#01000000b ;SETB SPE, cho pheo dinh nghia chan SPI bit thu 6 of thanh ghi spcr
mov spcr,a
;************ xoa co truyen ***************
mov a,SPSR
anl a,#00111111b ;CLR SPIF xoa co truyen, bit 7 of thanh ghi spsr
; /* clear software transfert flag */ xoa co truyen
mov spsr,a
MOV R7,SPDR
;************** cho phep ngat toan cuc ***************
SETB EA
LOOP:
SETB 00H
JB 00H,$
MOV P2,serial_data
MOV SPDR,serial_data
LJMP LOOP

it_SPI:
;*********xoa co ngat******************************
mov a,SPSR
anl a,#00111111b ;CLR SPIF xoa co truyen, bit 7 of thanh ghi spsr
; /* clear software transfert flag */ xoa co truyen
mov spsr,a
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
21

;*******Doc du lieu nhan duoc**********************
MOV serial_data,SPDR ; /* read receive data */

CLR 00H
RETI
End

Truyền SPI chế độ ENHAUCED:
- Là chế độ 2 bộ đệm truyền. Dữ liệu sau khi được gửi ra thanh ghi SPDR sẽ được truyền
đi, trong lúc truyền chưa xong mà có một byte khác được đưa đến thì sẽ được lưu vào bộ đệm
phụ Tx (cùng đòa chỉ với SPDR) bằng cách này người ta có thể truyền nhiều byte liên tiếp
nhau. Bit nhận biết bộ đệm Tx sẵn sàng nạp dữ liệu là WCOL và LEND trong thanh ghi SPCR,
khi WCOL = 0 và LEND = 1 là an toàn để load dữ liệu, ngược lại dữ liệu sẽ bò tràn.
CODE MẪU CHO CHẾ ĐỘ ENHAUCED :
; truyền lệnh từ VĐK master sang slaver
#include <AT89s53.inc>
data_example EQU 30H
data_save EQU 31H
serial_data EQU 32H
org 000h
ljmp Main
org 0030h

Main:
MOV tmod,#00010001b
MOV spsr,#10000001b ;bit 1 la dissco =0 dc nhan; bit 0 la chon c/d ENH(1) or normal(0)
MOV data_example,#01010101b ; /* data example */
MOV SPCR, #10110101B ; initialize SPI master BIT4=1; interrupt ;ENabled
BIT7=1,CHO PHEP HD SPI BIT6=1 pin enable, ;BIT5=1 lSB first, polarity 0, ;phase 1, ; clock
rate /16
CLR P1.4 ; /* enable master */ cho phep chon con chu san sang truyen
;********* Setb SPE cho phep DN chan SPI ***********
MOV a,SPCR ;lenh orl or tung bit voi nhau 0 or x = x ; 1 or

x = 1 muon set len 1 thi or bit can set voi 1 cac bit con lai or voi 0 kq o bi ah
ORl a,#01000000b ;SETB SPE, cho pheo dinh nghia chan SPI bit thu 6 of thanh ghi spcr
MOV spcr,a ;x or voi 1 = 1 ;x or 0 =x
;************ xoa co truyen spif(7) va wcol(6) ***************
MOV a,SPSR ;muon xoa 1 bit ta anl bit do voi 0 cac bit
con lai and voi 1 ko bi ah
ANL a,#01111111b ;CLR SPIF xoa co truyen, bit 7 of thanh ghi spsr
; /* clear software transfert flag */ xoa co truyen
MOV spsr,a ;x anl voi 0 = 0 ; X ANL 1 = X
MOV R7,SPDR
LOOP:
MOV SPDR,#00H ;ADDRESS
LCALL CHO
MOV SPDR,#00H ;ADDRESS
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
22

LCALL CHO
MOV SPDR,#11100100B ;POWER_UP
LCALL CHO
MOV SPDR,#00H ;ADDRESS
LCALL CHO
MOV SPDR,#00H ;ADDRESS
LCALL CHO
MOV SPDR,#11100100B ;POWER_UP
LJMP LOOP ;thuc hien lai qua trinh truyen
CHO:
MOV A,SPSR
JNB ACC.5,$ ;LEND1 CHO LOAD WCOLL 0

JB ACC.6,$
RET
End

IV. ĐIỀU KHIỂN GIAO TIẾP MÁY TÍNH QUA CHUẨN RS232 :
- Trước khi bước vào phần lập trình giao tiếp máy tính tôi sẽ hướng dẫn các bạn cách
lập trình trên giao diện Visual Basic 6.0
- Để dễ hiểu hơn ta đi vào một yêu cầu cụ thể. Giả sử ta có một yêu cầu là lập trình
giao tiếp với card LCD. Ở đây chương trình vi điều khiển có nhiệm vụ nhận dữ liệu trên máy
tính và hiển thò trên màn hình LCD. Chương trình trên máy tính có giao diện cho phép nhập dữ
liệu vào textbox, một nút SEND để gửi dữ liệu xuống VĐK, một textbox để nhận dữ liệu và
một nút STOP để kết thúc.
Đoạn code chương trình Vi Điều Khiển như sau: (những phần không chú thích đã
trình bày ở các bài trên)
; KHAI BAO BIEN (khai báo các chân trong LCD)
RS BIT P1.0 ; RS=0 chon thanh ghi lệnh, RS=1 chọn thanh ghi dữ liệu
RW BIT P1.1 ;RW=0 ghi dữ liệu, RW=1 đọc dữ liệu
EN BIT P1.2 ;sau khi gửi lệnh hay data lên LCD cần tạo 1 xung lên chân EN
DATA_OUT EQU P2 ;8 đường dữ liệu của LCD được nối với Port2

ORG 0000H
LJMP MAIN
ORG 0023H
LJMP SERIAL
ORG 0030H
MAIN:
MOV PCON,#10000000B ;7 SMOD = 1 TANG TOC DO BAUD; CD NGHI 1 PD,0 IDL
MOV SCON,#01010001B
MOV TMOD,#00100001B
MOV TH0,#HIGH(-50000)

MOV TL0,#LOW(-50000)
MOV TH1,#-3
MOV IE,#10010000B
SETB TR1
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
23


LOOP:
MOV A,#38H ;lệnh tạo ma trận hai dòng 5x7
LCALL OUT_INSTRUCTION ;gọi chương trình con để gửi lênh lên LCD
MOV A,#1H ;lệnh xóa màn hình LCD
LCALL OUT_INSTRUCTION
MOV A,#80H ;lệnh đưa con trỏ về đầu dòng 1
LCALL OUT_INSTRUCTION
SJMP $ ;nhảy tại chổ (không làm gì)

SERIAL: ;Trình phục vụ ngắt port nối tiếp
JNB RI,$
CLR RI
MOV A,SBUF
LCALL OUT_DATA ;Gọi chương trình xuất dữ liệu lên LCD

RETI

OUT_DATA:
MOV DATA_OUT,A ;đưa nội dung trong thanh ghi A lên LCD
SETB RS ;chọn thanh ghi dữ liệu
CLR RW ;chọn lệnh ghi dữ liệu lên LCD

SETB EN ;tạo xung trên chân EN
LCALL DELAY
CLR EN
LCALL DELAY
RET

OUT_INSTRUCTION:
MOV DATA_OUT,A
CLR RS ;Chọn thanh ghi lệnh
CLR RW
SETB EN
LCALL DELAY
CLR EN
LCALL DELAY
RET

DELAY: ;Chương trình con tạo thời gian trì hoãn 12,5ms
MOV 7FH,#50
DL1:
MOV 7EH,#250
DL:
DJNZ 7EH,DL
DJNZ 7FH,DL1
YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
24

RET
END


Dưới đây là phần thao tác trên VB6.0:
- Sau khi cài đặt VB6.0 bạn click vào biểu tượng
Vb6.exe

- Hộp thoại sau xuất hiện:


- Chọn Standard EXE, click Open để vào màn hình soạn thảo sau:

1. Click
here

2. Click here

YELLOW BUTTERFLY 3/15/2008
Created by ELECTRONIC FACULTY Page
25


- Sau khi đặt vào Form 2 button, 2 textbox. Trên thanh công cụ chọn Project ->
Components (hay Ctr+T) để lấy cổng Com

- Cửa sổ sau xuất hiện:

Nhấp chọn công cụ
Button, nhã chuột ra di
chuyển vào Form và đặt
ở vò trí bạn chọn
Làm tương tự
cho textbox

×