MỤC LỤC
PHẦN I : MỞ ĐẦU
Trang 1
ĐẶT VẤN ĐỀ
1. Tổng quan.
Có thể nói, hiện nay vi điều khiển đã rất phổ biến ở Việt Nam, và được ứng
dụng rất nhiều. Những sinh viên ngành Điện, Điện tử, Cơ điện tử, Tin Học, Viễn
thông... Hầu như ai cũng biết cách để làm việc với vi điều khiển. Ngày nay,
những tiến bộ trong công nghệ bán dẫn đã thúc đẩy sự phát triển không ngừng
của ngành công nghiệp tự động, các quá trình điều khiển tự đông hoá và điều
khiển thời gian thực đã đặt ra yêu cầu rất lớn về việc trao đổi dữ liệu giữa các hệ
thống hay giữa các bộ phận trong cùng một hệ thống.
Trong đời sống của con người hiện nay những nghiên cứu để tạo ra những sản
phẩm, dịch vụ tự động, nhằm giảm bớt sức người trong lao động, sản xuất là vấn
đề thiết yếu. Cùng với sự phát triển của khoa học kĩ thuật thì những sản phẩm
công nghệ càng trở nên phổ biến và gần gũi hơn với chúng ta. Khi cuộc sống
càng ngày càng được nâng cao cùng với sự phát triển của các công nghệ thì chất
lượng cuộc sống của con người cải thiện. Trong cuộc sống con người sử dụng
các bình kín đựng nhiên liệu mà con người chúng ta không thể biết là khi nào
chúng đầy khi nào chúng hết để có thể thêm vào hoặc lấy bớt. Chính vì điều này,
trong đề tài nghiên cứu tốt nghiệp của chúng em lần này chúng em đã lựa chọn
đề tài “Kiểm soát lượng nước trong bình hiển thị trên LCD” để nhằm đáp ứng
nhu cầu cần thiết trong cuộc sống của con người nhằm nâng cao chất lượng cuộc
sống.
2. Tính cấp thiết của đề tài.
Kiểm soát lượng nước trong bình là một ứng dụng khoa học công nghệ mà
chúng ta chắc hẳn đã từng được nhìn hay quan sát, và không thể phủ nhận được
công dụng mà nó mang lại, nó là một công việc tưởng chừng là đơn giản nhưng
lại vô cùng khó khăn. Không phải lúc nào chúng ta cũng có thể kiểm tra trong
những chiếc bể bình kín để xem lượng dung dịch trong đó bây giờ là bao nhiêu
được điều đó sẽ làm mất rất nhiều thời gian và công sức của con người. Đồ án
Trang 2
được nghiên cứu, khảo sát và thực hiện với mục đích áp dụng những kiến thức
đã được học trong nhà trường để thiết kế, tạo ra một sản phẩm giúp con người
có thể giải quyết những vấn đề trên một cách dễ dàng hơn mà không hề tốn
nhiều thời gian và công sức. Không chỉ áp dụng cho các kiểm soát nước mà nó
còn kiểm soát lượng xăng dầu trong các phương tiện mà con người sử dụng
hàng ngày giúp con người chủ động hơn trong cuộc sống.
3. Ý nghĩa khoa học và thực tiễn của đề tài.
Quyển đồ án bao gồm nhiều phần nghiên cứu từ lý thuyết đến thực hành, từ
dễ đến khó sẽ dẫn dắt người đọc tìm hiểu và lập trình thiết kế hệ thống dễ dàng
hơn với những linh kiện điện tử cơ bản trên thị trường. Vì vậy nhóm thực hiện
đề tài hy vọng quyển đồ án này sẽ là nguồn tài liệu tham khảo lý thuyết và thực
hành trong ứng dụng của đồ án.
Trang 3
PHẦN 2 : NỘI DUNG BÁO CÁO
CHƯƠNG I : CƠ SỞ LÝ THUYẾT VÀ GIỚI THIỆU CÁC LINH KIỆN
SỬ DỤNG TRONG MẠCH.
I. CƠ SỞ LÝ THUYẾT.
1. Các phương pháp kiểm soát chất lỏng.
Sử dụng phao đo
Sử dụng cảm biến áp suất.
Sử dụng cảm biến điện dung.
Sử dụng cảm biến siêu âm.
2. Các phương pháp xử lý tín hiệu.
Sử dụng IC số.
Vi xử lý.
Vi điều khiển.
3. Hiển thị.
Dùng phao tác động lên thước đo.
Chỉ thị kim (ví dụ: kim xăng xe máy).
Hiển thị trên Led 7 thanh.
Hiển thị trên Led ma trận.
Hiển thị trên LCD.
II. GIỚI THIỆU CÁC LINH KIỆN CHÍNH SỬ DỤNG TRONG MẠCH.
1. Giới thiệu về LCD.
- Text LCD là các loại màn hình tinh thể lỏng nhỏ dùng để hiển thị các dòng
chữ hoặc số trong bảng mã ASCII. Không giống các loại LCD lớn, Text LCD
được chia sẵn thành từng ô và ứng với mỗi ô chỉ có thể hiển thị một ký tự
ASCII. Cũng vì lý do chỉ hiện thị được ký tự ASCII nên loại LCD này được gọi
là Text LCD (để phân biệt với Graphic LCD có thể hiển thị hình ảnh). Mỗi ô
của Text LCD bao gồm các “chấm” tinh thể lỏng, việc kết hợp “ẩn” và “hiện”
các chấm này sẽ tạo thành một ký tự cần hiển thị. Trong các Text LCD, các mẫu
ký tự được định nghĩa sẵn. Kích thước của Text LCD được định nghĩa bằng số
ký tự có thể hiển thị trên 1 dòng và tổng số dòng mà LCD có. Ví dụ LCD 16x2
là loại có 2 dòng và mỗi dòng có thể hiển thị tối đa 16 ký tự. Một số kích thước
Text LCD thông thường gồm 16x1, 16x2, 16x4, 20x2, 20x4….
Trang 4
Hình 1.1 Hình ảnh thực tế của LCD16x2
- Text LCD có 2 cách giao tiếp cơ bản là nối tiếp (như I2C) và song song.
Trong phạm vi nghiên cứu này tôi chỉ giới thiệu loại giao tiếp song song, cụ thể
là LCD 16x2 điều khiển bởi chip HD44780U của hãng Hitachi. Đối với các
LCD khác bạn cần tham khảo datasheet riêng của từng loại. Tuy nhiên,
HD44780U cũng được coi là chuẩn chung cho các loại Text LCD, vì thế bạn có
thể dùng chương trình ví dụ trong bài này để test trên các LCD khác với rất ít
hoặc không cần chỉnh sửa.
HD44780U là bộ điều khiển cho các Text LCD dạng ma trận điểm (dotmatrix), chip này có thể được dùng cho các LCD có 1 hoặc 2 dòng hiển thị.
HD44780U có 2 mode giao tiếp là 4 bit và 8 bit. Nó chứa sẵn 208 ký tự mẫu
kích thước font 5x8 và 32 ký tự mẫu font 5x10 (tổng cộng là 240 ký tự mẫu
khác nhau).
1.1. Sơ đồ chân của LCD.
- Các Text LCD theo chuẩn HD44780U thường có 16 chân trong đó 14 chân
kết nối với bộ điều khiển và 2 chân nguồn cho “đèn LED nền”. Thứ tự các chân
thường được sắp xếp như sau: Bảng 1 sơ đồ chân
Chức
năng
Ground
Số thứ tự
chân
1
Tên
Vss(GND)
Trạng thái
logic
-
Trang 5
Mô tả
0V
Nguồn
cho
LCD
Tương
phản
2
Vdd(VCC)
-
+5V
0-Vdd
Vee
0
1
RS
0
1
D0 – D7 : lệnh
D0 – D7 : lệnh
Ghi
Đọc
Vô hiệu hóa LCD
LCD hoạt động
Bắt đầu ghi/đọc LCD
Bit 0 LSB
3
4
Điều
khiển
LCD
Dữ
liệu /
lệnh
5
R/W
6
E
7
D0
0
1
0
1
Từ 1 xuống
0/1
8
D1
0/1
Bit 1
9
10
11
12
13
D2
D3
D4
D5
D6
0/1
0/1
0/1
0/1
0/1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
14
D7
0/1
Bit 7
Bảng 1 Bảng sơ đồ chân của LCD
1.2. Kết nối LCD với vi điều khiển
- Trong một số LCD 2 chân LED nền được đánh số 15 và 16 nhưng trong một
số trường hợp 2 chân này được ghi là A (Anode) và K (Cathode). Hình 1.2 mô
tả cách kết nối LCD với nguồn và mạch điều khiển.
Trang 6
Hì
nh 1.2 .Sơ đồ kết nối LCD với vi điều khiển
- Chân 1 và chân 2 là các chân nguồn, được nối với GND và nguồn 5 V. Chân 3
là chân chỉnh độ tương phản (contrast), chân này cần được nối với 1 biến trở
chia áp như trong hình 2. Trong khi hoạt động, chỉnh để thay đổi giá trị biến trở
để đạt được độ tương phản cần thiết, sau đó giữ mức biến trở này. Các chân điều
khiển RS, R/W, EN và các đường dữ liệu được nối trực tiếp với vi điều khiển.
Tùy theo chế độ hoạt động 4 bit hay 8 bit mà các chân từ D0 đến D3 có thể bỏ
qua hoặc nối với vi điều khiển, chúng ta sẽ khảo sát kỹ càng hơn trong các phần
sau.
- Thanh ghi và tổ chức bộ nhớ.
HD44780U có 2 thanh ghi 8 bits là INSTRUCTION REGISTER (IR) và
DATA REGISTER (DR). Thanh ghi IR chứa mã lệnh điều khiển LCD và là
thanh ghi “chỉ ghi” (chỉ có thể ghi vào thanh ghi này mà không đọc được nó).
Thanh ghi DR chứa các các loại dữ liệu như ký tự cần hiển thị hoặc dữ liệu đọc
ra từ bộ nhớ LCD…Cả 2 thanh ghi đều được nối với các đường dữ liệu D0:7
Trang 7
của Text LCD và được lựa chọn tùy theo các chân điều khiển RS, RW. Thực tế
để điều khiển Text LCD chúng ta không cần quan tâm đến cách thức hoạt động
của 2 thanh ghi này, vì thế cũng không cần khảo sát chi tiết chúng.
HD44780U có 3 loại bộ nhớ, đó là bộ nhớ RAM dữ liệu cần hiển thị DDRAM
(Didplay Data RAM), bộ nhớ chứa ROM chứa bộ font tạo ra ký tự CGROM
(Character Generator ROM) và bộ nhớ RAM chứa bộ font tạo ra các symbol
tùy chọn CGRAM (Character Generator RAM). Để điều khiển hiển thị Text
LCD chúng ta cần hiểu tổ chức và cách thức hoạt động của các bộ nhớ này.
1.3. DDRAM
DDRAM là bộ nhớ tạm chứa các ký tự cần hiển thị lên LCD, bộ nhớ này gồm
có 80 ô được chia thành 2 hàng, mỗi ô có độ rộng 8 bit và được đánh số từ 0 đến
39 cho dòng 1; từ 64 đến 103 cho dòng 2. Mỗi ô nhớ tương ứng với 1 ô trên màn
hình LCD. Như chúng ta biết LCD loại 16x2 có thể hiển thị tối đa 32 ký tự (có
32 ô hiển thị), vì thế có một số ô nhớ của DDRAM không được sử dụng làm các
ô hiển thị. Để hiểu rõ hơn chúng ta tham khảo hình 1.3 bên dưới.
Hình 1.3. Tổ chức của DDRAM
1.4. CGROM
CGROM là vùng nhớ cố định chứa định nghĩa font cho các ký tự. Chúng
ta không trực tiếp truy xuất vùng nhớ này mà chip HD44780U sẽ tự thực hiện
khi có yêu cầu đọc font để hiện thị. Một điều đáng lưu ý là địa chỉ font của mỗi
ký tự vùng nhớ CGROM chính là mã ASCII của ký tự đó. Ví dụ ký tự ‘a’ có mã
ASCII là 97, tham khảo tổ chức của vùng nhớ CGROM trong hình 4 bạn sẽ
nhận thấy địa chỉ font của ‘a’ có 4 bit thấp là 0001 và 4 bit cao là 0110, địa chỉ
tổng hợp là 01100001 = 97.
Trang 8
CGROM và DDRAM được tự động phối hợp trong quá trình hiển thị của
LCD. Giả sử chúng ta muốn hiển thị ký tự ‘a’ tại vị trí đầu tiên, dòng thứ 2 của
LCD thì các bước thực hiện sẽ như sau: trước hết chúng ta biết rằng vị trí đầu
tiên của dòng 2 có địa chỉ là 64 trong bộ nhớ DDRAM, vì thế chúng ta sẽ ghi
vào ô nhớ có địa chỉ 64 một giá trị là 97 (mã ASCII của ký tự ‘a’). Tiếp theo,
chip HD44780U đọc giá trị 97 này và coi như là địa chỉ của vùng nhớ CGROM,
nó sẽ tìm đến vùng nhớ CGROM có địa chỉ 97 và đọc bảng font đã được định
nghĩa sẵn ở đây, sau đó xuất bản font này ra các “chấm” trên màn hình LCD tại
vị trí đầu tiên của dòng 2 trên LCD. Đây chính là cách mà 2 bộ nhớ DDRAM và
CGROM phối hợp với nhau để hiển thị các ký tự. Như mô tả, công việc của
người lập trình điều khiển LCD tương đối đơn giản, đó là viết mã ASCII vào bộ
nhớ DDRAM tại đúng vị trí được yêu cầu, bước tiếp theo sẽ do HD44780U đảm
nhiệm.
1.5. CGRAM
CGRAM là vùng nhớ chứa các symbol do người dùng tự định nghĩa, mỗi
symbol được có kích thước 5x8 và được dành cho 8 ô nhớ 8 bit. Các symbol
thường được định nghĩa trước và được gọi hiển thị khi cần thiết. Vùng này có tất
cả 64 ô nhớ nên có tối đa 8 symbol có thể được định nghĩa. Tài liệu này không
đề cập đến sử dụng bộ nhớ CGRAM nên tôi sẽ không đi chi tiết phần này, bạn
có thể tham khảo datasheet của HD44780U để biết thêm.
1.6. Các chân điều khiển của LCD
Các chân điều khiển việc đọc và ghi LCD bao gồm RS, R/W và EN.
RS (chân số 3): Chân lựa chọn thanh ghi (Select Register), chân này cho phép
lựa chọn 1 trong 2 thanh ghi IR hoặc DR để làm việc. Vì cả 2 thanh ghi này đều
được kết nối với các chân Data của LCD nên cần 1 bit để lựa chọn giữa chúng.
Nếu RS=0, thanh ghi IR được chọn và nếu RS=1 thanh ghi DR được chọn.
Chúng ta đều biết thanh ghi IR là thanh ghi chứa mã lệnh cho LCD, vì thế nếu
muốn gởi 1 mã lệnh đến LCD thì chân RS phải được reset về 0. Ngược lại, khi
Trang 9
muốn ghi mã ASCII của ký tự cần hiển thị lên LCD thì chúng ta sẽ set RS=1 để
chọn thanh ghi DR. Hoạt động của chân RS được mô tả trong hình 1.4.
Hình 1.4. Hoạt động của chân RS
R/W (chân số 4): Chân lựa chọn giữa việc đọc và ghi. Nếu R/W=0 thì dữ liệu sẽ
được ghi từ bộ điều khiển ngoài (vi điều khiển AVR chẳng hạn) vào LCD. Nếu
R/W=1 thì dữ liệu sẽ được đọc từ LCD ra ngoài. Tuy nhiên, chỉ có duy nhất 1
trường hợp mà dữ liệu có thể đọc từ LCD ra, đó là đọc trạng thái LCD để biết
LCD có đang bận hay không (cờ Busy Flag – BF). Do LCD là một thiết bị hoạt
động tương đối chậm (so với vi điều khiển), vì thế một cờ BF được dùng để báo
LCD đang bận, nếu BF=1 thì chúng ta phải chờ cho LCD xử lí xong nhiệm vụ
hiện tại, đến khi nào BF=0 một thao tác mới sẽ được gán cho LCD. Vì thế, khi
làm việc với Text LCD chúng ta nhất thiết phải có một chương trình con tạm gọi
là wait_LCD để chờ cho đến khi LCD rảnh. Có 2 cách để viết chương trình
wait_LCD. Cách 1 là đọc bit BF về kiểm tra và chờ BF=0, cách này đòi hỏi lệnh
đọc từ LCD về bộ điều khiển ngoài, do đó chân R/W cần được nối với bộ điều
khiển ngoài. Cách 2 là viết một hàm delay một khoảng thời gian cố định nào đó
(tốt nhất là trên 1ms). Ưu điểm của cách 2 là sự đơn giản vì không cần đọc
LCD, do đó chân R/W không cần sử dụng và luôn được nối với GND. Tuy
nhiên, nhược điểm của cách 2 là khoảng thời gian delay cố định nếu quá lớn sẽ
làm chậm quá trình thao tác LCD, nếu quá nhỏ sẽ gây ra lỗi hiển thị. Trong bài
này tôi hướng dẫn bạn cách tổng quát là cách 1, để sử dụng cách 2 bạn chỉ cần
Trang 10
một thay đổi nhỏ trong chương trình wait_LCD và kết nối chân R/W của LCD
xuống GND.
EN (chân số 5): Chân cho phép LCD hoạt động (Enable), chân này cần được
kết nối với bộ điều khiển để cho phép thao tác LCD. Để đọc và ghi data từ LCD
chúng ta cần tạo một “xung cạnh xuống” trên chân EN, nói theo cách khác,
muốn ghi dữ liệu vào LCD trước hết cần đảm bảo rằng chân EN=0, tiếp đến
xuất dữ liệu đến các chân D0:7, sau đó set chân EN lên 1 và cuối cùng là xóa
EN về 0 để tạo 1 xung cạnh xuống.
1.7. Các mã lệnh của LCD
Mã(Hex)
0x01
0x02
0x04
0x06
0x05
0x07
0x08
0x0A
0x0C
0x0E
0x0F
0x10
0x14
0x18
0x1C
0x80
0xC0
0x38
Lệnh đến thanh ghi của LCD
Xóa màn hình hiển thị
Trở về đầu dòng
Giảm con trỏ ( dịch con trỏ sang trái)
Tăng con trỏ (dịch con trỏ sang phải)
Dịch hiển thị sang phải
Dịch hiển thị sang trái
Tắt con trỏ, tắt hiển thị
Tắt hiển thị, bật con trỏ
Bật hiển thị, tắt con trỏ
Bật hiển thị, nhấp nháy con trỏ
Tắt con trỏ, nhấp nháy con trỏ
Dịch con trỏ sang trái
Dịch con trỏ sang phải
Dịch toàn bộ hiển thị sang trái
Dịch toàn bộ hiển thị sang phải
Ép con trỏ về đầu dòng thứ nhất
Ép con trỏ về đầu dòng thứ hai
Hai dòng ma trận
Bảng 2. Mã lệnh của LCD
Trang 11
2. Giới thiệu về IC AT89S52
Hình 1.5 . Hình ảnh thực tế của IC AT89S52
2.1. Cấu trúc chung của IC AT89S52
IC AT89S52 có những đặc điểm sau :
8kB ROM bên trong
256 Byte ngoài
4 Port xuất nhập dữ liệu I/O
Giao tiếp nối tiếp
64 kB vùng nhớ mã ngoài
64 kB vùng nhớ dữ liệu ngoài
Xử lý Boolean
Cấu trúc của AT89S52 ở dạng sơ đồ khối tổng quát
Trang 12
Hình 1.6 Sơ đồ khối tổng quát của IC AT89S52
- Cấu trúc bus:
+ Bus địa chỉ của họ vi điều khiển AT89S52 gồm 16 đường tín hiệu (thường
gọi là bus địa chỉ 16 bit). Với số lượng bit địa chỉ như trên, không gian nhớ của
chip được mở rộng tối đa là 216 = 65536 địa chỉ, tương đương 64kB.
+ Bus dữ liệu của họ vi điều khiển AT89S52 gồm 8 đường tín hiệu (thường gọi
là bus dữ liệu 8 bit), đó là lý do tại sao nói AT89S52 là họ vi điều khiển 8 bit.
Với độ rộng của bus dữ liệu như vậy, các chip họ AT89S52 có thể xử lý các
toán hạng 8 bit trong một chu kỳ lệnh.
- CPU (Central Processing Unit)
CPU là đơn vị xử lý trung tâm, đó là bộ não của toàn bộ hệ thống vi điện tử
được tích hợp trên chip vi điều khiển. CPU có cấu tạo chính gồm một đơn
vị xử lý số học và • logic ALU (Arithmethic Logic Unit) – nơi thực hiện tất
cả các phép toán số học và phép • logic cho quá trình xử lý.
- Bộ nhớ chương trình (Program Memory)
Trang 13
Không gian bộ nhớ chương trình của AT89 là 64kB, tuy nhiên hầu hết các vi
điều khiển AT89 trên thị trường chỉ tích hợp sẵn trên chip một lượng bộ nhớ
chương trình nhất định và chiếm dải địa chỉ từ 0000h trở đi trong không gian
bộ nhớ chương trình.
AT89C52/AT89S52 có 8kB bộ nhớ chương trình cùng loại.
Bộ nhớ chương trình của các chip họ AT89S52 có thể thuộc một trong các
loại: ROM, EPROM, Flash, hoặc không có bộ nhớ chương trình bên trong
chip. Tên của từng chip thể hiện chính loại bộ nhớ chương trình mà nó mang
bên trong, cụ thể là vài ví dụ sau:
STT
Tên chip
ROM
EPROM
Flash
1
8051
4 Kbyte
x
x
2
8052
8 Kbyte
x
x
3
8031
x
x
x
4
8032
x
x
x
5
87C51
x
4 Kbyte
x
6
87C52
x
8 Kbyte
x
7
AT89C51/AT89S51
x
x
4 Kbyte
8
AT89C52/AT89S52
x
x
8 Kbyte
Bảng 3 Bảng mô tả bộ nhớ chương trình của chíp AT89S52
Bộ nhớ chương trình dùng để chứa mã của chương trình nạp vào chip. Mỗi
lệnh được mã hóa bởi 1 hay vài byte, dung lượng của bộ nhớ chương trình
phản ánh số lượng lệnh mà bộ nhớ có thể chứa được. Địa chỉ đầu tiên của bộ
nhớ chương trình (0x0000) chính là địa chỉ Reset của AT89S52. Ngay sau khi
reset (do tắt bật nguồn, do mức điện áp tại chân RESET bị kéo lên 5V...), CPU
sẽ nhảy đến thực hiện lệnh đặt tại địa chỉ này trước tiên, luôn luôn là như vậy.
Phần còn trống trong không gian chương trình không dùng để làm gì cả. Nếu
muốn mở rộng bộ nhớ chương trình, ta phải dùng bộ nhớ chương trình bên
ngoài có dung lượng như ý muốn. Tuy nhiên khi dùng bộ nhớ chương trình
ngoài, bộ nhớ chương trình onchip không dùng được nữa, bộ nhớ chương trình
ngoài sẽ chiếm dải địa chỉ ngay từ địa chỉ 0x0000.
Trang 14
- Bộ nhớ dữ liệu (Data Memory)
Vi điều khiển họ AT89S52 có không gian bộ nhớ dữ liệu là 64kB địa chỉ, đó
cũng là dung lượng bộ nhớ dữ liệu lớn nhất mà mỗi chip thuộc họ này có thể có
được (nếu phối ghép một cách chính tắc, sử dụng các đường tín hiệu của bus
địa chỉ và dữ liệu). Bộ nhớ dữ liệu của các chip họ AT89S52 có thể thuộc
một hay hai loại: SRAM hoặc EEPROM. Bộ nhớ dữ liệu SRAM được tích
hợp bên trong mọi chip thuộc họ vi điều khiển này, có dung lượng khác nhau
tùy loại chip, nhưng thường chỉ khoảng vài trăm byte. Đây chính là nơi chứa
các biến trung gian trong quá trình hoạt động của chip. khi mất điện, do bản
chất của SRAM mà giá trị của các biến này cũng bị mất theo. Khi có điện trở
lại, nội dung của các ô nhớ chứa các biến này cũng là bất kỳ, không thể xác
định trước. Bên cạnh bộ nhớ loại SRAM, một số chip thuộc họ AT89S52
còn có thêm bộ nhớ dữ liệu loại EEPROM với dung lượng tối đa vài kB, tùy
từng loại chip cụ thể.
Tổng quát về bộ nhớ của AT89S52, ta có thể thấy mỗi chip AT89S52
gồm có những bộ nhớ sau:
Hình 1.7 Bộ nhớ của chíp AT89S52
Đối với các chip có bộ nhớ SRAM 128 byte thì địa chỉ của các byte
SRAM này được đánh số từ 00h đến 7Fh. Đối với các chip có bộ nhớ SRAM
Trang 15
256 byte thì địa chỉ của các byte SRAM được đánh số từ 00h đến FFh. Ở cả hai
loại chip, SRAM có địa chỉ từ 00h đến 7Fh được gọi là vùng RAM thấp, phần
có địa chỉ từ 80h đến FFh (nếu có) được gọi là vùng RAM cao.
Bên cạnh các bộ nhớ, bên trong mỗi chip AT89S52 còn có một tập hợp các
thanh ghi chức năng đặc biệt (SFR – Special Function Register). Các thanh ghi
này liên quan đến hoạt động của các ngoại vi onchip (các cổng vào ra, timer,
ngắt ...). Địa chỉ của chúng trùng với dải địa chỉ của vùng SRAM cao, tức là
cũng có địa chỉ từ 80h đến FFh.
Hình 1.8 Địa chỉ vùng RAM
Vậy khi truy cập vào một địa chỉ thuộc dải từ 00h đến 7Fh thì sẽ truy cập đến ô
nhớ thuộc vùng RAM thấp. Tuy nhiên khi truy cập đến một địa chỉ x thuộc
dải từ 80h đến FFh thì xảy ra vấn đề cần giải quyết: sẽ truy cập đến thanh ghi
SFR ở địa chỉ x hay truy cập đến ô nhớ ở địa chỉ x của vùng RAM cao? Nhà
sản xuất quy định rằng, trong trường hợp này, nếu kiểu truy cập sử dụng chế độ
địa chỉ trực tiếp thì sẽ truy cập vào vùng SFR, ngược lại nếu kiểu truy cập sử
dụng chế độ địa chỉ gián tiếp thì sẽ truy cập vào vùng RAM cao.
Bộ nhớ dữ liệu RAM onchip thường dùng để chứa các biến tạm thời trong
quá trình vi điều khiển hoạt động, đó cũng là nơi dành cho ngăn xếp hoạt động.
Trang 16
Không gian dữ liệu 64kB được để trống hoàn toàn và chỉ dùng được khi ghép
nối với bộ nhớ dữ liệu bên ngoài. Khi ghép nối thêm bộ nhớ dữ
liệu bên ngoài, dung lượng của các bộ nhớ này sẽ chiếm dần các vị trí trong
không gian, tuy nhiên không hề ảnh hưởng đến 128 byte RAM onchip.
Ngăn xếp trong AT89S52 liên quan đến một thanh ghi tên là con trỏ ngăn
xếp SP (Stack Pointer). Thanh ghi này luôn trỏ vào đỉnh của ngăn xếp, tức là
nó chứa địa chỉ của vị trí ngay sát vị trí có thể lưu địa chỉ/dữ liệu tiếp theo vào.
Khi cất 1 byte địa chỉ/dữ liệu vào ngăn xếp, SP tự động tăng lên 1 đơn vị sau
đó mới cất địa chỉ/dữ liệu vào ô nhớ có địa chỉ bằng với giá trị của SP sau khi
đã tăng. Khi lấy 1 byte địa chỉ/dữ liệu ra khỏi ngăn xếp, giá trị sẽ được lấy ra
sau đó SP mới tự động trừ đi 1 đơn vị. Giá trị sau khi reset của SP là 0x07, do
đó quy định ngăn xếp sẽ cất dữ liệu từ địa chỉ 0x08 trở đi. Tuy nhiên do đặc
tính hoạt động bành trướng theo chiều tăng địa chỉ mà ngăn xếp thường được
bố trí lên vùng trên cùng của bộ nhớ RAM onchip để tránh tranh chấp với các
biến lưu trong RAM.
- Cổng vào ra song song (I/O Port)
AT89S52 có 4 cổng vào ra song song, có tên lần lượt là P0, P1, P2 và P3. Tất
cả các cổng này đều là cổng vào ra hai chiều 8bit. Các bit của mỗi cổng là
một chân trên chip, như vậy mỗi cổng sẽ có 8 chân trên chip.
Hướng dữ liệu (dùng cổng đó làm cổng ra hay cổng vào) là độc lập giữa các
cổng và giữa các chân (các bit) trong cùng một cổng. Ví dụ, ta có thể định
nghĩa cổng P0 là cổng ra, P1 là cổng vào hoặc ngược lại một cách tùy ý, với cả
2 cổng P2 và P3 còn lại cũng vậy. Trong cùng một cổng P0, ta cũng có thể định
nghĩa chân P0.0 là cổng vào, P0.1 lại là cổng ra tùy ý.
Liên quan đến mỗi cổng vào/ra song song của 8051 chỉ có một thanh
ghi SFR ( thanh ghi chức năng đặc biệt) có tên trùng với tên của cổng. Ta có
các thanh ghi P0 dùng cho cổng P0, thanh ghi P1 dùng cho cổng P1 … Đây là
các thanh ghi đánh địa chỉ đến từng bit (bit addressable), do đó ta có thể dùng
các lệnh tác động bit đối với các bit của các thanh ghi này. Mỗi thanh ghi này
Trang 17
gồm 8 bit tương ứng với các chân (bit) của cổng đó. Khi một chân (bit) cổng
nào đó được dùng làm cổng vào thì trước đó bit tương ứng trong thanh ghi SFR
phải được đặt ở mức 1. Nếu một chân (bit) cổng nào đó được dùng làm cổng ra
thì giá trị của bit tương ứng trong thanh ghi SFR sẽ là giá trị lôgic muốn đưa ra
chân cổng đó. Nếu muốn đưa ra mức lôgic cao (điện áp gần 5 V), bit tương
ứng trong thanh ghi phải được đặt bằng 1, hiển nhiên nếu muốn đưa ra mức
lôgic thấp (điện áp gần 0 V) thì bit tương ứng trong thanh ghi phải được đặt
bằng 0. Như đã nói ở trên, các bit trong thanh ghi cổng có thể được đặt bằng
1/0 mà không làm ảnh hưởng đến các bit còn lại trong cổng đó bằng cách dùng
các lệnh setb (đặt lên 1) hay clr (đặt về 0).
Sau khi đặt một chân cổng làm cổng vào, ta có thể dùng các lệnh kiểm tra bit
để đọc vào và kiểm tra các mức lôgic của mạch ngoài đang áp vào là mức 0
hay mức 1. Các lệnh này là jb (nhảy nếu bit bằng 1), jnb (nhảy nếu bit bằng 0).
Mỗi cổng có cấu trúc gồm một latch (chính là các bit của thanh ghi cổng),
mạch lái đầu ra (output driver) và mạch đệm đầu vào (input buffer).
Ngoài chức năng vào/ra thông thường, một số cổng còn được tích hợp thêm
chức năng của một số ngoại vi khác. Xem bảng liệt kê sau:
Bảng 4 Bảng liệt kê chức năng 1 số cổng IC AT89S52
Các chân cổng P1.0 và P1.1 được tích hợp với các tín hiệu của timer2 trong
trường hợp chip là AT89S52
Khi dùng với các chức năng của các ngoại vi, chân cổng tương ứng phải
được đặt lên 1. Nếu không các tín hiệu sẽ luôn bị ghim ở mức 0.
Trang 18
Cổng P0 không có điện trở treo cao (pullup resistor) bên trong, mạch lái tạo
mức cao chỉ có khi sử dụng cổng này với tính năng là bus dồn kênh địa
chỉ/dữ liệu. Như vậy với chức năng ra thông thường, P0 là cổng ra open
drain, với chức năng vào, P0 là cổng vào cao trở (high impedance). Nếu
muốn sử dụng cổng P0 làm cổng vào/ra thông thường, ta phải thêm điện trở
pullup bên ngoài. Giá trị điện trở pullup bên ngoài thường từ 4.7K đến 10K.
Các cổng P1, P2 và P3 đều có điện trở pullup bên trong, do đó có thể dùng
với chức năng cổng vào/ra thông thường mà không cần có thêm điện trở pullup
bên ngoài. Thực chất, điện trở pullup bên trong là các FET, không phải điện
trở tuyến tính thông thường, tuy vậy nhưng khả năng phun dòng ra của mạch lái
khi đầu ra ở mức cao (hoặc khi là đầu vào) rất nhỏ, chỉ khoảng 100 µA.
- Cổng vào ra nối tiếp (Serial Port)
+ Cổng nối tiếp trong AT89S52 chủ yếu được dùng trong các ứng dụng có
yêu cầu truyền thông với máy tính, hoặc với một vi điều khiển khác. Liên
quan đến cổng nối tiếp chủ yếu có 2 thanh ghi: SCON và SBUF. Ngoài ra,
một thanh ghi khác là thanh ghi PCON (không đánh địa chỉ bit) có bit 7 tên là
SMOD quy định tốc độ truyền của cổng nối tiếp có gấp đôi lên (SMOD = 1)
hay không (SMOD = 0).
+ Dữ liệu được truyền nhận nối tiếp thông qua hai chân cổng P3.0 (RxD) và
P3.1 (TxD).
+ Thanh ghi SBUF là thanh ghi 8 bit chứa dữ liệu truyền hoặc nhận. Về
thực chất có hai thanh ghi dữ liệu khác nhau, một dành để chứa dữ liệu
truyền đi, một để chứa dữ liệ nhận được. Cả hai thanh ghi này đều có
chung một tên là SBUF, tuy nhiên CPU hoàn toàn phân biệt được một cách
dễ dàng. Khi ta muốn truyền dữ liệu đi, ta phải ghi vào thanh ghi SBUF (ví
dụ viết lệnh mov SBUF,a), còn khi muốn đọc kiểm tra dữ liệu nhận về ta
phải đọc thanh ghi SBUF (ví dụ viết lệnh mov a,SBUF). CPU sẽ căn cứ vào
việc thanh ghi SBUF nằm ở vị trí toán hạng đích (toán hạng bên trái) hay
toán hạng nguồn (toán hạng bên phải) để quyết định sẽ truy nhập (đọc/ghi)
Trang 19
thanh ghi SBUF nào. Người lập trình không cần phải quan tâm xử lý vấn đề
này. Thanh ghi quy định chế độ hoạt động và điều khiển cổng nối tiếp là
thanh ghi SCON (đánh địa chỉ bit).
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
Hình 1.9 Thanh ghi SCON của AT89S52
Bit SM0, SM1, SM2 quy định chế độ hoạt động của cổng nối tiếp. Thông
thường để truyền thông giữa 2 vi điều khiển hoặc giữa 1 vi điều khiển và 1
máy tính, giá trị của bit SM2 được đặt bằng 0. Khi truyền thông theo kiểu
mạng đa vi xử lý (multiprocessor communication), SM2 được đặt bằng 1.
Hai bit SM0 và SM1 thực sự là các bit quy định chế độ hoạt động của cổng
nối tiếp, chúng tạo ra 4 tổ hợp (00,01,10 và 11) ứng với 4 chế độ hoạt động
mô tả trong bảng sau.
SM0
0
0
1
1
SM1
0
1
0
1
Chế độ
0 – Đồng bộ
1 – Dị bộ
2 – Dị bộ
3 – Dị bộ
Khung dữ liệu
8 bit SBUF
8 bit SBUF
8bit SBUF + RB8/TB8
8bit SBUF + RB8/TB8
Baud rate
Fosc/12
Thay đổi được
Fosc/32 hoặc Fosc/64
Thay đổi được
Bảng 5. Bit SM0 và SM1 của AT89S52
Chế độ 0: là chế độ truyền đồng bộ duy nhất. Chân RxD sẽ là tín hiệu
truyền/nhận dữ liệu, chân TxD là tín hiệu xung nhịp. Bit LSB (bit 0) của dữ
liệu được truyền đi trước tiên. Tốc độ truyền cố định và bằng 1/12 giá trị thạch
anh.
Chế độ 1: là chế độ truyền dị bộ 8 bit. Dữ liệu 8 bit được đóng khung bởi
một bit
Start (= 0) ở đầu và một bit Stop (=1) ở cuối trước khi được truyền đi. Tốc độ
truyền thay đổi được theo ý người lập trình.
Chếđộ 2: là chế độ truyền dị bộ 9 bit. Dữ liệu 9 bit được ghép thành bởi 8bit
trong thanh ghi SBUF và bit RB8 (trường hợp nhận về) hoặc TB8 (trường
hợp truyền đi)
Trang 20
- Xem thêm -