Giáo trình Vi điều khiển (Phần 2)
Giới thiệu chung.276
Tần số: tần số xung ngõ ra bằng tần số xung ngõ vào chia cho 2N.
Giá trị: giá trị nhị phân trong các FF của bộ định thời là số đếm
của các xung clock tại ngõ vào từ khi bộ định thời bắt đầu đếm.
Tràn: xảy ra hiện tượng tràn (cờ tràn = 1) khi số đếm chuyển từ
giá trị lớn nhất xuống giá trị nhỏ nhất của bộ định thời.
Hoạt động của một bộ định thời 3 bit đơn giản được minh họa trong hình
trên. Mỗi một tầng là D FF kích khởi cạnh âm hoạt động như một mạch chia 2
do ta nối ngõ ra Q với ngõ vào D. Flipflop cờ (Flag FF) là một mạch chốt D277
được set bằng 1 bởi tầng cuối của bộ định thời. Giản đồ thời gian cho thấy tầng
thứ nhất (Q0) chia 2 tần số xung clock, tầng thứ hai (Q1) chia 4 tần số xung
clock, Số đếm được ghi ở dạng thập phân và được kiểm tra dễ dàng bằng
cách khảo sát trạng thái của 3 flipflop. Ví dụ, số đếm là 4 xuất hiện khi Q2 = 1,
Q1 = 0, Q0 = 0. Các flipflop ở trên là các flipflop tác động cạnh âm (nghĩa là
trạng thái của các flipflop sẽ thay đổi theo cạnh âm của xung clock). Khi số đếm
tràn từ 111 xuống 000, ngõ ra Q2 có cạnh âm làm cho trạng thái của flipflop cờ
đổi từ 0 lên 1 (ngõ vào D của flipflop này luôn luôn ở logic 1).
Ứng dụng định thời gian (TIMER): bộ định thời được lập trình
sao cho sẽ tràn sau một khoảng thời gian đã qui định và khi đó cờ tràn của bộ
định thời sẽ bằng 1.
Ứng dụng đếm sự kiện (COUNTER): để xác định số lần xuất hiện
của một kích thích từ bên ngoài tới một chân của chip 8051 (kích thích là sự
chuyển trạng thái từ 1 xuống 0).
Ứng dụng tạo tốc độ baud cho port nối tiếp: xem thêm trong phần
“Hoạt động port nối tiếp.”.
Tóm tắt nội dung tài liệu: Giáo trình Vi điều khiển (Phần 2)
275 BÀI 4: GIỚI THIỆU HOẠT ĐỘNG CỦA BỘ ĐỊNH THỜI TRONG VI ĐIỀU KHIỂN 8051. Mục tiêu. Kiến thức: Nắm bắt được các chức năng của bộ định thời trong vi điều khiển 8051. Nắm bắt được các chức năng của các thanh ghi định thời trong vi điều khiển 8051. Nắm bắt được các chế độ định thời trong vi điều khiển 8051. Nắm bắt được các chương trình điều khiển bộ định thời trong vi điều khiển 8051. Kỹ năng: Viết được một số chương trình điều khiển bộ định thời trong vi điều khiển 8051. Viết được một số bài tập thực hành liên quan đến hoạt động định thời để điều khiển các thiết bị ngoại vi có sẵn trên mô hình thực hành. Thái độ: Có ý thức tự giác. Tuân thủ nội quy và trình tự thực hiện. Có tinh thần hợp tác giúp đỡ lẫn nhau. Cẩn thận, đảm bảo an toàn vật liệu, linh kiện. Bảo quản thiết bị đo, mô hình học cụ. Vệ sinh mô hình, thiết bị học tập và phòng thực hành. Nội dung chính. 4.1. Giới thiệu chung. 276 Tần số: tần số xung ngõ ra bằng tần số xung ngõ vào chia cho 2N. Giá trị: giá trị nhị phân trong các FF của bộ định thời là số đếm của các xung clock tại ngõ vào từ khi bộ định thời bắt đầu đếm. Tràn: xảy ra hiện tượng tràn (cờ tràn = 1) khi số đếm chuyển từ giá trị lớn nhất xuống giá trị nhỏ nhất của bộ định thời. Ví dụ: Bộ định thời 16 bit (chứa 16 FF bên trong). Tần số: 65536 162 IN f IN f OUT f Giá trị: số đếm nằm trong khoảng 0 (0000H) 65535 (FFFFH). Tràn: cờ tràn bằng 1 khi số đếm từ FFFFH chuyển xuống 0000H. Hình minh họa đơn giản hoạt động của bộ định thời 3 bit: Hoạt động của một bộ định thời 3 bit đơn giản được minh họa trong hình trên. Mỗi một tầng là D FF kích khởi cạnh âm hoạt động như một mạch chia 2 do ta nối ngõ ra Q với ngõ vào D. Flipflop cờ (Flag FF) là một mạch chốt D 277 được set bằng 1 bởi tầng cuối của bộ định thời. Giản đồ thời gian cho thấy tầng thứ nhất (Q0) chia 2 tần số xung clock, tầng thứ hai (Q1) chia 4 tần số xung clock, Số đếm được ghi ở dạng thập phân và được kiểm tra dễ dàng bằng cách khảo sát trạng thái của 3 flipflop. Ví dụ, số đếm là 4 xuất hiện khi Q2 = 1, Q1 = 0, Q0 = 0. Các flipflop ở trên là các flipflop tác động cạnh âm (nghĩa là trạng thái của các flipflop sẽ thay đổi theo cạnh âm của xung clock). Khi số đếm tràn từ 111 xuống 000, ngõ ra Q2 có cạnh âm làm cho trạng thái của flipflop cờ đổi từ 0 lên 1 (ngõ vào D của flipflop này luôn luôn ở logic 1). Ứng dụng định thời gian (TIMER): bộ định thời được lập trình sao cho sẽ tràn sau một khoảng thời gian đã qui định và khi đó cờ tràn của bộ định thời sẽ bằng 1. Ứng dụng đếm sự kiện (COUNTER): để xác định số lần xuất hiện của một kích thích từ bên ngoài tới một chân của chip 8051 (kích thích là sự chuyển trạng thái từ 1 xuống 0). Ứng dụng tạo tốc độ baud cho port nối tiếp: xem thêm trong phần “Hoạt động port nối tiếp.”. 4.2. Bộ định thời của vi điều khiển 8051. 4.2.1. Thanh ghi THx/TLx. TL0: Chứa byte thấp của bộ định thời 0. TL1: Chứa byte thấp của bộ định thời 1. TH0: Chứa byte cao của bộ định thời 0. TH0: Chứa byte cao của bộ định thời 1. 4.2.2. Thanh ghi TMOD. 278 Thanh ghi TMOD (Timer Mode Register) chứa các bit dùng để thiết lập chế độ hoạt động cho bộ định thời 0 và bộ định thời 1. Thanh ghi TMOD được nạp giá trị một lần tại thời điểm bắt đầu của chương trình để qui định chế độ hoạt động của các bộ định thời. Cấu trúc thanh ghi TMOD: Các chế độ hoạt động của bộ định thời: Ví dụ 1: Cho biết giá trị cần nạp cho thanh ghi TMOD để Timer 0: là bộ định thời gian 16 bit, được điều khiển bằng phần mềm (bit TR0). 279 Timer 1: là bộ đếm xung 13 bit, được điều khiển bằng phần cứng (chân 1INT ). Giải Phân tích: (1): Chế độ 16 bit. M1 = 0, M0 = 1. (2): Bộ định thời gian. TC / = 0. (3): Điều khiển bằng phần mềm. GATE = 0. (4): Chế độ 13 bit. M1 = 0, M0 = 0. (5): Bộ đếm xung. TC / = 1. (6): Điều khiển bằng phần cứng. GATE = 1. Từ đó ta có: (TMOD) = 11000001B = C1H. Ví dụ 2: Cho biết giá trị cần nạp cho thanh ghi TMOD để Timer 0: không sử dụng. Timer 1: là bộ định thời gian 8 bit tự nạp lại, được điều khiển bằng phần mềm (bit TR1). Giải Phân tích: (1): Không sử dụng. M1 = 0, M0 = 0. (2): Không sử dụng. TC / = 0. (3): Không sử dụng. GATE = 0. Do Timer 0 không sử dụng, nên ta có thiết lập nó ở bất cứ chế độ nào. Thông thường để dễ dàng ta nên cho: GATE=0, TC / = 0, M1 = 0 và M0 = 0. (4): Chế độ 8 bit tự động nạp lại. M1 = 1, M0 = 0. (5): Bộ định thời gian. TC / = 0. (6): Điều khiển bằng phần mềm. GATE = 0. 280 Từ đó ta có: (TMOD) = 00100000B = 20H. Ví dụ 3: Cho biết (TMOD) = A5H. Hãy cho biết chế độ hoạt động của các Timer 0 và Timer 1. Giải Ta có: (TMOD) = A5H = 10100101B. Giải thích: M1 = 1, M0 = 0. (4): Chế độ 8 bit tự động nạp lại. TC / = 0. (5): Bộ định thời gian. GATE = 1. (6): Điều khiển bằng phần cứng. M1 = 0, M0 = 1. (1): Chế độ 16 bit. TC / = 1. (2): Bộ đếm xung. GATE = 0. (3): Điều khiển bằng phần mềm. Từ đó ta có: o Timer 0: là bộ đếm xung 16 bit, được điều khiển bằng phần mềm (bit TR0). o Timer 1: là bộ định thời gian 8 bit tự nạp lại, được điều khiển bằng phần cứng (chân 1INT ). Ví dụ 4: Cho biết (TMOD) = 21H. Hãy cho biết chế độ hoạt động của các Timer 0 và Timer 1. Giải Ta có: (TMOD) = 21H = 00100001B. Giải thích: M1 = 1, M0 = 0. (4): Chế độ 8 bit tự động nạp lại. TC / = 0. (5): Bộ định thời gian. GATE = 0. (6): Điều khiển bằng phần mềm. M1 = 0, M0 = 1. (1): Chế độ 16 bit. 281 TC / = 0. (2): Bộ định thời gian. GATE = 0. (3): Điều khiển bằng phần mềm. Từ đó ta có: Timer 0: là bộ định thời gian 16 bit, được điều khiển bằng phần mềm (bit TR0). Timer 1: là bộ định thời gian 8 bit tự nạp lại, được điều khiển bằng phần mềm (bit TR1). 4.2.3. Thanh ghi TCON. Thanh ghi TCON (Timer Control Register) chứa các bit dùng để điều khiển và báo trạng thái của bộ định thời 0 và bộ định thời 1. Cấu trúc thanh ghi TCON: 282 Lưu ý:Các bit IT0, IT1, IE0, IE1 không dùng để điều khiển các bộ định thời. Các bit này được dùng để phát hiện và khởi động các ngắt ngoài. Việc thảo luận các bit này sẽ được trình bày trong “Hoạt động ngắt.”. 4.2.4. Các chế độ định thời. 4.2.4.1. Chế độ định thời 13 bit (Chế độ 0): Chế độ 0 (Mode 0): Chế độ định thời 13 bit. Sử dụng 8 bit của thanh ghi THx và 5 bit thấp của thanh ghi TLx để tạo ra bộ định thời. Số đếm: 0000H 1FFFH nghĩa là từ 0 8191. Thời gian định thời: từ 1.TTimer 2 13.TTimer nghĩa là từ 1.TTimer 8192.TTimer. Thanh ghi THx và TLx chứa giá trị của bộ định thời. Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong THx/TLx. Xảy ra tràn (cờ tràn TFx=1) khi số đếm chuyển từ 1FFFH sang 0000H và việc đếm sẽ tiếp tục đếm lên từ giá trị 0000H. 283 Hình 4.2.1: Kiến trúc của Timer 0 ở chế độ 0 (Mode 0). 4.2.4.2. Chế độ định thời 16 bit (Chế độ 1): Chế độ 1 (Mode 1): Chế độ định thời 16 bit. Sử dụng thanh ghi THx và TLx để tạo ra bộ định thời. Số đếm: 0000H FFFFH nghĩa là từ 0 65535. Thời gian định thời: từ 1.TTimer 2 16.TTimer nghĩa là từ 1.TTimer 65536.TTimer. Thanh ghi THx và TLx chứa giá trị của bộ định thời. Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong THx/TLx. Xảy ra tràn (cờ tràn TFx=1) khi số đếm chuyển từ FFFFH sang 0000H và việc đếm sẽ tiếp tục đếm lên từ giá trị 0000H. Hình 4.2.2: Kiến trúc của Timer 0 ở chế độ 1 (Mode 1). 4.2.4.3. Chế độ định thời 8 bit tự nạp lại (Chế độ 2): 284 Chế độ 2 (Mode 2): Chế độ định thời 8 bit tự nạp lại. Sử dụng thanh ghi TLx để tạo ra bộ định thời. Số đếm: 00H FFH nghĩa là từ 0 255. Thời gian định thời: từ 1.TTimer 2 8.TTimer nghĩa là từ 1.TTimer 256.TTimer. Thanh ghi TLx chứa giá trị của bộ định thời và thanh ghi THx chứa giá trị sẽ được dùng để nạp lại cho bộ định thời. Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong TLx (THx không thay đổi giá trị). Xảy ra tràn (cờ tràn TFx=1) khi số đếm chuyển từ FFH sang 00H, đồng thời giá trị trong THx sẽ được nạp vào TLx và việc đếm sẽ tiếp tục đếm lên từ giá trị chứa trong thanh ghi TLx (giá trị này bằng với giá trị của THx). Hình 4.2.3: Kiến trúc của Timer 0 ở chế độ 2 (Mode 2). 4.2.4.4. Chế độ định thời chia xẻ (Chế độ 3): 285 Chế độ 3 (Mode 3) là: Chế độ định thời chia xẻ. Bộ định thời 0 được chia ra: o Bộ định thời 8 bit thứ I: Sử dụng thanh ghi TL0 để tạo ra bộ định thời. Số đếm: 00H FFH nghĩa là từ 0 255. Thời gian định thời:từ 1.TTimer 2 8.TTimer nghĩa là từ 1.TTimer 256.TTimer. Thanh ghi TL0 chứa giá trị của bộ định thời. Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong TL0. Xảy ra tràn (cờ tràn TF0=1) khi số đếm chuyển từ FFH sang 00H và việc đếm sẽ tiếp tục đếm lên từ giá trị 00H. o Bộ định thời 8 bit thứ II: Sử dụng thanh ghi TH0 để tạo ra bộ định thời. Số đếm: 00H FFH nghĩa là từ 0 255. Thời gian định thời:từ 1.TTimer 2 8.TTimer nghĩa là từ 1.TTimer 256.TTimer. Thanh ghi TH0 chứa giá trị của bộ định thời. Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong TH0. Xảy ra tràn (cờ tràn TF1=1) khi số đếm chuyển từ FFH sang 00H và việc đếm sẽ tiếp tục đếm lên từ giá trị 00H. Bộ định thời 1: 286 o Là bộ định thời 16 bit. o Không hoạt động ở chế độ 3 nhưng có thể hoạt động các chế độ khác (chế độ 0, 1, 2). o Không có cờ báo tràn như các bộ định thời khác. Hình 4.2.4: Kiến trúc của Timer 0 ở chế độ 3 (Mode 3). 4.2.5. Các nguồn xung clock. Nguồn xung cho bộ định thời được tạo ra từ: Mạch dao động trên chip dùng cho tính năng định thời gian. Xung kích thích bên ngoài dùng cho tính năng đếm sự kiện. 4.2.5.1. Trường hợp định thời gian: Nếu C/T=0 thì: Bộ định thời được dùng để định thời gian (Timer). 287 Nguồn xung clock định thời được lấy từ mạch dao động trên chip. Lưu ý: o Tần số xung clock cung cấp cho bộ định thời bằng 1/12 tần số của mạch dao động trên chip 8051. o Thời gian định thời là khoảng thời gian được tính từ lúc bộ định thời bắt đầu đếm lên (từ giá trị chứa trong các thanh ghi THx/TLx) cho đến lúc bộ định thời bắt đầu tràn (thời gian này phụ thuộc vào giá trị ban đầu được nạp cho các thanh ghi THx và TLx). Ví dụ: Tìm tần số xung clock và chu kỳ của bộ định thời đối với trường hợp các hệ thống vi điều khiển xây dựng trên chip 8051 với tần số thạch anh như sau: 11,0592 MHz, 12 MHz và 16 MHz. Giải Gọi fTIMER là tần số xung clock của bộ định thời, fOSC là tần số xung clock của thạch anh. Theo như trên đã trình bày, ta có: s KHz TIMER fTIMER T KHz MHzOSC f TIMER fMHz OSC f 085,1 6,921 11 6,921 12 0592,11 12 0592,11 s MHz TIMER fTIMER T MHz MHzOSC f TIMER fMHz OSC f 1 1 11 1 12 12 12 12 s MHz TIMER fTIMER T MHz MHzOSC f TIMER fMHz OSC f 75,0 333,1 11 333,1 12 16 12 16 4.2.5.2. Trường hợp đếm sự kiện: 288 Nếu C/T=1 thì: Bộ định thời được dùng để đếm sự kiện (Counter). Nguồn xung clock định thời được lấy từ xung kích thích bên ngoài tại hai chân T0 và T1 của chip 8051. Lưu ý: o Tần số kích thích tối đa cho phép tại chân T0 và T1: 2)(1,0 TIMER f MAXTT f fTIMER: tần số xung clock định thời. fT0,T1(MAX): tần số kích thích tối đa cho phép tại T0 và T1. Ví dụ: Tính tần số kích thích tối đa cho phép tại chân T0 và T1 đối với trường hợp các hệ thống vi điều khiển xây dựng trên chip 8051 với tần số thạch anh như sau: 11,0592 MHz, 12 MHz và 16 MHz. Giải KHzKHzTIMER f MAXTT fMHz OSC f 8,460 2 6,921 2)(1,0 0592,11 KHzMHzTIMER f MAXTT fMHz OSC f 500 2 1 2)(1,0 12 KHzMHzTIMER f MAXTT fMHz OSC f 5,666 2 333,1 2)(1,0 16 o Số lượng sự kiện (số xung) mà bộ định thời đếm được sẽ được chứa trong các thanh ghi THx/TLx, giá trị trong các thanh ghi này sẽ tăng theo mỗi xung kích thích bên ngoài tại T0 và T1 của chip 8051. Một kích thích được gọi là một sự kiện (một xung) khi xảy ra sự chuyển trạng thái từ 1 xuống 0 ở chân T0 hoặc T1. 4.3. Phương pháp lập trình điều khiển bộ định thời. 4.3.1. Lập trình định thời gian. Các bước cơ bản để khởi động Timer: Chọn chế độ hoạt động cho Timer, cho bit GATE=0 và C/T=0: MOV TMOD, #...(1) Chọn giá trị thích hợp (khoảng thời gian định thời) cho Timer: MOV THx, #...(2) MOV TLx, #...(3) 289 Cho Timer chạy: SETB TRx Kiểm tra cờ báo tràn (kiểm tra đủ thời gian định thời): JNB TFx, $ hoặc WAIT: JNB TFx, WAIT Xóa cờ báo tràn (chuẩn bị cho lần định thời tiếp theo): CLR TFx Dừng Timer (sau khi đã hoàn tất quá trình định thời): CLR TRx Lưu ý: x: Số thứ tự của Timer sử dụng. (1): Giá trị này phụ thuộc vào Timer được chọn và chế độ hoạt động của Timer đó. (2), (3): Giá trị này phụ thuộc vào khoảng thời gian cần định thời. Cũng cần lưu ý thêm, việc chọn giá trị cho không phải lúc nào ta cũng phải chọn giá trị cho cả hai thanh ghi này mà nó tùy thuộc vào từng chế hoạt động của Timer (Mode 0: THx/TLx, Mode 1: THx/TLx, Mode 2: THx, Mode 3: THx hoặc TLx). Các giá trị trên phải thoả mãn điều kiện sau: Chế độ 8 bit: giá trị trong khoảng từ -255 đến -1 (tương ứng từ 255.TTIMER đến 1.TTIMER). Ví dụ: MOV TH1, #(-255) định thời 255.TTIMER Chế độ 13 bit: giá trị trong khoảng từ -8191 đến -1 (tương ứng từ 8191.TTIMER đến 1.TTIMER). Ví dụ: MOV TL1, #LOW(-8000) định thời 8000.TTIMER MOV TH1, #HIGH(-8000) Chế độ 16 bit: giá trị trong khoảng từ -65535 đến -1 (tương ứng từ 65535.TTIMER đến 1.TTIMER). Ví dụ: MOV TL1, #LOW(-10000) định thời 10000.TTIMER MOV TH1, #HIGH(-10000) Trường hợp đặc biệt nếu giá trị (N) nạp vào thanh ghi THx/TLx là giá trị 0 thì thời gian định thời sẽ là lớn nhất cho từng chế độ. Chế độ 8 bit: N = 0 tDELAY = 256.TTIMER. Chế độ 13 bit: N = 0 tDELAY = 8192.TTIMER. 290 Chế độ 16 bit: N = 0 tDELAY = 65536.TTIMER. 4.3.2. Lập trình đếm sự kiện. Các bước cơ bản để khởi động Counter: Chọn chế độ hoạt động cho Counter, cho bit GATE=0 và C/T=1: MOV TMOD, #...(1) Xoá các giá trị chứa trong thanh ghi THx và TLx (nghĩa là cho số xung ban đầu bằng 0): MOV THx, #00H MOV TLx, #00H Cho Counter chạy: SETB TRx Kiểm tra cờ báo tràn (kiểm tra số đếm bị tràn) để xử lý trường hợp số đếm bị tràn. Xóa cờ báo tràn (sau khi đã xử lý cho trường hợp số đếm bị tràn): CLR TFx Dừng Counter (sau khi đã hoàn tất quá trình đếm xung): CLR TRx Đọc số xung đếm được trong thanh ghi THx và TLx. Lưu ý: x: Số thứ tự của Counter sử dụng. (1): Giá trị này phụ thuộc vào Counter được chọn và chế độ hoạt động của Counter. Giá trị này phải thoả mãn điều kiện sau: Chế độ 8 bit: số lượng xung tối đa mà Counter đếm được từ 0 đến 255. Chế độ 13 bit: số lượng xung tối đa mà Counter đếm được từ 0 đến 8191. Chế độ 16 bit: số lượng xung tối đa mà Counter đếm được từ 0 đến 65535. Trong quá trình đọc số xung đếm được chứa trong các thanh ghi THx/TLx ta phải chú ý đến trường hợp Counter bị tràn. Vì khi đó giá trị trong thanh ghi THx/TLx (nơi chứa số xung đếm được) sẽ trở về 0. Cho nên nếu ta không có biện pháp xử lý cho trường hợp này thì ... 9 1 RP3 10K +5V +5V KEY7 KEY6 KEY5 KEY4 KEY3 KEY2 KEY1 KEY0 1B 1 2B 2 3B 3 4B 4 5B 5 6B 6 7B 7 8B 8 1C 18 2C 17 3C 16 4C 15 5C 14 6C 13 7C 12 8C 11 COM 10 U3 ULN2803 2 3 4 5 6 7 8 9 1 RP4 10K +5V +5V D8 R10 330 +5V D9 R11 330 +5V D10 R12 330 +5V D11 R13 330 +5V D12 R14 330 +5V D13 R15 330 +5V D14 R16 330 +5V D15 R17 330 +5V KEY15 KEY14 KEY13 KEY12 KEY11 KEY10 KEY9 KEY8 Hình 6.5.15: Sơ đồ nguyên lý mô phỏng hệ thống điều khiển. Mạch mô phỏng này đã được thiết kế sẵn và lưu trong máy tính với tên tập tin là: SerialPort_1.DSN. Vì thế người học có thể tự vẽ thiết kế mạch mô phỏng hoặc lấy mạch mô phỏng có sẵn trong cơ sở dữ liệu của môn học. Bước 9: Chọn tập tin chương trình cần mô phỏng (tập tin mã máy đã được tạo ra từ Bước 6) cho hệ thống vi điều khiển: SP_1_M.HEX và SP_1_S.HEX 412 Bước 10: Thực hiện chạy mô phỏng và quan sát trực tiếp kết quả trên màn hình máy tính. o Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thông thường do giải thuật chương trình không chính xác hoặc do mạch mô phỏng vẽ không chính xác, cần phải được kiểm tra lại. Sau khi hoàn tất việc hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 5 (do giải thuật chương trình không chính xác) hoặc Bước 8 (do mạch mô phỏng vẽ không chính xác). o Nếu không có lỗi xuất hiện thì thực hiện tiếp theo các phần nội dung dưới đây. 6.5.13. Lắp mạch và nạp chương trình điều khiển. Sử dụng các khối "Microcontroller Unit Slot", "Point LED", "Inverter" và "Power Supply" có sẵn trên mô hình thực hành vi điều khiển để lắp ráp mạch theo thiết kế bên trên. Bước 11: Kết nối các khối trên mô hình như Hình 6.5.16 để tạo thành hệ thống mạch điều khiển như bên trên. o Tắt nguồn AC cấp cho mô hình thực hành. Hình 6.5.16: Sơ đồ kết nối mạch trên mô hình. Sử dụng phần mềm Flash Magic để thực hiện việc nạp chương trình cho vi điều khiển P89V51RB2 trên mô hình thực hành. Bước 12: Bật nguồn AC cấp cho mô hình thực hành. Bước 13: Khởi động phần mềm Flash Magic. Bước 14: Kiểm tra cấu hình phần mềm (loại vi điều khiển, cổng COM, tốc độ truyền, chuẩn giao tiếp,... Bước 15: Chọn tập tin chương trình điều khiển (tập tin mã máy đã được tạo ra từ Bước 6): SP_1_M.HEX và SP_1_S.HEX 413 Bước 16: Nạp chương trình vào vi điều khiển. Bước 17: Nhấn nút "Master Reset" ở khối "Microcontroller Unit Slot" để chạy chương trình và quan sát trực tiếp kết quả trên mô hình thực hành. o Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thường do việc lắp ráp phần cứng không chính xác hoặc các linh kiện bị hư hỏng, cần phải được kiểm tra lại. Sau khi hoàn tất việc kiểm tra và hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 15. o Nếu không có lỗi xuất hiện thì hoàn tất bài thực hành. 6.5.14. Bài tập thực hành. 6.5.14.1. Bài tập mẫu. Bài tập số 1: Nội dung: "Viết chương trình, mô phỏng và lắp ráp mạch điều khiển truyền dữ liệu thông qua port nối tiếp. Thay đổi trạng thái của các LED đơn tại vi điều khiển 2 (Slave) theo trạng thái của các nút nhấn tại vi điều khiển 1 (Master) và ngược lại, trong khi các LED 7 đoạn vẫn hiển thị số đếm liên tục từ 00 đến 99. Sử dụng phương pháp ngắt port nối tiếp cho việc truyền dữ liệu." Lưu đồ giải thuật: 414 Sơ đồ nguyên lý mô phỏng: P0.7M P0.0M P0.0M P0.1M P0.2M P0.3M P0.4M P0.5M P0.6M P0.7M P0.6M P0.5M P0.4M P0.3M P0.2M P0.1M P0.7S P0.0S P0.0S P0.1S P0.2S P0.3S P0.4S P0.5S P0.6S P0.7S P0.6S P0.5S P0.4S P0.3S P0.2S P0.1S D 0 S D0M D0M D1M D1M D2M D2M D3M D3M D4M D4M D5M D5M D6M D6M D7M D7M D 7 S D 6 S D 5 S D 4 S D 3 S D 2 S D 1 S P 0 .0 S P 0 .1 S P 0 .2 S P 0 .3 S P 0 .4 S P 0 .5 S P 0 .6 S P 0 .7 S D0SD0S D1SD1S D2SD2S D3SD3S D4SD4S D5SD5S D6SD6S D7SD7S D 0 M D 7 M D 6 M D 5 M D 4 M D 3 M D 2 M D 1 M P 0 .0 M P 0 .1 M P 0 .2 M P 0 .3 M P 0 .4 M P 0 .5 M P 0 .6 M P 0 .7 M P2.0M P2.7M P2.0S P2.7S P2.1M P2.2M P2.3M P2.4M P2.5M P2.6M P2.1S P2.2S P2.3S P2.4S P2.5S P2.6S P2.4M P2.5M P2.6M P2.7M A1 B1 C1 D1 E1 F1 G1 A1 B1 C1 D1 E1 F1 G1 P2.0M P2.1M P2.2M P2.3M A2 B2 C2 D2 E2 F2 G2 A2 B2 C2 D2 E2 F2 G2 P2.4S P2.5S P2.6S P2.7S A3 B3 C3 D3 E3 F3 G3 A3 B3 C3 D3 E3 F3 G3 P2.0S P2.1S P2.2S P2.3S A4 B4 C4 D4 E4 F4 G4 A4 B4 C4 D4 E4 F4 G4 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 U9 AT89C51 C1 33p C2 33p X1 11.0592MHz C3 10uF R1 10k +5V 2 3 4 5 6 7 8 9 1 RP1 10K + 5 V MA ÏCH Ñ I EÀU K H I EÅN GI A O T I EÁP COÅN G N OÁI T I EÁP 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 C4 33p C5 33p X2 11.0592MHz C6 10uF R18 10k +5V 2 3 4 5 6 7 8 9 1 RP2 10K + 5 V MA ST ER SLA V E D0 R2 330 +5V D1 R3 330 +5V D2 R4 330 +5V D3 R5 330 +5V D4 R6 330 +5V D5 R7 330 +5V D6 R8 330 +5V D7 R9 330 +5V 1B 1 2B 2 3B 3 4B 4 5B 5 6B 6 7B 7 8B 8 1C 18 2C 17 3C 16 4C 15 5C 14 6C 13 7C 12 8C 11 COM 10 U2 ULN2803 2 3 4 5 6 7 8 9 1 RP3 10K +5V +5V KEY7 KEY6 KEY5 KEY4 KEY3 KEY2 KEY1 KEY0 1B 1 2B 2 3B 3 4B 4 5B 5 6B 6 7B 7 8B 8 1C 18 2C 17 3C 16 4C 15 5C 14 6C 13 7C 12 8C 11 COM 10 U3 ULN2803 2 3 4 5 6 7 8 9 1 RP4 10K +5V +5V D8 R10 330 +5V D9 R11 330 +5V D10 R12 330 +5V D11 R13 330 +5V D12 R14 330 +5V D13 R15 330 +5V D14 R16 330 +5V D15 R17 330 +5V KEY15 KEY14 KEY13 KEY12 KEY11 KEY10 KEY9 KEY8 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 U4 74LS47 +5VR19 56 R20 56 R21 56 R22 56 R23 56 R24 56 R25 56 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 U5 74LS47 R2656 R2756 R2856 R2956 R3056 R3156 R3256 +5V 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 U6 74LS47 +5VR33 56 R34 56 R35 56 R36 56 R37 56 R38 56 R39 56 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 U7 74LS47 R4056 R4156 R4256 R4356 R4456 R4556 R4656 +5V 415 Sơ đồ lắp ráp: Chương trình điều khiển cho vi điều khiển Master: ;*************************************************** ;CHUONG TRINH DIEU KHIEN GIAO TIEP PORT NOI TIEP TRUC TIEP GIUA HAI VI DIEU KHIEN. ;CHUONG TRINH CHO VI DIEU KHIEN MASTER. ;DIEU KHIEN CAC LED SANG/TAT THEO SU DIEU KHIEN CUA CAC SW TUONG UNG. ;TRONG KHI SO DEM TANG DAN TU 00 DEN 99. ;MO PHONG PROTUES: SERIALPORT_1. ;*************************************************** ;*************************************************** ;KET NOI: 8 SWITCH -> PORT 0 (ACT = 0). ; 8 LED -> PORT 1 (CO SU DUNG DEM DAO - ACT = 1). ; 2 LED 7 -> PORT 2 (BCD). ;*************************************************** $MOD51 ORG 00H ;DIEM NHAP RESET. SJMP MAIN ORG 23H ;DIEM NHAP NGAT PORT NOI TIEP. AJMP SP_ISR ;NHAY TOI CTC PHUC VU NGAT PORT NOI TIEP. ORG 30H ;DIEM NHAP CHUONG TRINH CHINH. MAIN: MOV P1,#00H ;LED TAT ;**************************************************** 416 ;KHOI DONG PORT NOI TIEP. MOV SCON,#52H;SERIAL: MODE 1, TI = 1, RI = 0, REN = 1. MOV TMOD,#20H ;TIMER 1: MODE 2 - TAO TOC DO BAUD CHO SERIAL PORT. MOV TH1,#(-3) ;BAUD RATE = 9600. SETB TR1 ;TIMER HOAT DONG - PORT NOI TIEP HOAT DONG. ;**************************************************** ;THIET LAP CAC NGAT CHO PORT NOI TIEP. MOV IE,#90H ;CHO PHEP NGAT PORT NOI TIEP. ;**************************************************** MP1: ;DOAN CHUONG TRINH SE THUC HIEN KHI KHONG CO TIN HIEU NGAT. MOV A,#00H ;GIA TRI BAT DAU. LOOP: MOV P2,A ;XUAT HIEN THI. LCALLDELAY500MS ADD A,#1 ;TANG GIA TRI (+1). DA A CJNE A,#00,LOOP SJMP MP1 ;QUAY LAI. ;**************************************************** SP_ISR: ;CTC PHUC VU NGAT PORT NOI TIEP. ;P0 = DU LIEU PHAT. ;P1 = DU LIEU THU. PUSH ACC JB TI,TRANS_DATA ;KIEM TRA TIN HIEU NGAT LA NGAT PHAT HAY NGAT THU. RECEI_DATA: ;XU LY THU DU LIEU TU PORT NOI TIEP VAO THANH GHI A. CLR RI ;XOA RI DE CHUAN BI CHO LAN THU KE TIEP. MOV A,SBUF ;THU DU LIEU. MOV P1,A ;XUAT DU LIEU THU DUOC RA PORT LED. SJMP EXIT_SP_ISR ;THOAT KHOI ISR. TRANS_DATA: ;XU LY PHAT DU LIEU TU THANH GHI A RA PORT NOI TIEP. CLR TI ;XOA TI DE CHUAN BI CHO LAN PHAT KE TIEP. MOV A,P0 ;DOC DU LIEU LAY TU PORT SW. CPL A ;DAO TRANG THAI (SW ACT = 0, LED ACT = 1). MOV SBUF,A ;PHAT DU LIEU. EXIT_SP_ISR: POP ACC RETI ;*************************************************** 417 DELAY500MS: ;CHUONG TRINH CON TAO THOI GIAN TRE 500MS PUSH 00H PUSH 01H PUSH 02H MOV R0,#250 DEL2: MOV R1,#100 DEL1: MOV R2,#10 DJNZ R2,$ DJNZ R1,DEL1 DJNZ R0,DEL2 POP 02H POP 01H POP 00H RET END Chương trình điều khiển cho vi điều khiển Slave: ;*************************************************** ;CHUONG TRINH DIEU KHIEN GIAO TIEP PORT NOI TIEP TRUC TIEP GIUA HAI VI DIEU KHIEN. ;CHUONG TRINH CHO VI DIEU KHIEN SLAVER. ;DIEU KHIEN CAC LED SANG/TAT THEO SU DIEU KHIEN CUA CAC SW TUONG UNG. ;TRONG KHI SO DEM GIAM DAN TU 99 DEN 00. ;MO PHONG PROTUES: SERIALPORT_1. ;*************************************************** ;KET NOI: 8 SWITCH -> PORT 0 (ACT = 0). ; 8 LED -> PORT 1 (CO SU DUNG DEM DAO - ACT = 1). ; 2 LED 7 -> PORT 2 (BCD). ;*************************************************** $MOD51 ORG 00H ;DIEM NHAP RESET. SJMP MAIN ORG 23H ;DIEM NHAP NGAT PORT NOI TIEP. AJMP SP_ISR ;NHAY TOI CTC PHUC VU NGAT PORT NOI TIEP. ORG 30H ;DIEM NHAP CHUONG TRINH CHINH. MAIN: MOV P1,#00H ;LED TAT ;**************************************************** ;KHOI DONG PORT NOI TIEP. MOV SCON,#52H;SERIAL: MODE 1, TI = 1, RI = 0, REN = 1. 418 MOV TMOD,#20H ;TIMER 1: MODE 2 - TAO TOC DO BAUD CHO SERIAL PORT. MOV TH1,#(-3) ;BAUD RATE = 9600. SETB TR1 ;TIMER HOAT DONG - PORT NOI TIEP HOAT DONG. ;**************************************************** ;THIET LAP CAC NGAT CHO PORT NOI TIEP. MOV IE,#90H ;CHO PHEP NGAT PORT NOI TIEP. ;**************************************************** MP1: ;DOAN CHUONG TRINH SE THUC HIEN KHI KHONG CO TIN HIEU NGAT. MOV A,#99H ;GIA TRI BAT DAU. LOOP: MOV P2,A ;XUAT HIEN THI. LCALLDELAY500MS ADD A,#99H ;GIAM GIA TRI (-1). CJNE A,#0FFH,PROCESS_ERROR ;KIEM TRA LOI KHI GIAM QUA GIA TRI 66 - 65. SETB C ;XU LY LOI (CHO CO C = 1). PROCESS_ERROR: DA A CJNE A,#0F9H,LOOP SJMP MP1 ;QUAY LAI. ;**************************************************** SP_ISR: ;CTC PHUC VU NGAT PORT NOI TIEP. ;P0 = DU LIEU PHAT. ;P1 = DU LIEU THU. PUSH ACC JB TI,TRANS_DATA ;KIEM TRA TIN HIEU NGAT LA NGAT PHAT HAY NGAT THU. RECEI_DATA: ;XU LY THU DU LIEU TU PORT NOI TIEP VAO THANH GHI A. CLR RI ;XOA RI DE CHUAN BI CHO LAN THU KE TIEP. MOV A,SBUF ;THU DU LIEU. MOV P1,A ;XUAT DU LIEU THU DUOC RA PORT LED. SJMP EXIT_SP_ISR ;THOAT KHOI ISR. TRANS_DATA: ;XU LY PHAT DU LIEU TU THANH GHI A RA PORT NOI TIEP. CLR TI ;XOA TI DE CHUAN BI CHO LAN PHAT KE TIEP. MOV A,P0 ;DOC DU LIEU LAY TU PORT SW. CPL A ;DAO TRANG THAI (SW ACT = 0, LED ACT = 1). MOV SBUF,A ;PHAT DU LIEU. EXIT_SP_ISR: POP ACC 419 RETI ;*************************************************** DELAY500MS: ;CHUONG TRINH CON TAO THOI GIAN TRE 500MS PUSH 00H PUSH 01H PUSH 02H MOV R0,#250 DEL2: MOV R1,#100 DEL1: MOV R2,#10 DJNZ R2,$ DJNZ R1,DEL1 DJNZ R0,DEL2 POP 02H POP 01H POP 00H RET END 6.5.15. Bài tập ứng dụng. Bài 1: Cho hệ thống truyền dữ liệu giữa hai vi điều khiển (Master và Slave) thông qua port nối tiếp (UART) được thiết kế như hình vẽ bên dưới. Viết chương trình điều khiển hệ thống để thực hiện các hoạt động sau: o Ban đầu khi chưa nhấn nút thì tất cả các LED đơn đều tắt và các LED 7 đoạn đều hiển thị số 0. o Truyền dữ liệu từ MASTER sang SLAVE: Nhấn nút “KEY8/MASTER”: 8 LED đơn “D0- D7/SLAVE” sáng tắt liên tục. Nhấn nút “KEY9/MASTER”: 8 LED đơn “D0- D7/SLAVE” sáng đuổi từ trái sang phải liên tục. Nhấn nút “KEY10/MASTER”: 8 LED đơn “D0- D7/SLAVE” sáng dần từ trái sang phải liên tục. Nhấn nút “KEY11/MASTER”: 8 LED đơn “D0- D7/SLAVE” sáng dần từ hai bên vào giữa liên tục. Nhấn nút “KEY12/MASTER”: 8 LED đơn “D0- D7/SLAVE” tắt hết. Nhấn nút “KEY13/MASTER”: 8 LED đơn “D0- D7/SLAVE” sáng hết. o Truyền dữ liệu từ SLAVE sang MASTER: 420 Nhấn nút “KEY0/SLAVE”: 2 LED 7 đoạn “7seg/MASTER” đếm lên liên tục (giá trị đếm nằm trong khoảng 0099). Nhấn nút “KEY0/SLAVE”: 2 LED 7 đoạn “7seg/MASTER” đếm xuống liên tục (giá trị đếm nằm trong khoảng 0099). Nhấn nút “KEY1/SLAVE”: 2 LED 7 đoạn “7seg/MASTER” đang đếm (lên hoặc xuống) sẽ bị dừng lại và hiển thị liên tục giá trị tại thời điểm bị dừng. Nhấn nút “KEY2/SLAVE”: 2 LED 7 đoạn “7seg/MASTER” đang dừng sẽ tiếp tục đếm (lên hoặc xuống) từ giá trị bị dừng. Nhấn nút “KEY4/SLAVE”: 2 LED 7 đoạn “7seg/MASTER” hiển thị liên tục giá trị 00. Bài 2: Cho hệ thống truyền dữ liệu giữa hai vi điều khiển (Master và Slave) thông qua port nối tiếp (UART) như hình vẽ ở Bài 1 bên trên. Viết chương trình điều khiển hệ thống để thực hiện các hoạt động sau: o Ban đầu khi chưa nhấn nút thì tất cả các LED đơn đều tắt và các LED 7 đoạn đều hiển thị số 0. o Nhấn nút “KEY8/MASTER”: 16 LED đơn “D8- D15/MASTER” và “D0-D7/SLAVE” sáng đuổi từ trái sang phải liên tục. o Nhấn nút “KEY9/MASTER”: 16 LED đơn “D8- D15/MASTER” và “D0-D7/SLAVE” sáng đuổi từ phải sang trái liên tục. o Nhấn nút “KEY10/MASTER”: 16 LED đơn “D8- D15/MASTER” và “D0-D7/SLAVE” tắt hết. o Nhấn nút “KEY0/SLAVE”: 4 LED 7 đoạn “7seg/MASTER” và “7seg/SLAVE” đếm lên liên tục từ 0000 đến 9999. o Nhấn nút “KEY1/SLAVE”: 4 LED 7 đoạn “7seg/MASTER” và “7seg/SLAVE” đếm xuống liên tục từ 9999 đến 0000. o Nhấn nút “KEY2/SLAVE”: 4 LED 7 đoạn “7seg/MASTER” và “7seg/SLAVE” hiển thị giá trị 0000.
File đính kèm:
- giao_trinh_vi_dieu_khien_phan_2.pdf