Giáo trình Lập trình vi điều khiển
Các kiểu cấu trúc bộ nhớ
2.2.1. Cấu trúc Von Neumann
Trong cấu trúc Von Neumann chỉ có một vùng địa chỉ tuyến tính bao gồm tất cả
dữ liệu và lệnh điều khiển, độ lớn của vùng địa chỉ phụ thuộc vào chiều dài của bộ
đếm chương trình, nếu không trang bị thêm linh kiện phụ thì việc định địa chỉ bộ nhớ
chương trình và bộ nhớ dữ liệu không độc lập với nhau. Trong cấu trúc này chỉ tồn tại
một bus dữ liệu và một bus địa chỉ để đọc-ghi dữ liệu và đọc lệnh điều khiển chương
trình và không có khả năng thực song song (truy xuất đồng thời bộ nhớ dữ liệu và bộ
nhớ chương trình).
2.2.2. Cấu trúc Harvard
Gồm hai vùng địa chỉ riêng biệt cho bộ nhớ dữ liệu và bộ nhớ chương trình nên
có thể truy xuất song song dữ liệu và lệnh điều khiển, cấu trúc này đặc biệt thích hợp
với các vi điều khiển 16 và 32 bít vì làm tăng tốc độ làm việc. Nếu chỉ có một hệ
thống bus như thường thấy ở vi điều khiển 8 bít thì việc truy xuất bộ nhớ dữ liệu hoặc
bộ nhớ chương trình sẽ được thực hiện thông qua các tín hiệu điều khiển, nếu không
có yêu cầu ghi vào bộ nhớ chương trình thì cấu trúc này còn cho phép tăng tính an
toàn của chương trình.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Lập trình vi điều khiển
àn phím và thay đổi quá trình nấu tương ứng sau đó chấm dứt bằng cách chuyển điều khiển về cho chương trình chính, chương trình chính lại tiếp tục từ nơi bị ngắt. Một điểm quan trọng trong ví dụ này là việc nhập bằng tay xảy ra một cách không đồng bộ có nghĩa là không biết trước hoặc không được điều khiển bằng phần mềm đang chạy trong hệ thống. Đó chính là đặc điễm của ngắt. Hình 32-06-1 Thực hiện chương trình 2. Tổ chức ngắt Cờ ngắt xảy ra Trình phục vụ ngắt vectơ ngắt Chương trình hiện hành Cách nhìn ngắn gọn của một chương trình thực thi không có ngắt Cách nhìn ngắn gọn của một chương trình thực thi có ngắt Bắt đầu trình phục vụ ngắt Kết thúc trình phục vụ ngắt 101 Mục tiêu: - Hiểu được cấu tạo các thanh ghi của ngắt - Biết được chuỗi vòng hoạt động của các ngắt - Biết được địa chỉ các thanh ghi ngắt - Ứng dụng các thanh ghi để viết chương trình điều khiển 2.1. Thanh ghi cho phép và không cho phép ngắt Mỗi nguồn ngắt được cho phép hoặc không cho phép thông qua thanh ghi chức năng đặc biệt có các bit được địa chỉ hóa IE (Interrupt Enable) tại địa chỉ 0A8H. Bit Symbol Address Mô tả (1: cho phép, 0: không cho phép) IE.7 EA AFH Cho phép, không cho phép toàn cục IE.6 - AEH Không xác định IE.5 ET2 ADH Cho phép ngắt do timer 2(có ở 8952) IE.4 ES ACH Cho phép ngắt nối tiếp IE.3 ET1 ABH Cho phép ngắt do timer1 IE.2 EX1 AAH Cho phép ngắt do bên ngoài (INT 1) IE.1 ET0 A9H Cho phép ngắt do timer0 IE.0 EX0 A8H Cho phép ngắt do bên ngoài (INT 0) 2.2. Thanh ghi ưu tiên ngắt Khi có nhiều ngắt được cho phép, một trong số các ngắt được chọn ưu tiên cao hơn. Nếu một ngắt được chọn ưu tiên nó sẽ làm cho ngắt khác đang thực thi sẽ tạm dừng cho đến khi trình phục vụ ngắt ưu tiên kết thúc . Trong một tình huống khác, khi hai ngắt xảy ra cùng lúc, ngắt nào có mức ưu tiên cao hơn sẽ làm trước. Ở vi điều khiển 89xxx, một chương trình có sử dụng ngắt được chia làm 3 mức: mức nền (thường cho chương trình chính), mức ngắt và ưu tiên ngắt và chỉ có một ngắt được ưu tiên cao nhất nếu có nhiều ngắt được cho phép. Mỗi một nguyên nhân ngắt riêng 102 rẽ được lập trình để có một trong hai mức ưu tiên thông qua thanh ghi chức năng đặt biệt IP (interrupt priority). Bit Symbo l Bit Address Description (1: ưu tiên, 0: không ưu tiên) IP.7 - - Không sử dụng IP.6 - - Không sử dụng IP.5 ET2 ADH Ưu tiên do ngắt do bộ định thời 2 IP.4 ES ACH Ưu tiên do ngắt do port nối tiếp IP.3 ET1 ABH Ưu tiên do ngắt do bộ định thời 1 IP.2 EX1 AAH Ưu tiên do ngắt do bên ngoài (INT 1) IP.1 ET0 A9H Ưu tiên do ngắt do bộ định thời 0 IP.0 EX0 A8H Ưu tiên do ngắt do bên ngoài (INT 0) 2.3. Chuỗi Pooling Nếu như có nhiều ngắt cùng xuất hiện đồng thời, chuỗi vòng sẽ xác định ngắt nào thực hiện trước. Chuỗi vòng này là: Ngắt ngoài 0, ngắt do bộ định thời 0, ngắt ngoài 1, ngắt do bộ định thời 1, ngắt do port nối tiếp, ngắt do bộ định thời 2. 103 Hình 32-06-2 Cấu trúc ngắt 8051 2.4. Vector ngắt Khi có sự kiện ngắt (Cờ ngắt) xuất hiện, chương trình ngắt bắt đầu một địa chỉ cố định – gọi là vectơ ngắt. Interrupt Flag Interrupt Vector System Reset RST 0000h External 0 IE0 0003H Timer 0 TF0 000BH External 1 IE1 0013H Timer 1 TF1 001BH Serial Port RI, TI 0023H Timer2 TF2 & EXF2 (vđk 8952) 002BH 3. Thiết kế ngắt Mục tiêu:Viết chương trình sử dụng ngắt Dựa vào kích thước của chương trình, ta có 2 mẫu thiết kế như sau: 104 Mẫu thiết kế trình phục vụ ngắt có kích thước nhỏ Org 0000h Ljmp main ; Nhảy qua khỏi đoạn các vectơ ngắt Org 00xxh ISR_xx: ;Trình phục vụ ngắt Reti Org 0030h Main: End Mẫu thiết kế trình phục vụ ngắt có kích thước lớn Org 0000h Ljmp main ; Nhảy qua khỏi đoạn các vectơ ngắt Org 00xxh Ljmp ISR_xx ;vùng khai báo các vecto ngắt và ;dùng l ệnh nhảy đến trình phục vụ ngắt Org 0030h Main: ISR_xx: ; Các trình phục vụ ngắt Reti End 105 4. Ngắt Timer Mục tiêu: - Hiểu được hoạt động của ngắt Timer - Viết chương trình điều khiển sử dụng các ngắt Timer Các ngắt do các bộ Timer xảy ra do sự kiện tràn ở các Timer, khi đó các cờ tràn TF0 hoăc TF1 sẽ được đặt bằng 1. Khi ISR được đáp ứng, các cờ TF0 hoăc TF1 sẽ tự động được xóa bởi phần mềm. 5. Ngắt ngoài Mục tiêu: - Hiểu được hoạt động của ngắt ngoài - Viết chương trình điều khiển sử dụng các ngắt ngoài Các ngắt ngoài xảy ra khi có một mức thấp hoặc cạnh xuống trên chân /INT0 hoặc /INT1 của bộ vi điều khiển. Các cờ tạo ra các ngắt này là bít IE.0 và IE.1 trong thanh ghi TCON, cờ tạo ra ngắt bị xóa bởi phần cứng khi CPU trỏ đến ISR nếu ngắt là loại tác động cạnh, còn đối với ngắt tác động bằng mức thì nguồn tạo ngắt bên ngoài sẻ điều khiển mức của cờ ngắt. Việc chọn lựa ngắt tác động mức thấp hoặc tác động cạnh âm được được lập trình thông qua bít IT0 và IT1 trong thanh ghi TCON. VD: Nếu IT1 = 0 thì ngắt 1 ngoài được kích bởi mức thấp tại chân INT1 và nếu IT1 = 1 thì ngắt này được kích bằng cậnh âm. Trong chế độ này nếu các mẫu tại chân INT1 ở mức cao trong một chu kỳ và ở mức thấp trong các chu kỳ kế tiếp thì cờ IE1 trong TCON được set và sau đó cờ này sẻ yêu cầu một ngắt. Vì các chân ngắt ngoài được lấy mẫu mỗi chu kỳ máy một lần nên ngỏ vào này phải được duy trì ít nhất trong 12 chu kỳ dao động để bảo đãm việc lấy mẫu là thích hợp. Nếu là loại tác động cạnh thì nguồn ngoài phải giữ ở mức cao ít nhất một chu kỳ và ở mức thấp ít nhất một chu kỳ hoặc hơn để bảo đảm nhận ra được sự chuyển mức. IE0 và IE1 được xóa tự động khi CPU trỏ đến ngắt. Nếu ngắt ngoài là loại tác động mức thì nguồn ngoài phải duy trì mức tác động cho đến khi ngắt yêu cầu thực sự được tạo ra. Sau đó phải trở về mức không tác động trước khi ISR hoàn tất hoặc trước khi một ngắt khác được tạo ra. Thông thường một 106 thao tác trong ISR làm cho nguồn tạo ngắt trả tín hiệu ngắt trở về trạng thái không tác động. 6. Ngắt cổng nối tiếp Mục tiêu: - Hiểu được hoạt động của ngắt do cổng nối tiếp - Viết chương trình điều khiển sử dụng ngắt do cổng nối tiếp Các ngắt của cổng nối tiếp xảy ra khi một trong hai cờ ngắt phát TI hoặc cờ ngắt thu RI được set. Ngắt phát xuất hiện khi quá trình phát của ký tự trước đó được viết vào SBUF hoàn tất, một ngắt thu xuất hiện khi một ký tự đã được nhận đầy đủ và đang chờ đọc trong SBUF. Các ngắt cổng nối tiếp khác với các ngắt của timer, cờ tạo ra ngắt cổng nối tiếp không được xóa bằng phần cứng khi CPU trỏ đến véc tơ ngắt lý do là có hai nguồn tạo ra một ngắt cổng nối tiếp đó là TI hoặc RI. Nguồn tạo ra ngắt phải được xác định trong ISR và cờ ngắt được xóa bằng phần mềm. Trở lại với các ngắt timer, cờ ngắt được xóa bằng phần cứng khi CPU trỏ đến ISR THỰC HÀNH VỚI NGẮT I. MỤC TIÊU - Hiểu rõ hơn về tập lệnh của vi điều khiển MCS-51. - Hiểu được hoạt động của ngắt (Interrupt) ở các chế độ khác nhau. - Hiểu được phương pháp lập trình và điều khiển có sử dụng các ngắt. II. NỘI DUNG THÍ NGHIỆM 1. Nối mạch thí nghiệm Ngắt do Timer Chương trình 1 : Viết chương trình tạo sóng vuông tần số f = 5 KHz tại P1.0 dùng ngắt timer 1 (giả sử tần số thạch anh là 12 MHz). 107 2. Viết chương trình điều khiển ORG 0000h LJMP main ORG 001Bh CPL P1.0 ; đảo bit RETI ; trở về chương trình chính từ ISR Main: MOV TMOD,#20h MOV IE,#88h ; Có thể thay thế bằng 2 lệnh sau: ; SETB EA ; SETB ET1 MOV TH1,#(-100) MOV TL1,#(-100) SETB TR1 SJMP $ END Chương trình 2 : Viết chương trình tạo xung vuông tần số f =10KHz tại P1.0 dùng ngắt timer 0 và xung vuông tần số f = 1 KHz tại P1.1 dùng ngắt timer 1. 108 ORG 0000h LJMP main ORG 000Bh CPL P1.0 RETI ORG 001Bh MOV TH1,#HIGH(-500) ; 2 byte MOV TL1,#LOW(-500) ; 2 byte CPL P1.1 ; 2 byte RETI ; 1 byte Main: MOV TMOD,#12h MOV IE,#8Ah SETB TR0 SETB TR1 MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) MOV TH0,#(-50) MOV TL0,#(-50) 109 SJMP $ END Ngắt ngoài Chương trình 3: Giả sử chân INT1 được nối đến công tắc bình thường ở mức cao. Mỗi khi nó xuống thấp phải bật một đèn LED. Đèn LED được nối đến chân P1.3 và bình thường ở chế độ tắt. Khi nó được bật lên nó phải sáng vài phần trăm giây. Chừng nào công tắc được ấn xuống thấp đèn LED phải sáng liên tục. ORG 0000H LJMP MAIN ; Nhảy đến bảng véc tơ ngắt ; - - Chương trình con ISR cho ngắt cứng INT1 để bật đèn LED. ORG 0013H ; Trình phục vụ ngắt ISR cho INT1 SETB P1.3 ; Bật đèn LED MOV R3, # 255 ; BACK: DJNZ R3, BACK ; Giữ đèn LED sáng một lúc CLR P1.3 ; Tắt đèn LED RETI ; Trở về từ ISR ; - - Bắt đầu chương trình chính Main. ORG 30H 110 MAIN: MOV IE, #10000100B ; Cho phép ngắt dài SJMP HERE ; Chờ ở đây cho đến khi được ngắt END Chương trình 4 Viết chương trình sao cho mỗi khi có mức logic 0 xuất hiện tại P3.2 (ngắt ngoài 0) thì tạo xung 1 KHz tại P1.0. Quá trình tạo xung chỉ dừng khi có mức logic 0 xuất hiện tại P3.3 (ngắt ngoài 1). ORG 0000h LJMP main ORG 0003h ; Địa chỉ ISR ngắt ngoài 0 SETB TR1 ; Timer 1 chạy RETI ORG 0013h ; Địa chỉ ISR của ngắt ngoài 1 CLR TR1 ; Cấm timer 1 RETI ORG 001Bh ; Địa chỉ ISR timer 1 111 MOV TH1,#HIGH(-500); Chế độ 16 bit nên mỗi lần tràn MOV TL1,#LOW(-500); phải nạp lại giá trị CPL P1.0 ; Đảo bit P1.0 để tạo xung RETI Main: MOV TMOD,#10h MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) MOV IE,#8Dh ; Cho phép ngắt tại ngắt ngoài 0, 1 và SJMP $ ; timer 1 END Ngắt cổng nối tiếp Chương trình 6 Viết chương trình đếm sản phẩm bằng vi điều khiển 8051 và truyền dữ liệu qua cổng nối tiếp. Chương trình: org 0000h mov tmod,#20h mov scon,#50h mov th1,#0fdh setb tr1 112 clr tf1 clr ti clr ri mov r7,#0 lap: call delay cpl p1.0 jb p3.7,lap jnb p3.7,$ inc r7 call truyensanpham sjmp lap truyensanpham: mov a,r7 mov b,#10 div ab mov 30h,b mov b,#10 div ab mov 31h,b mov 32h,a mov dptr,#ma movc a,@a+dptr clr ti mov sbuf,a jnb ti,$ mov a,31h movc a,@a+dptr clr ti mov sbuf,a 113 jnb ti,$ mov a,30h movc a,@a+dptr clr ti mov sbuf,a jnb ti,$ clr ti mov sbuf,#0dh jnb ti,$ ret delay: mov 70h,#2 dl1: mov 71h,#255 dl2: mov 72h,#255 djnz 72h,$ djnz 71h,dl2 djnz 70h,dl1 ret ma: db '0123456789',00h end ĐIỀU KHIỂN LCD I. MỤC TIÊU - Hiểu hơn về tập lệnh của vi điều khiển MCS-51. - Biết cách viết các chương trình điều khiển LCD. - Hiểu được sơ đồ và nguyên lý hoạt động của khối LCD trên mô hình thí nghiệm. - Hiểu được nguyên lý và kỹ thuật điều khiển để hiển thị các thông tin trên LCD. - Biết cách viết các chương trình ứng dụng để hiển thị các dạng thông tin khác nhau trên LCD tùy theo nhu cầu sử dụng. II. NỘI DUNG THÍ NGHIỆM 114 1. Nối mạch thí nghiệm Sơ đồ của LCD1602A: CONST (contrast): chỉnh độ tương phản (độ sáng của hình ảnh trên LCD). - EN (Enable): cho phép đọc/ghi dữ liệu. Trong chế độ đọc, EN tác động bằng xung dương (cạnh lên) và trong chế độ ghi, EN tác động bằng xung âm (cạnh xuống). - RS (register selection): chọn thanh ghi lệnh (RS = 0) hoặc thanh ghi dữ liệu (RS = 1) - R/W: đọc (R/W = 1) hay ghi (R/W = 0) - D7 – D4: bus dữ liệu (chế độ 8 bit: 4 bit cao, chế độ 4 bit: dùng cho truyền 4 bit cao và 4 bit thấp). Ngoài ra, bit D7 còn dùng làm ngõ ra cho cờ Busy. - D3 – D0: 4 bit thấp trong chế độ 8 bit hay bỏ trống trong chế độ 4 bit. - A, K: anode và cathode đèn nền của LCD. Các thành phần chức năng của LCD1602A: - Cờ Busy (BF – Busy flag): Nếu BF = 1, LCD đang trong quá trình thực thi một lệnh. Khi đó, các lệnh gởi tiếp theo sẽ bị bỏ qua. BF được đọc tại chân D7 khi RS = 0 và R/W = 1. Do đó, trước khi thực hiện một lệnh, cần kiểm tra BF trước, nếu BF = 0 thì mới gởi lệnh. - DDRAM (Display Data RAM): chứa các ký tự sẽ hiển thị trên LCD, tối đa là 80x8 bit (80 ký tự). Khi hiển thị ở chế độ 1 dòng, địa chỉ của DDRAM có phạm vi từ 00h ÷ 4Fh còn khi ở chế độ 2 dòng, địa chỉ DDRAM từ 00h ÷ 27h cho dòng 1 và 40h ÷ 67h cho dòng 2. - Bộ đếm địa chỉ (AC - Address Counter): dùng để lưu địa chỉ hiện hành của DDRAM và CGRAM, có thể thực hiện đọc AC khi RS = 0 và R/W = 1. 115 - CGROM (Character Genaration ROM): chứa các mô hình ký tự sẽ hiển thị trên LCD, bao gồm 192 ký tự 5x7 theo bảng mã ASCII (nghĩa là khi DDRAM chứa giá trị 41h tương ứng với mã ASCII của ký tự ‘A’ thì trên LCD sẽ hiện ‘A’), trong đó chỉ có các mã từ 00h – 0Fh sẽ không lấy theo mã ASCII mà lấy theo các ký tự đã định nghĩa trong CGRAM. Chương trình 1 Cho sơ đồ kết nối LCD 1602A với AT89C51 như hình vẽ. Viết chương trình hiển thị chuỗi “TRUONG CAO DANG” trên dòng 1 hiển thị chuỗi “NGHE CONG NGHIEP” trên dòng 2. 2. Viết chương trình điều khiển DATA_PORT EQU P0 RS BIT P2.0 RW_ BIT P2.1 E BIT P2.2 DB7 BIT P0.7 ORG 00h CALL KHOITAO LOOP: MOV DPTR,#CHUOI1 116 CALL WRITE_STRING MOV A,#0C0H CALL GHI_LENH MOV DPTR,#CHUOI2 CALL WRITE_STRING JMP $ KHOITAO: MOV A,#038H CALL GHI_LENH MOV A,#0dH CALL GHI_LENH MOV A,#01 CALL GHI_LENH RET WRITE_STRING: MOV R0,#0 WR_LOOP: MOV A,R0 MOVC A,@A+DPTR CJNE A,#00H,NEXT JMP EXIT NEXT: CALL WRITE INC R0 JMP WR_LOOP EXIT: RET WRITE: CALL READY 117 MOV DATA_PORT,A SETB RS CLR RW_ CLR E SETB E RET Ghi_lenh: CALL READY mov DATA_PORT,A clr rw_ clr rs clr e setb e ret READY: MOV DATA_PORT,#0FFH CLR RS SETB RW_ recheck: CLR E SETB E JB DB7,recheck RET CHUOI1: DB 'TRUONG CAO DANG',00H CHUOI2: DB 'NGHE CONG NGHIEP ',00H END Yêu cầu về đánh giá kết quả học tập 118 * Về kiến thức: - Hiểu cấu tạo vi điều khiển 8051. - Ứng dụng bộ định thời để tạo thời gian trễ. - Biết công dụng và cách sử dụng ngắt. - Truyền dữ liệu kiểu nối tiếp. - Giải thích sơ đồ mạch. - Viết chương trình ứng dụng theo yêu cầu. *Về kỹ năng: - Lắp ráp được mạch điều khiển theo sơ đồ có sẵn. - Phân tích được hiện tượng và phán đoán nguyên nhân gây hư hỏng trong mạch điều khiển bằng các thiết bị đo. - Sửa được chương trình điều khiển. * Về thái độ - Nghiêm túc, tích cực, chủ động trong học tập. - Chấp hành nghiêm chỉnh nội quy của xưởng và phòng thực hành vi điều khiển. TÀI LIỆU THAM KHẢO [1]- Tống Văn On, Hoàng Đức Hải, Họ vi điều khiển 8051, NXB Lao đông xã hội, Hà Nội 2005. [2]- Ngô Diên Tập, Lập trình bằng hợp ngữ, NXB Khoa học kỹ thuật, Hà Nội 1998. [3]- Ngô Diên Tập, Vi xử lý trong đo lường và điều khiển, NXB Khoa học kỹ thuật, Hà Nội 1999. [4]- Đỗ Xuân Thụ, Hồ Khánh Lâm, Kỹ thuật vi xử lý và máy tính, NXB Giáo dục, Hà Nội 2000. [5]- Nguyễn Tăng Cường, Phan Quốc Thắng, Cấu trúc và lập trình vi điều khiển, NXB Khoa học kỹ thuật, Hà Nội 2004. [6]- Ngô Diên Tập, Vũ Trung Kiên, Phạm Xuân Khánh, Kiều Xuân Thực, Giáo trình vi xử lý và cấu trúc máy tính, NXB Giáo dục, Hà Nội 2007.
File đính kèm:
- giao_trinh_lap_trinh_vi_dieu_khien.pdf