Lập trình C cho họ vi điều khiển 8051
          
        
            
            
              
            
 
            
                
                    MỤC LỤC 
 
Phần I 
Tổng quan đề tài 4 
 ã đặt vấn đề 4 
 ã Nội dung đề tài .4
Phần II 
Nội dung đề tài .5 
 Chương 1: Giới thiệu bộ vi điều khiển AT9C2051 và 89C51 
 ã Giới thiệu bộ vi điều khiển AT89C2051 5 
 ã Giới thiệu sơ lược về vi điều khiển AT89C51 19 
Chương 2: Giới thiệu phần mềm Keil µVision 21 
Phần III 
Thi công mạch và Ứng dụng lập trình C trong AT89C2051 62 
Phần IV 
Kết luận và Hướng phát triển đề tài 67 
Tài liệu tham khảo 68 
Mục lục .69
                
              
                                            
                                
            
 
            
                 66 trang
66 trang | 
Chia sẻ: banmai | Lượt xem: 4327 | Lượt tải: 4 
              
            Bạn đang xem trước 20 trang tài liệu Lập trình C cho họ vi điều khiển 8051, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
n nguồn , ta có thể thêm file tới Procject . Những đề xuất 
uVision vài cách để thêm tập tin nguồnvào một Procject. Ví dụ như ta có thể lựa chọn 
nhóm Procject Workspace-Files và click chuột phải để mở menu. Tùy chọn Add files 
được mở ra. Chọn file MAIN.C mà ta đã tạo ra. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 26
Thêm và định hình mã khởi Động ( Add and Configure the Starup Code) 
File STARUP.A51 là mã khởi động cho đa số CPU 8051. Mã khởi động làm sạch bộ 
nhớ dữ liệu và tạo những con trỏ ngăn xếp. Ngoài ra một vài dẫn xuất 8051 yêu cầu một 
mã khởi tạo CPU phù hợp với với cấu hình phần cứng. Ví dụ Philips 8051RD+ đề nghị ta 
chèn on-chip xdata RAM mà cần được thêm vào trong mã khởi động. Khi ta cần sửa đổi 
file toán học cho phù hợp với phần cứng, ta phải copy file STARUP.A51 từ 
C:\KEIL\C51\LIB đến ngăn Procject 
Tạo nhóm Procject 
Nhóm hồ sơ cho phép chúng ta tổ chức những Procject lớn. Cho mã khởi động 
CPU và những cấu hình hệ thống mà ta có thể tạo ra một Procject – những thành phần, 
môi trường , hướng dẫn …trong hộp thoại.Chèn một group mới để tạo ra một hệ thống có 
tên nhóm hồ sơ ngăn xếp. trong Procject mới có thể kéo thả file STARTUP.A51 lên 
nhóm file mới này. 
Bây giờ , Project Workspace – Files liệt kê tất cả trong Project . Để mở một 
Project soạn thảo, nhấn double lên file Project Workspace .Ta có thể cần định hình 
STARTUP.A51 trong trình biên tập. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 27
Thiết đặt những tùy chọn cho những mục tiêu. 
uVision cho chúng ta thiết đặt những tùy chọn cho mục tiêu phần cứng .Hộp thoại 
những tùy chọn cho những mục tiêu được mở qua biểu tượng thanh công cụ hoặc qua 
menu tùy chọn Project. Trong bảng mục tiêu chỉ rõ những tham số thích đáng phần cứng 
và thành phần chip mà bạn đã lựa chọn. Sau đây là ví dụ những thiết đặt : 
Sau đây là bản mô tả những tùy chọn của hộp thoại Target 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 28
Xtal – chỉ tần số clock mà CPU của bạn hoạt động. Trong đa số trường hợp giá trị này 
đồng nhất với tần số XTAL.( Specifies the CPU clock of your device. In most cases 
this value is identical with the XTAL frequency) 
Memory Model – chỉ rõ bộ nhớ C51, để bắt đầu những ứng dụng mặc định là một sự lựa 
chọn tốt. 
Allocate On-Chip... 
Use multiple DPTR registers – chỉ rõ cách dùng những thành phần của chip cho phép 
mã khởi động CPU , nếu ta đang sử dụng bộ nhớ xdata RAM ta cũng phải cho phép sự 
truy nhập XRAM trong STARTUP.A51 sắp xếp. 
Off-chip...Memory – chỉ rõ tất cả các vùng bộ nhớ ngoài 
Chỉ rõ những tham số cho mã và xdata. Tham chiếu tơi Code Banking để biết thêm chi 
tiết hơn Specifies the parameters for code and xdata banking. Refer to the "Code 
Banking" section for more information 
Vài tùy chọn trong hộp thoại chỉ có nếu ta đang sử dụng LX51 Linker/Locater. 
LX51 Linker/Locater chỉ có trong gói PK51 
Xây dựng Project và khởi tạo file HEX 
Những thiết đặt công cụ dưới những tùy chọn-mục tiêu mà ta cần để khởi động 
một ứng dụng mới. Ta có thể dịch tất cả các tập tin nguồn và kẻ những ứng dụng với một 
cái click trên biểu tượng Build Target . Khi ta xây dựng với những lỗi cú pháp, uVision 
sẽ trình bày những thông báo lỗi và cảnh báo với những lỗi có thể xảy ra. Nhấn double 
trên hàng thông báo lỗi để mở file nguồn để định vị trong trình biên tập uVision 
Một lần thành công ta có thể khởi động trình gỡ lỗi như mô tả dưới Testing 
Programs với trình gỡ lỗi uVision . 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 29
Bây giờ ta có thể sửa lỗi mã nguồn hoặc thêm những tập tin nguổn mới vào dự án. 
Nút thanh công cụ Build Target dịch những file nguồn chỉ được sửa đổi, hoặc file nguồn 
mới và file thực thi. uVision lưu giữ một danh sách và những file được sử dụng trong file 
nguồn. Thậm chí những tùy chọn công cụ được lưu trữ trong danh sách phụ thuộc, để 
uVision xây dựng lại nếu cần thiết, với lệnh Rebuild Target , tất cả những file nguồn 
được dịch bất chấp những cải biến. 
Sau khi kiểm tra ứng dụng của bạn, nó có thể yêu cầu tạo ra file HEX vả để tải 
xuống phần mềm ứng dụng vào trong thiết bị sử dụng một tiện ích lập trình Flash. 
uVision tạo file HEX với mỗi lần xây dựng dưới những tùy chọn cho Target-Outout dược 
cho phép. Tùy chọn Merge32K Hexfile sẵn sàng cho những ứng dụng Code Applocations 
khi ta đã lựa chọn Extended Linker LX51. Ta có thể khởi động tiện ích lập trình Flash 
sau khi trình dịch làm quá trình khi bạn chỉ rõ những chương trình Run Program#1. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 30
Chương trình mẫu 
Mục này mô tả những chương trình mẫu chạy trên Keil C51. Những chương trình 
mẫu này sẵn sàng cho bạn chạy thử. Những chương trình này giúp ta học cách sử dụng 
các công cụ của Keil C51. Đồng thời, ta cũng có thể sao chép các đọan mã của chúng vào 
chương trình của chúng ta. 
Các chương trình mẫu của Keil C51 được lưu trong thu mục 
C:\KEIL\C51\EXAMPLES\ . Mỗi chương trình được lưu trong một thư mục riêng cùng 
với một tập tin dữ kiện giúp bạn có thể nhanh chóng xây dựng và đánh giá chương trình. 
Ngoài ra, các chương trình nhỏ riêng biệt cho RTX – 51 cũng được cung cấp trong 
mục RTX – 51. 
Bảng sau là danh sách các chương trình mẫu trong C51 và tên thư mục của chúng. 
Kiểu mẫu Mô tả
ADI 83x Các chương trình dùng cho các thiết bị tương tự ADuC83x và 
ADuC84x mà nó chỉ ra các thiết bị mở rộng và cách dùng ADI 
MONITOR DRIVER 
ASM Một chưogn trình hợp ngữ đơn giản mà ta cả thể viết một đoạn 
text cho các port tuần tự
Benchmarks\... Vài chương trình riêng biệt: Dhrystone, Whetstone, Sieve.
BLINKY Loại 8051 Blinky làm sáng LED trên board Keil MCBx51
CodeBanking\... Kiểu mã Banking chỉ ra việc lập trình trên bộ nhớ 64K
CSAMPLE Bộ cộng và trừ đơn giản mà cho thấy làm sao xây dựng một 
chương trình với nhiều module trên μVision 
Dallas 390 Vài ví dụ sử dụng Dallas Contigious Addressing Mode mà nó có 
sẵn một vài thiết bị khác nhau như DS80C390, DS80C400, 
DS80C41x, DS5240, and DS5250.
FarMemory Làm sao mở rộng ô nhớ tr6n 64K
Hello Chương trình hiện chữ Hello world. Chạy thử nó trước khi sử 
dụng μVision.
Infineon C517 Cho thấy cách dùng Infineon mở rộn các thiết bị: MDU và bộ 
giao điện nối tiếp.
Infineon XC866 Những chương trình mẫu cho bo mạch Keil MCBXC866 hỗ trợ 
được thiết bị Infineon XC800 
M8051EW Các chương trình mẫu cho Mentor M8051EW 
MEASURE Là hệ thống thu thập và tập hợp những dữ liệu số và tương tự. Là 
chương trình điều khiển hệ thống đo lường nhiệt độ từ xa.
Philips 80C51MX Là chương trình mẫu cho họ Philips 80C51MX hỗ trợ tới 16MB 
vùng địa chỉ
Philips LPC9xx Chương trình cho bo mạch Keil MCB900 Evaluation mà hỗ trợ 
các thiết bị Philips LPC900 - LPC94x
Philips LPC95x Chương trình cho bo mạch Keil MCB9xx Evaluation mà hỗ trợ 
các thiết bị Philips LPC950 - LPC99x 
ST uPSD Chương trình mẫu cho dòng ST uPSD cho thấy cấu hình hệ 
thống Keil ULINK USB-JTAG Adapter 
TI MSC121x Chương trình cho các thiết bị TI MSC121x chỉ ra cách dùng hệ 
thống giải mã ISD51 In-System Debugger 
TI MSC1200 Chương trình cho các thiết bị TI MSC1200 chỉ ra cách dùng hệ 
thống giải mã ISD51 In-System Debugger 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 31
Để bắt đầu sử dụng một trong các chương trình mẫu, ta mở menu Project – Open 
Project trong μVision rồi mở tâp tin chương trình. 
Các mục trong chương này mô tả làm sao sử dụng các công cụ để xây dựng các 
chương trình sau: 
 HELLO : chương trình C viết cho 8051 
 MEASURE: hệ thống đo lường từ xa. 
HELLO 
Chương trình HELLO được lưu trong thư mục 
C:\KEIL\C51\EXAMPLES\HELLO\ . chương trình này không làm gì hơn là 
xuất đoạn text “ HELLO WORLD “ ra port. Toàn bộ chương trình được lưu trong tập tin 
nguồn là HELLO.C 
Ứng dụng nhỏ này giúp bạn có thể biên tập, liên kết và gỡ lỗi một ứng dụng. Bạn 
có thể thực hiện thao tác này từ dòng lệnh trên DOS, sử dụng tập tin dạng batch hoặc 
dùng μVison trên windown với các tập tin chương trình. 
Phần cứng cho chữ HELLO dựa vào CPU 8051 chuẩn. Một con chip ngoại vi 
được sử dụng cho các dãy port. Tuy nhiên, với μVision bạn không cần phải có 1 CPU vì 
chương trình đã đóng vai trò phần cứng yêu cầu cho chương trình này. 
Tập tin chương trình HELLO 
Trong μVision, những ứng dụng được lưu trong tập tin chương trình. Một chương 
trình được viết cho chữ HELLO. Để mở chương trình này ta chọn Open Project từ menu 
Project và mở tập tin HELLO.UV2 từ thư mục …\C51\EXEMPLES\HELLO. 
Soạn thảo chương trình HELLO.C 
Bây giờ bạn có thể soạn thảo chương trình HELLO.C bằng cách nhấp đúp chuột 
vào cửa sổ project file. μVision sẽ tải và hiển thị nội dung file HELLO.C trên cửa sổ làm 
việc. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 32
Biên dịch và kết nối HELLO 
Khi bạn đã sẵn sàng biên dịch và liên kết chương trình của mình, sử dụng lệnh Build 
Target từ menu Project hoặt thanh công cụ Build. μVision bắt đầu biên dịch và liên kết 
tạo ra một đoạn chương trình mà bạn có thể tải vào μVision cho việc thử lỗi. Quá trình 
xây dựng được liệt kê trong cửa sổ ngõ ra. 
Chú ý 
Bạn cần phải không gặp lỗi khi chạy các chương trình mẫu 
 chạy thử HELLO 
Khi chương trình HELLO đã được biên dịch và kết nối ta có thể kiểm tra nó với 
trình tìm lỗi của µVision. Trong µVision, sử dụng lệnh Start/Stop Debug Session từ 
menu Debug hoặc thanh công cụ. µVision khởi tạo trình báo lỗi và khởi động các 
chương trình con đến các chương trình chính. Sau đây là màn hình hiển thị: 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 33
Mở cửa sổ Serial Window #1 cho ta thấy các hiển thị ở ngõ ra với lệnh mở 
cửa sổ Serial Window #1 từ menu VIEW hoặc thanh công cụ Debug. 
Chạy chương trình HELLO với lệnh GO từ thanh công cụ Debug. Chương 
trình lời chào được thực hiện và hiển thị đoạn văn bản “HELLO WORLD” trong cửa sổ 
serial window. Sau khi ngõ ra hiển thị “HELLO WORLD” nó sẽ chạy với vòng lập vô 
tận. 
Dừng việc chạy chương trình HELLO với lệnh Halt từ menu Debug hoặc 
thanh công cụ. Bạn cũng có thể đánh lệnh ESC trong trang lệnh của cửa sổ OUTPUT. 
Trong suốt quá trình kiểm tra lỗi của µVision sẽ được hiển thị như sau: 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 34
Chạy từng bước và ngắt ngang 
Sử dụng lệnh Insert/Remove Breakpoints từ thanh công cụ hoặc từ trình 
đơn trên menu lập trình. Ta dùng chuột phải để đặt điểm dừng trên điểm bắt đầu của hiển 
chính. 
Sử dụng lệnh Reset CPU từ menu DEBUG hoặc thanh công cụ. Nếu bạn 
dừng chương trình đang chạy bởi lậnh RUN. µVision sẽ dừng chương trình tại điểm 
dừng mà bạn đã đặt. 
Bạn có thể chạy từng bước chương trình HELLO bằng cách ấn nút STEP trên 
thanh công cụ DEBUG. Những câu lệnh sẽ được chỉ ra với mũt tên màu vàng. Mũi tên sẽ 
di chuyển theo từng bước thực hiện. 
Đặt con trỏ chuột trên các biến để xem giá trị của chúng. 
Bạn có thể chạy hoặc dừng chương trình bất kỳ kúc nào với lệnh 
START/STOP DEBUG. 
MEASURE: hệ thống điều khiển thiết bị từ xa 
Chương trình điều khiển (MEASURE) được lưu trong thư mục 
..\C51\Examples\Measure. Chương trình này sử dụng các dữ liệu số và tương tự thường 
được dùng trong các đài khí tượng và điều khiển trong công nghiệp. 
Chương trình này chạy trên P89LPC935 CPU và ghi dữ liệu từ hai port kỹ thuật số 
và bốn ngõ vào chuyển đổi A/D. Một bộ định thời (Timer) điều khiển quá trình lấy dữ 
liệu. Mẫu dữ liệu có thể định hình từ 1 mili giây đến 60 phút. Mỗi dữ liệu đo được trong 
suốt thời gian hoặc từ các kênh ngõ vào đề được lưu vào RAM. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 35
Tập tin lệnh của chương trình đo lường 
Tập tin này có tên là MEASURE.UV2. để mở tập tin ta dùng lệnh Open Project 
từ menu Project và chọc file MEASURE.UV2 trong thư mục 
C:\Keil\C51\Examples\Measure. 
Trang tập tin trong cửa sổ Project cho ta thấy những tập tin nguồn dùng để biên 
soạn chương trình trắc lượng. Chương trình đo lường mẫu gồm có 3 tâp tin nguồn đó là: 
Getline.c, Mcommand.c, và Measure.c mà ta có thể tìm thấy trong nhóm file nguồn. 
Ngoài ra bạn còn có thể tìm thấy mã khởi động CPU và tập tin dữ liệu. 
Để mở một file ta nhấp đúp vào tên tấp tin trong Project Workpage 
Các chương trình có chức năng nhằm vào các mục đích khác nhau cho những môi 
trường thử nghiệm khác nhau. Để dò lỗi chạy chương trình mô phỏng ta chọn mục mô 
phỏng SIMULATOR trong thanh công cụ BUILD. Khi sử dụng phiên bản ước lượng 
Evaluation Version bạn cần phải chọn Demo - Simulator. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 36
Mô tả các chức năng của tập tin nguồn 
Measure.c Chức các hàm chính của C cho hệ thống đo lường và 
điều kiện ngắt cho timer0. các hàm chính khởi tạo tất 
cả các thiết bị ngoại vi của P89LPC935 và xử lý các 
lệnh hệ thống. Điều kiện ngắt timer,timer0, quản lý 
đồng hồ thời gian thực và lấy dữ liệu từ phép đo của 
hệ thống. 
Mcommand.c Những quá trình hiển thị, thời gian và khoảng cách 
giữa các lệnh. Những hàm này được gọi từ chương 
trình chính. Các lệnh hiển thị giá trị tương tự từ điểm 
giao động sẽ cho tín hiệu điện từ 0.00V đến 3.30V 
Getline.c Gồm các dòng lệnh được soạn thảo cho những dữ 
kiện nhận từ các port 
Yêu cầu phần cứng 
Các ứng dụng đo lường chỉ có thể chạy trên bo mạch Keil MCB900 hoặc các phần 
cứng cơ bản khác dùng P89LBC935. Bộ vi điều khiển PL89LBC935 cung cấp khả năng 
nhập vào cả tín hiệu số và tương tự. Port 1 và Port2 được dùng để nhập tín hiệu số và từ 
AD00 đến AD03 để nhập tín hiệu tương tự. 
Tuy nhiên, chúng ta sẽ không cần một bo mạch nào hết vì μVision đã tích hợp 
chức năng này. 
biên dịch và liên kết chương trình MEASURE 
Khi đã sẵn sàng biên dịch và liện kết chương trình, sử dụng lệnh Buil Target từ 
menu Project hoặc thanh công cụ. μVision sẽ thực hiện toàn bộ quá trình và sẽ thông báo 
cho bạn khi hoàn tất. 
chạy thử chương trình MEASURE 
Chương trình mẫu điều khiển đo lường được lập trình để chấp nhận các lệnh trên 
chip của các port tuần tự. Nếu bạn có phần cứng thực tế, bạn có thể dử dụng phần mô 
phỏng cuối cùng để kết nối với CPU P89LPC935. nếu bạn không có phần cứng thì có 
thể sử dụng phần cứng mô phỏng trên μVision. Bạn có thể sử dụng cửa sổ Serial 
Windown để cung cấp tín hiệu được nhập vào. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 37
Mỗi lần chương trình Measure được xây dựng bạn có thể chạy thử. Sử dụng lệnh 
START/STOP trong menu DEBUG để chạy chương trình kiểm tra lỗi. 
Những lệnh của hệ thống điều khiển đo lường từ xa 
Chuỗi các lệnh dùng cho chương trình được liệt kê trong bảng. Những lệnh này 
bao gồm bảng mã ASCII và tất cả các lệnh điều phải được hoàn tất bằng một sự quay 
vòng. 
Lệnh Cấu trúc Chức năng 
clear C Xóa tất cả các dữ liệu đo được trước đó 
Dislay D Hiển thị thời gian làm việc và giá trị ngõ 
vào 
time T hh:mm:ss Đặt thời gian theo chuẩn 24h 
Interval I mm:ss.ttt Đặt những khoảng thời gian cho mỗi phép 
đo khoảng thời gian này từ 0:00.001(1ms) 
và 60:00.000 (60 phút) 
start S Khởi động quá trình ghi dữ liệu đo được. 
Khi nhận lệnh start, chương trình đo lấy 
mẫu tất cả các tín hiệu ngõ vào tại các 
khoảng thời gian đã định. 
Read R[count] Hiển thị các giá trị đo được, bạn có thể chỉ 
rõ số của tâ1t cả các mẫu mà mình muốn 
đọc. Nếu không chỉ ra thứ tự nào, lệnh đọc 
sẽ hiển thị tất cả các giá trị đo. Bạn chỉ có 
thể đọc các giá trị này trong 1 giây. Nếu 
muốn hơn thì phải dừng chương trình. 
quit Q Thoát khỏi quá trình ghi giá trị đo 
Khi bạn chạy một lần chương trình mô phỏng trên μVision, bạn có thể vào các 
lệnh này trong cửa sổ Serial Windown#1 ở bên dưới: 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 38
Hiển thị các đoạn mã của chương trình 
μVision cho phép bạn hiển thị các đoạn mã của chương trình trong cửa sổ 
Disassembly Window bằng cách mở menu View hoặc dùng các nút trên thanh công cụ. 
Cửa sổ Disassembly Window cho thấy sự trộn lẫn các nguồn và các đoạn assembly. Bạn 
có thể thay đổi cách hiển thị bằng cách nhấp chuột phải vào menu ngữ cảnh. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 39
hiển thị nội dung các ô nhớ 
μVision có thể hiển thị các ô nhớ ở các định dạng khác nhau. Cửa sổ ô nhớ 
Memory Window được mở từ menu View hoặc từ thanh công cụ. Bạn có thể nhập địa 
chỉ của 4 vùng nhớ ở trang này. Menu ngữ cảnh cho phép bạn sửa đổi nội dung ô nhớ 
hoặc lựa chọn những kiểu ngõ ra khác nhau. 
các biến thay đổi đồng hồ thời gian 
Bạn có thể liên tục nhìn nội dung của các biến, cấu trúc và các mảng. Ta có thể mở 
cửa sổ Watch Window từ menu View hoặc thanh công cụ. Một trang ngữ cảnh hiện ra 
cho thấy taa61t cả các ký tự ngữ cảnh của hàm hiện thời. Các trang Watch#1 và Watch#2 
cho phép ta vào bất kỳ biến nào của chương trình như ở trang sau: 
Vào các biến thời gian trong cửa sổ Watch Window 
Lựa chọn văn bản cùng với 1 cái click chuột và đợi trong 
một giây. Một cái click chuôt khác cùng quá trình chỉnh sửa giúp ta thêm vàog ía trị của 
các biến. Với cùng cách như trên ta có thể thay đổi nhiều giá trị. Cách khác là bạn có thể 
dùng phím F2. 
Đồ Án
phản c
bạn m
suốt q
menu 
 Tốt Nghi
Để xóa đi 
Những cấ
hiếu sự lồn
Chú ý 
Cửa sổ W
ở chế độ V
uá trình ch
Vào biến 
Chọc một
ngữ cảnh b
Vào các b
Sử dụng l
ệp 
một biến, n
u trúc và m
g nhau. 
atch Windo
iew - Perio
ạy chương 
thời gian t
 biến trong 
ằng cách c
iến thời gi
ênh Watch
hấn chọn v
ảng sẽ hiện
w cập nhập
dic Windo
trình mô ph
ừ cửa sổ so
vùng soạn 
lick phải ch
an từ tran
Set để thêm
à ấn phím 
 ra khi ấn k
 bầt cứ khi
w Update
ỏng. 
ạn thảo 
thảo và dùn
uột. 
g lệnh ngõ
 giá trị biế
delete. 
ý hiệu [+].
 nào chươn
 các giá trị 
g câu lệnh
 ra (output
n vào cửa s
 Các dòng 
g trình thự
cập nhật sẽ
 Add to W
 window) 
ổ Watch W
bị thụt vào 
c hiện dừng
 lấy liên tụ
atch Wind
indow 
để 
. Khi 
c trong 
ow từ 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 41
Thực hiện chương trình 
trước khi bắt đầu mô phòng chương trình MEASURE, mở cửa sổ Serial 
Window#1 để hiển thị chuỗi giá trị ngõ ra bằng cách vào menu View hoặc thanh Debug. 
Bạn có thể thu nhỏ các cửa sổ khác nếu màn hình không đủ lớn. Bạn có thể chạy từng 
bước bằng lệnh Step các câu lệnh Essembler hoặc các đoạn mã gốc. Nếu cửa sổ 
Assembly Window đang mở, bạn nên chọc chạy tùng bước các lệnh essembly cơ bản. 
Nếu cửa sổ soạn thảo với các mã gốc được mở, bạn chạy từng bước với từng mã nguồn. 
nút lệnh ‘chạy từng bước đến” (stepinto) cho phép bạn thực hiện một bước 
nhảy đến các chương trình được gọi 
thực hiện việc gọi một hàm và sẽ không tự động ngắt cho đến khi gặp điểm 
ngắt. 
trên nguyên tắc ta có thể ngẫu nhiên nhảy vào một hàm chưa hoàn tất. Bạn có 
thể dùng lệnh StepOut để hoàn tất hàm đó và trả lại giá trị cho nó ngay lập tức khi có 
lệnh gọi. 
mũi tên vàng đánh dấu câu lệnh hiện thời và hoặc các lệnh cấp cao. Bạn có thể 
ngẫu nhiên bước vào một hàm chưa hoàn tất. 
lệnh chạy ngay hàng của con trỏ (Run till Cursor Line) 
lệnh đặt và bỏ điểm ngắt Insert/Remove BreakPoint 
Hộp thoại BreakPoint 
μvision cũng hỗ trợ các điểm ngắt phức tạp. Chẳng hạn bạn muốn ngắt một 
chương trình khi một biến đạt giá trị nhất định. Cài đặt ở bên dưới khi nào giá trị 3 được 
viết cho current.time.sec 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 42
Để định nghĩa điểm dừng này ta mở hộp thoại BreakPoint từ menu Debug. Đánh 
dấu chọn vào ô Write ( dấu chọn này chỉ ra là lệnh ngắt chỉ được kiểm tra khi được viết 
tới ). Tiếp tục click vào nút Define để chọn điểm dùng. Để kiểm tra việc thực hiện điểm 
dừng làm các bước sau: 
 Reset CPU 
Nếu sự thực hiện chương trình dừng thì bắt đầu chạy chương trình đo 
Sau một ít thời gian, μVision dừng sự thực hiện. Chương trình đếm hàng đánh 
dấu vị trí hàng mà trong đó điểm ngắt được đặt. 
Sự ghi vệt tin 
Quá trình này thực hiện trong suốt thời gian kiểm lỗi cho đến điểm dừng nơi bạn 
yêu cầu thông tin cho giá trị thanh ghi và những nguyên nhân khác dẫn tới dự ngắt. Nếu 
Debug - Enable/Disable Trace Recording được đặt bạn có thể nhìn thấy các lệnh liên 
quan tới CPU thực hiện trước điểm dừng. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 43
Bảng giá trị các thanh ghi 
Gọi ngăn xếp 
Các ngăn xếp trong của μVision sẽ được lấp đầy khi chương trình hoàn tất. Trang 
CallStack của cửa sổ Watch Window cho thấy sự lồng nhau giữa các hàm hiện thời. Nhấp 
đúp lên một hàng hiển thị mã gốc để thực hiện chức năng của nó. 
On-Chip ngoại vi 
μVision cung cấp một số cách để hiển thị và sửa dổi các chip ngoại vi sử dụng 
trong chương trình của bạn. Bạn có thể thấy kết quả của ví dụ khi thực hiện các bước sau: 
Reset CPU và xóa tất cả các điểm ngắt 
Nếu chương trình bị dừng khi bắt đầu đo lường. 
Mở cửa sổ Serial Window #1 và vào lệnh ‘d’ cho ứng dụng MEASURE. 
Chương trình đo lường cho thấy giá trị từ ngõ vào port1 và port2 và bộ chuyển đổi A/D 
1-3. Cửa sổ Serial Window #1 được biễu diễn ở hình sau: 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 44
Những hộp thoại thiết bị ngoại vi 
μVision cung cấp các hộp thoại cho: I/O port, thiết bị ngắt, bộ định thời, chuyển 
đổi A/D, và một số chip ngoại vi đặc biệt. Các hộp thoại này có thể mở từ menu 
Peripheral. Mỗi hộp thoại cho thấy các ký hiệu SFR liên quan và tình trạng các thiết bị 
ngoại vi. 
Cho ứng dụng đo đạc bạn có thể mở Peripherals - I/O Ports - Port2 và 
Peripherals - A/D Converter - ADC0/DAC0. những hộp thoại này cho thấy tình trạng 
của các thiết bị ngoại vi và bạn có thể thay đổi giá trị ngõ vào. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 45
Bạn có thể sử dụng Virtual Simulator Registers (VTREGs) để thay đổi giá trị ngõ 
vào. Trong cửa sổ Output Window – Command Page bạn có thể đặt các ấn định cho các 
ký hiệu VTREG giống như ngững biến và các thanh ghi. 
Ví Dụ: 
PORT2=0xDA ; set digital input PORT2 to 0xDA. 
AD01=2.3 ; set analog input AD01 to 2.3 volts. 
Các user và tín hiệu chức năng ( Signal Function ) 
Bạn có thể kết hợp các ký hiệu VTREG với chức năng tìm lỗi của μVision để tạo 
ra một phương thức phức tạp của việc cung cấp dữ liệu ngoài được nhập vào tới các 
chương trình của bạn. 
Chương trình mẫu Measure sử dụng bộ giải mã khởi tạo file MEASURE.INI để 
định nghĩa các tín hiệu hàm cho: 
 Xuất hiện xung răng cưa trên ngõ vào A/D AD01. 
 Xuất hiện sóng sine trên ngõ vào A/D AD02. 
 Xuất hiện tín hiệu nhiễu trên ngõ vào A/D AD03. 
Tập tin MEASURE.INI được lưu dưới dạng Options for Target – Debug – 
Initialization File và có nội dung như sau: 
/*-------------------------------------------*/ 
/* Function MyRegs() shows Registers R0...R3 */ 
/*-------------------------------------------*/ 
FUNC void MyRegs (void) { 
 printf ("---------- MyRegs() ----------\n"); 
 printf (" R0 R1 R2 R3\n"); 
 printf (" %02X %02X %02X %02X\n"); 
 printf ("------------------------------\n"); 
} 
// 
// Generate Saw Tooth Signal on A/D input AD01 
// 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 46
signal void AD01_Saw (void) { 
 float volts; // peak-to-peak volatage 
 float frequency; // output frequency in Hz 
 float offset; // volatge offset 
 float duration; // duration in Seconds 
 float delay; 
 float val; 
 long i, end, steps; 
 volts = 2.0; 
 offset = 0.2; 
 frequency = 140; 
 duration = 8.0; 
 printf ("Saw Tooth Signal on A/D input AD01\n"); 
 steps = 100; 
 delay = (0.01/frequency); 
 printf ("Saw Steps = %d\n", steps); 
 end = (duration * 10000); 
 for (i = 0 ; i < end; i++) { 
 val = (i % steps) / ((float) steps); 
 AD01 = (val * volts) + offset; 
 swatch (delay); 
 } 
} 
// 
// Generate Sine Wave Signal on A/D input AD02 
// 
signal void AD02_Sine (void) { 
 float volts; // peak-to-peak volatage 
 float frequency; // output frequency in Hz 
 float offset; // volatge offset 
 float duration; // duration in Seconds 
 float val; 
 long i, end; 
 volts = 1.4; 
 offset = 1.6; 
 frequency = 180; 
 duration = 5.0; 
 printf ("Sine Wave Signal on A/D input AD02\n"); 
 end = (duration * 10000); 
 for (i = 0 ; i < end; i++) { 
 val = __sin (frequency * (((float) STATES) / CLOCK) * 2 * 3.1415926); 
 AD02 = (val * volts) + offset; 
 swatch (0.0001); // in 100 uSec steps 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 47
 } 
} 
// 
// Generate Noise Signal on A/D input AD03 
// 
signal void AD03_Noise (void) { 
 float volts; // peak-to-peak volatage 
 float frequency; // output frequency in Hz 
 float offset; // volatge offset 
 float duration; // duration in Seconds 
 float val; 
 long i, end; 
 volts = 1.4; 
 offset = 1.6; 
 duration = 0.5; 
 printf ("Noise Signal on A/D input AD03\n"); 
 end = (duration * 100000); 
 for (i = 0 ; i < end; i++) { 
 val = ((float) rand (0)) / 32767.0; 
 AD03 = (val * volts) + offset; 
 swatch (0.00001); // in 10 uSec steps 
 } 
} 
// 
// Run Signal Functions at Startup 
// 
signal void Startup (void) { 
 swatch (1.0); // wait 1.0 seconds 
 AD01_Saw (); 
 swatch (0.3); // wait 0.3 seconds 
 AD02_Sine (); 
 swatch (0.6); // wait 0.6 seconds 
 AD03_Noise (); 
} 
Startup (); // Start the Signals 
define button "AD01 Saw Tooth", "AD01_Saw ()" 
define button "AD02 Sine Wave", "AD02_Sine ()" 
define button "AD03 Noise Signal", "AD03_Noise ()" 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 48
Bạn có thể kèm theo chức năng dò lỗi cho những hàm trong cửa sổ Output 
Window – Command Page. 
>MyRegs () 
---------- MyRegs() ---------- 
 R0 R1 R2 R3 
 00 00 00 00 
Cho nhiều tín hiệu chức năng ta có thể dùng hộp công cụ ToolBox cho các yêu 
cầu khẩn cấp. 
Thực hiện phân tích (Performance Analyzer) 
μVision cho phép bạn thực hiện viện phân tích tính toán thời gian của những ứng 
dụng tích hợp Performance Analyzer. Để chuẩn bị cho sự phân tích tính toán thời gian, 
ta dừng việc thực thi chương trình và mở menu Debug - Performance Analyzer để mở 
hộp thoại Setup Performance Analyzer. 
Bạn có thể chọn các ký hiệu hàm hay đánh tên hàm hoặc mật dãy địa chỉ khi dùng 
hộp thoại Setup Performance Analyzer . 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 49
Thực hiện các bước để thấy việc thực hiện phân tích: 
 mở hộp thoại Performance Analyzer 
reset CPU và xóa các điểm ngắt 
nếu chương trình bị dừng khi bắt đầu việc đo đạc 
mở cửa sổ Serial Window#1 và gõ lệnh S , gõ D. 
Performance Analyzer cho ta thấy biểu đồ dạng cột trong mỗi phạm vi.biểu đồ 
hình cột cho thấy phần trăm thời gian thực hiện đoạn mã trong mỗi phạm vi. Click vào 
một cột để thấy thông tin thống kê chi tiết. 
Phân tích tín hiệu logic 
Với Logic Analyzer, μVision Debugger/Simulator cung cấp một màn hình đồ thị 
cho giá trị thay đổi của biến hoặc VTREGs. 
Thực hiện các bước sau để thấy việc phân tích giá trị Logic hoạt động: 
Mở hộp thoại Logic Analyzer 
 Sử dụng hộp thoại để biểu diễn các tín hiệu bạn muốn. Một ví dụ là AD01, 
AD02, AD03 và một cấu trúc như là current.time.sec. Bạn có thể chọn 
giữa nhiều kiểu mẫu. 
Chạy chương trình và hiển thị mức logic ngõ ra 
Logic Analyzer cung cấp một màn hình tính toán thời gian chi tiết của các tían 
hiệu đã chọn. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 50
Sử dụng các chip ngoại vi 
Đây là các thông số kỹ thuật mà bạn phải biết để tạo những chương trình dùng các 
chip ngoại vi và những đặt tính của họ 8051. những thông số được đề cập trong chương 
này. Bạn có thể sử dụng các đoạn mã được giới thiệu để có thể nhanh chóng làm việc với 
8051. 
Ở đây không có các chế độ đơn đặt thiết bị ngoại vi trong 8051. thay vào đó chip 
8051 cung cấp một sự sử dụng đa dạng các chip ngoại vi để phân biệt giữa chúng với 
nhau. các đoạn mã mẫu trong chương này cho ta biết cách sử dụng các họ chip ngoại vi 
đặc biệt. Chú ý rằng có nhiều tùy chọn cấu hình hơn được giới thiệu trong phần này. 
• Start up code 
• Special function Register 
• Register bank 
• Interrupt service Rountine 
• Interrupt Enable Registors 
• Parallel Port I/O 
• Timer/counter 
• Serial Interface 
• Watchdog Timer 
• D/A Coverter 
• A/D Coverter 
• Power Redution Modes 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 51
Mã khởi động ( startup code ) 
Mã khởi động được thực hiện ngay lập tức khi ta reset toàn bộ hệ thống và nó thực 
hiện các thao tác sau: 
 Phụ thuộc vào sự khác nhau của thiết bị, những đặc tính đặc biệt của thiết 
bị. 
 Xóa toàn bộ các dữ liệu (tùy chọn) 
 Thiết lập trạng thái ban đầu giá trị các ngăn xếp và con trỏ ngăn xếp(tùy 
chọn) 
 Thiết lập trạng thái ban đầu của con trỏ ngăn xếp phần cứng 8051 
 Chuyển đổi điều khiển tới các biến được thiết lập hoặc các hàm chính của 
C. 
Trình biên dịch Keil 51 các thiết bị đặc biệt có các mã khởi động khác nhau chút 
ít. Một mã khởi động chung được cung cấp trong tập tin ..\C51\LIB\STARTUP.A51. 
Chức năng các thanh ghi đặc biệt (Special Function Registers) 
Các chip thiết bị ngoại vi của 8051 được truy nhập sử dụng các thanh ghi có chức 
năng đặc biệt hoặc SFRs. SRFs được định vị trí bên trong chip một cách trực tiếp có địa 
chỉ từ 80H đến 0FFH. Nhà phát triển Keil đã cung cấp các công cụ gồm các tập tin hoặc 
các file tiêu đề có thể định nghĩa các thanh ghi nà cho bạn. Bạn có thể sử dụng các file 
tiêu đề được cung cấp sẵn hoặc tự tạo cho mình một file để định địa chỉ các chip ngoại vi. 
Ki bạn tạo một chương trình với μVision bạn có thể chèn việc định nghĩa các thanh ghi 
đặc biệt của thiết bị bằng cách dùng menu trong cửa sổ làm việc. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 52
Nhiều chương trình mẫu trong chương này đều sử dụng đoạn mã bắt đầu như sau: 
#include 
Các tập tin định nghĩa thanh ghi được lưu trong thư mục C:\KEIL\C51\INC. 
Đoạn mã sau đây được trích từ một tập tin định nghĩa thanh ghi cho các port song song 
I/O . 
sfr P0 = 0x80; // 8-bit I/O Port P0 
sfr P1 = 0x90; // 8-bit I/O Port P1 
sfr P2 = 0xA0; // 8-bit I/O Port P2 
sfr P3 = 0xB0; // 8-bit I/O Port P3 
Bạn có thể định các giá trị SFRs một cách trực tiếp bằng các mã nguồn C các tiêu 
đề flie. 
sfr IE = 0xA8; // Interrupt Enable register at SFR address 0xA8 
sbit EA = IE^7; // global Interrupt Enable Flag (bit 7 of SFR IE) 
Chú ý: 
 Khi bạn lấy hoặc ghi giá trị các thanh ghi đặc biệt bạn cần phải khai báo 
SFR trong tập tin nguồn. 
 Bit ký hiệu SFR chỉ có thể định nghĩa cho bit địa chỉ của thanh ghi SFR, 
mà nó được định vị theo địa chỉ 0x80, 0x88, 0x90 … 0xF8. 
Register Banks ( các thanh ghi lưu trữ ) 
 Vi điều khiển 8051 được xây dựng dựa vào các vùng nhớ căn bản với tám 
thanh ghi thông dụng (R0 –R70). Mỗi thanh ghi là một thanh ghi byte đơn. 
Tám thanh ghi đa dụng này có thể quản lý việc lưu trữ và các thanh ghi lưu 
trữ. 
 8051 cung cấp 4 thanh ghi lưu trữ mà bạn có thể sử dụng. Quá trình làm 
việc cơ bản của các thanh ghi dễ dàng được nhận thấy khi bạn thực hiện 
ngắt. 
 Dùng cho chương trình C trên 8051 thì ta không cần chọn hoặc mở thanh 
ghi vì chương trình đã mặc đinh chọn thanh ghi lưu trữ 0. 
 Các thanh ghi lưu trữ 1, 2, 3 trong quá các quá trình ngắt vì để tránh việc 
lưu trữ và khôi phục các ngăn xếp. 
Các điều kiện ngắt ( Interrupt Service Routines ) 
Trình biên dịch C51 cho phép viết những điều kiện ngắt trong C. trình biên dịch 
được sử dụng một cách hiệu quả bằng mã khởi đầu và mã kết thúc và điều tiết mở các 
thanh ghi lưu trữ. Các điều kiện ngắt được khai báo như sau: 
void function_name (void) interrupt interrupt_number [using register_bank] 
Chỉ số ngắt (interrupt number) giúp xác định địa chỉ véc tơ ngắt của hàm ngắt. Sử 
dụng bảng sau để xác định chỉ số ngắt: 
Interrupt Number Address Interrupt Number Address 
0 (EXTERNAL INT 0) 0003h 16 0083h 
1 (TIMER/COUNTER 0) 000Bh 17 008Bh 
2 (EXTERNAL INT 1) 0013h 18 0093h 
3 (TIMER/COUNTER 1) 001Bh 19 009Bh 
4 (SERIAL PORT) 0023h 20 00A3h 
5 (TIMER/COUNTER 2) 002Bh 21 00ABh 
6 (PCA) 0033h 22 00B3h 
7 003Bh 23 00BBh 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 53
8 0043h 24 00C3h 
9 004Bh 25 00CBh 
10 0053h 26 00D3h 
11 005Bh 27 00DBh 
12 0063h 28 00E3h 
13 006Bh 29 00EBh 
14 0073h 30 00F3h 
15 007Bh 31 00FBh 
Việc sử dụng các thuộc tính để cho ta có thể chỉ rõ một thanh ghi lưu trữ trong 
suốtt thời gian thực hiện hàm ngắt. Những điều ngắt khoảng ngắn có thể hiệu quả hơn 
không sử dụng thuộc tính, khi chúng sử dụng thanh ghi lưu trữ 0. bạn có thể kiểm chứng 
bằng hai đoạn mã essembler xem hiệu quả của chúng. 
Chú ý: 
Các hàm kèm theo điều kiện ngắt cần phải được biên tập với chỉ thị NOAREGS. 
Việc này bảo đảm rằng việc biên dịch không phát sinh việc thay đổi các thanh ghi tuyệt 
đối. 
Ví dụ sau cho ta thấy một hàm ngắt tiêu biểu: 
#include // Special Function Registers of 80C51 CPU 
 #pragma NOAREGS // do not use absolute register symbols (ARx) 
 // for functions called from interrupt routines. 
 static void HandleTransmitInterrupt (void) { 
 : 
 : 
 } 
 static void HandleReceiveInterrupt (void) { 
 : 
 : 
 } 
 #pragma AREGS // for other code it is save to use ARx symbols 
 static void com_isr (void) interrupt 4 using 1 { 
 if (TI) HandleTransmitInterrupt (); 
 if (RI) HandleReceiveInterrupt (); 
 } 
Trong ví dụ trên điều kiện ngắt chi chỉ số ngắt 4 được thiết lập. Tên của hàm ngắt 
là com_isr. Khi lệnh ngắt được thực hiện sẽ kéo theo, các mã mục được lưu vào thanh ghi 
CPU và chọn thanh ghi lưu trữ 1. Khi thủ tục ngắt kết thúc thì giá trị các thanh ghi được 
khôi phục. 
Sau đây là đoạn mã sinh ra bởi lậnh ngắt kể trên. Chú ý rằng nội dung thanh ghi 
lưu trữ sẽ được hoán đổi và được khôi phục lại sau khi thoát. 
 ; FUNCTION com_isr (BEGIN) 
0000 C0E0 PUSH ACC ; Save the Accumulator and Data 
Pointer 
0002 C083 PUSH DPH 
0004 C082 PUSH DPL 
0006 C0D0 PUSH PSW ; Save PSW (and the current Register Bank) 
0008 75D008 MOV PSW,#08H ; This selects Register Bank 1 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 54
: 
: 
0052 D0D0 POP PSW ; Restore PSW (and prior reg bank) 
0054 D082 POP DPL 
0056 D083 POP DPH 
0058 D0E0 POP ACC ; Restore the Accumulatorand DPTR 
005A 32 RETI 
 ; FUNCTION com_isr (END) 
Các thanh ghi cho phép ngắt (Interrupt Enable Registers) 
8051 cung cấp điều kiện ngắt cho nhiều chip ngoại vi. Quá trình ngắt hoàn toàn 
phụ thuộc vào bit EA của Interrupt Enable (IE) SFR. Khi bit EA lên mức 1 thì quá trình 
ngắt được thực hiện. Khi bit EA xuống mức 0 thì quá trình ngắt bị vô hiệu. 
Mỗi quá trình ngắt thì được kiểm soát bởi than ghi IE SFR. Tên một số chip 8051 
có thể có hơn 1 thanh ghi IE. Kiểm tra tài liệu về chip đó để tận dụng các quá trình ngắt. 
Các port song song vào/ra (Parallel Port I/O) 
Một chip 8051 bình thường có 4 port vào ra song song mà bạn có thể kết nối với 
các thiết bị ngoại vi. Chúng là Port 0, Port 1, Port 2, Port 3. Một số IC 8051 mở rông có 
tới 8 Port xuất nhập. 
Port Direction Width Alternate use 
P0 I/O 8 bits Mux'd. 8-bit bus: A0-A7 & D0-D7 
P1 I/O 8 bits P1.0-P1.7: Available for user I/O 
P2 I/O 8 bits Mux'd. 8-bit bus: A8-A15 
P3 I/O 8 bits P3.0: RXD (Serial Port Receive) 
 P3.1: TXD (Serial Port Transmit) 
 P3.2: /INT0 (Interrupt 0 input) 
 P3.3: /INT1 (Interrupt 1 input) 
 P3.4: T0 (Timer/Counter 0 Input) 
 P3.5: T1 (Timer/Counter 1 Input) 
 P3.6: /WR (Write Data Control) 
 P3.7: /RD (Read Data Control) 
Các Port trên IC 8051 bình thường thì không có các dữ liệu trên thanh ghi điều 
khiển. Thay vào đó, các chân của Port 1, Port 2, Port 3 mỗi chân có thể tăng lên mà 
chúng có thể là đầu nhập hay đầu xuất. Để ghi giá trị vào một Port bạn chỉ đơn giản ghi 
giá trị tùng chân của Port đó. Để lấy giá trị từ Port trước hết giá trị của chân phải được 
ghi là 1 ( đây cũng là giá trị ban đầu sau khi RESET ). 
Ví dụ sau là chương trình ghi và xuất giá trị các Port I/O: 
sfr P1 = 0x90; // SFR definition for Port 1 
sfr P3 = 0xB0; // SFR definition for Port 3 
sbit DIPswitch = P1^4; // DIP switch input on Port 1 bit 4 
sbit greenLED = P1^5; // green LED output on Port 1 bit 5 
void main (void) { 
 unsigned char inval; 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 55
 inval = 0; // initial value for inval 
 while (1) { 
 if (DIPswitch == 1) { // check if input P1.4 is high 
 inval = P1 & 0x0F; // read bit 0 .. 3 from P1 
 greenLED = 0; // set output P1.5 to low 
 } 
 else { // if input P1.4 is low 
 greenLED = 1; // set output P1.5 to high 
 } 
 P3 = (P3 & 0xF0) | inval; // output inval to P3.0 .. P3.3 
 } 
} 
Timer/Counter ( bộ định thời và bộ đếm ) 
IC 80C52 có ba bộ Timer/Counter (Timer 0, Timer 1, và Timer 2). Timer 1 và 
Timer 0 có các chức năng thông thường như nhau trong khi Timer 2 có khả năng ứng 
dụng cao hơn. Các timer có thể hoạt động độc lập với nhau với các kiểu định thời, kiểu 
đếm, kiểu phát tốc độ baud (cho các Port tuần tự). 
Chương trình sau là một ví dụ dùng Timer 1 tạo một xung vuông có tần số 10KHz. 
#include 
/* 
 * Timer 1 Interrupt Service Routine: executes every 100 clock cycles 
 */ 
static unsigned long overflow_count = 0; 
void timer1_ISR (void) interrupt 3 { 
 overflow_count++; // Increment the overflow count 
} 
/* 
 * MAIN C function: sets Timer1 for 8-bit timer w/reload (mode 2). 
 * The timer counts to 255, overflows, is reloaded with 156, and 
 * generates an interrupt. 
 */ 
void main (void) { 
 TMOD = (TMOD & 0x0F) | 0x20; // Set Mode (8-bit timer with 
reload) 
 TH1 = 256 - 100; // Reload TL1 to count 100 clocks 
 TL1 = TH1; 
 ET1 = 1; // Enable Timer 1 Interrupts 
 TR1 = 1; // Start Timer 1 Running 
 EA = 1; // Global Interrupt Enable 
 while (1); // Do Nothing (endless-loop): the 
timer 1 ISR will 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 56
 // occur every 100 clocks. Since the 
80C51 CPU runs 
 // at 12 MHz, the interrupt happens 
10 KHz. 
} 
Bộ biến đổi tương tự – số 
Các bộ biến đổi tương tự số A/D là các linh kiện chỉ có trên một số thành viên của 
họ 8051 nhưng khá phổ biến. Các bộ biến đổi A/D thường được điều khiển thông qua 
thanh ghi chủ ADCON, thanh ghi này được gán cho một vị trí còn trống nào đó trong 
đoạn nhớ dành cho các SFR, thanh chi ADCON cho phép người sử dụng chọn lựa kênh 
cần được biến đổi A/D, bặ đầu một biến đổi mới và kiểm tra trạng thái của lần biến đổi 
hiện tại. 
Các bộ biến đổi A/D điển hình cần 40 chu kỳ lệnh hoặc ít hơn để hoàn tất việc 
biến đổi và chúng được cấu hình để tạo ra ngắt vào lúc hoàn tất việc biến đổi, việc này 
làm cho bộ vi điều khiển định hướng đến một vector ngắt cụ thể dành cho việc biến đổi 
A/D. thông thường khuyết điểm của bộ biến đổi A/D là bộ này yêu cầu bộ vi điều khiển 
phải ở mức tính cực thay vì đi vào nghỉ để chờ ngắt do việc biến đổi hoàn tất. Kết quả 
của việc biến đổi được đọc từ một SFR khác hoặc một cặp SFR, phụ thuộc vào độ phân 
giãi của bộ biến đổi. 
Chương trình sau là ví dụ chuyển đổi tương tự từ tín hiệu ngõ vào sang số: 
#include 
#include 
void main (void) { 
 unsigned char chan_2_convert; 
 SCON = 0x50; // Configure the serial port. 
 TMOD |= 0x20; 
 TH1 = 0xA0; 
 TR1 = 1; 
 TI = 1; 
 // Configure A/D to sequentially convert each input 
channel. 
 ADCCON1 = 0x7C; // 0111 1100 
 while (1) { 
 unsigned int conv_val; 
 unsigned char channel; 
 // Start a conversion and wait for it to complete. 
 chan_2_convert = (chan_2_convert + 1) % 8; 
 ADCCON2 = (ADCCON2 & 0xF0) | chan_2_convert; 
 SCONV = 1; 
 while (ADCCON3 & 0x80); 
 // Read A/D data and print it out. 
 channel = ADCDATAH >> 4; 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 57
 conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8); 
 printf ("ADC Channel %bu = 0x%4.4X\r\n", channel, conv_val); 
 } 
} 
Bộ biến đổi số sang tương tự ( D/A coverter) 
Bộ biến đổi nàychuye63n đổi tían hiệu số đi vào thành tín hiệu dòng điện ở ngõ ra. 
IC Philips 87LPC769 là một trong các IC có tích hợp bộ chuyển đổi số – tương tự. IC 
Philips 87LPC769 gồm 2 kênh, và bộ chuyển đổi 8bit D/A dễ dàng thực hiện với chương 
trình. Ví dụ sau cho ta thấy cách dùng bộ chuyển đổi sử dụng D/A SFRs. 
/* 
 * This program generates sawtooth waveforms on the DAC 
 * of the Philips 87LPC769. 
 */ 
#include 
void main (void) { 
 // Disable the A/D Converter (this is required for 
DAC0) 
 ADCI = 0; // Clear A/D conversion complete flag 
 ADCS = 0; // Clear A/D conversion start flag 
 ENADC = 0; // Disable the A/D Converter 
 // Set P1.6 and P1.7 to Input Only (Hi Z). 
 P1M2 &= ~0xC0; 
 P1M1 |= 0xC0; 
 ENDAC0 = 1; // Enable the D/A Converters 
 ENDAC1 = 1; 
 while (1) { 
 unsigned int i; 
 // Create a sawtooth wave on DAC0 and the 
 // opposite sawtooth wave on DAC1. 
 for (i = 0; i < 0x100; i++) { 
 DAC0 = i; 
 DAC1 = 0xFF - i; 
 } 
 } 
} 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 58
Điều khiển cấp điện (Power Reduction Modes) 
Chế độ nghỉ (Idle mode) được kích hoạt bằng cách thiết lập bit IDLE bằng 1. chế 
độ nghỉ làm dừng mọi việc thực thi chương trình. Các nội dung trên RAM được bảo toàn 
và mạch dao động tiếp tục hoạt động nhưng xung clock bị khó không đến được CPU. 
Các bộ định thời và UART tiếp tục thực hiện bìn thường các chức năng của chúng. 
Chế độ nghỉ được kết thúc bằng cách kích hoạt một điểm ngắt bất kỳ. Khi việc 
thực thile65nh ngắt ISR kết thúc thì hệ thống sẽ làm việc lại từ lênh set bit IDLE lên 1. 
Sau đây là chương trình thực hiện chế độ nghỉ: 
sfr PCON = 0x87; 
void main (void) { 
 while (1) { 
 task_a (); 
 task_b (); 
 task_c (); 
 PCON |= 0x01; /* Enter IDLE Mode - Wait for enabled interrupt */ 
 } 
} 
Chế độ giảm cấp điện ( power down mode) được thiết lập bằng cách set bit 
PDWN lên 1. trong chế độ nàyma5ch dao động trong chip bị dừng. Như vậy các bộ định 
thời và UART cũng như việc thực hiện phần mềm đều tạm ngưng. Miễn là có điện áp tối 
thiểu 2V đặt vào chip thì các nội dung lưu trên RAM vẫn được bảo toàn. 
Cách duy nhất để buộc bộ vi điều khiển ra khỏi chế độ giảm công suất là áp đặt 
thiết lập lại (RESET) bộ vi điều khiển này khi cấp điện. 
Sau đây là chương trình thự hiện quá trình giãm cấp điện: 
sfr PCON = 0x87; 
void main (void) { 
 while (1) { 
 task_a (); 
 task_b (); 
 task_c (); 
 PCON |= 0x02; /* Enter Power Down Mode */ 
 } 
} 
Bộ định thời WATCHDOG 
Bộ định thời Watchdog có sẵn trên nhóm mở rộng của các thành viên họ 8051. 
mục đích của bộ định thời Watchdog là thiết lập lại (reset) lại bộ vi điều khiển nếu bộ 
định thời không được cung cấp một trình tự thao tác cụ thể trong một khoảng thời gian 
xác định. Điều này ngăn ngừa việc nạp lại Wachdog mọt cách trùng khớp ngẫu nhiên bởi 
các phần mềm khác. 
Trong họ 8051, watchdog thường được thực hiện dưới dạng một bộ định thời khác 
trên chip, bộ định thời này lập tỉ lệ giảm tần số mạch dao động hệ thống và kế đến đếm 
xung clock đã được chia tỉ lệ. Khi bộ định thời quay vòng, hệ thống thiết lập lại từ đầu 
(reset). Watchdog có thể được cấu hình đối với tốc độ quay vòng và thường có thể được 
sử dụng làm bộ định thời khác mặc dù đây là bộ định thời có độ phân giải thấp. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 59
Chương trình sau đây cho thấy cách thiết lập giá trị ban đầu và reset watchdog: 
#include 
/* This function adjusts the watchdog timer compare value to the current 
 * PCA timer value + 0xFF00. Note that you must write to CCAP4L first, 
 * then write to CCAP4H. */ 
void watchdog_reset (void) { 
 unsigned char newval; 
 newval = CH + 0xFF; 
 CCAP4L = 0; 
 CCAP4H = newval; 
} 
void main (void) { 
 unsigned int i; 
/* Configure PCA Module 4 as the watchdog and make 
 sure it doesn't time-out immediately. */ 
 watchdog_reset (); 
 CCAPM4 = 0x48; 
/* Configure the PCA for watchdog timer. */ 
 CMOD = (CMOD & 0x01) | 0x40; 
/* Start the PCA Timer: From this point on, we must reset the watchdog 
 timer every 0xFF00 clock cycles. If we don't, the watchdog timer 
 will reset the MCU. */ 
 CR = 1; 
/* Do something for a while and make sure that we don't get reset by 
 the watchdog. */ 
 for (i = 0; i < 1000; i++) { 
 watchdog_reset (); 
 } 
/* Stop updating the watchdog and we should get reset. */ 
 while (1); 
} 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 60
PHẦN III 
THI CÔNG MẠCH VÀ 
ỨNG DỤNG LẬP TRÌNH C TRONG AT89C2051 
I.Điều khiển led đơn 
 Sơ đồ nguyên lý: 
 Code C: 
#include 
 char const num[ ] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; 
 void wait (void) 
 { ; 
 } 
 void main( void ) 
 { 
 unsigned int i; 
 unsigned char j; 
 P1 = 0; 
 while(1){ 
 for( j = 0; j < 8; j++ ) 
 { 
 P1 = num[ j ]; 
 for ( i = 0; i < 10000; i++ ) 
 { 
 wait(); 
 } 
 } 
 } 
 } 
Đồ Án Tốt Nghi
II. ỨNG 
 Sơ đ
 Code 
#include <
 char num
 void wa
 { ; } 
 void ma
 unsig
 unsig
 P1 =
 P3 =
 for( ;;
 for (r
 { 
 P3 
 for
 {
 } 
 } 
 } 
ệp 
DỤNG C
ồ nguyên 
C: 
 at892051
[ ] = {0x3f
it (void) 
in ( void ){ 
ned char cn
ned int i; 
 0; 
 0; 
 ){ 
ight=0;rig
= right; 
 (cnt=0;cn
P1 = num[
 for (i = 0; 
 { 
 wait(); 
 } 
 } 
HO 2 LE
lý: 
.h > 
,0x06,0x5b
t, right; 
ht<3;right+
t<10;cnt++
cnt]; 
i < 10000;
D 7 ĐOẠ
,0x4f,0x66
+) 
) 
 i++) 
N VỚI N
,0x6d,0x7d
ÚT NHẤ
,0x07,0x7f,
N 
0x6f}; 
Đồ Án
I
 Tốt Nghi
II.ỨNG D
• Sơ Đồ
• Code 
#include <
 char c
 void wait
 { ; 
 } 
 void mai
 { 
 unsign
 unsign
 P3 =
 P1 =
 for( ;; 
 { 
 col =
 for 
 { 
 fo
 {
ệp 
ỤNG CH
 Nguyên
C: 
 at892051.
onst pat[5]=
 (void) 
n( void ) 
ed char cnt
ed int i; 
 0; 
 0; 
) 
 1; 
(cnt=0;cnt<
r(col = 0;co
P1 = pat[cn
P3 = col; 
 for (i = 0; i
 { 
 wait(); 
O LED 
 Lý: 
h > 
{ 0x3f, 0x0
, col; 
5;cnt++) 
l < 32;col<
t]; 
 < 10000; i+
MATRIX
2, 0x04, 0x0
<=1) 
+) 
 5x7. 
2, 0x3f }; 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 63
 } 
 } 
 } 
 } 
 } 
SOẠN THẢO VÀ BIÊN DỊCH CHƯƠNG TRÌNH 
CHO HỌ VI ĐIỀU KHIỂN 8051 
1. Soạn thảo chương trình 
 Dùng chức năng Edit của NC (Norton Commander) hoặc bất cứ 
phần mềm soạn thảo văn bản nào khác. 
 Lưu dưới dạng file .A51 hoặc .ASM, hoặc .C v.v.. 
2. Chuyển thành file object (.obj) bằng chương trình A51.exe, hoặc 
ASM51.exe. 
A51 baitap.a51 [enter] 
ASM51 baitap.a51 [enter] 
 Chương trình dịch sẽ tạo ra file baitap.obj và baitap.lsl. 
 File.obj là file cơ sở cho việc liên kết thành chương trình thực thi được. 
Còn file .lsl là file văn bản chứa các lệnh, mã lệnh và địa chỉ tương ứng. 
File .lsl còn chứa các thông báo của chương trình biên dịch về những lỗi 
cú pháp (nếu có). 
 Sau khi thực hiện biên dịch xong sẽ nhận được thông báo: 
ASSEMBLY COMPLETE, NO ERRORS FOUND 
Hoặc ASSEMBLY COMPLETE, x ERRORS FOUND (y) 
 Với x là số lỗi cú pháp và y là số thứ tự của hàng lệnh bị lỗi cuối cùng 
trong chương trình. 
 Mở file baitap.lsl để xem các lỗi. Sau đó, mở file baitap.a51, hoặc file 
baitap.asm để sửa các lỗi rồi tiến hành biên dịch lại. 
3. Chuyển file object thành file hex (.HEX) bằng chương trình 
OHS51.EXE hoặc OH.EXE. 
Ohs51.exe baitap.obj [enter] 
Oh.exe baitap.obj [enter] 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 64
PHẨN IV 
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI 
KẾT LUẬN 
 Trong đề tài này chúng tôi tìm hiểu và nghiên cứu lập trình C cho 
họ vi điều khiển 8051 và mới chỉ đi vào một số ứng dụng nhỏ như là điều 
khiển led đơn , led bảy đoạn, và led ma trận . Tôi chưa khai thác hết tầm 
hạn của phần mềm Keil C cũng như chip AT89C2051. 
 Khảo sát qua phần mềm Keil C. 
 Thực hiện biên dịch mã nguồn C cho led đơn, led 7 đoạn, led matrix 
5x7. 
HƯỚNG PHÁT TRIỂN 
 Hướng phát triển của đồ án là: dùng ngôn ngữ lập trình C để ứng 
dụng vào hệ thống nhúng của họ vi điều khiển 8051 hoặc các họ vi điều 
khiển khác như là Philips P89C51Rx2/P89V51 Rx2 mà không chỉ xuất 
đơn thuần là led đơn , mà là led matrix 5x7, matrix 8x8 , hoặc LCD 1 line, 
LCD 2 line, LCD 4 line…Và ứng dụng ngôn ngữ lập trình C để thiết kế 
những ứng dụng thực tiễn phục vụ cho đời sống của con người. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 65
TÀI LIỆU THAM KHẢO 
9 Datasheet AT8051/AT89C51/AT89C2051 Preliminary (Complete) 
của hãng Atmel Corporation. 
9 User’s Guide for Keil µVision. 
9 Phạm Quang Trí, Giáo trình Vi xử lý của trường ĐHCN TP.HCM. 
9 Giáo trình Vi xử lý của trường ĐHBKTPHCM. 
9 Website :  / 
9 Sách embedded C 
9 Sách Ngôn ngữ C của các tác giả Quách Tuấn Ngọc . 
9 Handel-C Language Reference Manual. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 66
MỤC LỤC 
1. Phần I 
9 tổng quan đề tài ............................................................ trang 4 
• đặt vấn đề ................................................................ trang 4 
• Nội dung đề tài 
2. Phần II 
9 Nội dung đề tài ............................................................... trang 5 
 Chương 1: Giới thiệu bộ vi điều khiển ĂT9C2051 và 89C51 
• Giới thiệu bộ vi điều khiển AT89C2051 ................ trang 5 
• Giới thiệu sơ lược về vi điều khiển AT89C51 ........ trang 19 
Chương 2: Giới thiệu phần mềm Keil µVision ............ trang 21 
3. Phần III 
9 Thi công mạch và Ứng dụng lập trình C trong AT89C2051 trang 62 
4. Phần IV 
9 Kết luận và Hướng phát triển đề tài .............................. trang 67 
5. Tài liệu tham khảo ............................................................... trang 68 
6. Mục lục ............................................................................... trang 69 
            Các file đính kèm theo tài liệu này:
 do_an_lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505.pdf do_an_lap_trinh_c_cho_vi_dieu_khien_8051_8462_1505.pdf