Đồ án Lập trình C cho họ vi điều khiển 8051

I. ĐẶT VẤN ĐỀ:

Ngày nay, những ứng dụng của Vi điều khiển đã đi sâu vào đời sống sinh hoạt và

sản xuất của con người. Thực tế hiện nay là hầu hết các thiết bị điện dân dụng hiện nay

đều có sự góp mặt của Vi Điều Khiển và vi xử lí . Ứng dụng vi điều khiển trong thiết kế

hệ thống làm giảm chi phí thiết kế và hạ giá thành sản phẩm đồng thời nâng cao tính ổn

định của thiết bị và hệ thống.Trên thị trường có rất nhiều họ vi điều khiển: họ 8051 của

Intel, 68HC11 của Motorola, Z80 của hãng Zilog, PIC của hãng Microchip, H8 của

Hitachi,vv

Việc phát triển ứng dụng các hệ vi xử lý đòi hỏi những hiểu biết cả về phần cứng

cũng như phần mềm, nhưng cũng chính vì vậy mà các hệ vi xử lý được sử dụng để giải

quyết những bài toán rất khác nhau. Tính đa dạng của các ứng dụng phụ thuộc vào việc

lựa chọn các hệ vi xử lý cụ thể cũng như vào kỹ thuật lập trình.

Ngày nay các bộ vi xử lý có mặt trong rất nhiều thiết bị điện tử hiện đại: từ đầu

đĩa CD, máy thu hình, máy ghi hình, dàn âm thanh HiFi, bộ điều khiển lò sưởi cho đến

các thiết bị điều khiển dùng trong công nghiệp. Lĩnh vực ứng dụng của các hệ vi xử lý

cũng rất rộng lớn: từ nguyên cứu khoa học, truyền dữ liệu, đến công nghiệp, năng lượng,

giao thông và y tế

Tùy theo kinh nghiệm và mức độ thông thạo mà chúng ta có thể sử dụng các ngôn

ngữ khác ngoài hợp ngữ như: C, C++, Visual basic để có những chương trình chất lượng

cao hơn.

II. NỘI DUNG CỦA ĐỀ TÀI:

9 Sơ lược về vi điều khiển AT89C51.

9 Khảo sát vi điều khiển AT89C2051 của hãng ATMEL.

• Gồm sơ đồ chân linh kiện.

• Sơ đồ khối của AT89C2051.

• Các nội dụng ứng dụng của AT89C2051.

9 Giới thiệu phần mềm Keil Software µViSion 2

9 Ứng dụng ngôn ngữ C và Assembly điều khiển lập trình led.

• Ứng dụng cho led đơn, led 7 đoạn, led ma trận

9 Kết luận và hướng phát triển của đề tài.

pdf 67 trang yennguyen 2980
Bạn đang xem 20 trang mẫu của tài liệu "Đồ án Lập trình C cho họ vi điều khiển 8051", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Đồ án Lập trình C cho họ vi điều khiển 8051

Đồ án Lập trình C cho họ vi điều khiển 8051
Lập trình C cho họ vi điều khiển 
8051 
BỘ CÔNG NGHIỆP 
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP HCM 
KHOA CÔNG NGHỆ ĐIỆN TỬ 
#" 
Đồ Án Tốt nghiệp 
 Đề Tài: 
LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 2
PHẦN I 
TỔNG QUAN về ĐỀ TÀI 
I. ĐẶT VẤN ĐỀ: 
Ngày nay, những ứng dụng của Vi điều khiển đã đi sâu vào đời sống sinh hoạt và 
sản xuất của con người. Thực tế hiện nay là hầu hết các thiết bị điện dân dụng hiện nay 
đều có sự góp mặt của Vi Điều Khiển và vi xử lí . Ứng dụng vi điều khiển trong thiết kế 
hệ thống làm giảm chi phí thiết kế và hạ giá thành sản phẩm đồng thời nâng cao tính ổn 
định của thiết bị và hệ thống.Trên thị trường có rất nhiều họ vi điều khiển: họ 8051 của 
Intel, 68HC11 của Motorola, Z80 của hãng Zilog, PIC của hãng Microchip, H8 của 
Hitachi,vv 
Việc phát triển ứng dụng các hệ vi xử lý đòi hỏi những hiểu biết cả về phần cứng 
cũng như phần mềm, nhưng cũng chính vì vậy mà các hệ vi xử lý được sử dụng để giải 
quyết những bài toán rất khác nhau. Tính đa dạng của các ứng dụng phụ thuộc vào việc 
lựa chọn các hệ vi xử lý cụ thể cũng như vào kỹ thuật lập trình. 
 Ngày nay các bộ vi xử lý có mặt trong rất nhiều thiết bị điện tử hiện đại: từ đầu 
đĩa CD, máy thu hình, máy ghi hình, dàn âm thanh HiFi, bộ điều khiển lò sưởi cho đến 
các thiết bị điều khiển dùng trong công nghiệp. Lĩnh vực ứng dụng của các hệ vi xử lý 
cũng rất rộng lớn: từ nguyên cứu khoa học, truyền dữ liệu, đến công nghiệp, năng lượng, 
giao thông và y tế 
 Tùy theo kinh nghiệm và mức độ thông thạo mà chúng ta có thể sử dụng các ngôn 
ngữ khác ngoài hợp ngữ như: C, C++, Visual basic để có những chương trình chất lượng 
cao hơn. 
II. NỘI DUNG CỦA ĐỀ TÀI: 
9 Sơ lược về vi điều khiển AT89C51. 
9 Khảo sát vi điều khiển AT89C2051 của hãng ATMEL. 
• Gồm sơ đồ chân linh kiện. 
• Sơ đồ khối của AT89C2051. 
• Các nội dụng ứng dụng của AT89C2051. 
9 Giới thiệu phần mềm Keil Software µViSion 2 
9 Ứng dụng ngôn ngữ C và Assembly điều khiển lập trình led. 
• Ứng dụng cho led đơn, led 7 đoạn, led ma trận 
9 Kết luận và hướng phát triển của đề tài. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 3
PHẦN II 
NỘI DUNG ĐỀ TÀI 
CHƯƠNG 1: GIỚI THIỆU BỘ VI ĐIỀU KHIỂN 89C2051 và 89C51 
I.GIỚI THIỆU BỘ VI ĐIỀU KHIỂN 89C2051 
 I.1 CÁC ĐẶC ĐIỂM 
9 Tương thích với các sản phẩm của họ MSC-51. 
9 2K byte bộ nhớ Flash lập trình được. 
9 Khả năng :1000 chu kì ghi/xóa. 
9 Tầm điện áp hoạt động từ 2,7 V đến 6V 
9 Tầm tần số hoạt động từ 0 Hz đến 21 MHz 
9 2 mức khóa bộ nhớ chương trình (program memory). 
9 RAM bên trong (internal RAM) có dung lượng 128 x 8 bit. 
9 15 đường I/O lập trình được. 
9 2 bộ định thời /đếm 16 bit. 
9 6 nguồn (nguyên nhân ) ngắt. 
9 Kênh nối tiếp UART lập trình được. 
9 Các ngõ ra kích LED trực tiếp. 
9 Mạch so sánh tương tự trên chip (on-chip analog comparator). 
9 Các chế độ nghỉ công suất thấp và chế độ giảm công suất. 
 I.2 MÔ TẢ 
 Chip AT89C2051 là chip vi điều khiển CMOS 8 bit điện áp thấp, hiệu suất cao có 2K 
byte bộ nhớ Flash chỉ đọc, xóa được và lập trình được PEROM (Flash programmable and 
erasable readonly memory). Linh kiện này được sản xuất bằng cách sử dụng công nghệ bộ nhớ 
không thay đổi mật độ cao của Atmel và tương thích với tập tệp của MCS-51 chuẩn công 
nghiệp. Bằng cách kết hợp một CPU 8-bit đa năng và linh hoạt với Flash trên chip đơn tinh thể , 
Atmel AT89C2051 là chip vi điều khiển mạnh cung cấp giải pháp linh động cao và mang lại 
hiệu quả về giá thành cho nhiều ứng dụng điều khiển nhúng (embedded control application). 
 AT89C2051 cung cấp các đặc tính chuẩn sau đây : bộ nhớ Flash 2K byte , 128 byte 
RAM , 15 đường I/O, 2 bộ định thời/đếm 16-bit , kiến trúc ngắt hai mức 5 vector, port nối tiếp 
hoàn toàn song công , mạch so sánh tương tự chính xác, mạch dao động và tạo xung clock trên 
chip . Ngoài ra AT89C2051 được thiết kế có mạch logic tĩnh cho hoạt động giảm đến tần số 0 
Hz và hỗ trợ 2 chế độ tiết kiệm công suất lựa chọn được bằng phần mềm. 
 Chế dộ nghĩ ( idle mode ) sẽ dùng CPU nhưng vẫn cho phép RAM, các bộ định 
thời/đếm, port nối tiếp và hệ thống ngắt tiếp tục hoạt động. Chế độ giảm công suất duy trì nội 
dung của RAM nhưng làm dừng mạch dao động, không cho phép mọi chức năng khác của chip 
hoạt động cho đến lần reset cứng kế tiếp (nghĩa là ta thiết lập lại trạng thái ban đầu [reset] cho 
chiop bằng mạch điện bên ngoài). 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 4
 I.3 CẤU HÌNH CHÂN 
Hình 1.1 
 I.4 SƠ ĐỒ KHỐI 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 5
Hình 1.2 
9 RAM ADDR. REGISTER: thanh ghi địa chỉ RAM . 
9 RAM: vùng nhớ truy cập ngẫu nhiên (RAM). 
9 FLASH: vùng nhớ FLASH. 
9 B REGISTER:thanh ghi B. 
9 ACC: thanh chứa. 
9 STACK POINTER: con trỏ vùng nhớ xếp chồng. 
9 PROGRAM ADDRESS REGISTER: thanh ghi địa chỉ chương trình. 
9 TMP1: thanh ghi tạm 1 
9 TMP2: thanh ghi tạm 2 
9 ALU: đơn vị số học/logic. 
9 BUFFER: bộ đệm. 
9 PC INCREMENTER: bộ tăng thanh ghi đếm chương trình PC. 
9 INTERRUPT, SERIAL PORT AND TIMER BLOCKS: các khối ngắt, port nối tiếp 
và định thời. 
9 PROGRAM COUNTER: bộ đếm chương trình PC. 
9 PSW: từ trạng thái chương trình . 
9 TIMING AND CONTROL:mạch logic điều khiển và định thời. 
9 INSTRUCTION REGISTERED: thanh ghi lệnh. 
9 DPTR: con trỏ dữ liệu . 
9 PORT1 LATCH: bộ chốt port 1. 
9 PORT3 LATCH: bộ chốt port 3. 
9 ANALOG COMPARTOR:bộ so sánh tương tự . 
9 OSC:mạch dao động. 
9 PORT 1 DRIVERS: các mạch kích port 1. 
9 PORT 3 DRIVERS: các mạch kích port 3. 
 I.5 MÔ TẢ CHÂN 
 VCC 
 Chân cấp điện áp Vcc cho chip. 
 GND 
 Chân nối đất. 
 Port 1 
 Port 1 là port I/O (port nhập/xuất: input/output port) hai chiều 8-bit. Các chân của port từ 
P1.2 đến P1.7 cung cấp các mạch kéo lên bên trong (internal pull-ups). Các chân P1.0 và P1.1 
yêu cầu các mạch kéo lên bên ngoài . P1.0 và P1.1 cũng còn được sử dụng làm ngõ vào dương 
(AIN0) và ngõ vào âm (ÁIN), theo thứ tự, của mạch so sánh tương tự chính xác trên chip (on –
chip precision analog comparator). 
 Các mạch đệm ngõ ra (output buffer) của port 1 có thể hút dòng 20mA và kích trực tiếp 
các bộ hiện thị LED. Khi các logic 1 được ghi đến các chân của port 1, các chân này có thể được 
sử dụng làm các ngõ vào. Khi các chân từ P1.2 đến P1.7 được sử dụng làm các ngõ vào và được 
kéo xuống mức thấp từ bên ngoài, chúng sẽ cung cấp dòng (IIL) do các mạch kéo lên bên trong. 
 Port 1 cũng nhận dữ liệu chương trình hay dữ kiệu mã (code data) trong thời gian lập trình 
và kiểm tra bộ nhớ Flash. 
 Port 3 
 Các chân của port 3 từ P3.0 đến P3.5, P3.7 là chân I/O hai chiều với các mạch kéo lên bên 
trong. P3.6 được nối dây cứng làm ngõ vào nối đến ngõ ra của mạch so sánh trên chip và không 
thể truy cập như một chân I/O có mục đích tổng quát. Các mạch đệm ngõ ra của port 3 có thể hút 
dòng 20mA.Khi các logíc được ghi đến các chân của port 3, các chân này được kéo lên mức cao 
bởi các mạch kéo lên bên trong và có thể được sử dụng làm các ngõ vào. Khi là các ngõ vào, các 
chân nào của port 3 được kéo xuống mức thấp bởi mạch bên ngoài sẽ cung cấp dòng (IIL) do các 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 6
mạch kéo lên. Các chân của port 3 còn được sử dụng cho các chức năng đặc biệt khác của 
AT89C2051 như được liệt kê dưới đây ( bảng 11,1). Port 3 cũng nhận một số tín hiệu điều khiển 
để lập trình và kiểm tra bộ nhớ Flash. 
Bảng 1.1 
 RST 
 Ngõ vào reset (thiết lập lại trạng thái ban đầu). Tất cả các chân I/O được reset đến mức 
logíc ngay sau khi RST lên mức cao. Việc duy trì chân RST ở mức cao trong 2 chu kỳ máy trong 
khi mạch dao động đang hoạt động sẽ reset chip. 
 XTAL 1 
 Ngõ vào đến mạch khuếch đại dao động đảo và ngõ vào đến mạch tạo xung clock bên 
trong. 
 XTAL 2 
 Ngõ ra từ mạch khuếch đại dao động đảo. 
 I.6 CÁC ĐẶC TÍNH CỦA MẠCH DAO ĐỘNG. 
 XTAL 1 và XTAL 2 là ngõ vào và ngõ ra, theo thứ tự, của 
mạch khuếch đại đảo có thể được cấu hình để trở thành mạch dao 
động trên chip như được trình bày ở hình 1.3. Một tinh thể thạch 
anh hoặc mạch cộng hưởng gốm đều có thể sử dụng được. Để kích 
chip từ nguồnxung clock bên ngoài, chân XTAL 2 sẽ không kết 
nối trong khi chân ATAL 1 được kích như được trình bày ở hình 
1.4. Không có yêu cầu nào về chu kỳ nhiệm vụ (duty cycle) của 
tín hiệu xung clock bên ngoài vì ngõ vào đến mạch vì ngõ vào đến 
mạch tạo xung clock bên trong sẽ đi qua một flipflop làm nhiệm 
vụ chia 2 tần số, nhưng các đặc tính về điện áp tối thiểu và tối đa 
của mức cao và mức thấp phải được xem xét. 
Hình 1.3 các kết nối của mạch dao động. 
 Lưu ý: C1,C2=30pF± 10pF đối với các thạch anh ; C1,C2=40pF± 10pF đối với các bộ 
cộng hưởng gốm. 
Hình 1.4: Cấu hình kích xung clock bên ngoài. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 7
 I.7CÁC THANH GHI CHỨC NĂNG ĐẶC BIỆT SFR 
Bảng 1.2 Các giá trị khi reset và bản đồ các SFR của AT89C2051 
 Một bản đồ vùng nhớ trên chip được gọi là không gian thanh ghi chức năng đặc biệt SFR 
(special function registor) được trình bày ở bản trên đây (bảng 1.2). Lưu ý rằng không phải tất cả 
địa chỉ đều bị chiếm bởi các thanh ghi này, các địa chỉ không bị chiếm có thể không được thực 
hiện trên chip. Các truy cập đọc đến các địa chỉ này trong trường hợp tổng quát, sẽ trả về dữ liệu 
ngẫu nhiên và các truy cập ghi sẽ có tác động không rõ ràng. 
 Phần mêm của người sử dụng không nên ghi các logic 1 đến các vị trí nhớ không được liệt 
kê vì chúng có thể được sử dụng trong các sản phẩm tương lai để đáp ứng các đặt tính mới. 
Trong trường hợp đó, các giá trị do reset hoặc các giá trị không tích cực của các bit mới sẽ luôn 
luôn bằng 0. 
 I.8 CÁC GIỚI HẠN TRÊN MỘT SỐ LỆNH 
 AT89C2051 là một thành viên tiết kiệm và có hiệu quả về giá thành của họ vi đièu khiển 
đang phát triển của Atmel. Chip này chứa 2K bộ nhớ chương trình Flash. Chip này hoàn toàn 
tương thích với kiến trúc MCS-51và có thể được lập trình bằng cấch sử dụng tập lệnh MCS-51. 
tuy nhiên, có vài cân nhắc mà ta ohải chú ý khi sử dụng một số lập trình của chip này. 
Tất cả các lệnh liên quan đến các hoạt động nhảy và rẽ nhánh sẽ bị giới hạn, chẳn hạn như địa 
chỉ đíh rơi vào trong không gian nhớ của chip, không gian này là 2K byte với AT89C2051. Vấn 
đề này là trách nhiệm của nguowif lập trình phần mềm. 
Thí dụ, lệnh LJMP 7E0H sẽ là lệnh hợp lệ đối với AT89C2051 (có 2K byte bộ nhớ chương 
trình)trong khi đó lệnh LJMP 900H là lệnh không hợp lệ. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 8
 Các lệnh rẽ nhánh 
 LCALL,LMJP, ACALL, AJMP,SJMP ,JMP@A+DPTR- Các lệnh rẽ nhánh không điều 
kiện này sẽ thực thi đúng miễn là người lập trình lưu ý rằng địa chỉ đích rẽ nhánh phải nằm trong 
giới hạn vật lý của kích thước bộ nhớ chương trình (các vị trí nhớ từ 00H đến 7FFH đối với 
AT89C2051). Việc vi phạm các giới hạn khong gian vật lý có thể gây ra hành vi không biết 
được của chương trình 
CJNE [. . . ], DJNZ [. . . ], JB, JNB, JC, JNC, JBC, JZ, JNZ - Với các lệnh rẽ nhánh có 
điều kiện này, các quy luật giống như ở trên cũng được áp dụng. Một lần nữa, việc vi phạm các 
giơis hạn bộ nhớ vật lý sẽ làm cho chương trình thực hti không đúng. 
Đối với các ứng dụng bao gồm các cách ngắt, các vị trí địa chỉ của chương trình phục vụ ngắt 
(interrupt service rountine) bình thường của cấu trúc họ 89C2051 được bảo toàn. 
Các lệnh liên quan đến MOVX, bộ nhớ dữ liệu 
AT89C2051 chứa 128 byte bộ nhớ dữ liệu bên trong (intenal data memory). Như vậy 
trong AT89C2051,kích thước của bộ xếp chồng (stack depth) được giới hạn tới 128 byte, đay là 
dung lượng của RAM có sẳn. Việc truy cạp bộ nhớ bên ngoài không được hỗ trợ trong chip này 
và việc thưc thi chương trình bên ngoài cũng không được hỗ trợ. 
Như vậy không có lệnh MOVX [. . . ] nào chứa trong chương trình. 
Một trình dịch hợp ngữ (assembler) điển hình của 89C51 vẫn dịch các lệnh này,ngay cả 
khi chúng được viết dưới dạng vi phạm các giới hạn đã đề cập ở trên. Người sử dụng bộ vi điều 
khiển phải có trách nhiệm phải biết các tính chất vật lý và giới hạn của linh kiện đang được sử 
dụng và điều chỉnh các lệnh được sử dụng một cách thích hợp. 
Các giới hạn trên đây cho ta thấy các khuyết điểm của At89C2051. 
I.9 CÁC BIT KHOÁ BỘ NHỚ CHƯƠNG TRÌNH 
Với chip AT89C2051 ta có 2 bit khoá (lock bit), các bit này có thể để lại không lập trình 
(U) hoặc có thể lập trình (P) đẻ nhận thêm được các tính chất được liệt kê ở bảng 11.3. 
Các bit khoá chương trình 
 LB1 LB2 
 Loại bảo vệ 
1 U U Không có tính chất khoá chương trình. 
2 P U Việc lập trình thêm nữa cho bộ nhớ Flash bị cấm. 
3 U U Tương tự chế độ 2, việc kiểm tra cũng bị cấm. 
Lưu ý: các bit khoá chỉ có thể bị xoá bằng thao tác xoá chip 
Bảng 1.3:Các chế độ bảo vệ của bit khoá. 
 I.10 CHẾ ĐỘ NGHỈ 
 Trong chế đọ nghỉ CPU sẽ tự ngủ, trong khi tất cả các ngoại vi khác trên chip điều hoạt 
động và điều duy trì trạng thái ở chế độ tích cực. Chế đọ này được yêu cầu bởi phần mềm. Nội 
dung của RAM trên chip và tất cả tren các thanh ghi chức năng đặc biệt điều giữ nguyên không 
thay đổi trong thời gian ở chế độ này. Chế độ nghỉ có thể được kết thúc bởi cách ngắt bất kì được 
phép hoăc bằng cách reset phần cứng. 
Các chân P1.0 và P1.1 sẽ được thiết lập bằng 0 nếu không sử dụng các mạch kéo lên 
bên ngoài hoặc được thiết lập bằng 1 nếu có mạch kéo lên bên ngoài. 
Cũng cần lưu ý rằng khi chế độ nghỉ được kết thúc bởi một reset cứng, chip sẽ tiếp tục 
thực thi chương trình bình thường từ nơi chương trình bị rời bỏ, đến 2 chu kỳ máy trước giải 
thuật reset bên trong lấy quyền điều khiển. Phần cứng trên chip ngăm cản việc truy cập đến 
RAM bên trong ở chế độ này nhưng không cấm việc truy cập đến cá chân của port. Để laọi bỏ 
khả năng có một thao tác không mong đợi đến một chân của port khi chế độ nghỉ được kết thúc 
bằng reset, lẹnh theo sau lệnh yêu cầu chế nghỉ sẽ không thể là lệnh ghi đến một chân port hoặc 
bộ nhớ ngoài. 
Đồ Án Tốt Nghiệp 
SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 9
 I.11 CHẾ ĐỘ GIẢM CÔNG SUẤT 
Trong chế độ giảm công suất, mạch dao động bị dừng và lệnh yêu cầu chế độ giảm công 
suất là lệnh sau cùng được thực thi. RAM trên chip và các thanh ghi chức năng đặc biệt giữ lại 
các giá trị của chúng cho đén khi các chế độ giảm công suất được kết thúc.Lối thoát duy nhất ra 
khỏi chế độ giảm công suất là sử dụng reset cứng. Reset sẽ định nghĩa lại các thanh ghi chua\cứ 
năng đặc biệt nhưng không làm thay đổi Ram trên chip. Reset không nên được kích hoạt trươc 
khi điện áp VCC được khôi phục đến mức hoạt động bình thường và reset phải duy trì tích cực đủ 
lâu để cho phép mạch hoạt động trở lại và trở nên ổn định. 
Các chân P1.0 và P1.1 sẽ được thiết lập bằng 0 nếu không sử dụng các mạch kéo lên bên 
ngoài hoặc được thiết lập bằng 1 nếu có mạch kéo lên bên ngoài. 
I.12 LẬP TRÌNH FLASH 
AT89C2051 trên thị trường có dải nhớ chương trình PEROM trên chip la 2K byte ở 
trạng thái đã được xóa (nghĩa là toàn bộ nội dung của các byte là FFH) và sẳn sàng được lập 
trình. Dải nhớ chương trình được lập trình một byte cho mỗi thời điểm. Một khi dãi này đã được  ... 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 lineVà ứ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 

File đính kèm:

  • pdfdo_an_lap_trinh_c_cho_ho_vi_dieu_khien_8051.pdf