Lập trình hợp ngữ, và điều khiển thiết bị
Trang 2Mục tiêu môn học
§ Sau khi kết thúc môn học này, sinh viên có thể
• Trình bày cấu trúc phần cứng và kiến trúc tập
lệnh của vi họ điều khiển 8051
• Lập trình hợp ngữ sử dụng tập lệnh của vi điều
khiển 8051 để điều khiển các thiết bị ngoại vi
• Sử dụng phần mềm Proteus để mô phỏng hoạt
động của vi điều khiển và các thiết bị ngoại vi
Trang 3§ Tài li ệu tham khảo chính:
1 Nguyễn Tăng Cường – Cấu trúc và lập trình họ
vi điều khiển 8051
2 Michael J.Paul – Embedded C
3 Diễn đàn: dientuvietnam.net
Trang 4Nội dung môn học
Chương 1 Cấu trúc vi điều khiển 8051
Chương 2 Lập trình hợp ngữ vi điều khiển
8051 Chương 3 Lập trình vi điều khiển 8051 điều
khiển thiết bị (sử dụng C)
Trang 51 Cấu trúc vi điều khiển 80511.1 Tổng quan về vi điều khiển
1.2 Kiến trúc vi điều khiển 8051
Trang 61.1 Tổng quan vi điều khiển
§Vi điều khiển <> Vi xử lý
Vi điều khiển: Computer On Chip (bao gồm cả CPU, Bộ nhớ, cổng vào ra)
Trang 7Tổng quan về vi điều khiển
§ Một số dòng vi điều khiển phổ biến hiện nay
• 8051 (AT89C51, AT89S51, AT89S52)
• AVR (ATMEGA8, ATMEGA16)
• PIC (PIC16F877A, PIC18F4550, PIC18F2550)
• ARM (ARM7, ARM9)
• …
Trang 91.2 Kiến trúc vi điều khiển 8051
§Do hãng Intel thiết kế năm 1981
§4KB Flash, 128 Byte Ram
§Tần số xung nhịp tối đa: 24 MHz
Trang 10Đóng vỏ vi điều khiển 8051
Trang 11Kiến trúc vi điều khiển 8051
Trang 12Các thanh ghi của 8051
địa chỉ
§ Các thanh ghi này chủ yếu là thanh ghi 8 bit
• Thanh ghi A : thanh ghi tích lũy
• Thanh ghi R0->R7
• Thanh ghi con trỏ dữ liệu DPTR (16 bit)
• Thanh ghi bộ đếm chương trình PC (16bit)
Trang 142.1 Cơ bản về lập trình hợp ngữ
§ Ngôn ngữ máy:
• Chỉ được biểu diễn bằng số nhị phân.
• Bộ vi xử lý chỉ hiểu được các chương trình mã máy.
• Con người rất khó khăn để tạo lập hay đọc hiểu chương trình ngôn ngữ máy.
§ Hợp ngữ (Assembly Language):
• Là ngôn ngữ lập trình bậc thấp (gần ngôn ngữ máy nhất).
• Được xây dựng trên cơ sở ký hiệu tập lệnh của bộ vi xử lý tương ứng.
• Phụ thuộc hoàn toàn vào bộ vi xử lý cụ thể.
§ Ngôn ngữ lập trình bậc cao:
• Gần với ngôn ngữ tự nhiên hơn.
Trang 15Tập lệnh
§ Mỗi bộ xử lý/ vi điều khiển có một tập lệnh xác định
(mang tính kế thừa trong cùng một dòng họ).
Trang 16Khuôn dạng của một lệnh máy
§ Mã thao tác (Operation Code - Opcode): mã hóacho thao tác mà CPU phải thực hiện
§ Tham chiếu toán hạng: mã hóa cho toán hạng
hoặc nơi chứa toán hạng mà thao tác sẽ tác
Trang 18Các chế độ địa chỉ
§ Chế độ định địa chỉ thanh ghi
• Sử dụng thanh ghi để lưu trữ dữ liệu cần thao tác
• Thanh ghi nguồn và đích phải phù hợp về kích
Trang 19Các chế độ địa chỉ
§ Chế độ địa chỉ trực tiếp
• Toán hạng (nguồn hoặc đích) là địa chỉ của ô nhớ
• Trước địa chỉ ô nhớ không có dấu #
• Ví dụ:
üMOV A, 35h ;Dữ liệu trong ô nhớ có địa chỉ
; 35h được chuyển vào thanh ghi A
Trang 20Các chế độ địa chỉ
§ Chế độ định địa chỉ gián tiếp thanh ghi
• Địa chỉ ô nhớ chứa dữ liệu được chứa trong
thanh ghi R0 hoặc R1
• Trước thanh ghi R0 hoặc R1 phải chèn thêm ký
tự “@” để biểu thị cho chế độ địa chỉ này
• Ví dụ:
üMOV A,@R0 ;chuyển dữ liệu trong ô nhớ có
;địa chỉ được chỉ ra trong thanh
;ghi R0 vào thanh ghi A
Trang 22Tập lệnh vi điều khiển 8051
A/B DIV AB
A*B MUL AB
Đích = đích - 1 DEC nguồn
Đích = đích + 1 INC nguồn
Đích = đích – nguồn SUBB đích, nguồn
Đích = đích + nguồn + cờ nhớ ADDC đích, nguồn
Đích = đích + nguồn ADD đích, nguồn
Giải thích Lệnh
Lệnh số học
Trang 23MOVX đích, nguồn
Đích = nguồn (Bộ nhớ trong) MOV đích, nguồn
Giải thích Lệnh
Lệnh truyền dữ liệu
Trang 24Lệnh logic
Trang 25Gọi chương trình con, địa chỉ 16 bit LCALL
Gọi chương trình con, địa chỉ 11 bit ACALL
Giải thích Lệnh
Lệnh rẽ nhánh
Trang 262.3 Mở đầu lập trình hợp ngữ
2.3.1 Cú pháp của hợp ngữ
2.3.2 Dữ liệu của chương trình
2.3.3 Khai báo biến, hằng số
2.3.4 Một số lệnh cơ bản
2.3.5 Cấu trúc chương trình hợp ngữ
2.3.6 Dịch và chạy chương trình
2.3.7 Một số ví dụ
Trang 28Dữ liệu của chương trình
§ Hợp ngữ cho phép biểu diễn dưới dạng:
• Số nhị phân: 1011b, 1011B,
• Số thập phân: 35, 35d, 35D,
• Số Hexa: 4Ah, 0ABCDh, 0FFFFH,
• Kí tự: "A", 'HELLO', "Bach Khoa",
§ Tất cả các kiểu dữ liệu trên sau đó đều được
trình dịch Assembler dịch ra mã nhị phân
§ Mỗi kí tự được dịch thành mã ASCII tương ứng
• Chương trình không phân biệt 'A' với 41h hay 65
Trang 31Một số lệnh cơ bản
§ Lệnh ADD: cộng
• Cú pháp:
ADD A,nguồn ;cộng toán hạng
;nguồn vào thanh ghi A
§ Lệnh MOV: chuyển dữ liệu
• Cú pháp
MOV đích, gốc ;chuyển dữ liệu từ toán hạng
;gốc vào toán hạng đích
Trang 32Dịch và chạy chương trình
Trang 33Ví dụ sử dụng lệnh ADD, MOV
ORG 000 ;Dia chi bat dau cua chuong trinh
MOV R5, #25h ;Nap 25h vao R5
MOV R7, #34h ;Nap 34h vao R7
MOV A, #0 ;Nap 0 vao thanh ghi A
ADD A, R5 ;A=A+R5
ADD A, R7 ;A=A+R7 (A=25h+34h)
HERE: SJMP HERE ;O lai trong vong lap
END
Sử dụng các lệnh ADD, MOV
Trang 352.4.Các cấu trúc lập trình với hợp ngữ
2.4.1 Các lệnh liên quan
2.4.2 Cấu trúc điều kiện
2.4.3 Cấu trúc lặp
Trang 36JNZ NEXT ;Nhảy tới NEXT nếu A khác 0 MOV R5,#55h
NEXT:
…
Trang 37Lệnh lặp
§ Lệnh DJNZ
• Cú pháp
DJNZ thanh_ghi, nhãn
+ Sau mỗi lần nhảy, giá trị thanh ghi bị giảm đi 1
+ Nếu giá trị thanh ghi vẫn khác 0 thì nhảy tới nhãn
§ Ví dụ: Xóa thanh ghi A, cộng 3 vào thanh ghi A 10 lần
MOV A,#0 MOV R2,#10 BACK: ADD A,#3
DJNZ R2,BACK ;Lặp 10 lần
Trang 382.5 Các lệnh logic, lệnh quay
§ Lệnh ANL
ANL đích, nguồn ; đích=đích AND nguồn
vMục đích: che, xóa bit
vVD: - Xóa 4 bit thấp của thanh ghi A
Trang 40Các lệnh logic, lệnh quay
§ Lệnh quay
• Lệnh quay phải: RR A
• Lệnh quay trái: RL A
Trang 41Các lệnh logic, lệnh quay
§ Lệnh quay
• Lệnh quay phải qua cờ nhớ: RRC A
• Lệnh quay trái qua cờ nhớ: RLC A
Trang 42vào phải tiến hành ghi các bit 1 ra các cổng/chântương ứng
Trang 43Nguyên lý bit cổng
Sơ đồ nguyên lý của một bit cổng
Trang 44ü Clk ở mức thấp: trạng thái của Triger D sẽ
được chốt, khi đó đầu ra Q luôn luôn giữ giá trị đó cho đến khi Clk chuyển sang mức cao và có giá trị D mới.
Trang 45Nguyên lý bit cổng
§ Đệm 3 trạng thái:
• /C =0 : đầu ra bằng đầu vào
• /C=1 : đầu ra ở trở kháng cao
Trang 46Nguyên lý bit cổng
§ MOSFET (Metal Oxide Semiconductor Field
Effect Transistor) Transitor trường:
• Điều khiển bởi điện áp ở gate.
Trang 47Nguyên lý bit cổng
• Đọc tín hiệu từ chân IO:
Read Pin =0: Đệm 3 trạng thái thông, tín hiệu từ IO pin được truyền tới Data bus
Trang 49Lập trình xuất dữ liệu ra cổng/chân
§ Xuất dữ liệu ra cổng ra
• Ví dụ:
üMOV P1, #55h
§ Xuất dữ liệu ra từng chân
• Đưa chân lên mức cao:
Ví dụ: SETB P1.0
• Đưa chân xuống mức thấp:
Trang 50Ví dụ
Trang 53Lập trình đọc dữ liệu từ một chân vào
§ Bước 1: thiết lập chân vào/ra tương ứng làm việc ở chế
MOV R1,#0
Trang 54Ví dụ
Trang 552.7 Lập trình xử lý ngắt
§ Khái niệm chung về ngắt (Interrupt): Ngắt là cơchế cho phép CPU tạm dừng chương trình đangthực hiện để chuyển sang thực hiện một chươngtrình khác, gọi là chương trình con phục vụ ngắt
Trang 56Phương pháp ngắt và thăm dò
kiểm tra yêu cầu của các thiết bị để phục vụ
Quá trình phục vụ diễn ra tuần tự nếu có nhiềuthiết bị cùng yêu cầu
vụ, thiết bị gửi tín hiệu yêu cầu tới chân ngắt của
vi điều khiển Vi điều khiển sẽ xử lý yêu cầu ngắt
đó Chương trình xử lý ngắt gọi là trình phục vụngắt (ISR-Interrupt Service Routine)
Trang 57§ Tập hợp các ô nhớ lưu giữ địa chỉ của tất cả cáctrình phục vụ ngắt gọi là bảng vector ngắt
(Interrupt Table)
Trang 58Chu trình xử lý ngắt
§ Được thêm vào cuối chu trình lệnh
§ Sau khi hoàn thành một lệnh, CPU kiểm tra xem có yêu cầu ngắt gửi đến hay không
• Nếu không có tín hiệu yêu cầu ngắt thì CPU nhận lệnh kế tiếp
• Nếu có yêu cầu ngắt và ngắt đó được chấp nhận thì:
üCPU cất ngữ cảnh hiện tại của chương trình đang thực hiện (các thông tin liên quan đến chương trình bị ngắt)
üCPU chuyển sang thực hiện chương trình con phục vụ ngắt tương ứng
üKết thúc chương trình con đó, CPU khôi phục lại ngữ cảnh
và trở về tiếp tục thực hiện chương trình đang tạm dừng
Trang 59Trình tự phục vụ ngắt của 8051
1 Kết thúc lệnh hiện tại, lưu địa chỉ của lệnh kế
tiếp (PC) vào ngăn xếp
2 Nhảy đến vị trí cố định trong bảng vector ngắt
3 Nhận địa chỉ của trình phục vụ ngắt, nhảy tới
địa chỉ đó và bắt đầu thực thi chương trình con phục vụ ngắt cho đến lệnh cuối cùng là lệnh
RETI
4 Kết thúc chương trình con phục vụ ngắt, bộ vi
điều khiển trở về thực thi tiếp lệnh nơi nó đã bị
Trang 60Chuyển đến chuơng trình
điều khiển ngắt Y
Trang 61Hoạt động ngắt (tiếp)
Trang 62Xử lý với nhiều tín hiệu yêu cầu ngắt
• Các ngắt vẫn đang đợi và được kiểm tra sau khi
ngắt đầu tiên được xử lý xong
• Các ngắt được thực hiện tuần tự
Trang 63Xử lý ngắt tuần tự (tiếp)
Trang 64Xử lý với nhiều tín hiệu yêu cầu ngắt
§ Xử lý ngắt ưu tiên:
• Các ngắt được định nghĩa mức ưu tiên khác nhau
• Ngắt có mức ưu tiên thấp hơn có thể bị ngắt bởi
ngắt ưu tiên cao hơn Þ ngắt xảy ra lồng nhau
Trang 65Xử lý ngắt ưu tiên
Trang 66Các ngắt của 8051
§ 8051 có 6 nguồn ngắt
• Ngắt RESET
• 2 ngắt cho bộ đếm và định thời
• 2 ngắt ngoài (INT0, INT1)
• 1 ngắt cho bộ truyền thông nối tiếp UART
Trang 67Bảng vector ngắt
§ Bảng vector ngắt của 8051
Trang 68Lập trình xử lý ngắt
§ Viết các chương trình con xử lý ngắt
§ Bật cờ cho phép ngắt
Trang 69Khung chương trình
ORG 0h
LJMP MAIN ;Xử lý ngắt Reset ORG 3h
;Chuong trinh con xu ly ngat ngoai 0 ORG 0Bh
;Chuong trinh con xu ly ngat timer 0 ORG 13h
;Chuong trinh con xu ly ngat ngoai 1 ORG 1Bh
;Chuong trinh con xu ly ngat timer 1 ORG 23h
;Chuong trinh con xu ly ngat truyen thong noi tiep
ORG 30h MAIN:
;chương trình chính
Trang 713 Lập trình điều khiển thiết bị
3.7 Lập trình điều khiển LCD
3.8 Lập trình bảng quang báo
3.9 Bài tập tổng hợp (Thiết kế và lập trình máy
Trang 723.1 Lập trình C cho 8051
§ Tuân thủ các cú pháp của ngôn ngữ lập trình C chuẩn ANSI C
§ Hỗ trợ thêm một số kiểu dữ liệu/từ khóa mới
• sfr: định nghĩa một thanh ghi đặc biệt (Special Function Register)
üVD: sfr P1=0x90; //Từ đây có thể truy xuất cổng P1
//ở địa chỉ 0x90 thông qua biến P1
• sbit: định nghĩa từng bit trong thanh ghi đặc biệt
üVD: sbit Led_pin=P1^1; //Từ đây có thể truy xuất chân 1 của
//cổng P1 thông qua biến Led_pin
• bit: kiểu dữ liệu mang hai giá trị 0 hoặc 1
Ví dụ: xem file AT89X51.h
Trang 73Chương trình Hello World (Nhấp nháy led chân P1_0)
Trang 743.2 Lập trình cổng vào,ra
§ L ập trình xuất dữ liệu ra cổng hoặc chân ra
• Ghi dữ liệu ra cổng: Tên cổng=dữ liệu
üVD: P1=0xff;
• Ghi dữ liệu ra chân: Tên chân ra=bit (0/1)
üVD: P1_0=1;
§ L ập trình đọc dữ liệu từ cổng hoặc chân vào
• Thiết lập chân hoặc cổng vào(ghi ra các bit 1)
• Đọc dữ liệu từ cổng: Tên biến=Tên cổng
üVD: unsigned char value;
P1=0xff; //Chuyển cổng sang chế độ cổng vào
Trang 75Ví dụ
§ Ví dụ 1: Xuất dữ liệu ra cổng ra
• Xuất dữ liệu điều khiển 8 led trên cổng P0 nhấp nháy so le.
§ Ví dụ 2: Đọc dữ liệu từ chân vào
• Thêm một nút bấm vào chân P1_0, nếu nút bấm
ở trạng thái mở, 8 led trên cổng P0 sáng nhấp
nháy so le, nếu nút bấm được nhấn thì 8 led dữ nguyên trạng thái.
Trang 76Ví dụ 1: xuất dữ liệu ra cổng
Trang 78Ví dụ 2: đọc dữ liệu từ chân vào
Trang 79đọc dữ liệu từ chân vào
Trang 80Hiện tượng nảy phím (key bounce)
§ Khi sử dụng các phím bấm cơ khí sẽ có hiện
tượng này phím, đó là hiện tượng tín hiệu thayđổi mức liên tục trong một khoảng thời gian ngắntrước khi chuyển sang trạng thái ổn định
Lý tưởng
Thực tế
Trang 81Hiện tượng nảy phím (key bounce)
§ Hậu quả của này phím
Trang 843.3 Lập trình hiển thị led 7 thanh
§ Nguyên tắc hoạt động của led 7 thanh
• Led đơn
Trang 86Phân loại led 7 thanh
Trang 87Ví dụ
Trang 88P0=0x79; //Hien thi so 1 delay(100);
P0=0x24; //Hien thi so 2 delay(100);
}
Trang 893.4 Lập trình xử lý ngắt
• Chương trình con xử lý ngắt cũng là một chương trình con.
• Điểm khác biệt: chương trình con xử lý ngắt được gọi bởi bộ vi điều khiển.
Trang 90Khung chương trình con xử lý ngắt
• Tên chương trình con ngắt: do người lập trình đặt, tuân thủ các quy tắc giống như chương trình con thông thường
• Số hiệu ngắt: số hiệu vector ngắt (Xem trong file
at89x51.h)
v #define IE0_VECTOR 0 /* External Interrupt 0 */
v #define TF0_VECTOR 1 /* Timer 0 */
v #define IE1_VECTOR 2 /* External Interrupt 1 */
v #define TF1_VECTOR 3 /* Timer 1 */
v #define SIO_VECTOR 4 /* Serial port */
Trang 91Thanh ghi IE
§ Thanh ghi cho phép/ cấm ngắt
Trang 92üNgắt theo sườn âm: ngắt được kích hoạt khi có sườn âm (chuyển từ mức cao xuống mức thấp) đưa đến chân ngắt
• Thiết lập chế độ kích hoạt ngắt qua thanh ghi
TCON (bit IT0 cho INT0 và IT1 cho INT1)
Trang 93Thanh ghi TCON
Trang 94Lập trình xử lý ngắt ngoài
ngoài
mức): thiết lập bit IT0 và IT1 cho thanh ghi
TCON
• Bit IT0 cho ngắt ngoài 0 và IT1 cho ngắt ngoài 1
• ITx=0-> ngắt theo mức, ITx=1->ngắt theo sườn
Trang 95void main(){
IE=0x81; //Cho phép ngắt ngoài 0 IT0=0; //Chế độ ngắt theo mức while(1){
//Chương trình
Trang 96void main(){
IE=0x84; //Cho phép ngắt ngoài 1 IT1=1; //Chế độ ngắt theo sườn while(1){
//Chương trình }
Trang 97Demo
Trang 99Cấu tạo và nguyên tắc hoạt động
§ Cả hai bộ định thời đều có độ dài 16 bit, được
chia thành hai thanh ghi 8 bit
§ Bộ định thời 0:
• Thanh ghi TH0: 8 bit cao
• Thanh ghi TL0: 8 bit thấp
§ Bộ định thời 1:
• Thanh ghi TH1: 8 bit cao
• Thanh ghi TL1: 8 bit thấp
Trang 100Cấu tạo và nguyên tắc hoạt động
§ Hoạt động ở chế độ bộ định thời (xét chế độ bộđịnh thời 16 bit)
• Giá trị trong thanh ghi bộ định thời tự động tăng lên 1 sau 12 chu kỳ dao động
• Sau khi đạt giá trị tối đa (65535), cờ TF0/TF1 báo tràn bộ định thời sẽ được phát sinh
• VD: chu kỳ dao động đồng hồ là 12MHz -> cứ mỗi
us giá trị thanh ghi bộ định thời sẽ tăng lên 1->
chúng ta có thể tính toán để đưa ra thời gian trễ chính xác
Trang 102Các thanh ghi điều khiển Timer/Counter
§ Thanh ghi TCON
• TR1/TR0: bit khởi động/tắt bộ đếm/định thoài
• TF1/TF0: cờ báo tràn bộ đếm/định thời
• IE1, IT1, IE0, IT0: liên quan tới ngắt phần cứng
ngoài
Trang 103Các thanh ghi điều khiển Timer/Counter
§ Thanh ghi TMOD
• Gate: sử dụng cho bộ đếm
• C/T: chọn chế độ (bộ đếm hay bộ định thời)
üC/T=0: bộ định thời üC/T=1: bộ đếm
• M1,M0: chọn chế độ làm việc Có hai chế độ thông dụng
üM1=0, M0=1: chế độ 1, bộ Timer/Counter 16 bit üM1=1, M0=0: chế độ 2, bộ Timer/Counter 8 bit tự động nạp lại
Trang 1053.6 Lập trình ghép nối bàn phím
§ Cấu trúc bàn phím ma trận
Trang 106Hoạt động của ma trận phím
§ Tín hiệu mức thấp được đưa tới tất cả các hàng
tại cột đó sẽ ở mức thấp
phím
• Mỗi thời điểm chỉ đưa tín hiệu mức thấp tới 1
hàng, các hàng còn lại đưa tín hiệu mức cao
• Kiểm tra tín hiệu tại các cột
Trang 107Demo
Trang 108Ghép nối vi điều khiển với ma trận phím
Khi có phím bấm, có tín hiệu yêu cầu ngắt gửi tới chân ngắt ngoài 0
Trang 1093.7 Lập trình điều khiển LCD
§ LCD LM016L
• 2 hàng, 16 cột
Trang 110Sơ đồ khối
Trang 111Sơ đồ chân
Trang 112Các bước lập trình điều khiển LCD
• Sử dụng phương thức ghi (0-> R/W)
• Thao tác thanh ghi lệnh (0-> RS)
• Chọn vị trí hiển thị (nếu cần)
• Sử dụng phương thức ghi (0-> RW)
• Thao tác thanh ghi dữ liệu (1-> RS)
• Dữ liệu gửi tới LCD là mã ASCII của ký tự cần
hiển thị
• Gửi đến chân E 1 xung cao xuống thấp để chốt
dữ liệu
Trang 113Tập lệnh điều khiển LCD
Trang 114Hàm gửi lệnh điều khiển tới LCD
void LCD_Send_Command(unsigned char x)
{
LCD_DATA=x;
RS=0; //Chon thanh ghi lenh
RW=0; //De ghi du lieu
Trang 115Hàm gửi 1 ký tự tới LCD
void LCD_Write_One_Char(unsigned char c)
{
LCD_DATA=c; //Dua du lieu vao thanh ghi
RS=1; //Chon thanh ghi du lieu
Trang 116}
Trang 117Ví dụ
Trang 1183.8 Lập trình bảng quang báo
§ Ví dụ bảng quang báo: bảng quảng cáo, thông
báo…
Trang 119Nguyên tắc hoạt động của bảng quang báo
§ Bảng quang báo hoạt động dựa trên hiện tượnglưu ảnh trên mắt người
§ Các hàng/cột của bảng quang báo được quét vớitốc độ rất nhanh và do hiện tượng lưu ảnh mà
mắt người không cảm nhận được sự thay đổi
Trang 120Linh kiện làm bảng quang báo
§ Bảng quang báo kích thước nhỏ: một hoặc mộtvài module led 8x8
Trang 121Linh kiện làm bảng quang báo
§ Bảng quang báo kích thước lớn: hàng chục/hàngtrăm module led được ghép nối với nhau
§ Mỗi một cụm module led sẽ có vi điều khiển
§ Các vi điều khiển tại các cụm sẽ được kết nối vớinhau theo các chuẩn truyền tin
• RS485
• CAN
• I2C
• …