Phương pháp ngắt và thăm dò• Phương pháp thăm dò: bộ vi điều khiển liên tục 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ều thiết bị cùng yê
Trang 12.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 2Các lệnh điều kiện
• Lệnh nhảy có điều kiện: JZ, JNZ, DJNZ, JC, JNC, JB, JNB
• Lệnh nhảy không điều kiện: SJMP (nhảy ngắn), LJMP (nhảy dài)
• Ví dụ:
MOV A,R5 ;A=R5 JNZ NEXT ;Nhảy tới NEXT nếu A khác 0 MOV R5,#55h
NEXT:
…
Trang 3Lệnh lặp
• Lệnh DJNZ
• Cú pháp
+ 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
Trang 4Các lệnh logic, lệnh quay
• Lệnh ANL
ANL đích, nguồn ; đích=đích AND nguồn
Mục đích: che, xóa bit
VD: - Xóa 4 bit thấp của thanh ghi A
Trang 5Các lệnh logic, lệnh quay
• Lệnh XRL
XRL đích, nguồn ; đích=đích XOR nguồn
Mục đích: - Xóa thanh ghi (XOR với chính nó)
- Đảo bit (XOR với 1)
VD: Xóa thanh ghi A
Đảo các bit của thanh ghi A
Trang 6Các lệnh logic, lệnh quay
• Lệnh quay
• Lệnh quay phải: RR A
Trang 7Cá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 8Cổng vào/ra và lập trình
• 8051 có 4 cổng vào ra (mỗi cổng 8 bit): P0, P1, P2, P3
• Sau khi reset, các cổng ở chế độ mặc định là cổng ra
• Để các cổng/chân làm việc ở chế độ cổng/chân vào phải tiến hành ghi các bit 1 ra các cổng/chân tương ứng
• Ví dụ: MOV P1,#0FF ; Cổng 1 thành cổng vào
SETB P1.0 ; Chân P1.0 làm chân vào
; các chân còn lại làm chân ra
Trang 9Nguyên lý bit cổng
Sơ đồ nguyên lý của một bit cổng
Trang 10Nguyên lý bit cổng
• Đọc dữ liệu:
• Đọ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 11Nguyên lý bit cổng
• Ghi dữ liệu: ? Write=1:Q=Data(i)
• Data(i)=0:
/Q=1 Gate=1 Rds nhỏ, IO pin =0
• Data(i)=1:
/Q=0 Gate=0 Rds >>, IO pin =1
Trang 12Lập trình xuất dữ liệu ra cổng/chân
• Xuất dữ liệu ra cổng ra
MOV tên_cổng, giá trị
• 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 13Ví dụ
Trang 14Lập trình đọc dữ liệu từ cổng vào
• Bước 1: Thiết lập cổng làm việc ở chế độ cổng vào
• Bước 2: Đọc dữ liệu trên cổng
Ví dụ:
MOV P1, #0FFhMOV A, P1 ; Đọc giá trị tại
; cổng P1, lưu vào AMOV P2, A ; Xuất ra cổng P2
Trang 15Ví dụ
MOV P3,#0FFh MOV A,P3
MOV P0,A MOV P2,A
Trang 17Lậ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
Trang 18Chương trình Hello World
(Nhấp nháy led chân P1_0)
Trang 19Lậ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 value=P1; //Đọc dữ liệu từ cổng P1
• Đọc dữ liệu từ chân: Tên biến=Tên chân
Trang 20Ví 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 21Ví dụ 1: xuất dữ liệu ra cổng
Trang 23Ví dụ 2: đọc dữ liệu từ chân vào
Trang 24đọc dữ liệu từ chân vào
Trang 25Hiệ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ắn trước khi chuyển sang trạng thái ổn định
Lý tưởng
Thực tế
Trang 26Hiện tượng nảy phím (key bounce)
• Hậu quả của này phím
• Thay vì đọc một ký tự A từ bàn phím thì đọc thành nhiều ký tự A: AAAAAA
• Đếm số lần bấm phím sẽ không còn chính xác
• Giữa thời điểm nhấn phím và nhả phím sẽ xuất hiện nhiều lần
“giả” bấm và nhả phím
Chống nảy phím
Trang 27Chống nảy phím
• Chống nảy phím bằng phần mềm
• Thêm một khoảng trễ (tùy thuộc vào từng loại nút bấm, thông thường
khoảng 20ms) sau khi nhận sự kiện nhấn phím đầu tiên -> bỏ qua thời gian nảy phím
• Chống nảy phím bằng phần cứng
• Đấu thêm tụ điện song song với công tắc
• Sử dụng trigger smith
Trang 28}
Trang 29Lập trình hiển thị led 7 thanh
• Nguyên tắc hoạt động của led 7 thanh
• Led đơn
Trang 30Led 7 thanh
• Cấu thành từ các led đơn
Phân loại:
• Anode chung
Trang 31Phân loại led 7 thanh
Trang 32Ví dụ
Trang 33void main(){
while(1){
P0=0x40; //Hien thi so 0 delay(100);
P0=0x79; //Hien thi so 1
Trang 34Phương pháp ngắt và thăm dò
• Phương pháp thăm dò: bộ vi điều khiển liên tục 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ều thiết bị cùng yêu cầu
• Phương pháp ngắt: mỗi khi thiết bị yêu cầu phục 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 35Trình phục vụ ngắt
• 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ì vi điều khiển thực thi 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ớ
• Tập hợp các ô nhớ lưu giữ địa chỉ của tất cả các trình phục vụ ngắt gọi
là bảng vector ngắt (Interrupt Table)
Trang 36Chu 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 37Trì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ị ngắt
Trang 38Hoạt động ngắt (tiếp)
Trang 39Xử lý với nhiều tín hiệu yêu cầu ngắt
• Xử lý ngắt tuần tự:
• Khi một ngắt đang được thực hiện, các ngắt khác sẽ bị cấm
• Bộ xử lý sẽ bỏ qua các ngắt tiếp theo trong khi đang xử lý một 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 40Xử lý ngắt tuần tự (tiếp)
Trang 41Xử 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 42Xử lý ngắt ưu tiên
Trang 43Cá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 44Bảng vector ngắt
• Bảng vector ngắt của 8051
Trang 45Lập trình xử lý ngắt
• Dưới góc nhìn của ngôn ngữ C
• Chương trình con xử lý ngắt cũng là một chương trình con.
bởi bộ vi điều khiển.
Trang 46Khung chương trình con xử lý ngắt
• void Tên_chương_trình_con() interrupt Số_hiệu
• 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)
#define IE0_VECTOR 0 /* External Interrupt 0 */
#define TF0_VECTOR 1 /* Timer 0 */
#define IE1_VECTOR 2 /* External Interrupt 1 */
#define TF1_VECTOR 3 /* Timer 1 */
#define SIO_VECTOR 4 /* Serial port */
Trang 48Thanh ghi TCON
Trang 49Lập trình xử lý ngắt ngoài
• Bước 1: Thiết lập thanh ghi IE để cho phép ngắt ngoài
• Bước 2: Chọn chế độ ngắt (theo sườn hay theo 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
• Bước 3: Viết chương trình con xử lý ngắt
Trang 50Ví dụ 1
• Viết chương trình xử lý ngắt ngoài 0 theo chế độ ngắt theo mức
void IEX0_Process() interrupt 0 {
//Chương trình }
void 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 51Ví dụ 2
• Viết chương trình xử lý ngắt ngoài 1 theo chế độ ngắt theo sườn
void IEX0_Process() interrupt 2 {
//Chương trình }
void 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 52Demo
Trang 54Cấ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 55Cấ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 56Các bước lập trình bộ định thời
• Tính toán giá trị ban đầu cho thanh ghi bộ định thời
• Nạp giá trị này vào thanh ghi bộ định thời
• Khởi động bộ định thời
• Thanh ghi bộ định thời sẽ tự động tăng cho đến giá trị tối đa và thiết lập cờ TF báo tràn
Trang 57Cá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 58Các thanh ghi điều khiển Timer/Counter
• Thanh ghi TMOD
Trang 60Lập trình ghép nối bàn phím
• Cấu trúc bàn phím ma trận
Trang 61Hoạ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
• Bình thường, tín hiệu tại các cột là mức cao
• Khi có nút được bấm trên cột nào thì tín hiệu đọc tại cột đó sẽ ở mức thấp
• Để xác định được chính xác nút ở hàng nào, cột nào được bấm thì
phải thực hiện thủ tục quét 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
Trang 62Demo
Trang 63Ghé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 64Lập trình điều khiển LCD
• LCD LM016L
• 2 hàng, 16 cột
Trang 65Sơ đồ khối
Trang 66Sơ đồ chân
Trang 67Các bước lập trình điều khiển LCD
• Bước 1: Thiết lập cấu hình làm việc cho LCD
• Sử dụng phương thức ghi (0-> R/W)
• Thao tác thanh ghi lệnh (0-> RS)
• Bước 2: Gửi dữ liệu hiển thị trên LCD
• 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ị
Trang 68Tập lệnh điều khiển LCD
Trang 69Hà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
EN=1;
Delay_ms(1);
EN=0;
Trang 70Hà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 71LCD_Send_Command(0x0E); LCD_Send_Command(0x01); //Xoa man hinh
Trang 72Ví dụ
Trang 73Lậ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 74Nguyê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ượng lư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ới tố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 75Linh kiện làm bảng quang báo
• Bảng quang báo kích thước nhỏ: một hoặc một vài module led 8x8
Trang 76Linh 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àng tră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ới nhau theo các chuẩn truyền tin
• RS485
• CAN
• I2C
• …
Trang 77Cấu tạo module led
• Mỗi module led sẽ bao gồm các chân điều khiển hàng và điều khiển cột
• VD: module led 8x8 có 8 chân điều khiển hàng và 8 chân điều khiển cột
Trang 78Các bước làm ứng dụng quang báo
• Tạo font chữ mong muốn
• Thiết kế mạch ghép nối các module led với nhau và với vi điều khiển
• Thực hiện thuật toán quét led phù hợp
Trang 79Ví dụ
• Để hiển thị chữ A trên module led 8x8
• Bước 1: Tạo font chữ (thường có kích
thước 5x8 – chiều rộng 5 pixel và cao
Trang 80Font chữ B
Trang 81Font chữ C
Trang 82Font chữ D
Trang 83Font chữ E
Trang 84Font số 0
Trang 85Font số 1
Trang 86Font số 2
Trang 87Font số 3
Trang 88Font số 4