Tài liệu Bài giảng Vi điều khiển: TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN
KHOA CƠ KHÍ ĐỘNG LỰC
BÀI GIẢNG
HỌC PHẦN: VI ĐIỀU KHIỂN
SỐ TÍN CHỈ: 02
LOẠI HÌNH ĐÀO TẠO: ĐẠI HỌC CHÍNH QUY
NGÀNH: CÔNG NGHỆ KỸ THUẬT Ô TÔ
Hưng Yên - 2015
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
1
Chƣơng 1 TỔNG QUAN ................................................................................................................ 4
1.1. Khái niệm ......................................................................................................................... 4
1.2. Các dòng vi điều khiển phổ biến trên thị trƣờng .............................................................. 4
1.3 Các hệ thống số ..................................................................................................................... 5
1.3.1. Hệ thống số thập phân ................................................................................................... 5
1.3.2. Hệ thống số nhị phân ..................................
75 trang |
Chia sẻ: putihuynh11 | Lượt xem: 609 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Vi điều khiển, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN
KHOA CƠ KHÍ ĐỘNG LỰC
BÀI GIẢNG
HỌC PHẦN: VI ĐIỀU KHIỂN
SỐ TÍN CHỈ: 02
LOẠI HÌNH ĐÀO TẠO: ĐẠI HỌC CHÍNH QUY
NGÀNH: CÔNG NGHỆ KỸ THUẬT Ô TÔ
Hưng Yên - 2015
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
1
Chƣơng 1 TỔNG QUAN ................................................................................................................ 4
1.1. Khái niệm ......................................................................................................................... 4
1.2. Các dòng vi điều khiển phổ biến trên thị trƣờng .............................................................. 4
1.3 Các hệ thống số ..................................................................................................................... 5
1.3.1. Hệ thống số thập phân ................................................................................................... 5
1.3.2. Hệ thống số nhị phân ..................................................................................................... 5
1.3.3. Hệ thống số bát phân (BCD-Binary Coded Decimal) ................................................... 6
1.3.4. Hệ thống số thập lục (Hexadecimal) ............................................................................. 6
1.3.5. Số bù hai ........................................................................................................................ 7
1.3.6. Các phép toán số học đối với hệ nhị phân ..................................................................... 7
1.3.6.1. Phép cộng nhị phân không dấu .............................................................................. 7
1.3.6.2. Phép trừ nhị phân .................................................................................................. 7
1.3.6.3. Phép nhân nhị phân ............................................................................................... 7
1.3.6.4. Phép chia nhị phân ................................................................................................ 8
1.3.7. Chuyển đổi qua lại giữa các hệ thống số ....................................................................... 8
1.3.7.1. Chuyển đổi số thập phân sang nhị phân : ............................................................... 8
1.3.7.2. Chuyển đổi số nhị phân sang thập phân ................................................................. 8
1.3.7.3. Chuyển đổi số nhị phân sang Hexa : ...................................................................... 8
1.3.7.4. Chuyển đổi số Hexa sang nhị phân: ....................................................................... 9
1.3.7.5. Mã ASCII: (American Standard Code for Information Interchange ) ................... 9
Chƣơng 2. CẤU TRÚC PHẦN CỨNG VÀ NGÔN NGỮ LẬP TRÌNH C .................................. 11
2.1 Cấu trúc phần cứng của vi điều khiển 8051 ........................................................................ 11
2.2. Sơ đồ chân .......................................................................................................................... 11
2.2.1. Nhóm chân nguồn, dao động, điều khiển .................................................................... 12
2.2.2. Nhóm chân cổng vào ra .............................................................................................. 13
2.3. Tổ chức không gian bộ nhớ ................................................................................................ 14
2.3.1. Bản đồ bộ nhớ ROM của 8051 .................................................................................... 14
2.3.2. Tổ chức không gian bộ nhớ RAM của 8051 ............................................................... 15
2.4. Thanh ghi ............................................................................................................................ 17
2.4.1. Thanh ghi tích luỹ A: .................................................................................................. 18
2.4.2. Thanh ghi từ trạng thái PSW (hay còn gọi là thanh ghi cờ) : ..................................... 18
2.4.3. Thanh ghi điều khiển bộ đếm bộ định thời (TCON) .................................................. 18
2.4.4. Thanh ghi điều khiển chế độ bộ định thời/bộ đếm (TMOD) ...................................... 19
2.4.5. Thanh ghi cho phép ngắt IE ....................................................................................... 20
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
2
2.5. Ngôn ngữ lập trình C cho vi điều khiển ............................................................................. 20
2.5.1. Cấu trúc một chƣơng trình trong C ............................................................................. 20
2.5.2. Lời chú thích ............................................................................................................... 21
2.5.3. Các loại kiểu dữ liệu trong C...................................................................................... 21
2.5.4. Các hàm trong C ......................................................................................................... 23
2.5.5. Các toán tử ................................................................................................................. 24
2.5.6. Phép toán lấy địa chỉ biến (&) .................................................................................... 26
2.5.7. Phép toán chuyển đổi kiểu (bắt buộc) ........................................................................ 26
2.5.8. Các định dạng ............................................................................................................. 26
2.5.9. Cấu trúc điều khiển ..................................................................................................... 27
2.5.9.1. Cấu trúc rẽ nhánh ................................................................................................ 27
2.5.9.2. Cấu trúc lựa chọn switch ...................................................................................... 27
2.5.9.3. Vòng lặp có hạn for ............................................................................................. 28
2.5.9.4. Vòng lặp không xác định while ............................................................................ 28
2.5.9.5. Một số thƣ viện chuẩn của C ............................................................................... 28
2.5.9.6. Các từ khóa trong C ............................................................................................. 29
2.5.9.10. con trỏ và mảng .................................................................................................. 29
2.6. Thuật toán và lƣu đồ thuật toán .......................................................................................... 33
2.6.1. Khái niệm .................................................................................................................... 33
2.6.2. Biểu diễn thuật toán bằng sơ đồ khối .......................................................................... 33
CHƢƠNG 3. LẬP TRÌNH ỨNG DỤNG ..................................................................................... 34
3.1. Các bƣớc tạo một Project mới ............................................................................................ 34
3.2. Lập trình ứng dụng. ............................................................................................................ 40
3.2.1. Chƣơng trình tạo trễ ................................................................................................... 40
3.2.2. Ứng dụng điều khiển LED đơn .................................................................................. 40
3.2.3. Ứng dụng điều khiển 8 LED đơn ................................................................................ 41
3.2.4. Ứng dụng điều khiển LED 7 thanh ............................................................................. 43
3.2.5. Ứng dụng điều khiển LED ma trận ............................................................................. 47
3.2.6. Ứng dụng sử dụng nút nhấn ........................................................................................ 48
3.2.7 Ứng dụng sử dụng ngắt ngoài ...................................................................................... 51
3.2.8. Lập trình cho Timer ..................................................................................................... 55
3.2.8.1. Các thanh ghi cơ sở của bộ định thời ................................................................... 55
3.2.8.2. Lập trình cho timer ở chế độ 1 ............................................................................. 57
3.2.8.3. Lập trình cho Timer ở chế độ 2 ............................................................................ 59
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
3
3.2.8.4. Lập trình cho bộ đếm ........................................................................................... 60
3.2.9. Lập trình ngắt timer ..................................................................................................... 62
3.2.10. Lập trình với bộ biến đổi A/D ................................................................................... 65
3.2.11. Lập trình giao tiếp máy tính ...................................................................................... 67
3.2.11.1. Chế độ thu phát .................................................................................................. 67
3.2.11.2. Giao thức (protocol) ........................................................................................... 68
3.2.11.3. Tốc độ truyền ..................................................................................................... 69
3.2.11.4. Bố trí chân của RS232 ........................................................................................ 69
3.2.11.5. Ghép nối 8051 với RS232 .................................................................................. 71
3.2.11.6. Lập trình truyền thông nối tiếp cho 8051 ........................................................... 71
3.2.11.7. Lập trình 8051 truyền dữ liệu nối tiếp ................................................................ 73
3.2.11.8. Lập trình 8051 nhận dữ liệu nối tiếp .................................................................. 73
3.2.11.9. Truyền dữ liệu bằng ngắt ................................................................................... 74
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
4
Chƣơng 1 TỔNG QUAN
1.1. Khái niệm
Hình 1.1. Cấu trúc chung của vi xử lí, vi điều khiển
- Vi xử lý: theo nghĩa rộng hơn chính là CPU, các khối chức năng nhƣ bộ nhớ và các thiết
bị ngoại vi khác phải đƣợc ghép từ bên ngoài tới chíp vi xử lý để hình thành một bản
mạch (board) vi xử lý hoàn chỉnh. Hệ thống đƣợc thực hiện theo cách này đƣợc gọi là
máy vi tính một bản mạch (single board). Thí dụ 8085, 8086, 80486 và các vi xử lý.
- Vi điều khiển: là thiết bị mà tất cả các khối chức năng (RAM, ROM, CPU) nằm bên
trong một vi mạch đơn lẻ. Hay còn gọi là máy tính “đơn chíp”.
- Bộ nhớ: là một phần của vi điều khiển, có chức năng lƣu trữ dữ liệu.
- Đơn vị xử lý trung tâm: Khối này có chức năng thực hiện các phép tính số học, logic và
di chuyển dữ liệu từ ô nhớ này tới ô nhớ khác.
- BUS: Các đƣờng dẫn để di chuyển dữ liệu từ một khối này sang một khối khác đƣợc gọi
là BUS. Về mặt vật lý, bus là một nhóm các đƣờng dẫn, thƣờng gồm 8, 16 đƣờng dẫn
hoặc có thể nhiều hơn. Các bus chia làm 2 loại: bus địa chỉ và bus dữ liệu. bus địa chỉ bao
gồm số đƣờng dẫn tƣơng ứng với dung lƣợng bộ nhớ mà ta muốn định địa chỉ. Bus dữ
liệu có độ rộng bằng độ rộng dữ liệu, thƣờng vi điều khiển là 8 bit hoặc 8 đƣờng kết nối.
- Khối vào ra: có chức năng giao tiếp với các thiết bị ngoại vi.
- Chuyển đổi tƣơng tự sang số (ADC): Khối này có nhiệm vụ chuyển đổi thông tin dƣới
dạng một vài giá trị tƣơng tự thành một số nhị phân và đƣa tới đơn vị xử lí trung tâm.
- Chƣơng trình: Sử dụng các câu lệnh đƣợc sắp xếp theo một quy tắc chặt chẽ, nhằm
truyền tải mong muốn của con ngƣời tới vi điều khiển.
1.2. Các dòng vi điều khiển phổ biến trên thị trƣờng
- Họ vi điều khiển 8051
- Vi điều khiển PIC
- Vi điều khiển AVR
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
5
1.3 Các hệ thống số
1.3.1. Hệ thống số thập phân
Hệ đếm thập phân còn gọi là hệ đếm cơ số mƣời và nó đƣợc biểu diễn bởi 10 con số từ
(0,1,2,3,4,5,6,7,8,9 ) những con số này đƣợc sử dụng rất nhiều trong khoa học kỹ thuật cũng nhƣ
trong đời sống hàng ngày, khi biểu diễn số thập phân thì dứng sau dãy số thƣờng có chữ D.
Ví dụ: Ba nghìn Chin trăm Bảy mƣơi Tám đƣợc biểu diễn nhƣ sau
3978 = 3x103 + 9x102 + 7x101 + 8x100
= 3000 + 900 + 70 + 8
1.3.2. Hệ thống số nhị phân
Hệ đếm nhị phân còn gọi là hệ đếm cơ số hai và nó đƣợc biểu diễn bởi 2 con số là 0 và 1,
trong kỹ thuật điện tử số thì số 0 gọi là mức logic thấp ứng với điện áp thấp, số 1gọi là mức logic
cao tƣơng ứng với điện áp cao nhất. Mỗi ký hiệu 0 hoặc 1 đƣợc gọi là 1 Bit (Binary Digit), khi
biểu diễn số nhị phân thì dứng sau dãy số phải có chữ B.
Ví dụ:
1100b gọi là 1 nibble
1001 1001b gọi là 1 Byte
1010 1011 1100 1101b gọi là 1 Word
Trong dãy số nhị phân đƣợc biểu diễn thì số nhị phân sát phải gọi là bít LSB còn số nhị
phân sát trái gọi là bít MSB
Số nhị phân thƣờng đƣợc biểu diễn ở 2 dạng là số nhị phân có dấu và số nhị phân không
dấu, nếu số nhị phân không dấu sẽ chỉ biểu diễn các số không âm (0) còn số nhị phân có dấu thì
biểu diễn đƣợc cả giá trị âm
Ví dụ : (1101) = 1x2^3 + 1x2^2 + 0x2^1 + 1x2^0
= 8 + 4 + 0 + 1 = 13
Giải giá trị của các số có dấu 8 bit là: -128 đến 127
Giải giá trị của các số có dấu 16 bit là: -32768 đến 32767
Trong khi biểu diễn dãy số nhị phân có dấu thì ngƣời ta sử dụng bít MSB để quy ƣớc cho
bít dấu, với bít 0 cho dãy số nhị phân dƣơng còn bít 1 cho dãy số nhị phân âm.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
6
1.3.3. Hệ thống số bát phân (BCD-Binary Coded Decimal)
Số đếm BCD đƣợc định nghĩa là số thập phân nhƣng đƣợc biểu diễn dƣới dạng nhị phân
4 bít, nhƣng dãy số nhị phân 4 bít này khi quy sang hệ thập phân thì giá trị của nó phải 9
.Trong kỹ thuật điện tử nói chung thì mã BCD đƣợc sử dụng để giải mã hiển thị LED bảy
thanh
Ví dụ: (0011), (0100), (0101), (0110), (1001) ; đây gọi là số BCD không nén
Ví dụ: (00110100), (01010110), (01111000) ; đây gọi là số BCD nén
Dƣới đây là bảng các mã BCD
Thập phân BCD
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
Ví dụ: số 15 biểu diễn dƣới dạng BCD: 0001 0101
1.3.4. Hệ thống số thập lục (Hexadecimal)
Hệ đếm thập phân còn gọi là hệ đếm cơ số mƣời sáu và nó đƣợc biểu diễn bởi 16 ký số
(0,1,2,3,4,5,6,7,8,9,B,C,D,E,F) những con số này đƣợc sử dụng rất nhiều trong khoa học kỹ thuật
đặc biệt là khoa học máy tính vì biểu diễn mã Hexa rất ngắn gọn, khi biểu diễn số thập lục phân
thì sau dãy số phải có chữ H.
Ví dụ: 3978h , 12CCh, 1998h, ABCDh, 2008h
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
7
1.3.5. Số bù hai
Trong kỹ thuật Vi xử lý để biểu diễn một con số nào đó dƣới dạng dãy số nhị phân thì ngoài
việc biểu diễn số không dấu, số có dấu thì ngƣời ta còn sử dụng cách biểu diễn số bù 2. Vậy số
bù 2 sẽ biểu diễn nhƣ thế nào?
Ví dụ: Hãy biểu diễn dãy số A = 10011001 sang số bù 2 của nó:
b1: Tìm số bù 1 của A(bằng cách lấy bù tất cả các bit của A): 01100110
b2: Tìm số bù 2 của A (bằng cách lấy số bù 1 cộng cho 1) : 01100111
đến đây ta nhận thấy rằng số bù 2 của một số nào đó nó chính là số đối của nó và tổng =0
1.3.6. Các phép toán số học đối với hệ nhị phân
1.3.6.1. Phép cộng nhị phân không dấu
Quy ƣớc:
0 + 0 = 0
0 + 1 = 1
1 + 1 = 0 nhớ 1
Ví dụ: Cho 2 số nhị phân nhƣ sau A = 10010011 ; B = 00111001 hãy tìm tổng Y
của 2 số nhị phân đã cho
1.3.6.2. Phép trừ nhị phân
Quy ƣớc:
0 – 0 = 0
0 – 1 = 1 mƣợn 1
1 – 0 = 1
1 – 1 = 0
Ví dụ : Cho 2 số nhị phân nhƣ sau A = 10010011 ; B = 00111001 hãy tìm hiệu Z
của 2 số nhị phân đã cho (Lưu ý rằng phép trừ có thể thực hiện bằng cách biến thành phép cộng
bằng cách cộng với số bù 2 )
1.3.6.3. Phép nhân nhị phân
Ví dụ : Cho 2 số nhị phân nhƣ sau A = 00100101 ; B = 00000100 hãy tìm tích F
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
8
Khi nhân 2 dãy số nhị phân với nhau thì ta đặt phép toán nhân giống nhƣ nhân số
thập phân, kết quả của phép nhân 2 dãy số nhị phân 8 bít sẽ thu đƣợc dãy số nhị phân là 16 bít,
nhƣ vậy ta có F = A*B = 0000000010010100b
1.3.6.4. Phép chia nhị phân
Ví dụ : Cho 2 số nhị phân nhƣ sau A = 10010110 ; B = 00000100 hãy tìm thƣơng
Khi chia 2 dãy số nhị phân với nhau thì ta đặt phép toán chia cũng giống nhƣ khi chia
2 số thập phân, kết quả của phép chia cũng nhƣ phần dƣ (nếu có) thu đƣợc tƣơng tự nhƣ khi làm
phép chia đối với số thập phân, nhƣ vậy ta có M = A/B = 00100101b dƣ 0010b
1.3.7. Chuyển đổi qua lại giữa các hệ thống số
1.3.7.1. Chuyển đổi số thập phân sang nhị phân :
Để chuyển đổi số thập phân sang số nhị phân ngƣời ta thƣờng dùng phƣơng pháp lấy
số thập phân cần chuyển rồi chia 2 liên tiếp đến khi không thể chia đƣợc nữa thì dừng
Ví dụ : Chuyển số thập phân 25 sang số nhị phân không dấu
Chia 2 Thƣơng số Dƣ số
25/2 = 12 1 LSB
12/2 = 6 0
6/2 = 3 0
3/2 = 1 1
1/2 = 0 1 MSB
Kết quả thu đƣợc là: 11001 với số dƣ lần thứ nhất là bít có trọng số nhỏ nhất
1.3.7.2. Chuyển đổi số nhị phân sang thập phân
Để chuyển đổi số nhị phân sang số thập phân ngƣời ta thƣờng dùng phƣơng pháp lấy
tổng của tích n các số nhị phân cần chuyển nhân với 20 đến 2N-1 hay theo biểu thức tổng quát nhƣ
sau: A = B(N-1)* 2
(N-1)
+ B(N-2)* 2
(N-2)
+ B(N-3)* 2
(N-3)
+ + B(1)* 2
(1)
+ B(0)* 2
(0)
Ví dụ : Chuyển số nhị phân không dấu 01011110b sang số thập phân
A = 0*2
7
+ 1*2
6
+0*2
5
+ 1*2
4
+ 1*2
3
+ 1*2
2
+ 1*2
1
+ 0*2
0
= 94
nhƣ vậy ta có 01011110b = 94
1.3.7.3. Chuyển đổi số nhị phân sang Hexa :
Ví dụ : Chuyển số nhị phân 1100101011111110 sang số hexa
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
9
Trƣớc hết ta chia số nhị phân đã cho thành các nhóm 4-bit tính từ bít có trọng số nhỏ
nhất, sau đó thay thế mỗi nhóm 4-bit bằng ký hiệu hexa tƣơng ứng với nó ta sẽ thu đƣợc kết quả
nhƣ sau:
1100 1010 1111 1110 Kết quả
CAFEh
C A F E
1.3.7.4. Chuyển đổi số Hexa sang nhị phân:
Ví dụ : Chuyển số hexa 2F8h và ABBAh sang số nhị phân
Tƣơng tự nhƣ trƣờng hợp trên ta sẽ thay thế mỗi ký hiệu hexa bằng 4-bit nhị phân tƣơng ứng
với nó và ta sẽ thu đƣợc kết quả nhƣ sau: (tham khảo chuyển đổi nhị phân sang hexa).
1.3.7.5. Mã ASCII: (American Standard Code for Information Interchange )
Quá trình trao đổi thông tin trong máy tính nói chung cũng nhƣ quá trình xử lý thông tin
của các bộ vi xử lý, tất cả các thông tin đều đƣợc biểu diễn dƣới dạng các số 0 và 1. Mỗi tổ hợp
số 0 hoặc 1 đƣợc gán một ký tự chữ cái, chữ số hoặc một ký tự đặc biệt nào đó. Khi thông tin
đƣợc truyền đi, đƣợc lƣu giữ trong bộ nhớ và hiển thị trên màn hình đều ở dƣới dạng ký tự và
tuân theo một loại mã chuẩn đƣợc sử dụng rất rộng rãi gọi là mã ASCII.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
10
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
11
Chƣơng 2. CẤU TRÚC PHẦN CỨNG VÀ NGÔN NGỮ LẬP TRÌNH C
2.1 Cấu trúc phần cứng của vi điều khiển 8051
- Bộ vi điều khiển 8051 đƣợc Intel cho ra mắt năm 1981, bộ vi điều khiển này có 128 byte RAM,
4KB ROM, 2 bộ định thời, một cổng nối tiếp và 4 cổng 8 bít. Tất cả đều đƣợc tích hợp trên một
chíp.
- 8051 trở nên phổ biến sau khi Intel sau khi cho phép các nhà sản xuất khác sản xuất và bán bất
kỳ dạng biến thể nào của 8051 với điều kiện phải để mã chƣơng trình tƣơng thích với 8051. Từ
đó dẫn đến sự ra đời nhiều phiên bản của 8051 với tốc độ chíp và dung lƣợng bộ nhớ ROM.
Hình 2.1: Sơ đồ khối bộ vi điều khiển 8051
Bảng 2.1: Đặc điểm kỹ thuật cơ bản của một số thành viên họ 8051
2.2. Sơ đồ chân
- Các thành viên họ 8051 nhƣ 8751, 89C51, DS5000 đều có kiểu đóng vỏ khác nhau nhƣ:
Dạng hai hàng chân DIP (Dual in – line pakage)
Dạng vỏ dẹt vuông QFP (Quad Flat Pakage)
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
12
Dạng không có chân đỡ LLC (Leadless Chip Carrier)
Tất cả đều có 40 chân với các chức năng, vào ra I/O. đọc RD, ghi WR, địa chỉ, dữ liệu và ngắt.
Tuy nhiên, để đáp ứng các ứng dụng có yêu cầu hạn chế một số chíp đƣợc đóng gói 20 chân với
số cổng vào ra ít hơn.
Hình 2.2. Sơ đồ chân của vi điều khiển 8051.
2.2.1. Nhóm chân nguồn, dao động, điều khiển
- Vcc chân 40 cung cấp điện áp +5V cho chíp.
- GND chân số 20 nối với 0 V
- XTAL1, XTAL2 hai chân dao động đƣợc nối nhƣ sau:
Hình 2.3. Nối hai chân với nguồn dao động
là thạch anh
Hình 2.4. Nối hai chân với nguồn phát xung
ngoài
Chú ý: Khi nối với bộ phát xung ngoài, thì chân 18 (XTAL2) để hở.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
13
- RST khởi động lại (reset chân số 9): bình thƣờng chân này đƣợc nối với mass thông qua
điện trở, khi có xung cao đặt tới chân này thì bộ VĐK sẽ kết thúc mọi hoạt động hiện tại và tiến
hành khởi động lại.
Hình 2.5. Mạch nối chân Reset
- EA: (External Access chân 31) truy cập bộ nhớ ngoài: Đối với họ 8051 có ROM chƣơng
trình trên chíp thì chân EA đƣợc nối với nguồn Vcc. Trƣờng hợp không có ROM trên chíp nhƣ
8031 hoặc 8032 thì mã chƣơng trình thì lƣu cất ở bộ nhớ ROM ngoài, khi đó chân EA đƣợc nối
với mass. Nhƣ vậy, chân EA hoặc đƣợc nối với mass hoặc đƣợc nối với dƣơng nguồn, chứ
không bao giờ để hở.
Ví dụ:
Xác định chu kỳ máy với a) XTAL = 11.059MHz b) XTAL = 16MHz.
Giải:
a) 11.059 MHz/12= 921.6kHz.
Chu kỳ máy = 1/921.6Khz=1.085µs
b) 16MHz/12 = 1.333MHz
Chu kỳ máy = 1/1.333MHz =0.75 µs
- PSEN (chân 29 – program store enable): là chân cho phép cất chƣơng trình, khi
chƣơng trình đƣợc cất ở ROM ngoài thì chân này đƣợc nối tới chân OE của ROM.
- ALE (chân 30- Address Latch Enable): là chân có mức tích cực cao, chân này
đƣợc sử dụng để phân kênh địa chỉ và dữ liệu bằng cách nối tới chân G của chíp 74LS373.
2.2.2. Nhóm chân cổng vào ra
- 4 chân P0, P1, P2, P3 đều có 8 chân và tạo thành cổng 8 bít, tất cả các cổng khi Reset thì
đều đƣợc cấu hình làm cổng ra. Để làm đầu vào thì cần đƣợc lập trình.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
14
- Cổng P0: Bình thƣờng là cổng ra, để có thể vừa làm đầu ra vừa làm đầu vào thì mỗi chân
phải nối với điện trở kéo 10K. Vì P0 có dạng cực máng hở.
Hình 2.6: Cổng P0 luôn đƣợc nối với điện trở kéo khi làm cổng vào ra.
Mặc định P0 là cổng ra, để cấu hình P0 là cổng vào thì phải ghi 1 tới tất cả các bít của cổng bằng
câu lệnh: MOV P0,#0FFH
Ngoài ra, khi nối 8051/31 tới bộ nhớ ngoài thì P0 cung cấp cả địa chỉ và dữ liệu bằng
cách dồn kênh để tiết kiệm số chân. Chân ALE sẽ báo P0 có địa chỉ hay dữ liệu. Nếu ALE = 0
thì P0 cấp dữ liệu.
- Cổng P1: Sử dụng làm cổng vào ra, không cần điện trở kéo nhƣ cổng P0.
- Cổng P2: Sử dụng làm cổng vào ra giống nhƣ P1. Tuy nhiên ở 8031, khi truy cập 64 KB
bộ nhớ ngoài cần có bus địa chỉ 16 bít, khi đó P0 cung cấp 8 địa chỉ bít thấp qua A0~A7,
còn lại 8 bít địa chỉ cao A8~A15 do P2 cung cấp.
- Cổng P3: Sử dụng làm cổng vào ra giống nhƣ P0, P1, P2. Ngoài ra P3 còn có một số
chức năng quan trọng khác
2.3. Tổ chức không gian bộ nhớ
2.3.1. Bản đồ bộ nhớ ROM của 8051
- Do bộ đến chƣơng trình của 8051 là 16 bít nên không gian ROM tối đa có thể truy cập đƣợc là
64K.
- Dải địa chỉ của ROM từ 0000h ~FFFFH, lệnh đầu tiên của ROM chƣơng trình đều đặt ở 0000H
còn lệnh cuối cùng phụ thuộc vào dung lƣợng ROM trên chíp của mỗi thành viên họ 8051.
- Ví dụ :
Tìm địa chỉ bộ nhớ ROM của những thành viên họ 8051 sau đây.
a) AT 8951 ( hoặc 8751 ) với 4k byte.
b) DS 500032 với 32K byte.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
15
Giải:
a) Với 4k byte không gian nhớ ROM trên chip, ta có 4096 byte bằng 1000H ở dạng Hexa (
4 x 1024 = 4096D = 1000H ). Bộ nhớ này đƣuọc sắp xếp trong các ngăn nhớ từ 0000 đến
0FFFFH. Lƣu ý 0 luôn là ngăn nhớ đầu tiên.
b) Với 32k byte ta có 32.768 byte, ( 32 x 1024). Chuyển 32.768 về số Hexa ta nhận đƣợc
giá trị 8000H. Do vậy, không gian nhớ là dải từ 0000 đến 7FFFH.
Hình 2.7: Bộ vi xử lý và bộ vi điều khiển.
2.3.2. Tổ chức không gian bộ nhớ RAM của 8051
1. 128 byte RAM thấp
- Có đị chỉ từ 00~7FH và đƣợc chia thành các vùng sau:
- Ngăn nhớ từ 00H~1FH tổng cộng là 32 byte, đƣợc dành làm các băng thanh ghi và ngăn
xếp.
- Ngăn nhớ từ 20H~2FH tổng cộng 16 byte đƣợc dùng làm bộ nhớ đọc ghi định địa chỉ
đƣợc theo bit.
- Ngăn nhớ từ 30H~7FH tổng cộng 80 byte đƣợc dùng để lƣu thông tin khi đọc và ghi và
thƣờng đƣợc gọi là RAM bảng nháp
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
16
Hình 2.8: Tổ chức RAM của 8051
Băng thanh ghi của 8051: 32 byte này đƣợc chia làm 4 băng thanh ghi (0,1,2,3). Mỗi
băng thanh ghi có 8 thanh ghi từ R0~R7
Hình 2.9: các băng thanh ghi và địa chỉ RAM
2. 128 byte RAM cao
Vùng không gian RAM này đƣợc dành cho các thanh ghi đặc biệt
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
17
Hình 2.9. 128 byte RAM cao
2.4. Thanh ghi
- Thanh ghi của 8051 đƣợc dùng để lƣu tạm thời dữ liệu hoặc địa chỉ. Các thanh ghi này chủ
yếu có dữ liệu 8 bít và 8051 cũng chỉ có một kiểu dữ liệu 8 bít. Các bít của thanh ghi đƣợc xắp
xếp nhƣ hình sau:
- Trong đó bít D7 là bít có trọng số cao nhất (MSB), bít D0 là bít có trọng số thấp nhất
(LSB). Vì chỉ có một kiểu dữ liệu 8 bít, nên mọi dữ liệu lớn hơn 8 bít trƣớc khi xử lý đều đƣợc
chia thành các phần 8 bít. 8051 có nhiều thanh ghi nhƣng ở đây chúng ta chỉ đề cập tới một số
thanh ghi đa năng cơ bản sau
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
18
2.4.1. Thanh ghi tích luỹ A:
- Là thanh ghi 8 bít đƣợc sử dụng để lƣu giữ liệu tạm thời, thƣờng đƣợc sử dụng trong các
phép toán số học và logic.
D7 D6 D5 D4 D3 D2 D1 D0
2.4.2. Thanh ghi từ trạng thái PSW (hay còn gọi là thanh ghi cờ) :
- Là một thanh ghi 8 bít dùng để báo trạng thái của chƣơng trình
2.4.3. Thanh ghi điều khiển bộ đếm bộ định thời (TCON)
Tên bít Vị trí bít Mô tả
TF1 7 Cờ tràn T1, thiết lập và xóa bằng phần cứng
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
19
TR1 6 TR1 = 1 thì T1 chạy
TR1 = 0 thì T1 dừng
TF0 5 Cờ tràn T0, thiết lập và xóa bằng phần cứng
TR0 4 TR0 = 1 thì T0 chạy
TR0 = 0 thì T0 dừng
IE1 3 Cờ ngắt ngoài 1, thiết lập và xóa bằng phần cứng
IT1 2 IT1 = 1 kích hoạt ngắt ngoài 1 theo sƣờn xuống
IT1 = 0 kích hoạt ngắt ngoài 1 theo mức thấp (mặc định)
IE0 1 Cờ ngắt ngoài 0, thiết lập và xóa bằng phần cứng
IT0 0 IT0 = 1 kích hoạt ngắt ngoài 0 theo sƣờn xuống
IT0 = 0 kích hoạt ngắt ngoài 0 theo mức thấp (mặc định)
2.4.4. Thanh ghi điều khiển chế độ bộ định thời/bộ đếm (TMOD)
T/C1 T/C0
GATE C/T M1 M0 GATE C/T M1 M0
- GATE = 1: T/Cx (x = 0, 1) chạy chỉ khi chân INTx là HIGHT.
- GATE = 0: T/Cx (x = 0, 1) chạy chỉ khi TRx = 1.
- C/T = 0: Chức năng định thời (timer) đƣợc chọn
- C/T = 1: Chức năng đếm xung ngoài (counter) đƣợc chọn.
- M1 M0: hai bít lựa chọn chế độ của bộ định thời
M1 M0 Chế độ hoạt động
0 0 Bộ định thời 13 bít
0 1 Bộ định thời/bộ đếm 16 bít
1 0 Bộ định thời/bộ đếm 8 bit tự động nạp lại
1 1 Hai bộ định thời 8 bít
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
20
2.4.5. Thanh ghi cho phép ngắt IE
EA - - ES ET1 EX1 ET0 EX0
- EA = 0: Không ngắt nào đƣợc chấp nhận
- EA = 1: Mỗi nguồn ngắt đƣợc cho phép hoặc cấm một cách riêng biệt bằng cách thiết lập
hoặc xóa bit tƣơng ứng đƣợc cho ra dƣới đây.
ES: Bit cho phép ngắt truyền thông nối tiếp
ET1: Bit cho phép ngắt T1
EX1: Bit cho phép ngắt ngoài 1
ET0: Bit cho phép ngắt T0
EX0: Bit cho phép ngắt ngoài 0
2.5. Ngôn ngữ lập trình C cho vi điều khiển
2.5.1. Cấu trúc một chƣơng trình trong C
// khai báo thƣ viện
#include
#include
//================================================
// Khai báo biến toàn cục
unsigned char x,y;
int z;
long n = 0;
//=================================================
// khai báo và định nghĩa các hàm
void HAM1 (void)
{
// viết các câu lệnh
}
//=================================================
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
21
void HAM2 (unsigned char x)
{
// viết các câu lệnh
}
//==================================================
// Hàm chính bắt buộc chƣơng trình nào cũng phải có
void main (void)
{
// viết các câu lệnh
}
2.5.2. Lời chú thích
- Nếu lời giải thích trên một dòng thì có thể dùng dấu: “//”
- Nếu lời giải thích trên nhiều dòng thì có thể dùng dấu: mở đầu bằng /* và kết thúc bằng
*/
Ví dụ:
/* - đây là chƣơng trình điều khiển LED đơn viết cho vi điều khiển
- Sử dụng vi điều khiển 8051
*/
2.5.3. Các loại kiểu dữ liệu trong C
Bảng 1: Các kiểu dữ liệu trong C.
Tên kiểu dữ liệu (Data type) Số byte Khoảng dữ liệu (Range)
char 1 –127 to 127 or 0 to 255
unsigned char 1 0 to 255
signed char 1 –127 to 127
int 2 –32,767 to 32,767
unsigned int 2 0 to 65,535
signed int 2 Nhƣ kiểu int
short int 2 Nhƣ kiểu int
unsigned short int 2 0 to 65,535
signed short int 2 Nhƣ kiểu short int
long int 4 –2,147,483,647 to
2,147,483,647
signed long int 4 Nhƣ kiểu long int
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
22
Tên kiểu dữ liệu (Data type) Số byte Khoảng dữ liệu (Range)
unsigned long int 4 0 to 4,294,967,295
long long int 8 –(263–1) to 263–1 (C99 only)
signed long long int 8 same as long long int (C99
only)
unsigned long long int 8 0 to 2
64–1 (C99 only)
float 4 6 digits of precision
double 8 10 digits of precision
long double 12 10 digits of precision
- Cách khai báo biến: Kiểu_dữ_liệu Tên_biến;
Ví dụ:
unsigned char x;
hoặc
unsigned char x =0; // khai báo cộng khởi tạo giá trị ban đầu
- Cũng có thể khai báo nhiều biến cùng một kiểu dữ liệu trên một dòng:
unsigned char x, y, z;
- Ngoài ra để dùng cho vi điều khiển trình dịch chuyên dụng còn hỗ trợ các loại biến sau:
Dạng biến Số bít Số byte Miền giá trị
bit 1 0 0;1
sbit 1 0 0;1
sfr 8 1 0 đến 255
sf16 16 2 0 đến 65535
- sbit: Kiểu dữ liệu này đƣợc đƣa ra để dung cho họ 8051 và đƣợc dùng để khai báo một bít
riêng lẻ bên trong SFR của họ 8051. Thí dụ, khi ta sử dụng kiểu dữ liệu này ta có thể truy nhập
lên các bít riêng biệt của một cổng I/O.
- ví dụ: sbit switch = P3^1; // biến switch đƣợc gán tới bít 3 của cổng 1.
- sfr: kiểu dữ liệu này tƣơng tự với sbit nhƣng đƣợc sử dụng để khai báo các biến kiểu 8 bít.
- ví du: sfr P1 = 0x09; // địa chỉ 0x90 đƣợc gán cho P1
Sfr P2 = 0xA0;// địa chỉ 0xA0 đƣợc gán cho P2
Unsigned char my_data;
My_data = P1;
P2 = my_data++;
- sfr16: kiểu dữ liệu này tƣơng tự với sfr nhƣng đƣợc sử dụng để khai báo các biến 16 bit. Khi sử
dụng kiểu dữ liệu này, byte thấp sẽ đi trƣớc byte cao.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
23
- thí dụ bộ định thời T2 của vi điều khiển 8052 sử dụng các địa chỉ 0xCC và 0xCD cho các byte
thấp (LOW) và cao (HIGH). Ta có thể khai báo biến T2 để truy cập:
- sfr16 T2 = 0xCC; // Timer 2, T2L = CC, T2H = CD
- T2 = 0xAE01; // ghi giá trị 0xAE01 vào timer 1;
2.5.4. Các hàm trong C
Có hai loại hàm trong C và có cấu trúc nhƣ sau:
- Hàm trả lại giá trị
Kiểu giá trị hàm trả lại Tên hàm (biến truyền vào hàm)
{
// các lệnh xử lý ở đây
}
Ví dụ:
Unsigned int Cong (unsigned int x, unsigned int y, unsigned int z)
{
z = x + y;
return z;
}
- Hàm không trả lại giá trị
void Tên hàm (biến truyền vào hàm)
{
//
}
- Hàm có thể truyền vào biến hoặc không
Ví dụ
unsigned char TenHam(void)
{
//viết các câu lệnh trong than này
}
- Hàm có biến truyền vào
void TenHam(unsigned char x)
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
24
{
//viết các câu lệnh trong thân này
}
- Ngoài ra riêng cho vi điều khiển phần mềm KeilC còn có một hàm phụ phụ ngắt có cấu
trúc nhƣ sau:
void TenHam(void)interrupt Nguồn_Ngắt using băng_thanh_ghi
{
// viết các lệnh ở đây
}
- Chú ý:
+ Hàm ngắt không đƣợc phép trả lại giá trị hay truyền tham biến vào hàm
+ Tên hàm có thể đặt bất kỳ
+ interrupt là từ khóa chỉ hàm ngắt
2.5.5. Các toán tử
Toán tử là những ký hiệu báo cho trình biên dịch các nhiệm vụ cần thực hiện, các bảng bên
dƣới tóm tắt các toán tử C dùng cho lập trình:
Bảng 1. Toán tử đại số
Bảng 2. Toán tử truy cập và kích thước
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
25
Bảng 3. Toán tử logic và quan hệ
Bảng 4. Toán tử thao tác bít
Bảng 5. Các toán tử khác
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
26
2.5.6. Phép toán lấy địa chỉ biến (&)
Bộ nhớ máy tính bao gồm nhiều byte đƣợc đánh số từ 0 tới giới hạn của bộ nhớ. Các số
này đƣợc gọi là số thứ tự và cũng là địa chỉ của các byte bộ nhớ. Mỗi biến đƣợc khai báo sẽ
chiếm giữ một vùng nào đó trong bộ nhớ và địa chỉ của nó là địa chỉ của byte đầu tiên trong
vùng nhớ đó.
Để xác định địa chỉ biến ngƣời ta sử dụng phép toán một ngôi & đặt trƣớc biến.
Ví dụ: int I;
&i;
Xác định cho ta địa chỉ của vùng nhớ 2 byte có tên là i. Không thể sử dụng phép toán & này cho
các đối tượng khác như hằng số, biểu thức.
2.5.7. Phép toán chuyển đổi kiểu (bắt buộc)
Ta có thể chuyển đổi một kiểu bất kỳ sang kiểu mong muốn bằng cách dùng toán tử
chuyển kiểu bắt buộc theo quy tắc nhƣ sau:
()
Trong đó có thể là tên của một kiểu dữ liệu nào đó đã đƣợc định nghĩa trƣớc nhƣ
là int; float; char
Ví dụ: long n = 2520.40;
(int) n;
Thì sau lệnh này n = 2520
Chuyển đổi kiểu tự động tuân thao sơ đồ sau:
Char >>int>>long>>float>>double>>long double
2.5.8. Các định dạng
Định dạng Áp dụng cho
kiểu dữ liệu
Ghi chú
%d int Đối là một số nguyên
%i int Đối đƣợc coi là hệ 10 có dấu (nếu giá trị âm)
%o int Đối đƣợc coi là số nguyên hệ 8 không dấu
%u int Đối là số nguyên không dấu
%x int Đối là số nguyên hệ 16 không dấu (không có 0x đứng
trƣớc)
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
27
%X int Số nguyên hệ 16 với các chữ số là A,B,C,D,E,F
%e, %E float,double Đối số đƣợc chuyển sang dạng thập phân dấu chấm động
%f, %lf float,double Đối số đƣợc chuyển sang dạng thập phân dẫu phẩy tĩnh
%g, %G float,double Đối số đƣợc chuyển sang dạng thập phân dấu phẩy tĩnh
hay động tùy thuộc vào loại nào ngắn hơn
%c char Đối số là một ký tự
%s char* Đối số là một xâu ký tự
2.5.9. Cấu trúc điều khiển
2.5.9.1. Cấu trúc rẽ nhánh
If (điều kiện) {
Statement1;
Statement2;
}
f (điều kiện) {
Statement1;
Statement2;
}else {
Statement1;
Statement2;
}
2.5.9.2. Cấu trúc lựa chọn switch
switch(biến)
{
Case giá_trị_1: {//các câu lệnh; break;}
Case giá_trị_2: {//các câu lệnh; break;}
Case giá_trị_3: {//các câu lệnh; break;}
case: giá_trị_n {//các câu lệnh; break;}
}
Hoạt động của cấu trúc này nhƣ sau: tùy vào giá trị của biến là:giá_trị_1 hay giá_trị_2thì thực
hiện các câu lệnh tƣơng ứng sau đó thoát nhờ lệnh break;
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
28
2.5.9.3. Vòng lặp có hạn for
for (i=giá_trị_ban_đầu; i<giá_trị_số_lần_lặp;
i++)
{
//viết các câu lệnh ở đây
}
2.5.9.4. Vòng lặp không xác định while
While (điều_kiện)
{
// Viết các câu lệnh ở đây
}
- Hoạt động nhƣ sau: nếu điều kiện đúng thì thực hiện các câu lệnh trong than vòng while,
còn nếu điều kiện sai thì bỏ qua vòng lặp.
2.5.9.5. Một số thƣ viện chuẩn của C
tệp *.h Giải thích chứa những gì
Các hàm nguyên mẫu và các thông tin liên quan của các hàm thƣ viện
vào/ra chuẩn của C++ (cout, cin)
Các macro và thông tin trợ giúp lập trình debbug
Các hàm nguyên mẫu của các hàm kiểm tra một số thuộc tính của các kí
tự, hay chuyển kí tự giữa chữ hoa và chữ thƣờng
Các macro hiển thị các thông tin về lỗi
Các giới hạn của số dấu phẩy động của hệ thống
Các giới hạn của hệ thống
Các hàm và các thông tin liên quan đến việc thay đổi ngôn ngữ và mã
nƣớc của chƣơng trình đang chạy
Các hàm nguyên mẫu của các hàm thƣ viện toán học
Các hàm nguyên mẫu của các hàm cho phép bỏ qua lời gọi hàm thông
thƣờng và trả quyền điều khiển lại một vị trí khác
Các hàm nguyên mẫu và các macro điều khiển các điều kiện khác nhau
có thể xuất hiện trong quá trình thực hiện chƣơng trình
Định nghĩa các macro làm việc với danh sách các tham số đối với những
hàm mà số lƣợng và kiểu của tham số là không biết
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
29
Định nghĩa các kiểu chung dùng để thực hiện tính toán
Các hàm nguyên mẫu và các thông tin liên quan của các hàm thƣ viện
vào/ra chuẩn (printf, scanf)
Các hàm nguyên mẫu và các thông tin liên quan của các hàm chuyển
kiểu, cung cấp bộ nhớ, tạo số ngẫu nhiên ...
Các hàm nguyên mẫu của các hàm xử lý xâu
Các hàm nguyên mẫu và kiểu dữ liệu cho thao tác thời gian
2.5.9.6. Các từ khóa trong C
auto break case union
char while continue default
do double else unsigned
extern typedef float for
goto sizeof if int
static long struct void
register return short signed
switch
2.5.9.10. con trỏ và mảng
1. Mảng
a. Khái niệm
Mảng (array) là một dãy liên tiếp các phần tử trong bộ nhớ, mỗi phần tử chứa dữ liệu
cùng một kiểu. Một mảng số nguyên gồm các phần tử là các biến số nguyên.
Kích thƣớc của mảng chính là số các phần tử trong mảng. Kích thƣớc này phải đƣợc khai
báo tƣờng minh trong phần khai báo mảng vì nó xác định vị trí và kích thƣớc của vùng nhớ trong
bộ nhớ trong đƣợc cấp phát cho mảng
b. Khai báo mảng
[kích_thước_mảng];
Ví dụ: int ti[7];
Hoặc:
int ti[7] ={1,2,3,4,5,6,7};
c. Truy cập vào các phần tử của mảng
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
30
Mỗi phần tử mảng đƣợc truy cập thông qua tên biến mảng và chỉ số tƣơng ứng, phần tử
đầu tiên có chỉ số là 0
Ví dụ
int ti[7];
ti[0]- là phần tử đầu tiên
ti[1]- là phần tử thứ 2
ti[2]- là phần tử thứ 3
Và ta có thể gán cho từng phần tử của mảng một giá trị
ti[1] =5;
d. Mảng nhiều chiều
- Khai báo
float tb[10][20];
ví dụ:
int t2i[3,4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
2. Xâu ký tự
a. Khai báo xâu ký tự
Một biến xâu ký tự đƣợc khai báo tƣơng tự nhƣ một mảng một chiều chứa các ký tự.
char str[10];
- Khai báo xâu ký tự
char str[6]=”abc”;
hoặc str[6]=(„a‟,‟b‟,‟c‟);
sự khác biệt giữa mảng ký tự và xâu ký tự là trong xâu ký tự có ký tự kết thúc NUL hay
„\0‟. Đây là các căn cứ của các thao tác xâu nhƣ: tính chiều dài, cộng xâu Một biến xâu ký tự
muốn có chiều dài 9 phải đƣợc khai báo nhƣ một mảng ký tự có 10 phần tử
str[0] „a‟
str[1] „b‟
str[2] „c‟
str[3] „d‟
str[4] „e‟
str[5] „f‟
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
31
str[6] „g‟
str[7] „h‟
str[8] „\0‟
str[9]
Trong hình vẽ trên, các ký tự str[8], str[9] không có vai trò gì trong các thao tác trên xâu
str.
Cần phân biệt giữa ký tự và xâu ký tự chứa một ký tự, ví dụ „A‟ là ký tự „A‟ đƣợc mã hóa
bằng 1 byte, trong khi “A” là một xâu ký tự chứa ký tự „A‟ xâu này đƣợc mã hóa bằng 2 byte
cho ký tự „A‟ và ký tự „\0‟
Trong C không tồn tại các phép toán so sánh, gán nội dung của xâu này cho xâu khác.
3. Con trỏ (pointer)
a. Khái niệm
Một con trỏ là một biến/hằng có giá trị (nội dung) là địa chỉ của một đối tƣợng khác; đối
tƣợng ở đây có thể là một biến hoặc một hàm mà không thể là một hằng.
- Khai báo một biến con trỏ theo mẫu sau:
Kiểu_dữ_liệu *Tên_con_trỏ;
Ví dụ: int *pi, qi;
b. Toán tử & và *
- Toán tử một ngôi & cho ta địa chỉ của một biến, còn biến con trỏ có giá trị là địa chỉ của một
biến, nhƣ vậy:
int n, *pi;
pi=&n;
là hợp lệ, nó gán địa chỉ của biến nguyên n cho con trỏ nguyên pi. Khi đó ta có thể nói rằng pi
chỏ đến n.
- Nhƣ vậy, khi pi chỉ đến n ta sẽ có 2 cách để mô tả giá trị của n hoặc trực tiếp bằng tên
của biến nhƣ truyền thống hoặc bằng toán tử một ngôi * lên biến pi.
Ví dụ: *pi=3; // có tác dụng gán giá trị 3 cho biến n
*pi = *pi+10;//thì thêm 10 vào n
m = *pi + 10;
*pi +=1;
++*pi;
(*pi)++;// Dấu ngoặc bắt buộc phải có nếu không có nghĩa là chúng ta tăng giá trị của pi chứ
không phải giá trị của đối tượng mà pi trỏ tới.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
32
c. Các phép toán trên con trỏ
- Phép gán trên hai con trỏ cùng kiểu
- Chỉ có thể gán địa chỉ một biến nguyên cho một con trỏ nguyên, cũng vậy không thể gán giá trị
của một con trỏ nguyên cho một con trỏ thực.
qi=pi;//pi,qi xác định cùng một biến n như vậy *pi,*qi,n là một
pf=&n; hoặc pf=pi;// là không hợp lệ vì khác kiểu
- Tuy nhiên ta có thể sử dụng phƣơng pháp chuyển đổi kiểu
pf=(float*)&m;
pf=(float*)pi;
- Phép cộng con trỏ với số nguyên
- m,n,p là ba biến nguyên khai báo lien tiếp nhau. Khi đó m,n,p sẽ tƣơng ứng với 3 vùng nhớ
2 byte liên tiếp nhau. Và con trỏ pi trỏ đến biến n.
- Phép cộng con trỏ pi+1 sẽ cho ta địa chỉ của số nguyên m đi ngay trƣớc còn pi+(-1) cho ta
địa chỉ của số nguyên p đi liền sau .
- Việc cộng trừ một con trỏ với một số nguyên có ý nghĩa trực quan nhƣ sau: nếu ta so sánh
con trỏ với địa chỉ các ngôi nhà trên một con đƣờng, mỗi ngôi nhà là một biến có địa chỉ nào đó
thì các địa chỉ này đƣợc đánh số tăng dần theo một chiều nhất định. Biết địa chỉ của nhà này, ta
có thể tính đƣợc địa chỉ của nhà bên cạnh bằng cách cộng hoặc trừ 1. Điều đó có nghĩa là khi
cộng hoặc trừ con trỏ với một số nguyên n ta sẽ đƣợc một địa chỉ mới chỉ đến một biến khác nằm
cách biến trƣớc đó n vị trí.
4. Liên hệ giữa con trỏ và mảng
a. Con trỏ và mảng một chiều
- Xét chỉ thị
int a[10];
- khai báo này sẽ xin cấp phát một vùng nhớ 10 số nguyên a[0], a[1], có địa chỉ xác định
bởi a. Vậy a chính là địa chỉ của biến nguyên a[0], do vậy nếu pi là một con trỏ nguyên
thì phép gán sau đây là hợp lệ:
pi=a;
- Nhƣ vậy sau phép gán này ta có thể sử dụng pi nhƣ một tên mảng: pi[0], pi[1], tƣơng
ứng là a[0], a[1],
b. Con trỏ đa cấp và mảng nhiều chiều
int **ppi;
int a2[10][10];
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
33
- Ta có thể thực hiện phép gán
ppi=a2;
2.6. Thuật toán và lƣu đồ thuật toán
2.6.1. Khái niệm
Thuật toán, còn gọi là giải thuật là một khái niệm cơ sở của Toán học và Tin học. Hiểu một
cách đơn giản, thuật toán là một tập hợp các hƣớng dẫn nhằm thực hiện một công việc nào đó.
Đối với việc giải quyết một vấn đề - bài toán thì thuật toán có thể hiểu là một tập hữu hạn các
hƣớng dẫn rõ ràng để ngƣời giải toán có thể theo đó mà giải quyết đƣợc vấn đề. Nhƣ vậy, thuật
toán là một phƣơng pháp thể hiện lời giải của vấn đề - bài toán
Việc nghiên cứu về thuật toán có vai trò rất quan trọng trong khoa học máy tính vì máy tính chỉ
giải quyết đƣợc vấn đề khi đã có hƣớng dẫn giải rõ ràng và đúng. Nếu hƣớng dẫn giải sai hoặc
không rõ ràng thì máy tính không thể giải đúng đƣợc bài toán. Trong khoa học máy tính, thuật
toán đƣợc định nghĩa là một dãy hữu hạn các bước không mập mờ và có thể thực thi được, quá
trình hành động theo các bước này phải dừng và cho được kết quả như mong muốn
2.6.2. Biểu diễn thuật toán bằng sơ đồ khối
Sơ đồ khối (còn gọi là lƣu đồ) là một hình ảnh minh họa cho giải thuật. Nó vẽ ra biểu đồ của
luồng chỉ thị hay những hoạt động trong một tiến trình. Mỗi hoạt động nhƣ vậy đƣợc biểu diễn
qua những ký hiệu.
Các quy ƣớc của lƣu đồ thuật toán:
+ Bắt đầu và kết thúc
+ Đƣờng hƣớng diễn tiến:
+ Khối công việc tuần tự:
+ Khối nhập/xuất dữ liệu:
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
34
+ Khối rẽ nhánh
+ Lời gọi chƣơng trình con
+ Ví dụ: Xây dựng lƣu đồ thuật toán cho bài toán tính tổng 2 số tự nhiên đƣợc nhập từ bàn phím,
sau đó in kết quả ra màn hình
CHƢƠNG 3. LẬP TRÌNH ỨNG DỤNG
3.1. Các bƣớc tạo một Project mới
Bƣớc 1: Tạo project mới
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
35
Bƣớc 2: Đặt tên bài tập
Bƣớc 3: Chọn linh kiện
Chọn AT89C51
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
36
Bƣớc 5: Chọn No
Bƣớc 6
Bƣớc 7
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
37
Bƣớc 8: Dat tên file (file_name.c) bắt buộc phải có đuôi mở rộng “.c”
Bƣớc 9: Kích chuột phải vào “Source Group1 – chọn Add files...” nhƣ hình dƣới
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
38
Bƣớc 10:
Bƣớc 11
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
39
Bƣớc 12
Bƣớc 13
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
40
Bƣớc 14 : Nhấn F7 để dịch ra file Hex là xong
3.2. Lập trình ứng dụng.
3.2.1. Chƣơng trình tạo trễ
void delay (long time)
{
long count;
for (count =0; count <time; count <++)
{}; // khong lam gi
}
3.2.2. Ứng dụng điều khiển LED đơn
Lập trình điều khiển LED đơn nối tới chân
P2.0 sáng/tắt. Quá trình này được lặp đi lặp
lại.
#include
#define SANG 1
#define TAT 0
sbit LED = P2^0; // khai bao bien
// chuong trinh con tao tre
void delay (long time)
{
long count;
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
41
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D1
LED-YELLOW
for (count =0; count ++; count < time)
{}; // khong lam gi
}
// Chuong trinh chinh
void main (void)
{
while(1)// vong lap vo han
{
LED = SANG;
delay(1000000);
LED = TAT;
delay(1000000);
}
}
3.2.3. Ứng dụng điều khiển 8 LED đơn
Lập trình điều khiển 8 LED đơn sang theo quy luật từ D1 đến D8.
D1
D2
D3
D4
D5
D6
D7
D8
D
1
D
2
D
3
D
4
D
5
D
6
D
7
D
8
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D1
LED-YELLOW
D2
LED-YELLOW
D3
LED-YELLOW
D4
LED-YELLOW
D5
LED-YELLOW
D6
ED-YELLOW
D7
LED-YELLOW
D8
LED-YELLOW
Sử dụng chương trình con:
#include
#define SANG 1
#define TAT 0
sbit LED1 = P2^0; // khai bao bien
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
// Tat ta cac lED
void Off_LED(void)
{
LED1 = TAT;
LED2 = TAT;
LED3 = TAT;
LED4 = TAT;
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
42
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
// chuong trinh con tao tre
void delay (long time)
{
long count;
for (count =0; count<time; count++)
{}; // khong lam gi
}
//CTC LED 1 sang
void D1 (void)
{
LED1 = SANG;
}
//CTC LED 2 sang
void D2 (void)
{
LED2 = SANG;
}
//CTC LED 3 sang
void D3 (void)
{
LED3 = SANG;
}
//CTC LED 4 sang
void D4 (void)
{
LED4 = SANG;
}
//CTC LED 5 sang
void D5 (void)
{
LED5 = SANG;
}
//CTC LED 6 sang
void D6 (void)
{
LED6 = SANG;
}
//CTC LED 7 sang
void D7 (void)
{
LED7 = SANG;
}
//CTC LED 8 sang
void D8 (void)
{
LED8 = SANG;
}
LED5 = TAT;
LED6 = TAT;
LED7 = TAT;
LED8 = TAT;
}
// Chuong trinh chinh
void main (void)
{
while(1)// vong lap vo han
{
Off_LED();
delay(1000000);
D1();
delay(1000000);
D2();
delay(1000000);
D3();
delay(1000000);
D4();
delay(1000000);
D5();
delay(1000000);
D6();
delay(1000000);
D7();
delay(1000000);
D8();
delay(1000000);
}
}
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
43
Sử dụng khai báo mảng giá trị:
#include
unsigned char LED_array[8] =
{1,2,4,8,16,32,64,128};
void delay(long time)
{
long count;
for(count=0;count<time;count++)
{};
}
// Chuong trinh chinh
main()
{
unsigned char i = 1;
while(1)// vong lap vo han
{
for(i=0;i<8;i++)
{
P2 =
LED_array[i];
delay(5000);
}
}
}
3.2.4. Ứng dụng điều khiển LED 7 thanh
Hình. Sơ đồ chân và hình dạng thực tế củaLed 7seg.
Led 7 đoạn có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo hình số 8 và có thêm
một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dƣới, bên phải của led 7 đoạn. Tám led
đơn trên led 7 đoạn có Anode (cực +) hoặc Cathode (cực -) đƣợc nối chung với nhau vào một
điểm, đƣợc đƣa chân ra ngoài để kết nối với mạch điện. Tám cực còn lại trên mỗi led đơn đƣợc
đƣa thành 8 chân riêng, cũng đƣợc đƣa ra ngoài để kết nối với mạch điện. Nếu led 7 đoạn có
Anode(cực +) chung, đầu chung này đƣợc nối với +Vcc, các chân còn lại dùng để điều khiển
trạng thái sáng tắt của các led đơn, led chỉ sáng khi tín hiệu đặt vào các chân này ở mức 0. Nếu
led 7 đoạn có Cathode (cực -) chung, đầu chung này đƣợc nối xuống Ground (hay Mass), các
chân còn lại dùng để điều khiển trạng thái sáng tắt của các led đơn, led chỉ sáng khi tín hiệu đặt
vào các chân này ở mức 1. Giả sử khi cấp nguồn cho chân nào thì đoạn tƣơng ứng với chân đó
sáng ví dụ nhƣ nếu đƣa chân A lên mức logic 1 thì đoạn A sáng (mức logic 1 tƣơng ứng với mức
điện áp cao). Nếu cấp nguồn cho E và F thì đoạn E F sáng tạo thành số 1. Nếu làm tƣơng tự với
số 2 thì mức logic tƣơng ứng ABCDEFG là 1101101 số 3 là 1111001 và số 4 là 0110011. Các số
còn lại làm tƣơng tự ta sẽ có led hiển thị đƣợc các số từ 0 đến 7.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
44
Hình 2.11. Hình dạng thực tế của Led 7seg 4 số
Bảng 2.3.Mã hiện thị led 7 đoạn Anot chung.
Số hiển thị trên led 7
seg
Mã hiển thị led 7 seg
dạng nhị phân
Mã hiển thị led 7 seg
dạng thập lục phân
0 11000000 C0
1 11111001 F9
2 10100100 A4
3 10110000 B0
4 10011001 99
5 10010010 92
6 11000010 82
7 11111000 F8
8 10000000 80
9 10010000 90
A 10001000 88
B 10000011 83
C 11000110 C6
D 10100001 A1
E 10000110 86
F 10001110 8E
- 10111111 BF
Phương án 1: sử dụng IC giải mã LED 7 thanh 74LS47
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
45
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
A
7
QA
13
B
1
QB
12
C
2
QC
11
D
6
QD
10
BI/RBO
4
QE
9
RBI
5
QF
15
LT
3
QG
14
U2
74LS47
#include
unsigned char LED_array[9] = {1,2,3,4,5,6,7,8,9};
void delay(long time)
{
long count;
for(count=0;count<time;count++)
{};
}
// Chuong trinh chinh
main()
{
unsigned char i = 1;
while(1)// vong lap vo han
{
for(i=0;i<10;i++)
{
P2 = LED_array[i];
delay(5000);
}
}
}
Phương án 2: Không sử dụng mạch IC giải mã
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
46
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
#include
unsigned char LED_array[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(long time)
{
long count;
for(count=0;count<time;count++)
{};
}
// Chuong trinh chinh
main()
{
unsigned char i = 1;
while(1)// vong lap vo han
{
for(i=0;i<+10;i++)
{
P2 = LED_array[i];
delay(5000);
}
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
47
}
}
3.2.5. Ứng dụng điều khiển LED ma trận
Hình 2.9. Cấu tạo và hình dạng thực tế của Led matrix.
Dựa trên nguyên tắc nhƣ quét màn hình, có thể thực hiện việc hiển thị ma trận đèn bằng cách
quét theo hàng và quét theo cột. Mỗi Led trên ma trận Led có thể coi nhƣ một điểm ảnh. Điểm
ảnh này sẽ đƣợc xác định trạng thái nhờ dữ liệu đƣa ra từ bộ vi điều khiển Atmega16. Một ma
trận Led 8x8 đơn sắc bao gồm 64 điểm sáng đƣợc bố trí thành 8 hàng x 8 cột. Còn led đa sắc
chia thành các loại 3 màu (24 chân) 7 màu (32 chân) trong đó mỗi điểm sáng gồm một Led màu
xanh lục + một Led màu đỏ. Điểm sáng hiển thị màu xanh nếu Led đỏ tắt, màu đỏ nếu Led xanh
tắt, màu vàng nếu cả hai Led sáng và tắt nếu cả hai Led cùng tắt.Trong cùng một hàng, các catot
của các Led màu xanh đƣợc nối với nhau để tạo thành một đƣờng dây hàng thứ nhất và các catot
của các Led màu đỏ đƣợc nối với nhau để tạo thành một đƣờng dây thứ hai. Các anot của mƣời
sáu Led trong cùng một cột đƣợc nối với nhau để tạo thành một đƣờng dây cột. Nhƣ vậy muốn
một Led trong ma trận sáng ta cần cấp nguồn cho Led vào dƣờng dây hàng và đƣờng dây cột
tƣơng ứng với Led đó.
- Ví du: Lập trình hiển thị số 4 trên LED ma trân 8x8
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
48
C0
C1
C2
C3
C4
H0
H1
H2
H3
H4
H5
H6
H7
C5
C6
C7
C
0
C
1
C
2
C
3
C
4
C
5
C
6
C
7
H
0
H
1
H
2
H
3
H
4
H
5
H
6
H
7
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
#include
unsigned char LED_array[8] = { 0x30,0x28,0x24,0x22,0x21,0xFF,0x20,0x20 };// so 4
unsigned char control_LED[8]={1,2,4,8,16,32,64,128};
void delay(long time)
{
long count;
for(count=0;count<time;count++)
{};
}
// Chuong trinh chinh
main()
{
unsigned char i;
while(1)// vong lap vo han
{
for(i=0;i<8;i++)
{
P2 = control_LED[i];
P3 = LED_array[i];
delay(100);
}
}
}
3.2.6. Ứng dụng sử dụng nút nhấn
Bàn phím đƣợc sử dụng trong rất nhiều các thiết bị, để giúp ngƣời sử dụng lựa chọncácchức
năng của thiết bị. Có thể nói giao tiếp bàn phím là một ứng dụng khá quan trọng.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
49
Phím bấm thông dụng nhất có cấu tạo gồm 2 đầu tiếp xúc, mỗi khi chúng ta bấm phím, 2 đầu này
sẽ chạm vào nhau (xem hình vẽ ở bên dƣới). Ngoài ra còn nhiều loại phím bấm khác, và cấu tạo
cũng khác, có thể là phím bấm thƣờng đóng, khi ta bấm phím thì 2 đầu tiếp xúc không thông
nhau. Hoặc cũng có loại phím bấm cảm ứng, dựa trên sự thay đổi điện trở của màng điện trở,
hoặc dựa trên sự thay đổi điện dung hay điện cảm mỗi khi có tay ngƣời chạm vào.
Hình 2.17. Hình dạng thực tế của phím bấm
- Ví dụ 1: lập trình đếm số lần nhấn nút và hiển thị ra cổng P2. Nút nhấn nối tới chân P1.0
D0
D1
D2
D3
D4
D5
D6
D7
D
0
D
1
D
2
D
3
D
4
D
5
D
6
D
7
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D1
LED-YELLOW
D2
ED-YELLOW
D3
ED-YELLOW
D4
ED-YELLOW
D5
ED-YELLOW
D6
ED-YELLOW
D7
ED-YELLOW
D8
ED-YELLOW
#include
unsigned char k,i;
// chuong trinh con tao tre
void delay(long time)
{
long count;
for(count=0;count<time;count++)
{};
}
// Chuong trinh con kiem tra phim
unsigned char button (void)
{
if(P1_0 == 0)
{
delay(200); // khu nhieu
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
50
while(P1_0==0)
{};//khong lam gi, doi nha phim
i++;
}
return i;
}
// Chuong trinh chinh
main()
{
P1 =0xff;// P1 lam cong vao
P2 = 0x00;
while(1)// vong lap vo han
{
P2 = button();
}
}
- Ví dụ 2: Đếm số lần nhấn nút và hiển thị ra cổng P2( Sử dụng cấu trúc Case)
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
#include
unsigned char k,i;
// chuong trinh con tao tre
void delay(long time)
{
long count;
for(count=0;count<time;count++)
{};
}
// Chuong trinh con kiem tra phim
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
51
unsigned char button (void)
{
if(P1_0 == 0)
{
delay(200); // khu nhieu
while(P1_0==0)
{};//khong lam gi, doi nha phim
i++;
if(i>8)
{i = 0;}
}
return i;
}
// Chuong trinh chinh
main()
{
P1 =0xff;// P1 lam cong vao
P2 = 0x00;
while(1)// vong lap vo han
{
k = button();
switch (k)
{
case 1: {P2 = 1; break;}
case 2: {P2 = 2; break;}
case 3: {P2 = 3; break;}
case 4: {P2 = 4; break;}
case 5: {P2 = 5; break;}
case 6: {P2 = 6; break;}
case 7: {P2 = 7; break;}
case 8: {P2 = 8; break;}
}
}
}
3.2.7 Ứng dụng sử dụng ngắt ngoài
- 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 ngƣng trong khi điều kiện đƣợc phục vụ bởi một chƣơng trình khác. Các ngắt đóng vai trò
quan trọng trong việc thiết kế và hiện thực các ứng dụng của bộ vi điều khiển. Các ngắt cho phép
hệ thống đáp ứng mộ sự kiện theo cách không đồng bộ và sử lý sự kiện trong khi 1 chƣơng trình
khác đag thực thi. Một hệ thống đƣợc điều khiển bởi ngắt cho ta ảo tƣởng đang làm việc đồng
thời.
Mỗi ngắt luôn có một trình phục vụ ngắt. Khi một ngắt đƣợc kích hoạt thì bộ vi điều
khiển chạy trình phục vụ ngắt. trình phục vụ ngắt của mỗi ngắt có một vị trí cố định trong bộ nhớ
địa chỉ ISR. Tập hợp các ô nhơ lƣu giữ địa chỉ của tất cả các ISR đƣợc gọi là bảng vector ngắt:
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
52
Ngắt Địa chỉ ROM ( hexa ) Chân
RESET 0000 9
Ngắt phần cứng ngoài ( INT0 ) 0003 12 ( P3.2)
Ngắt bộ Timer 0 ( TF0 ) 000B
Ngắt phần cứng ngoài 1 ( INT1 ) 0013 13 ( P3.3 )
Ngắt bộ Timer 1 ( TF1 ) 001B
Ngắt COM nối tiếp ( RI và TI ) 0023
- Thanh ghi cho phép ngắt IE:
có chức năng cho phép hay cấm ngắt thực hiện.
Thanh ghi IE là thanh ghi định địa chỉ bít.
- Các bước thực hiện ngắt
- Bước 1: bít EA = 1.
- Bước 2: Muốn thực hiện ngắt nào thì tương ứng cho bít của ngắt đó trong thanh ghi
IE lên bằng 1.
- Để kích hoạt ngắt ngoài theo sườn xuống của tín hiệu đầu vào, thiết lập IT1 = 1 cho
ngắt ngoài 1; IT0 = 1 cho ngắt ngoài 0.
- Cấu trúc chƣơng trình ngắt sử dụng trong lập trình C
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
53
Void INT_0 ()interrupt 0
{
; write code here
}
Void INT_1 ()interrupt 2
{
; write code here
}
- Ví dụ: đếm số lần nhấn nút và hiển thị ra cổng P2, sử dụng ngắt ngoài 0.
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
D0
D1
D2
D3
D4
D5
D6
D7
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D1
LED-YELLOW
D2
LED-YELLOW
D3
ED-YELLOW
D4
ED-YELLOW
D5
ED-YELLOW
D6
LED-YELLOW
D7
ED-YELLOW
D8
ED-YELLOW
#include
unsigned char count;
// chuong trinh con su dung ngat ngoai 0
void INT_0 (void) interrupt 0
{
count++;
P2 = count;
}
// Chuong trinh chinh
main()
{
P2 = 0;
P3=0xff;// thiet lap P3 lam cong vao
// thiet lap ngat
EX0 =1; // cho phep ngat ngoai 0
IT0 = 1; // Ngat ngoai theo suon xuong
EA = 1; // Cho phep thuc hien ngat
while(1)// vong lap vo han
{
// cho ngat
}
}
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
54
- Ví dụ 2: Tạo xung vuông trên chân P1_0, đồng thời sử dụng ngắt ngoài 1 đếm số lần
nhấn nút và hiển thị ra cổng P2
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
D0
D1
D2
D3
D4
D5
D6
D7
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D1
LED-YELLOW
D2
LED-YELLOW
D3
ED-YELLOW
D4
ED-YELLOW
D5
ED-YELLOW
D6
LED-YELLOW
D7
ED-YELLOW
D8
ED-YELLOW
D9
LED-YELLOW
#include
unsigned char count;
// Chuong trinh con tao tre
void delay (long time)
{
long k;
for(k = 0; k < time; k++)
{}; //Khong lam gi
}
// chuong trinh con su dung ngat ngoai 0
void INT_1 (void) interrupt 2
{
count++;
P2 = count;
}
//Chuong trinh khai bao su dung ngat ngoai 1 INT1
void init_INT1()
{
EX1 =1; // cho phep ngat ngoai 1
IT1 = 1; // Ngat ngoai theo suon xuong
EA = 1; // Cho phep thuc hien ngat
}
// Tao xung ra cong P1_0
void pulse ()
{
P1_0 = ~P1_0;
delay(5000);
}
// Chuong trinh chinh
main()
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
55
{
P2 = 0;
P3=0xff;// thiet lap P3 lam cong vao
// thiet lap ngat
init_INT1();
while(1)// vong lap vo han
{
pulse();
}
}
3.2.8. Lập trình cho Timer
3.2.8.1. Các thanh ghi cơ sở của bộ định thời
- Thanh ghi của bộ timer0 , timer 1
Hình Thanh ghi của bộ định thời Timer0, Timer 1
Đây là thanh ghi 16 bít đƣợc chia làm hai byte TLx, THx. Các thanh ghi này đƣợc truy cập và
đƣợc đọc độc lập.
- Thanh ghi chế độ của bộ định thời TMOD: là thanh ghi dùng để thiết lập chế độ của bộ định
thời
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
56
- Bít C/T: dùng để xác định bộ định thời đƣợc sử dụng làm bộ tạo trễ hay bộ đếm sự kiện.
Nếu C/T = 0 thì đó là bộ tạo trễ; còn nếu C/T = 1 thì đó là bộ đếm sự kiện.
- Bít GATE = 0 cho phép dừng và khởi động bộ định thời bằng phần mềm, với hai câu
lệnh SETB TRx ; CLR TRx – (khởi động; dừng bộ định thời).
- GATE = 1: Khởi động và dừng bộ định thời từ phần cứng bên ngoài.
- Thanh ghi TCON:
Ví dụ 1:
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
57
Ví dụ 2:
3.2.8.2. Lập trình cho timer ở chế độ 1
Hình Họat động của Timer ở chế độ 1
- Cách tính thời gian trễ của Timer
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
58
- Ví dụ: Lập trình tạo xung vuông trên chân P1_0, sử dụng T1 chế độ 1
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D9
LED-YELLOW
#include
//Khai bao su dung timer1 che do 1
void init_T1_M1 ()
{
TMOD = 0x10; //Timer 1 che do 1
}
// Delay du dung timer
void delay ()
{
TL1 = 0;
TH1 = 0;
TR1 = 1; // Chay timer 1
while(!TF1)
{};// khong lam gi
TF1 = 0;// xoa co tran
TR1 = 0; // Dung bo dinh thoi
}
// Chuong trinh chinh
main()
{
init_T1_M1();
while(1)// vong lap vo han
{
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
59
P1_0 = ~P1_0;
delay();
}
}
3.2.8.3. Lập trình cho Timer ở chế độ 2
Đặc chƣng của chế độ 2:
- Là bộ định thời 8 bít, do vậy chỉ cho phép các giá trị từ 00h đến FFh đƣợc nạp vào thanh
ghi TH của bộ định thời.
- Sau khi TH đƣợc nạp thì 8051 sao nội dung đó vào TL.
- Sau khi đƣợc khởi động thì bộ định thời bắt đầu đếm tăng bằng cách tăng thanh ghi TL,
cho tới khi đạt giá trị FF. Khi quay vòng từ FFh trở về 00h thì cờ bộ định thời TF đƣợc
thiết lập (TF0, TF1) tƣơng ứng với bộ định thời Timer0 hoặc Timer1.
- Khi cờ TF đƣợc bật lên 1 thì thanh ghi TL đƣợc tự động nạp lại với giá trị ban đầu đƣợc
giữ ở thanh ghi TH.
Các bƣớc lập trình với chế độ 2:
- Ví dụ: tạo xung vuông trên chân P1_0, su dụng timer 0 chế độ 2.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
60
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D9
LED-YELLOW
#include
//Khai bao su dung timer0 che do 2
void init_T0_M2 ()
{
TMOD = 0x02; //Timer 0 che do 2
TL0 = 0;
}
// Delay du dung timer
void delay ()
{
TR0 = 1; // Chay timer 0
while(!TF0)
{};// khong lam gi
TF0 = 0;// xoa co tran
TR0 = 0; // Dung bo dinh thoi
}
// Chuong trinh chinh
main()
{
init_T0_M2();
while(1)// vong lap vo han
{
P1_0 = ~P1_0;
delay();
}
}
3.2.8.4. Lập trình cho bộ đếm
- Nếu bít C/T = 1 thì bộ định thời được sử dụng làm bộ đếm.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
61
Khi bít GATE = 1 trong thanh ghi TMOD thì việc khởi động và dừng bộ định thời đƣợc
thực hiện từ bên ngoài qua chân P2.2 và P2.3. Việc chạy và dừng bộ định thời đƣợc thực hiện
qua một công tắc chuyển mạch bên ngoài.
- Ví dụ: lập trình cho bộ đếm 0 chế độ 2 và hiển thị số đếm ra cổng P2.
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
D0
D1
D2
D3
D4
D5
D6
D7
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D1
LED-YELLOW
D2
ED-YELLOW
D3
ED-YELLOW
D4
ED-YELLOW
D5
ED-YELLOW
D6
ED-YELLOW
D7
ED-YELLOW
D8
ED-YELLOW
#include
//Khai bao su dung timer1 che do 1
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
62
void init_C0_M2 ()
{
TMOD = 0x06; //Counter 0 che do 2
TL0 = 0;
TR0 = 1; // chay counter 0
}
// Delay du dung timer
void Dem ()
{
while(!TF1)
{
P2 = TL0;
}
TF1 = 0;// xoa co tran
}
// Chuong trinh chinh
main()
{
P3 = 0xff; //P3 lam cong vao
init_C0_M2();
while(1)// vong lap vo han
{
Dem();
}
}
3.2.9. Lập trình ngắt timer
- Trong phần trên ta đã biết, cờ bộ định thời TFx đƣợc đặt lên cao khi bộ định thời đạt giá trị cực
đại và quay trở về 0. Và để kiểm tra cờ này ta dùng lệnh while(!TFx). Phƣơng pháp này có nhƣợc
điểm là trong quá trình kiểm tra cờ TF, bộ vi điều khiển không thể làm đƣợc việc gì khác. Để
khắc phục nhƣợc điểm này, ta sử dụng phƣơng pháp ngắt.
- Các bƣớc khai báo ngắt cho timer
+ Bƣớc 1: Thiết lập giá trị thích hợp cho thanh ghi cho phép ngắt IE (ET0 =1; ET1 = 1)
+ bƣớc 2: Thiết lập cho bộ định thời theo trình tự 7 bƣớc đã nêu ở phần trên.
- Cách khai báo, sử dụng ngắt timer
Void interrupt_T1 () interrupt 3
{
//write code here
}
Void interrupt_T0 () interrupt 1
{
//write code here
}
- Ví dụ: Tạo xung trên chân P2_0 sử dụng ngắt T0, chế độ 2.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
63
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D8
LED-YELLOW
#include
//Khai bao su dung timer1 che do 1
void init_interrupt_T0_M2 ()
{
TMOD = 0x02; //T0,M2
TL0 = 0;
ET0 = 1; // Cho phep ngat T0
EA = 1; // Cho phep ngat
TR0 = 1; // chay counter 0
}
//Chuong trinh ngat cho T0
void interrupt_T2 () interrupt 1
{
P2_0=~P2_0;
}
// Chuong trinh chinh
main()
{
init_interrupt_T0_M2 ();
while(1)// vong lap vo han
{ }; // Cho ngat
}
- Ví dụ 2: Ứng dụng ngắt timer 1 điều chế độ rộng xung PWM
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
64
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
D8
LED-YELLOW
A
B
C
D
#include
// Khai bao bien
sbit button = P3^0;
sbit pulse = P2^0;
unsigned int count,rate;
//=================================================
// chuong trinh con tao tre
//Khai bao su dung timer1 che do 1==================
void init_interrupt ()
{
TMOD = 0x20; //T0,M2
TL1 = 0;
ET1 = 1; // Cho phep ngat T0
EX0 = 1;// Cho phep ngat ngoai 0
EA = 1; // Cho phep ngat
TR1 = 1; // chay counter 0
}
//Chuong trinh ngat cho T0==========================
void interrupt_T1 () interrupt 3
{
count++;
if(count == rate)
{
count = 0;
pulse =~pulse;
}
}
//Chuong trinh con dem so lan nhan nut==============
void interrupt_INT0 () interrupt 0
{
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
65
rate= rate + 2;
if(rate >= 20)
rate = 2;
}
// Chuong trinh chinh==================================
main()
{
P3 = 0xff;
count = 0;
rate = 2;
init_interrupt ();
while(1)// vong lap vo han
{ } ;
}
3.2.10. Lập trình với bộ biến đổi A/D
- Các bộ biến đổi AD chuẩn thƣờng đƣợc sử dụng trong các ứng dụng đòi hỏi tốc độ ở mức trung
bình và mức cao. Ví dụ bộ ACD 0804, thời gian chuyển đổi của bộ biến đổi A/D này là 100uS.
- Bộ biến đổi này giao tiếp với vi điều khiển thông qua các chân sau:
DB0~DB7 Tám chân dữ liệu
RD Lối vào đọc
WR Lối vào ghi
INTR Lối ra ngắt
CLKR/CLKIN Các lối vào điều khiển xung nhịp
VIN+ Lối vào Analog dƣơng
- Chức năng của các chân đƣợc giải thích chi tiết nhƣ sau:
+ DB0~DB7: là các lối ra số, dữ liệu đã chuyển đổi xuất hiện trên 8 đƣờng này. Bộ biến đổi 8 bít
có 256 khả năng kết hợp ( từ 0 đến 255) các mẫu bít ở lối ra. Với điện áp toàn dải là +5V, bộ
biến đổi có độ phân giải là 5/256 = 19,53mV. Ví dụ mẫu bít ở lối ra là “00010000” (nghĩa là 16
trong hệ thập phân) tƣơng ứng với 312,48mV. Tƣơng tự mẫu bít lối ra là “10100000” (nghĩa là
160 trong hệ thập phân) tƣơng ứng 3124,8mV hay 3,124V.
+ RD: là chân điều khiển đọc dữ liệu và khi RD ở mức thấp dữ liệu xuất hiện trên 8 chân lối ra.
Khi RD ở mức cao dữ liệu không tồn tại ở lối ra.
+ WR: lối vào WR bình thƣờng ở mức logic cao và lối vào này sẽ đƣợc kéo xuống mức logic
thấp, sau đó lại trở về mức cao để bắt đầu quá trình chuyển đổi.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
66
+ INTR: là lối ra ngắt của bộ biến đổi ADC, một sƣờn xung xuống (từ mức cao xuống mức thấp)
đƣợc tạo ra trên chân này khi quá trình chuyển đổi kết thúc. Lối ra này thƣờng đƣợc sử dụng để
tạo ra một ngắt trong vi điều khiển sao cho dữ liệu chuyển đổi có thể đƣợc đọc.
+ ADC0804 chứa một bộ dao động bên trong và cần có một tụ điện và điện trở bên ngoài nối với
chân CLKR và CLKIN để khởi động bộ dao động.
+ VIN+: chân lối vào của điện áp tƣơng tự.
- Để thực hiện một quá trình chuyển đổi, hoạt động của bộ A/D có thể tóm tắt theo các bƣớc sau:
+ Thiết lập WR và RD lên mức HIGH.
+ Bắt đầu quá trình chuyển đổi bằng cách đặt WR xuống mức LOW.
+ Đặt WR trở về mức HIGH.
+ Phát hiện điểm kết thúc của quá trình biến đổi khi INTR xuống mức LOW (thƣờng
đƣợc sử dụng bởi ngắt).
+ Đặt RD xuống mức LOW và đọc dữ liệu từ DB0~DB7.
+ Đặt RD lên mức cao.
+ Quá trình xử lý này đƣợc lặp lại khi cần đọc lien tục tín hiệu đƣa vào vi điều khiển.
RD
WR
INTR
RD
INTR
WR
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
D0
D1
D2
D3
D4
D5
D6
D7
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
VIN+
6
VIN-
7
VREF/2
9
CLK IN
4
A GND
8
RD
2
WR
3
INTR
5
CS
1
D GND
10
DB7(MSB)
11
DB6
12
DB5
13
DB4
14
DB3
15
DB2
16
DB1
17
DB0(LSB)
18
CLK R
19
VCC
20
U2
ADC0804
C1
150p
R1
10k
U2(VIN+)
5
0
%
RV1
1k
D1
LED-YELLOW
D2
ED-YELLOW
D3
ED-YELLOW
D4
ED-YELLOW
D5
ED-YELLOW
D6
ED-YELLOW
D7
ED-YELLOW
D8
ED-YELLOW
#include
// Khai bao bien
sbit ADC_RD = P3^2;
sbit ADC_WR = P3^4;
unsigned char t;
// chuong trinh con tao tre
void delay (long time)
{
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
67
long k;
for(k=0;k<time;k++)
{};
}
// Chuong trinh con thiet lap chuyen doi ADC va ngat ngoai 1
void init ()
{
ADC_RD = 1;
ADC_WR = 1;
IT1 = 1; // Ngat ngoai theo suon xuong
EX1 = 1; // cho phep ngat ngoai 1
EA = 1; // Cho phep ngat
}
// Chuong trinh con bat dau chuyen doi ADC
void start_con ()
{
ADC_WR = 0;
ADC_WR = 1;
}
// Chuong trinh con ngat ngoai 1
void int_EX1 () interrupt 2
{
ADC_RD = 0;
t = P1;
//t = t*19;
P2 = t;
ADC_RD = 1;
delay (5);
start_con();
}
// Chuong trinh chinh==================================
main()
{
init();
start_con();
while(1)// vong lap vo han
{ } ;
}
3.2.11. Lập trình giao tiếp máy tính
3.2.11.1. Chế độ thu phát
- Truyền dữ liệu nối tiếp, song song
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
68
- Các chế độ thu phát dữ liệu
3.2.11.2. Giao thức (protocol)
Truyền thông nối tiếp không đồng bộ và định khung dữ liệu:
Dữ liệu tới đầu thu của đƣờng truyền nối tiếp là tín hiệu 0 và 1. Việc xác định nội dung
của dữ liệu sẽ khó khăn nếu giữa phần đầu phát và đầu thu không có một quy tắc thống nhất còn
đƣợc gọi là giao thức (protocol) nhƣ: dữ liệu đƣợc xắp xếp nhƣ thế nào, có bao nhiêu bít tạo
thành một ký tự, khi nào bắt đầu và khi nào kết thúc dữ liệu
Bít khởi động và bít dừng: Truyền tin nối tiếp không đồng bộ đƣợc sử dụng rộng rãi
trong truyền ký tự, còn truyền dữ liệu định hƣớng khối sử dụng phƣơng pháp đồng bộ. Ở phƣơng
pháp không đồng bộ, mỗi ký tự đƣợc bố trí vào giữa bít khởi động và bit dừng. Ngƣời ta gọi
cách thức này là định khung. Nhƣ vậy, đối với truyền tin không đồng bộ, để định khung, dữ liệu
ký tự đƣợc nén giữa bít khởi động và bít dừng. Bit khởi động luôn chỉ có một bít, còn bít dừng
có thể có 1 hoặc 2 bit. Bit khởi động luôn có giá trị 0 (mức thấp), còn bít dừng thì có giá trị 1
(cao). Ví dụ, nhƣ hình 3, trong đó ký tự “A” ASCII có mã nhị phân là 0100 0001, đƣợc định
khung giữa một bít khởi động và 2 bít dừng. chú ý là bit trọng số thấp LSB đƣợc gửi đi trƣớc.
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
69
Hình 3.1. Định khung ký tự “A” mã ASCII – 41h
Ở hình 3, khi không truyền thì tín hiệu là 1, gọi là dấu (mark). Tín hiệu không đƣợc gọi là
khoảng trống (space). Lƣu ý là trình tự truyền bắt đầu với bít khởi động, tiếp theo là bít D0, bit
LSB, tiếp nữa là các bít còn lại cho đến bít có trọng số lớn nhất MSB là D7, và cuối cùng là bit
dừng để báo rằng đã kết thúc ký tự “A”.
Trong truyền tin nối tiếp không đồng bộ, các thiết bị ngoại vi và modem đƣợc lập trình
để có độ dài dữ liệu là 7 bít hoặc 8 bít, đó là chƣa kể các bít dừng có thể chiếm 1 hoặc 2 bít.
Trƣớc đây, ký tự ASCII là 7 bít, hiện nay ký tự ASCII mở rộng có 8 bít. Trong một số hệ thống
trƣớc đây, do thiết bị thu không nhanh nên cần sử dụng 2 bít dừng để thiết bị có đủ thời gian cho
truyền byte tiếp theo. Tuy nhiên, trong máy tính PC hiện đại phổ biến sử dụng một bit dừng.
Nếu chúng ta truyền một tệp văn bản ký tự ASCII sử dụng một bit dừng thì ta có tổng
cộng 10 bít cho mỗi ký tự, gồm: 8 bít ký tự ASCII chuẩn, 1 bít khởi động và 1 bít dừng. do đó,
cứ 8 bít thì có them 2 bít chiếm 25% tổng phí.
Ở một số hệ thống, nhằm tăng khả năng bảo toàn của dữ liệu, ngƣời ta còn thêm vào
khung dữ liệu 1 bít chẵn lẻ. Bít này có thể là bít chẵn hoặc bit lẻ. Trong hệ thống cơ bít chẵn lẻ
(bít bậc) thì bít này đƣợc gửi đi sau bit MSB và trƣớc bít dừng.
3.2.11.3. Tốc độ truyền
Tốc độ truyền tin nối tiếp đƣợc tính bằng bit/giây (bps – bit per second). Một thuật ngữ
khác cũng thƣờng đƣợc sử dụng là baud. Tuy nhiên, khái niệm bps và baud không hoàn toàn
giống nhau. Baud là đơn vị đo dùng cho modem và đƣợc định nghĩa là số lần thay đổi trong một
giây. Đối với modem, mỗi lần thay đổi tín hiệu có thể truyền đƣợc nhiều bit dữ liệu. Còn đối với
đƣờng truyền thì tốc độ baud và bps là một. Do đó, trong tài liệu này ta không phân biệt hai thuật
ngữ trên.
3.2.11.4. Bố trí chân của RS232
Hình 3.2. Sơ đồ đầu nối DB9 của RS232
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
70
Ngƣời ta phân biệt thiết bị truyền thông dữ liệu thành thiết bị đầu cuối dữ liệu DTE (Data
Terminal Equipment) hoặc thiết bị truyền thông dữ liệu DCE (Data Comunication Equipment).
DTE chủ yếu là máy tính và các thiết bị đầu cuối gửi và nhận dữ liệu, còn DCE là thiết bị truyền
thông, chẳng hạn nhƣ các modem chịu trách nhiệm về truyền dữ liệu. Lƣu ý rằng tất cả mọi định
nghĩa về chức năng các chân RS232 đều nhìn từ góc độ DTE.
Kết nối đơn giản nhất giữa một PC và bộ vi điều khiển yêu cần tối thiểu những chân sau:
TxD, RxD và đất.
Để đảm bảo truyền dữ liệu nhanh và tin cậy, giữa hai thiết bị thì việc truyền dữ liệu phải
đƣợc phối hopự tốt. Nhƣ trong trƣờng hợp của máy in, do thực tế là truyền tin nối tiếp, thiết bị
thu có thể không đủ chỗ để chứa dữ liệu, khi đó phải có cách để báo cho bên phát dừng gửi dữ
liệu. Có một số chân của RS232 đƣợc dùng làm chân tín hiệu bắt tay.
- DTR (data terminal ready) thiết bị đầu cuối sẵn sàng, sau khi đƣợc cấp nguồn, và sau khi
kết thúc quá trình tự kiểm tra, thiết bị đầu cuối hoặc cổng COM của máy tính gửi tín hiệu
DTR để báo rằng thiết bị đã sẵn sàng để truyền tin. Nếu có lỗi ở cổng COM, tín hiệu này
sẽ không đựợc kích hoạt. Đây là tín hiệu tích cực thấp và có thể đƣợc dùng để thông báo
cho modem biết rằng máy tính đang hoạt động. Đây là chân ra từ DTE (cổng COM máy
tính đƣa vào modem).
- DSR (data set ready): dữ liệu sẵn sàng, khi thiết bị truyền thông DCE (ví dụ modem)
đƣợc cấp nguồn và thực hiện xong quá trình tự kiểm tra, tín hiệu DSR đƣợc sử dụng để
xác nhận dữ liệu đã sẵn sàng để truyền tin. Nhƣ vậy DSR là chân ra từ modem (DCE) và
vào máy tính (DTE). Tín hiệu này có mức tích cực thấp. Nếu vì một lý do nào đó mà
modem không thể kết nối đƣợc vào mạng điện thoại thì tín hiệu này sẽ không đƣợc kích
hoạt để báo cho máy tính hoặc thiết bị đầu cuối rằng nó không thể nhận hoặc gửi dữ liệu.
- RTS (request to send): Yêu cầu gửi dữ liệu. Tín hiệu RTS đƣợc sử dụng để báo cho
modem biết thiết bị DTE (ví dụ máy tính) có một byte cần gửi. RTS là đầu ra tích cực
thấp từ thiết bị DTE và vào thiết bị DCE.
- CTS (clear to send): Tín hiệu thông: Để trả lời tín hiệu RTS, và khi đã sẵn sàng, modem
gửi tín hiệu CTS đến thiết bị DTE (ví dụ máy tính) báo máy tính biết modem đang sẵn
sàng nhận dữ liệu. CTS là tín hiệu vào thiết bị DTE và đƣợc DTE sử dụng để bắt đầu
truyền dữ liệu.
- CD (carrier detect)- dò sóng mang hoặc DCD (data carrier detect)- dò sóng mang dữ liệu.
Modem gửi tín hiệu DCD để báo cho thiết bị DTE (PC) rằng đã phát hiện đƣợc sóng
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
71
mang và sự kết nối giữa thiết bị DTE với modem đã đƣợc thiết lập. DCD là tín hiệu ra từ
modem và đƣa vào DTE (PC).
- RI (ring indicator) chỉ thị chuông- Đây là tín hiệu ra từ modem (DCE) đƣa vào PC (DTE)
để báo rằng điện thoại đang réo chuông. Tín hiệu này tắt hoặc mở đồng bộ với tiếng
chuông. Trong 6 tín hiệu bắt tay, đây là tín hiệu ít đƣợc sử dụng nhất.
- Từ những trình bày trên có thể tóm tắt quá trình truyền tin giữa PC và modem nhƣ sau:
khi có các tín hiệu DTR và DSC của PC và modem, chúng báo hiệu là PC và modem làm
việc tốt, các tín hiệu RTS và CTS điều khiển luồng dữ liệu. khi PC muốn gửi dữ liệu thì
nó gửi tín hiệu RTS cho modem và để trả lời lại nếu modem đã sẵn sàng (có chỗ chứa dữ
liệu) để nhận dữ liệu từ PC thì nó gửi lại cho PC tín hiệu CTS.
- Nếu modem bận thì nó không phát tín hiệu CTS, PC sẽ hủy tín hiệu DTR và sẽ thử lặp lại
quá trình này. Tín hiệu CTS và RTS còn gọi là tín hiệu điều khiển luồng phần cứng. Còn
nếu thiếu chỗ chứa dữ liệu thì modem không kích hoạt CTS và PC thôi không yêu cầu
DTR và tiến hành thử lại lần nữa. các tín hiệu RTS và CTS cũng đƣợc coi là tín hiệu
luồng điều khiển phần cứng.
3.2.11.5. Ghép nối 8051 với RS232
MAX232 dùng điện áp nguồn nuôi 5V cùng với điện áp nguồn của 8051. MAX232 cần 4
tụ điện giá trị từ 1 đến 22uF. Giá trị thƣờng dùng là 22uF.
Max232 có hai cặp TxD, RxD (T1, R1; T2, R2) trong nhiều ứng dụng thì chỉ có một cặp
đƣợc dùng, ví dụ T1, R1 đƣợc dùng với nhau cho trƣờng hợp TxD và RxD của 8051.
3.2.11.6. Lập trình truyền thông nối tiếp cho 8051
8051 phát và thu dữ liệu nối tiếp theo nhiều tốc độ khác nhau. Tốc độ truyền có thể lập
trình đƣợc thông qua bộ định thời timer 1.
Bảng Giá trị thanh ghi TH1 của Timer1 với các tốc độ Baud khác nhau
Tốc độ Baud Xung nhịp SMOD Giá trị TH1 Sai số
9600 11.0592MHz 0 0xFD 0%
4800 11.0592MHz 0 0xFA 0%
2400 11.0592MHz 0 0xF4 0%
1200 11.0592MHz 0 0xE8 0%
9600 12MHz 1 0xF9 7%
4800 12MHz 0 0xF9 7%
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
72
2400 12MHz 0 0xF3 0.16%
1200 12MHz 0 0xE6 0.16%
Thanh ghi SBUF: là thanh ghi 8 bít đƣợc dùng cho truyền nối tiếp của 8051. Để byte dữ
liệu đƣợc truyền qua đƣờng TxD thì cần đặt dữ liệu trong thanh ghi SBUF. Tƣơng tự, SBUF lƣu
một byte dữ liệu khi nó đƣợc nhận qua đƣờng RxD của 8051. SBUF có thể đƣợc mọi thanh ghi
của 8051 truy cập
Khi byte dữ liệu đƣợc ghi vào thanh ghi SBUF thì byte sẽ đƣợc định khung với bít Start
và Stop và đƣợc truyền nối tiếp qua chân TxD. Tƣơng tự nhƣ vậy, khi các bít đƣợc nhận nối tiếp
từ RxD thì 8051 mở khung, tức là loại trừ các bít Start, Stop để lấy ra một byte từ dữ liệu nhận
đƣợc và đặt vào thanh ghi SBUF.
Thanh ghi điều khiển nối tiếp SCON: là thanh ghi 8 bít đƣợc dùng cho một số công
việc, trong đó có lập trình bit khởi động Start, bit dừng Stop và các bít dữ liệu kiểu định khung
dữ liệu .
- Hai bít SM0, SM1 đây là các bít D6, D7 của thanh ghi SCON. Các bít này đƣợc dùng để xác
định chế độ định khung dữ liệu bằng cách xác định số bít của một ký tự và các bít Start, Stop các
tổ hợp của chúng là:
SM0 SM1 Chế độ
0 0 Chế độ nối tiếp 0
0 1 Chế độ nối tiếp 1, 8 bít dữ liệu, Start, Stop
1 0 Chế độ nối tiếp 2
1 1 Chế độ nối tiếp 3
Trong bốn chế độ trên, ta chỉ quan tâm tới chế độ 1, chế độ này cho phép tốc đọ Baud
thay đổi và do timer1 của 8051 thiết lập. Nhƣ vậy, ở chế độ nối tiếp 1, mỗi ký tự gồm có 10 bít
đƣợc truyển, trong đó có bít đầu tiên là bít Start, sau đó là 8 bít dữ liệu và cuối cùng là bít Stop.
Chú ý:
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
73
- SM2 = 0 vì ta không dùng 8051 cho hệ đa xử lý.
- REN = 1 thì 8051 vừa có thể phát và thu dữ liệu (SETB SCON.4)
- REN = 0 thì bộ thu bị khóa (CLR SCON.4)
- TB8 = 0; RB8 = 0 : vì không sử dụng chế độ nối tiếp 2,3.
- TI và RI: Ngắt phát và ngắt thu là các bít D1 và D0 của thanh ghi SCON. Khi 8051 kết
thúc phát một ký tự 8 bít thì cờ TI đƣợc bật để báo rằng bộ vi điều khiển đã sẵn sàng phát
byte tiếp theo. Bít TI đƣợc bật khi bắt đầu nút Stop
Khi 8051 nhận đƣợc dữ liệu nối tiếp qua chân RxD thì tiến hành tách các bít Start và Stop để
lấy ra 8 bít dữ liệu và đặt vào thanh ghi SBUF. Sau khi quá trình này hoàn tất, cờ RI đƣợc bật
để báo rằng bộ vi điều khiển đã nhận xong một byte và cần phải đƣợc cất đi nếu không sẽ bị
mất. Cờ RI đƣợc bất khi đang tách bít Stop
3.2.11.7. Lập trình 8051 truyền dữ liệu nối tiếp
3.2.11.8. Lập trình 8051 nhận dữ liệu nối tiếp
Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên
74
3.2.11.9. Truyền dữ liệu bằng ngắt
Nhƣ đã nêu ở phần trên, cờ ngắt phát TI đƣợc bật lên 1 khi bít cuối cùng của khung dữ
liệu, bít Stop đƣợc phát đi báo rằng thanh ghi SBUF sẵn sàng phát byte tiếp. Trái lại, cờ ngắt thu
RI đƣợc bật lên 1 khi toàn bộ khung dữ liệu kể cả bít Stop đã đƣợc nhận. Nói cách khác, thanh
ghi SBUF đang lƣu một byte, thì cờ RI bật lên báo rằng byte dữ liệu thu đƣợc cần cất đi vào nơi
an toàn trƣớc khi bị mất (bị ghi đè) bởi dữ liệu tiếp theo sẽ đƣợc nhận.
Ở 8051 chỉ có một ngắt dành riêng cho truyền thông nối tiếp. Ngắt này đƣợc dùng cho cả
phát và thu dữ liệu. Nếu bít ngắt trong thanh ghi IE (là bít IE.4) đƣợc phép khi RI và TI bật lên,
thì 8051 nhận đƣợc ngắt và nhảy đến địa chỉ trình phục vụ ngắt dành cho truyền thông nối tiếp
0023H trong bảng vectơ ngắt và thực hiện nó. Lúc đó, chúng ta cần kiểm tra cờ TI và RI để xem
cờ nào gây ngắt để có đáp ứng phù hợp.
Hình 3.3. Thu và phát dùng một ngắt
Ví dụ 1: Gửi dữ liệu từ vi điều khiển lên máy tính
Các file đính kèm theo tài liệu này:
- 03200072_6904_1984550.pdf