You are on page 1of 38

ĐỒ ÁN VI ĐIỀU KHIỂN

LỜI NÓI ĐẦU




Ngày nay với sự tiến bộ của khoa học kỹ thuật cộng với sự phát triển mạnh mẽ
của công cụ máy tính. Đã thay đổi phương thức sản suất đi theo một chiều hướng
mới đó là thời kỳ mà các dây chuyền, các máy sản xuất đã chuyển sang bán tự
động hoặc tự động hoá hoàn toàn.
Đối với các thiết bị tự động thì các chip vi điều khiển, các bộ vi xử lí trung
tâm đóng vai trò hết sức quan trọng là đầu não điều khiển mọi hoạt động của thiết
bị. Tuy nhiên với những thiết bị không đòi hỏi độ phức tạp trong xữ lí cao thì các
chip VĐK như họ 8051, PIC sử dụng rất tiện lợi, giá thành thấp.
Với mục đích của đồ án VĐK là nhằm giúp sinh viên làm quen, n ắm được
cách thức điều khiển một thiết bị thực tế bằng vi điều khiển. Em chọn chíp VĐK
89C51 cho đề tài của mình là: “Máy tính cộng trừ nhân chia hiển thị LCD”
Qua một thời gian tìm hiểu, thiết kế với sự cố gắng của bản thân và đặc biệt
là sự hướng dẩn của thầy Lê Xứng và các thầy giáo trong bộ môn đến nay em đã
hoàn thành đồ án VĐK này.
Em rất chân thành cảm ơn các thầy cô!
Đà Nẵng, ngày 12 tháng 6 năm 2009
Sinh viên thực hiện
Hoàng phi long

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 1


ĐỒ ÁN VI ĐIỀU KHIỂN

MỤC LỤC

Chương I: GIỚI THIỆU ĐỀ TÀI ................................ ................................ ......


Chương II: GIỚI THIỆU BỘ VI ĐIỀU KHIỂN 89C51
VÀ CÁC LINH KIỆN LIÊN QUAN ................................ ...............
A.GIỚI THIỆU BỘ VĐK AT89C51 ................................ ................................ ......
2.1.Giới thiệu chung ................................ ................................ ...............................
2.2. Lịch sử phát triển của vi điều khiển ................................ ................................ .
2.3 Khảo sát vi điều khiển 8051................................ ................................ .............
2.3.1.Cấu trúc bên trong của IC 8951 ................................ ................................ ....
2.3.2.Chức năng của các chân vi điều khiển................................ ............................
2.3.3.Hoạt động của bộ định thời................................ ................................ ............
2.3.4.Hoạt động ngắt ................................ ................................ ..............................
2.3.5.Tập lệnh họ 8051. ................................ ................................ ..........................
B.CÁC LINH KIỆN LIÊN QUAN ĐẾN MACH THIẾT KẾ ............................
Chương III: THIẾT KẾ MẠCH & CHƯƠNG TRÌNH ................................ .....
3.1.Sơ đồ mạch thiết kế ................................ ................................ ..........................
3.2. Sơ đồ khối chương trình ................................ ................................ ..................
3.3.Mã nguồn chương trình…………………………………………………………

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 2


ĐỒ ÁN VI ĐIỀU KHIỂN

Chương I
GIỚI THIỆU ĐỀ TÀI

1.1 Giới thiệu LCD


Trong những năm gần đây màn hình tinh thể lỏng LCD ngày càng được sử dụng
rộng rãi và đang dần thay thế các đèn LED. Đó là vì các nguyên nhân sau:
-Màn hình LCD có giá thành hạ.
-Khả năng hiển thị số ,ký tự và đồ hoạ tốt hơn nhiều so với đèn LED
-Sử dụng thêm một bộ điều khiển làm tươi LCD và như vậy giải phóng CPU khỏi
công việc này.còn đối với đèn LED luôn cần CPU để duy trì việc hiển thị dữ liệu.
-Dễ dàng lập trình các ký tự và đồ hoạ.
1.2Đặt vấn đề:
Ngày nay máy tính điện tử đã trở nên phổ biến và không thể thiếu được đối với
học sinh cũng như sinh viên .Chính vì lý do trên nên em chọn đề tài ~Máy tính
điện tử hiển thị LCD~ một trong những ứng dụng đơn giản của LCD. Nội dung
chính của đồ án của em là có thể thực hiện các phép toán đơn giản như Cộng, trừ,
nhân, chia,có thể thực hiện cộng từ 1 số sau đó phát triển thêm cộng được nhiều
số hơn nữa,và có thể giao tiếp với máy tính để hiển thị số lên LCD
Khi nghiên cứu đề tài này em muốn phát huy những ứng dụng của vi điều
khiển nhàm tạo ra sản phẩm của chính mình,trong quá trình phát tri ển đồ án em có
cơ hội nghiên cứu kỹ hơn về vi diều khiển ,phát hiện nhiều về khả năng ứng dụng
của vi điều khiển, đồng thời phát huy tính sáng tạo ,khả năng giải quyết một vấn đề
yêu cầu đặt ra.

Sơ đồ chương trình:
Đợi
ấn phím

No push

xử lý

Đọc phím

kết quả

Display

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 3


ĐỒ ÁN VI ĐIỀU KHIỂN

CHƯƠNG II:
GIỚI THIỆU VỀ VI ĐIỀU KHIỂN
VÀ CÁC LINH KIỆN LIÊN QUAN
A.GIỚI THIỆU VỀ HỌ VI ĐIỀU KHIỂN 89C51:
2.1.Giới thiệu chung
Bộ vi điều khiển viết tắt là Micro-controller, là mạch tích hợp trên một chip có thể
lập trình được, dùng để điều khiển hoạt động của một hệ thống. Theo các tập lệnh
của người lập trình, bộ vi điều khiển tiến hành đọc, lưu trữ thông tin, xử lý thông
tin, đo thời gian và tiến hành đóng mở một cơ cấu nào đó.
Trong các thiếh bị điện và điện và điện tử dân dụng, các bộ vi điều khiển, điều
khiển hoạt động của TV, máy giặt, đầu đọc laser, điện thọai, lò vi-ba … Trong hệ
thống sản xuất tự động, bộ vi điều khiển được sử dụng trong Robot, dây chuy ền tự
động. Các hệ thống càng "thông minh" thì vai trò c ủa hệ vi điều khiển càng quan
trọng.
2.2. Lịch sử phát triển của vi điều khiển
Bộ vi điều khiển thực ra, là một loại vi xử lí trong tập hợp các bộ vi xử lý nói
chung. Bộ vi điều khiển được phát triển từ bộ vi xử lí, từ những năm 70 do sự phát
triển và hoàn thiện về công nghệ vi điện tử dựa trên kỹ thuật MOS (Metal-Oxide-
Semiconductor) , mức độ tích hợp của các linh kiện bán dẫn trong một chip ngày
càng cao.
Năm 1971 xuất hiện bộ vi xử lí 4 bit loại TMS1000 do công ty texas Instruments
vừa là nơi phát minh vừa là nhà sản xuất. Nhìn tổng thể thì bộ vi xử lí chỉ có chứa
trên một chip những chức năng cần thiết để xử lí chương trình theo một trình tự,
còn tất cả bộ phận phụ trợ khác cần thiết như : bộ nhớ dữ liệu , bộ nhớ chương
trình , bộ chuển đổi AID, khối điều khiển, khối hiển thị, điều khiển máy in, hối
đồng hồ và lịch là những linh kiện nằm ở bên ngoài được nối vào bộ vi xử lí.
Mãi đến năm 1976 công ty INTEL (Interlligen -Elictronics). Mới cho ra đời bộ vi
điều khiển đơn chip đầu tiên trên thế giới với tên gọi 8048. Bên cạnh bộ xử lí trung
tâm 8048 còn chứa bộ nhớ dữ liệu, bộ nhớ chương trình, bộ đếm và phát thời gian
các cổng vào và ra Digital trên một chip.
Các công ty khác cũng lần lược cho ra đời các bộ vi điều khiển 8bit tương tự như
8048 và hình thành họ vi điều khiển MCS-48 (Microcontroller-sustem-48).
Đến năm 1980 công ty INTEL cho ra đ ời thế hệ thứ hai của bộ vi điều khiển đơn
chip với tên gọi 8051. Và sau đó hàng lo ạt các vi điều khiển cùng loại với 8051 ra
đời và hình thành họ vi điều khiển MCS-51 .
Đến nay họ vi điều khiển 8 bit MCS51 đã có đến 250 thành viên và hầu hết các
công ty hàng đầu thế giới chế tạo. Đứng đầu là công ty INTEL và rất nhiều công ty
khác như : AMD, SIEMENS, PHILIPS, DALLAS, OKI …
Ngoài ra còn có các công ty khác c ũng có những họ vi điều khiển riêng như:
Họ 68HCOS của công ty Motorola
Họ ST62 của công ty SGS-THOMSON
Họ H8 của công ty Hitachi
Họ pic cuả công ty Microchip
2.3 Khảo sát vi điều khiển 8051
IC vi điều khiển 8051/8031 thuộc họ MCS51 có các đặt điểm sau :
- 4kbyte ROM (được lập trình bởi nhà sản xuất chỉ có ở 8051)
- 128 byte RAM
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 4
ĐỒ ÁN VI ĐIỀU KHIỂN
- 4port I10 8bit
- Hai bộ định thời 16bit
- Giao tiếp nối tiếp
- 64KB không gian bộ nhớ chương trình mở rộng
- 64 KB không gian bộ nhớ dữ liệu mở rộng
- một bộ xử lí luận lí (thao tác trên các bit đơn)
- 210 bit được địa chỉ hóa
- bộ nhân / chia 4 s

Nguäön Ngàõt Thiãút bë Thiãút bë


âäöng häöö ngoaìi Näúi tiãúp Song song
ngoaìi
Âäöng
häö
näüi
Caïc bäü Âiãöu Giao tiãúp Giao tiãúp
âënh thåìi khiãøn ngàõt Näúi tiãúp Song song

CPU
Bus dæî liãûu, âëa chè, âiãöu khiãøn

RAM ROM

Hçnh 2.1. Så âäö khäúi cuía bäü vi âiãöu khiãøn


2.3.1.Cấu trúc bên trong của IC 8951
Phần chính của vi điều khiển 8051 là bộ xử lí trung tâm (CPU: central processing
unit ) bao gồm :
- Thanh ghi tích lũy A
- Thanh ghi tích lũy phụ B, dùng cho phép nhân và phép chia
- Đơn vị logic học (ALU : Arithmetic Logical Unit )
- Từ trạng thái chương trình (PSW : Prorgam Status Word)
- Bốn băng thanh ghi
- Con trỏ ngăn xếp
- Ngoài ra còn có bộ nhớ chương trình, bộ giải mã lệnh, bộ điều khiển thời
gian và logic.
- Đơn vị xử lí trung tâm nhận trực tiếp xung từ bộ giao động, ngoài ra còn có
khả năng đưa một tín hiệu giữ nhịp từ bên ngoài.
Chương trình đang chạy có thể cho dừng lại nhờ một khối điều khiển ngắt ở bên
trong. Các nguồn ngắt có thể là : các biến cố ở bên ngoài , sự tràn bộ đếm định
thời hoặc cũng có thể là giao diện nối tiếp.
Hai bộ định thời 16 bit hoạt động như một bộ đếm.
Các cổng (port0, port1, port2, port3 ). S ử dụng vào mục đích điều khiển.
Ở cổng 3 có thêm các đường dẫn điều khiển dùng để trao đổi với một bộ nhớ bên
ngoài, hoặc để đầu nối giao diện nối tiếp, cũng như các đường ngắt dẫn bên ngoài.

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 5


ĐỒ ÁN VI ĐIỀU KHIỂN
Giao diện nối tiếp có chứa một bộ truyền và một bộ nhận không đồng bộ, làm việc
độc lập với nhau. Tốc độ truyền qu ổng nối tiếp có thể đặt trong vảy rộng và được
ấn định bằng một bộ định thời.
Trong vi điều khiển 8051 / 8031 có hai thành phần quan trọng khác đó là bộ nhớ
và các thanh ghi :
Bộ nhớ gồm có bộ nhớ Ram và bộ nhớ Rom (chỉ có ở 8031) dùng để lưu trữ dữ
liệu và mã lệnh.
Các thanh ghi sử dụng để lưu trữ thông tin trong quá trình x ử lí. Khi CPU làm
việc nó làm thay đổi nội dung cuả các thanh ghi.
2.3.2.Chức năng của các chân vi điều khiển
VCC

U1

40
VCC 1 39

VCC
2 P1.0 P0.0/AD0 38 Address &
3 P1.1 P0.1/AD1 37 Data Bus
4 P1.2 P0.2/AD2 36
R2 C3 5 P1.3 P0.3/AD3 35
6 P1.4 P0.4/AD4 34
100 10u 7 P1.5 P0.5/AD5 33
SW1 8 P1.6 P0.6/AD6 32
9 P1.7 P0.7/AD7
RST 31
SW R1 10u C1 19 EA/VPP
XTAL1 30 74573
10K 12Mz ALE/PROG
29 7408
10u C2 18 PSEN
10 XTAL2 28
11 P3.0/RXD P2.7/A15 27
Max232 12 P3.1/TXD P2.6/A14 26
13 P3.2/INTO P2.5/A13 25 Address Bus
14 P3.3/INT1 P2.4/A12 24
15 P3.4/TO P2.3/A11 23
8255 & Ram 16 P3.5/T1 P2.2/A10 22
GND

7408 & /RD 17 P3.6/WR P2.1/A9 21


P3.7/RD P2.0/A8
20

AT89C51

Hình 2.2 : Sơ Đồ Chân 8051

a.Port0 : là port có 2 chức năng ở trên chân từ 32 đến 39 trong các thiết kế cỡ nhỏ
( không dùng bộ nhớ mở rộng ) có hai chức năng như các đường IO. Đối với các
thiết kế cỡ lớn ( với bộ nhớ mở rộng ) nó được kết hợp kênh giữ a các bus )
b.Port1 : port1 là một port I/O trên các chân 1-8. Các chân được ký hiệu P1.0,
P1.1, P1.2 … có thể dùng cho các thiết bị ngoài nếu cần. Port1 không có chức
năng khác, vì vậy chúng ta chỉ được dùng trong giao tiếp với các thiết bị ngoài.
c.Port2 : port2 là một port công dụng kép trên các chân 21 - 28 được dùng như các
đường xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ
mở rộng.
d.Port3 : port3 là một port công dụng kép trên các chân 10 - 17. Các chân của port
này có nhiều chức năng, các công dụng chuyển đổi có liên hệ với các đặc tín đặc
biệt của 8051 / 8031 như ở bảng sau :

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 6


ĐỒ ÁN VI ĐIỀU KHIỂN

Bit Tên Chức năng chuyển đổi

P3.0 RXD Dữ liệu nhận cho port nối tiếp


P3.1 TXD Dữ liệu phát cho port nối tiếp
P3.2 INTO Ngắt 0 bên ngoài
P3.3 INT1 Ngắt 1 bên ngoài
P3.4 TO Ngõ vào của timer/counter 0
P3.5 T1 Ngõ vào của timer/counter 1
P3.6 WR Xung ghi bộ nhớ dữ liệu ngoài
P3.7 RD Xung đọc bộ nhớ dữ liệu ngoài

Bảng 2.1 : Chức năng của các chân trên port3


e.Chân PSEN (Program Store Enable ) : 8051 / 8031 có 4 tín hi ệu điều khiển
PSEN là tín hiệu ra trên chân 29. Nó là tín hi ệu điều khiển để cho phép bộ nhớ
chương trình mở rộng và thường được nối đến chân OE (Output Enable) của một
EPROM để cho phép đọc các bytes mã lệnh.
PSEN sẽ ở mức thấp trong thời gian lấy lệnh. Các mã nhị phân của chương trình
được đọc từ EPROM qua bus và được chốt vào thanh ghi lệnh của 8051 để giải mã
lệnh. Khi thi hành chương tr ình trong ROM nội (8051) PSEN sẽ ở mức thụ động
(mức cao).
f.Chân ALE (Address Latch Enable ) :
Tín hiệu ra ALE trên chân 30 tương h ợp với các thiết bị làm việc với các xử lí
8585, 8088, 8086, 8051 dùng ALE m ột cách tương tự cho làm việc giải các kênh
các bus địa chỉ và dữ liệu khi port 0 được dùng trong chế độ chuyển đổi của nó :
vừa là bus dữ liệu vừa là búyt thấp của địa chỉ, ALE là tín hiệu để chốt địa chỉ
vào một thanh ghi bên ngoài trong n ữa đầu của chu kỳ bộ nhớ. Sau đó, các đường
port 0 dùng để xuất hoặc nhập dữ liệu trong nữa sau chu kỳ của bộ nhớ.
Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể
được dùng là nguồn xung nhịp cho các hệ thống. Nếu xung trên 8051 là 12MHz thì
ALE có tần số 2MHz. Chỉ ngoại trừ khi thi hành lệnh MOVX, một xung ALE sẽ bị
mất. Chân này cũng được làm ngõ vào cho xung lập trình cho EPROM trong 8051.
g. Chân EA (External Access) :
Tín hiệu vào EA trên chân 31 thư ờng được mắc lên mức cao (+5V) hoặc mức thấp
(GND). Nếu ở mức cao, 8051 thi hành chương trình từ ROM nội trong khoảng địa
chỉ thấp (4K). Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng.
Khi dùng 8031, EA luôn đư ợc nối mức thấp vì không có bộ nhớ chương trình trên
chip. Nếu EA được nối mức thấp bộ nhớ bên trong chương trình 8051 sẽ bị cấm và
chương trình thi hành từ EPROM mở rộng. Người ta còn dùng chân EA làm chân
cấp điện áp 21V khi lập trình cho EPROM trong 8051.
h.Chân RST(reset)
Ngõ vào RST trên chân 9 là ngõ reset c ủa 8051. Khi tín hiệu này được đưa lên
múc cao (trong ít nhất 2 chu kỳ máy ), các thanh ghi trong 8051 đư ợc tải những giá
trị thích hợp để khởi động hệ thống.

i.Chân XTAL:

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 7


ĐỒ ÁN VI ĐIỀU KHIỂN
Các ngõ vào bộ dao động trên chip :Như đã thấy trong các hình trên , 8051 có m ột
bộ dao động trên chip. Nó thường được nối với thạch anh giữa hai chân 18 và 19.
Các tụ giữa cũng cần thiết như đã vẽ. Tần số thạch anh thông thường là 12MHz.
j.Các chân nguồn :
8051 vận hành với nguồn đơn +5V. Vcc được nối vào chân 40 và Vss (GND) đư ợc
nối vào chân 20.
2.3.3.Hoạt động của bộ định thời
2.3.3.1.Giới thiệu.
Một định nghĩa đơn giản của timer là một chuỗi các flip-flop chia đôi tần số nối
tiếp với nhau, chúng nhận tín hiệu vào làm nguồn xung nhịp. Ngõ ra của tần số
cuối làm nguồn xung nhịp cho flip-flop báo tràn của timer (flip-flop cờ). Giá trị
nhị phân trong các flip-flop của timer có thể xem như số đếm số xung nhịp (hoặc
các sự kiện) từ khi khởi động timer. Ví dụ timer 16 bit sẽ đếm lên từ 0000H đến
FFFFH. Cờ báo tràn sẽ lên 1 khi số đếm tràn từ FFFFH đến 0000H.
8051 có 2 timer 16 bit, mỗi timer có bốn cách làm việc. Người ta sử dụng các
timer để : a) định khoảng thời gian, b) đếm sự kiện hoặc c) tạo tốc độ baud cho
port nối tiếp trong 8051
Trong các ứng dụng định khoảng thời gian, người ta lập trình timer ở một khoảng
đều đặn và đặt cờ tràn timer. Cờ được dùng để đồng bộ hóa chương trình để thực
hiện một tác động như kiểm tra trạng thái của các cửa ngõ vào hoặc gửi các sự
kiện ra các ngõ ra. Các ứng dụng khác có thể sử dụng việc tạo xung nhịp đều đặn
của timer để đo thời gian trôi qua giữa hai sự kiện (ví dụ : đo độ rộng xung).
Đếm sự kiện dùng để xác định số lần xẩy ra của một sự kiện. Một "sự kiện" là bất
cứ tác động ngoài nào có thể cung cấp một chuyển trạng thái trên một chân của
8051. Các timer cũng có thể cung cấp xung nhịp tốc độ baud cho port nối tiếp
trong 8051 Truy xuất timer của 8051 dùng 6 thanh ghi ch ức năng đặc biệt cho
trong bảng sau:

SFR MỤC ĐÍCH ĐỊA CHỈ Địa chỉ hóa từng bít
TCON Điều khiển timer 88H có
TMOD Chế độ timer 89H không
TL0 Byte thấp của timer 0 8AH không
TL1 Byte thấp của timer 1 8BH không
TH0 Byte cao của timer 0 8CH không
TH1 Byte cao của timer 1 8DH không

Bảng 2.2: Thanh ghi chức năng đặc biệt dùng timer.
2.3.3.2. Thanh ghi chế độ timer (TMOD)
Thanh ghi TMOD chứa hai nhóm 4 bit dùng để đặt chế độ làm việc cho timer 0 và
timer 1.

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 8


ĐỒ ÁN VI ĐIỀU KHIỂN
Bit Tên Timer Mô tả
7 GATE 1 Bit (Mở) cổng, khi lên 1 timer chỉ chạy khi INT1
ở mức cao.
6 C/T 1 Bit chọn chế độ counter/timer
1=bộ đếm sự kiện
0=bộ định khoảng thời gian
5 M1 1 Bit 1 của chế độ(mode)
4 M0 1 Bit 0 của chế độ
00: chế độ 0 : timer 13 bit
01: chế độ 1 : timer 16 bit
10: chế độ 2 : tự động nạp lại 8255A bit
11: chế độ 3 : tách timer
3 GATE 0 Bit (mở) cổng
2 C/T 0 Bit chọn counter/timer
1 M1 0 Bit 1 của chế độ
0 M0 0 Bit 0 của chế độ

Bảng 2.3: Tóm tắt thanh ghi TMOD

2.3.3.3. Thanh ghi điều khiển timer (TCON)


Thanh ghi TCON chứa các bit trạng thái và các bit điều khiển cho timer 0 và
timer 1.
7 6 5 4 3 2 1 0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

Bảng 2.4: Tóm tắt thanh ghi TCON

+TF1: (địa chỉ 8Fh) cờ tràn bộ định thời 1. Được set bởi phần cứng khi bộ
định thời/ đếm bị tràn, được xoá bởi phần mềm hoặc bởi phần cứng khi trình phục
vụ ngắt được trỏ đến.
+TR1:(địa chỉ byte8Eh) bit điều khiển bộ định thời 1 hoạt động. Được set/
xoá bởi phần mềm để điều khiển bộ định thời hoạt động hoặc ngưng hoạt động.
+TF0(địa chỉ byte8Dh) cờ tràn của bộ định thời 0.
+TR0(địa chỉ byte8C) bit điều khiển bộ định thời 0 hoạt động.
+IE1:( địa chỉ byte8Bh) cờ ngắt ngoài 1 tác động cạnh. Được set bởi phần
cứng khi phát hiện có ngắt ngoài 1 tác động cạnh; được xoá bởi phần cứng khi
ngắt được xử lý.
+IT1(địa chỉ byte8Ah)bít điều khiển chọn loại ngắt. Được set/ xoá để xác
định ngắt ngoài thuộc loại tác động cạnh xuống hay tác động mức thấp.
+IE0(địa chỉ byte89h) cờ ngắt ngoài 0 tác động cạnh.
+IT0(địa chỉ byte88h)bit điều khiển chọn loại ngắt (kích khởi cạnh hoặc
mức).

2.3.3.4Các chế độ định thời và cờ tràn:


-Ta chỉ xét đến chế độ định thời loại 0,1,2. Các mode của bộ định thời được
thiết lập ở bit 0,1 và 4,5 ở thanh ghi TMODE(đã xét ở trên).
a)Chế độ định thời 13-bit(chế độ 0):
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 9
ĐỒ ÁN VI ĐIỀU KHIỂN
Để tương thích với 8048 (có trứớc 8051)
Ba bit cao của TLX (TL0 và/hoăc TL1) không dùng
Xung clock
TLx(5bit) THx(8 bit) TFx

b)Chế độ định thời 16-bit(chế độ1):


Hoạt động như timer 16 bit đầy đủ.
Cờ báo tràn là bit TFx trong TCON có th ể đọc hoặc ghi bằng phầm mềm.
MSB của giá trị trong các thanh ghi timer là bit 7 c ủa THx và LBS là bit 0 của TLx.
Các thanh ghi timer (Tlx/THx) có th ể được đọc hoặc ghi bất cứ lúc nào bằng phầm
mềm.
Xung clock
TLx(8bit) THx(8 bit) TFx

c)Chế độ tự nạp lại 8 bit(chế độ 2):


TLx hoạt động như một timer 8 bit, trong khi đó THx v ẫn giữ nguyên giá trị được
nạp. Khi số đếm tràn tứ FFH đến 00H, không những cờ timer được set mà giá trị
trong THx đồng thời được nạp vào TLx. Việc đếm tiếp tục từ giá trị này lên đến
FFH xuống 00H và nạp lại... chế độ này rất thông dụng vì sự tràn timer xảy ra
trong những khoảng thời gian nhất định và tuần hoàn một khi đã khởi động TMOD
và THx.
Xung clock
TLx(8bit) TFx
Reload

THx(8 bit)

d)Vấn đề xung clock:


+Nguồn xung clock được quết đinh bởi bit C/ ở thanh ghi TMOD nếu nó ở
mức logic 0 thì nguồn xung được lấy ở mạch dao động bên trong chip (tần số thạch
anh chia cho 12 đó là đầu vào của nguồn xung ).
+Nếu bit trên ở mức logic cao thì nguồn xung được lấy ở bên ngoài thông
qua chân P3.4 và P3.5.

2.3.4.Hoạt động của ngắt :


+Ngắt là sự xảy ra của một điều kiện - một sự kiện - làm cho chương trình
hiện hành bị tạm dừng, chương trình khác được thực hiện.
+Củng chính vì vậy nên ta có cảm giác là chip có khã năng xử lý nhiều
chương trình một lúc làm nâng cao tính hiệu quả của con vi điều khiển, nhất là
trong kỹ thuật đáp ứng sự kiện với yêu cầu cập nhật một cách tự động.

+Chương trình xử lý không có sử dụng ngắt .


Timer

CHÆÅNG TRÇNH CHÊNH

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 10


ĐỒ ÁN VI ĐIỀU KHIỂN
+Chương trình có sử dụng đến ngắt.
ISR

MAIN MAIN

2.3.4.1.Tổ chức ngắt của 8051 :


+Có 5 nguyên nhân tạo ra ngắt : 2 ngắt do bên ngoài, hai ngắt do bộ định
thời và một ngắt do port nối tiếp.
+Khi xảy ra 2 hay nhiều ngắt đồng thời hoặc xảy ra một ngắt trong khi một
ngắt khác đang tác động thì lúc đó điều gì sẽ xảy ra :
-Nếu có 2 ngắt cùng mức ưu tiên thì chuổi vòng cố định sẽ xác định
ngắt nào được phục vụ trước. Chuổi vòng này sẽ là: ngắt ngoài 0, ngắt do bộ định
thời 0, ngắt ngoài 1, ngắt ngoài 1, ngắt do port nối tiếp.
-Khi có 2 ngắt với mức ưu tiên khác nhau xuất hiện đồng thời thì
ngắt có mức ưu tiên cao sẽ được phục vụ trước.
-Khi mức ngắt ưu tiên thấp đang thực hiện nếu có ngắt ở mức cao
xuất hiện thì trình thực hiện ngắt ở mức thấp phải tạm dừng. Nếu ngắt cao đang
thực hiện mà có một ngắt ở mức thấp tác động thì lúc này chương trình không thể
dừng ngắt ở mức ưu tiên cao để thực hiện được mà nó phải thực hiện chương trình
ngắt ở mức cao xong rồi mới phục vụ ngắt ở mức thấp.
*Vấn đề được xem xét kỹ hơn đó là nếu có ngắt xuất hiện thì điều gì sẽ xãy
ra trong bộ vi điều khiển.
+Hoàn tất lệnh hiện hành.
+Thanh ghi PC cất vào Stack.
+Trạng thái các ngắt hiện thời được lưu giữ lại.
+Các ngắt được chận lại ở mức ngắt.
+Bộ đếm chương trình PC được nạp địa chỉ chương trình phục vụ ngắt.
+Chương trình phục vụ ngắt được thực hiện cho đến khi gặp lệnh RETI trở
về chương trình ở ban đầu.
2.3.4.2.Địa chỉ của vecto ngắt:

Nguyên nhân ngắt Cờ Địa chỉ


Ngắt ngoài 0 IE0 03h
Ngắt bộ định thời 0 TF0 0BH
Ngắt ngoài 1 IE1 13H
Ngắt do bộ định thời 1 TF1 1BH
Ngắt do cổng nối tiếp TI hay RI 23H
- Khảo sát thanh ghi liên quang đ ến ngắt.
7 6 5 4 3 2 1 0
EA - - ES ET1 EX1 ET0 EX0

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 11


ĐỒ ÁN VI ĐIỀU KHIỂN
+EA : cho phép hoặ không cho phép tất cả các ngắt. Nếu EA =0, không có
ngắt nào đựơc nhận biết. Nếu EA=1, mỗi một nguyên nhân ngắt riêng rẽ sẽ được
cho phép hoặc không cho phép tuỳ thuộc vào bit cho phép ngắt tương ứng đựơc set
hay xoá.
+ES: Cho phép hoặc không cho phép ngắt do Port nối tiếp.
+ET1:Cho phép hoặc không cho phép ngắt do tràn bộ định thời 1.
+EX1:Cho phép hoặc không cho phép ngắt do ngắt ngoài 1.
+ET0: Cho phép hoặc không cho phép ngắt do tràn bộ định thời 0.
+EX0:Cho phép hoặc không cho phép ngắt do ngắt ngoài 0.
-Thanh ghi mức ưu tiên ngắt.

7 6 5 4 3 2 1 0
- - - PS PT1 PX1 PT0 PX0

+PS: Mức ưu tiên cho ngắt nối tiếp.


+PT1: Mức ưu tiên cho bộ định thời 1.
+PX1: Mức ưu tiên cho ngắt ngoài 1.
+PT0: Mức ưu tiên cho bộ định thời 0.
+PX0: Mức ưu tiên cho ngắt ngoài 0.
+Các cờ ngắt được nhận biết ở thanh ghi TCON :

7 6 5 4 3 2 1 0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

IE0:Cờ ngắt ngoài 0.


IE1:Cờ ngắt ngoài 1.
TF0:Cờ ngắt do bộ định thời 0.
TF1:Cờ ngắt do bộ định thời 1.
2.3.4.3.Sử dụng ngắt ngoài:
+Ngắt ngoài xảy ra khi có mức thấp hoặc có cạnh âm trên chân , (P3.2
và P3.3) của 8051.
+Việc chọn các ngắt loại tác động cạnh hay tác động mức được lập trình
thông qua các bit IT0 và IT1 c ủa thanh ghi TCON. Nếu 2 bit này ở mức cao thì
ngắt thuộc loại tác động cạnh.
+Các ngắt ngoài được lấy mẫu một lần ở mỗi chu kỳ máy , các ngỏ vào
này phải được duy trì tối thiểu 12 chu kỳ dao động để đảm bảo rằng việc lấy mẫu
là đúng. Nếu ngắt ngoài thuộc loại tác động cạnh, nguyên nhân ngắt ngoài phải
được duy trì tại chân yêu cầu ở mức cao tối thiểu 1 chu kỳ và sau đó ở mức thấp
tối thiểu một chu kỳ và sau đó ở mức thấp tối thiểu một chu kỳ nữa để đảm bảo
rằng sự chuyển trạng thái được phát hiện. IE0 va IE1 tự động được xoá khi CPU
trỏ tới trình phục vụ ngắt tương ứng.
+Nếu ngắt ngoài thuộc loại tác động mức, nguyên nhân ngắt ngoài phải
được duy trì trạng thái tích cực cho đến khi ngắt theo yêu cầu thực sự được tạo ra.
Sau đó nguyên nhân ngắt phải ở trạng thái thụ động trước khi trình phục vụ ngắt
được thực thi xong hoặc trước khi có một ngắt khác được tạo ra.
2.3.5.Tập lệnh của 8051 :

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 12


ĐỒ ÁN VI ĐIỀU KHIỂN
+Tập lệnh của MCS-51 được tối ưu hóa cho các ứng dụng điều khiển 8
bit. Tập lệnh củng hổ trợ các biến 1 bit cho phép quản lý bit trực tiếp trong các hệ
logic và điều khiển có yêu cầu xử lý bít.
+Cũng như các bộ vi xử lý 8-bit, các lệnh của 8051 có các ôpcde 8-bit,
do vậy số lệnh có thể lên đến 256 lệnh(thực tế có 255 lệnh, 1 lệnh không được
định nghĩa). Ngoài opcode, một số lệnh còn có thêm 1 hoặc 2 byte nữa cho dữ liệu
hoặc địa chỉ. Tập lệnh có 139 lệnh 1 byte, 92 lệnh 2-byte, 24 lệnh 3 byte.
+Một số kiểu định địa chỉ:
-Thanh ghi(register).
-Trực tiếp(direct).
-Gián tiếp(indirect).
-Tức thời(immediate).
-Tương đối(relative).
-Tuyệt đối(absolute).
-Dài (long).
-chỉ số(indexed).
*.Các loại lệnh :
+Các lệnh của 8051 được chia làm 5 nhóm :
-Nhóm lệnh số học.
-Nhóm lệnh logic.
-Nhóm lệnh di chuyển dữ liệu.
-Nhóm lệnh xử lý bit.
-Nhóm lệnh rẽ nhánh.
a)Các lệnh số học:
+Đặc trưng của các loại này là các phép toán cộng, trừ, nhân, chia:
Vd: ADD A,#25H
DIV AB
MUL AB
DEC R7
b)Các lệnh logic:
+Thực hiệnh các phép toán logic như AND, OR, XOR và NOT:
Vd: giả sử thanh ghi A có giá trị là 30h và B có giá trị là 40 h khi đó ta tiến hành
các phép toán sau:
ANL A,B : Khi đó thanh ghi A s ẽ nhận giá trị mới là:08h
ORL A,B : Khi đó thanh ghi A s ẽ nhận giá trị mới là:62h
XRL A,B : Khi đó thanh ghi A s ẽ nhận giá trị mới là:54h
c)Các nhóm lệnh di chuyển dữ liệu :
+Cũng giống như hầu hết các bộ vi xử lý thời gian mà CPU thực hiện việc di
chuyển dữ liệu chiếm hết 2/3 thời gian hoạt động của nó.
+ Lệnh điển hình ở đây là : MOV <destination>,<source>.
d)Các lệnh xữ lý bit:
+Các bit có thể được set và xoá bằng 1 lệnh. Điều này rất linh hoạt mà ta
khó tìm thấy được ở bộ vi xử lý. Nó giúp ta tiết kiệm được số cổng I/0 và thực hiện
kiểm tra điều khiển được dễ dàng hơn nhiều.
+Lệnh thường gặp ở trong trường hợp này đó là:
SETB <đối tượng> ; CLR <đối tượng>
e)Các lệnh rẽ nhánh:

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 13


ĐỒ ÁN VI ĐIỀU KHIỂN
+Trong thực tế không phải lúc nào chương trình lúc nào cũng đi theo
một đường thẳng nhất định mà đôi khi nó chịu tác động của yếu tố ngoại cảnh tác
động làm cho chiều hướng chương trình bị rẽ sang một hướng nào đó.
+Với yếu tố trên thì 8051 cung cấp cho ta một số mã lệnh để thực hiện
công việc trên một cách dễ dàng.
+Các lệnh thường gặp đó là: JMP, JNB, JB, CJNE , DJNZ .v.v.

+Tuỳ theo các tình huốn cụ thể mà ta cho chương trình đi theo một
chiều hướng mong muốn.

B.GIỚI THIỆU CÁC LINH KIỆN LIÊN QUAN ĐẾN MẠCH THIẾT KẾ:
a)Điện trở: đây là loại linh kiện thụ động nó được sử dụng với mục đích chính là
hạn dòng, hay phân áp cho c ác linh kiện khác có thể hoạt động bình thường.
+Các điện trở thường có giá trị được các nhà sản xuất qui định bởi màu sơn
ghi trên nó :
Các giá trị điện trở như sau:10kΩ,330Ω,4,7kΩ,1,2kΩ,270Ω…
b)Biến trở : là loại linh kiện điện trở mà giá trị của nó có thể thay đổi được một
cách dễ dàng. Hình dạng của nó củng có nhiều loại thường là có 3 chân ở trong
mạch này em sử dụng loại vi trở điều chỉnh được bằng nút vặn.
+Giá trị của biến trở có trong mạch là 10k.
c)Tụ điện: Sử dụng để lọc nguồn hay lọc tần số, chống nhiễu .
+Thường ta sử dụng các loại tụ sau : tụ sứ, tụ hoá
Giá trị tụ : ,2200µF,470 µF, 10 µF(tụ hóa);104,33pF(tụ sứ)
d) IC ổn áp :LM7805:
LM7805/TO

1 3
GND

VIN VOUT
2

Điện áp ngõ vào từ 8V -35V


Điện áp ngõ ra là 5V
e)Diode:
+ Diode:Dùng để chỉnh lưu nguồn AC thanh DC

+Photo diode:

D1

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 14


ĐỒ ÁN VI ĐIỀU KHIỂN
f) LCD
Mô tả các chân của LCD.

LCD được nói trong mục này có 14 chân, chức năng của các chân được cho
trong bảng 12.1. Vị trí của các chân được mô tả trên hình 12.1 cho nhiều LCD
khác nhau.
1. Chân VCC, VS S và VE E : Các chân VCC, VS S và VE E : Cấp dương nguồn - 5v
và đất tương ứng thì VEE được dùng để điều khiển độ tương phản của LCD.
2. Chân chọn thanh ghi RS (Register Select).
Có hai thanh ghi rất quan trọng bên trong LCD, chân RS được dùng để chọn các
thanh ghi này như sau: Nếu RS = 0 thì thanh ghi mà lệnh được chọn để cho phép
người dùng gửi một lệnh chẳng hạn như xoá màn hình, đưa con trỏ về đầu
dòng v.v… Nếu RS = 1 thì thanh ghi dữ liệu được chọn cho phép người dùng
gửi dữ liệu cần hiển thị trên LCD.
3. Chân đọc/ ghi (R/W).
Đầu vào đọc/ ghi cho phép người dùng ghi thông tin lên LCD khi R/W = 0
hoặc đọc thông tin từ nó khi R/W = 1.
4. Chân cho phép E (Enable).
Chân cho phép E được sử dụng bởi LCD để chốt thông tin hiện hữu trên chân dữ
liệu của nó. Khi dữ liệu được cấp đến chân dữ liệu thì một xung mức cao xuống
thấp phải được áp đến chân này để LCD chốt dữ liệu trên các chân dữ liêu. Xung
này phải rộng tối thiểu là 450ns.
5. Chân D0 - D7.
Đây là 8 chân dữ liệu 8 bít, được dùng để gửi thông tin lên LCD hoặc đọc nội
dung của các thanh ghi trong LCD.
Để hiển thị các chữ cái và các con số, chúng ta gửi các mã ASCII của các chữ
cái từ A đến Z, a đến f và các con số từ 0 - 9 đến các chân này khi bật RS = 1.
Cũng có các mã lệnh mà có thể được gửi đến LCD để xoá màn hình hoặc đưa con
trỏ về đầu dòng hoặc nhấp nháy con trỏ. Bảng 12.2 liệt kê các mã lênh.
Chúng ta cũng sử dụng RS = 0 để kiểm tra bít cờ bận để xem LCD có sẵn
sàng nhân thông tin. Cờ bận là D7 và có thể được đọc khi R/W = 1 và RS = 0
như sau:
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 15
ĐỒ ÁN VI ĐIỀU KHIỂN
Nếu R/W = 1, RS = 0 khi D7 = 1 (cờ bận 1) thì LCD bận bởi các công việc bên
trong và sẽ không nhận bất kỳ thông tin mới nào. Khi D7 = 0 thì LCD sẵn sàng
nhận thông tin mới. Lưu ý chúng ta nên kiểm tra cờ bận trước khi ghi bất kỳ dữ
liệu nào lên LCD.
Bảng 12.1 .Mô tả các chân của LCD

Chân Kí hiệu I/O Mô tả

1 Vss - Đất
2 VCC - Dương nguồn 5V
3 VEE - Cấp nguồn điều khiển phản
RS=0 chọn thanh ghi
4 RS I
lệnh.RS=1 chọn thanh dữ liệu
5 Rw I RW=1 đọc dữ liệu.RW=1 ghi
6 E I/O Cho phép
7 DB0 I/O Các bít dữ liệu
8 DB1 I/O Các bít dữ liệu
9 DB2 I/O Các bít dữ liệu
10 DB3 I/O Các bít dữ liệu
11 DB4 I/O Các bít dữ liệu
12 DB5 I/O Các bít dữ liệu
13 DB6 I/O Các bít dữ liệu
14 DB7 I/O Các bít dữ liệu

Bảng 12.2: Các mã lệnh LCD.


Mã Lệnh đến thanh ghi của LCD
(Hex)
1 Xóa màn hình hiển thị
2 Trở về đầu dòng
4 Dịch con trỏ sang trái
6 Dịch con trỏ sang phải
5 Dịch hiển thị sang phải
7 Dịch hiển thị sang trái
Tắt8con trỏ ,tắt hiển thị
A Tắt hiển thị,bật con trỏ
C Bật hiển thị,tắt con trỏ
E Bật hiển thị,Nhấp nháy con trỏ
F Tắt con trỏ,nhấp nháy con trỏ
10 Dịch vị trí con trỏ sang trái
14 Dịch con trỏ sang phải
18 Dịch toàn bộ hiển thị sang trái
1C Dịch toàn bộ hiển thị sang phải
80 Đưa con trỏ về đầu dòng thứ nhất
C0 Đưa con trỏ về đầu dòng thứ hai
38 Hai dòng và ma trận 5x7

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 16


ĐỒ ÁN VI ĐIỀU KHIỂN
B Ghép nối 89c51 với bàn phím:

Ở dạng đơn giản,bàn phím được tổ chức theo kiểu ma trận các h àng và các
cột.CPU truy cập cả hàng lẫn cột thông qua các cổng.Do vậy,với hai cổng 8 bít th ì
có thể nối một bàn phím 64 phím(8x8) tới bộ vi xử lý. Khi một phím đ ược nhấn
thì một hàng và một cột được tiếp xúc,các hàng và cột còn lại không có sự tiếp xúc
nào .Trong các bàn phím máy tính IBM PC có m ột bộ vi điều khiển(bao gồm một
bộ vi xử lý,bộ nhớ RAM,EPROM và một số cổng tất cả được bố trí trên một
chíp)Chịu trách nhiệm nối ghép phần cứng v à phần mền của bàn phím.Ở những hệ
như vậy,chương trình được lưu trong EPROM của bộ vi điều khiển đảm nhiệm
quét liên tục các phím,xác định xem phím n ào đã được kích hoạt và gủi thông tin
đến bo mạch chính.Trong phần n ày,chúng ta nghiên cứu về cơ cấu 8051 quét và
xác định phím nhấn.
Quét và xác định phím
Nếu không có phím nào được nhấn thì đọc cổng vào sẽ được toàn là 1 vì tất cả các
cột đều được nối tới nguồn Vcc.Nếu tất cả các hàng được nối đất và một phím
được nhấn thì một trong các cột sẽ có giá trị 0 v ì phím được nhấn nối cột xuống
đât.Chức năng của bộ vi điều khiển l à quét liên tục để phát hiện và xác định phím
được nhấn.

Để phát hiện phím nhấn bộ vi xử lý nối tất cả các h àng bằng cách đặt giá trị 0 lên
các chốt ra,sau đó đọc các cột.Nếu dữ liệu đọc đ ược ở các cột có giá trị 1111 tức là
không có phím nào được nhấn và quá trình cứ tiếp tục cho đến khi phát hiện ra
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 17
ĐỒ ÁN VI ĐIỀU KHIỂN
phím được nhấn.Nếu một trong các bít của cột có giá trị bằng 0,điều đó xác nhận
có phím được nhấn.Sau khi một phím nhấn đ ã được phát hiện,bộ vi xử lý sẽ
chuyển qua quá trình xác định phím nhấn đó.Bắt đầu từ h àng trên,sau đó nó tiến
hành đọc các cột.Nếu dữ liệu đọc được có giá trị toàn là 1 tức là không phím nào ở
hàng này được kích hoạt cả thì quá trình sẽ chuyển sang hàng tiếp theo.Bộ vi xử lý
lại nối đất hàng tiếp theo,đọc giá trị ở các cột v à kiểm tra xem có giá trị nào bằng
0 không.Quá trình này tiếp tục cho đến khi có h àng được xác định.Sau khi xác
định xong hàng có phím nhấn nhiệm vụ tiếp theo l à tìm xem cột nào có phím
nhấn.Việc này cũng khá đơn giản vì CPU biết được bất cứ thời điểm nào hàng nào
và cột nào được truy cập.
Chương trình thực hiện qua 4 giai đoạn chính nh ư sau:
1.Để bảo đảm rằng phím nhấn tr ước đó đã được nhả ra,các giá trị 0 cùng một lúc
áp đến tất các hàng,và tiến hành đọc nhiều lần giá trị các cột cho đến khi tất cả các
cột có giá trị cao.Khi tất cả các cột đ ã có giá trị cao ,chương trình sẽ đợi trong một
lúc trước khi chuyển sang bước tiếp theo là một phím được nhấn.
2.Để kiểm tra xem có phím n ào được nhấn,các cột được quét theo một chu trình
lặp cho đến khi một trong các cột có giá trị 0.Cần nhớ rằng các chốt lối có nghĩa l à
chúng được nối đất.Sau khi phát hiện được phím nhấn,chương trình sẽ chờ thêm
20ms rồi mới quét các cột một lần nữa .L àm như vậy với 2 mục đích (a) bảo đảm
việc phát hiện ra phím nhấn không phải do lỗi xung nhiễu gây ra v à (b) trễ 20ms
ngăn ngừa việc coi phím đó được nhiễu nhiều lần.Nếu sau khi giữ phím chậm
20ms phím đó vẫn cồn bị nhấn thì chương trình sẽ chuyển sang bước tiếp theo là
xác định đó thuộc về hàng nào,hay nói cách khác chương tr ình trở về vòng lặp để
xác định phím được nhấn thực sự.
3. Để phát hiện phím nhấn thuộc về h àng nào,cần nối đất từng hàng một và mỗi
lần như vậy phải đọc giá trị các cột.Nếu tất cả các cột đều ở mức cao có nghĩa l à
phím được nhấn không thuộc hàng đó,vì vậy cần nối đất hàng tiếp theo và cứ thế
tiếp tục cho đến khi tìm được hàng có phím được nhấn.Khi tìm ra hàng có phím
nhấn có nghĩa chúng ta có đ ược thông tin cần thiết để xác định vị trí phím thông
qua việc đối chiếu bảng chứa mã quét bàn phím.
4.Để xác định nhấn cần quay từng bít cột v ào cờ nhớ và kiểm tra xem liệu có giá
trị thấp hay không.Khi tìm thấy giá trị 0,có nghĩa là đã xác định được mã quét cho
phím nhấn,nếu không thì con trỏ sẽ tiếp tục tăng thêm 1 để trỏ đến phần tử tiếp
theo của bảng mã quét.

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 18


ĐỒ ÁN VI ĐIỀU KHIỂN

Bắt đầu
1

Nối đất tất cả các hàng Nối đất hàng tiếp theo

Đọc tất cả các hàng

Đọc tất cả các cột

Phím hàng
nay được
Tất cả các
cột dc nhấn

Tìm phím nhấn

Xác định mã quét


Đọc tất cả các cột

Trở về
Có phím
nhấn

Chờ phím nhấn xong

Đọc tất cả các cột

Có phím
nhấn

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 19


ĐỒ ÁN VI ĐIỀU KHIỂN

Chương III :
THIẾT KẾ MẠCH & CHƯƠNG TRÌNH
Sơ đồ mạch thiết kế:

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 20


ĐỒ ÁN VI ĐIỀU KHIỂN

Trình tự thực hiện chương trình :

Wait Process Result Display

Push button

Push button

Note

Action Process

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 21


ĐỒ ÁN VI ĐIỀU KHIỂN

Sơ đồ khối chương trình:

Bắt đầu

khởi tạo LCD

Đợi xử lý

Nu op
mb
KTra Phím
Nhập vào

kết quả

Kiểm tra số nhập ấn phím “=” Phép toán :+,-,*,/


vào a hoặc b

cập nhật số Hiển thị phép


Hiển thị kq toán

hiển thị số

kết thúc

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 22


ĐỒ ÁN VI ĐIỀU KHIỂN

Chương trình quét phím:

Quét phím

i=1

i<=10

P1=~i Thoát

Chon i

i=1

i=2

P1.4=0
i=4
P1.5=0

P1.6=0
i=8

………. ……. ………


số 1
số 2 số 3

Kết thúc

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 23


ĐỒ ÁN VI ĐIỀU KHIỂN

Chương trình xuất kết quả:

Đợi ấn “=”

KT phép toán

Phép +

phép-

Kq=a1+b1 Phép *

a1>b1 Phép /

Kq=a1*b1
Kq=a1-b1 Kq2=-
Kq1=(b1-b2)

Kq=a1/b1;
Kq5= *
Kq3=((a1%b1)*1000)/b1

xuất kết quả

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 24


ĐỒ ÁN VI ĐIỀU KHIỂN

-------------------------Mã nguồn Đồ Án Vi Điều khiên-------------------------------


---------

//viết bằng ngôn ngữ C


#include <AT89X51.H>
sfr DATA = 0xA0;
sbit RS = 0xB5;
sbit RW = 0xB6;
sbit E = 0xB7;

void initialize(); // LCD`s initialize Fu nction.


void clear(); // LCd`s clear Function.
void lcd_command(unsigned char a); // Control command of LCD.
void lcd_write(unsigned char a); // Writing data command.
void lcd_check_busy(); // Test LCD busy sta tus.

void outputstring(char *s);


int change_char_int(char a);
void convert_int_char(int kq);

void display_number(int num);


void display_result();
void display_op();

void outputkey(unsigned char a);

void delay_ms(unsigned int t);


unsigned char getkey(v oid);

char bien;
int k = 0;
char a,op,b,kq,kq2,kq5,buffer;
int a1,op1,b1,kq1,kq4,kq3,er;
int st1,phep = 0;

void main()
{
initialize();
clear(); // Clear Lcd.
outputstring("WELCOME... " );
delay_ms(1000);
lcd_command(0x01);
lcd_command(0x06);
outputstring(" DO AN VDKHIEN " );
lcd_command(0xCE);
lcd_command(0x07);
outputstring("HOANG PHI LONG 05CDT1");

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 25


ĐỒ ÁN VI ĐIỀU KHIỂN
delay_ms(1200);
lcd_command(0x01);
lcd_command(0x82);
lcd_command(0x06);
outputstring("START");
delay_ms(800);
clear();
kq2='\0';
kq3= 0;
kq5 ='\0';
kq1 = 0;
er = 0;
st1 = 0;
a1=b1=0;

while(1)
{
buffer = getkey();

while('\0' != buffer)
{
if(( buffer >= 48)&&(buffer <= 57))
{
if(st1==0)
{
a1 = (a1*10) + change_char_int(buffer);
display_number(change_char_int(buffer) ;
}
else
{
b1 = (b1*10) +change_char_int(buffer);

display_number(change_char_int(buffer)) ;

}
break;
}

if(( buffer >= 42)&&(buffer <= 47))


{
switch(buffer)
{
case 43:
{
phep = 1;
st1 = 1;
display_op();
}
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 26
ĐỒ ÁN VI ĐIỀU KHIỂN
break;

case 45:
{
phep = 2;
st1 = 1;
display_op();
}
break;
case 42:
{
phep = 3;
st1 = 1;
display_op();
}
break;
case 47:
{
phep = 4;
st1 = 1;
display_op();
}
break;

default:
st1 = 0;
break;

break;
}

if(61 == buffer)
{
display_result();
delay_ms(3200);
clear();

kq2='\0';
kq3= 0;
kq5 ='\0';
kq1 = 0;
er = 0;
st1 = 0;
a1=b1=0;
break;
}
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 27
ĐỒ ÁN VI ĐIỀU KHIỂN

}
// display
}

void display_number(int num)


{
convert_int_char(num);

void display_op()
{
if(phep == 1)
{
outputkey('+');
}

else if(phep == 2)
{
outputkey('-');
}

else if(phep == 3)
{
outputkey('*');
}

else if(phep == 4)
{
outputkey('/');
}
else
outputkey('\0');

void display_result()
{
if(phep == 1)
{
kq1 = a1 + b1;
}

if(phep == 2)
{
if(a1 > b1)
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 28
ĐỒ ÁN VI ĐIỀU KHIỂN
kq1 = a1 - b1;
else
{
kq2 = '-';
kq1 = b1 - a1;
}
}

if(phep == 3)
{
kq1 = a1 * b1;

if(phep == 4)
{
if(0 == b1)
{
kq5 = '\0';
er = 1;
}
else
{
kq1 = a1/b1;
kq5 = '.';
kq3 = ((a1%b1)*1000)/b1;
}

if(1 == er)
{
lcd_command(0x01);
lcd_command(0xC0);
outputstring(" ERROR " );
delay_ms(1000);
lcd_command(0x01);
}

if (kq3!=0)
{
lcd_command(0xC0);
convert_int_char(kq1);
outputkey(kq5);
convert_int_char(kq3);
}
lcd_command(0xC0);
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 29
ĐỒ ÁN VI ĐIỀU KHIỂN
outputkey(kq2);
convert_int_char(kq1);
// outputkey(' ');

void initialize()
{

bien = 0x38; // 8 Bit signal + 2 Column + 5 x 10 bit (Use led)


lcd_command(bien);

bien = 0x0E;
lcd_command(bien);

bien = 0x01; // Clear disp lay.


lcd_command(bien); // Writing data.

bien = 0x8f; // Display address.


lcd_command(bien);

bien = 0x06; // Increment, Shift display is on.


lcd_command(bien);
}

void lcd_command(unsigned char a)


{

lcd_check_busy();
DATA = a;

RS = 0;
RW = 0;
E = 1;
E = 0;
}
void lcd_check_busy()
{
P2_7 = 1;
RS = 0;
RW = 1;

while(1){
E=0;//cho nay la cho sai cua cac chuong trinh khac
E=1;// cu tuong la giong nhu xuat du lieu la e=1 sau do e=0
delay_ms(80);
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 30
ĐỒ ÁN VI ĐIỀU KHIỂN
if(P2_7==0) break;
}

void lcd_write(unsigned char a)


{

lcd_check_busy();
DATA = a;

RW = 0;
RS = 1;
E = 1;
E = 0;

void clear()
{
bien = 0x01;
lcd_command(bien);
}

void delay_ms(unsigned int t)


{
while(t--)
{
unsigned char temp = 121;
while(temp--);
}
}

void outputstring(char *s)


{
char var;
while((*s)!='\0')
{
var = *s;
lcd_write(var);
s++;
}
}

void outputkey(unsigned char a)


{
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 31
ĐỒ ÁN VI ĐIỀU KHIỂN
while(a != '\0')
{
lcd_write(a);
break;
}

unsigned char getkey(void)


{
int i;

for(i=0x01;i<0x10;i<<= 1)
{
delay_ms(100);
if(k==16) lcd_command(0xc0);//neu go chu qua 16 ky tu thi se
xuong hang
if(k==32) {k=0;// neu go het hang thu 2 thi se xoa man hinh va bat
dau tu hang thu nhat
lcd_command(0x01);
lcd_command(0x06);
lcd_command(0x80);
}
P1=~i;
switch(i)
{
case 1:
{
if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '1';
}
if(P1_5==0)
{
k++;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
return '2';
}
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 32
ĐỒ ÁN VI ĐIỀU KHIỂN
if(P1_6==0)
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}

return '3';
}

if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '+';
}
}
break;

case 2:
{

if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '4';
}
if(P1_5==0)
{
k++;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
return '5';
}
if(P1_6==0)
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 33
ĐỒ ÁN VI ĐIỀU KHIỂN
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}

return '6';
}

if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '-';
}

}
break;

case 4 :
{

if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '7';
}
if(P1_5==0)
{
k++;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
return '8';
}
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 34
ĐỒ ÁN VI ĐIỀU KHIỂN
if(P1_6==0)
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}

return '9';
}

if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '*';
}
}
break;

case 8 :
{

if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '0';
}
if(P1_5==0)
{
k=0;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
lcd_command(0x01);
k=0;
return '\0';
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 35
ĐỒ ÁN VI ĐIỀU KHIỂN
}
if(P1_6==0)
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}

return '=';
}

if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '/';
}

}
break;
default:
break;
}
}
return '\0';
}
int change_char_int(char a)
{
switch (a)
{
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case '+': return 10;
case '-': return 11;
case '*': return 12;
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 36
ĐỒ ÁN VI ĐIỀU KHIỂN
case '/': return 13;
case '=': return 14;
default:
return -1;
}
}
void convert_int_char(int kq)
{
int i,dem;
i = 1;
while(0!=kq)
{

while(i<=kq)
{
i = i*10;

i = i / 10;

while(i != 1)
{
dem = kq / i;
lcd_write(dem + 48);
kq %=i;
i /=10;
}
break;

}
kq = kq/i;
lcd_write(kq + 48);

SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 37

You might also like