Đây là bài giảng môn kỹ thuật điện chuyên đề về mạch điện, mạch điện ba pha, máy biến áp gửi đến các bạn độc giả tham khảo. Kĩ thuật điện là một lĩnh vực kĩ thuật nghiên cứu và áp dụng
Trang 1VI ĐIỀU KHIỂN 89C51
GV: LÊ THỊ KIM LOAN
KHOA : ĐIỆN
Trang 2GIỚI THIỆU PHẦN CỨNG
Chương 1
Trang 4SƠ ĐỒ CHÂN
Trang 7MÔ TẢ CÁC CHÂN
• Port 0: là port 8 bit có 2 chức năng
– Là I/O port đối với các thiết kế cỡ nhỏ ( không
sử dụng bộ nhớ mở rộng)
– Là byte thấp của address/data bus khi thiết kế
có sử dụng bộ nhớ mở rộng
• Port 1: là I/O port 8 bit
• Port 2: là port 8 bit có 2 chức năng
– Là I/O port đối với các thiết kế cỡ nhỏ ( không
sử dụng bộ nhớ mở rộng)
– Là byte cao của address/data bus khi thiết kế
có sử dụng bộ nhớ mở rộng
Trang 8• Port 3: là port 8 bit có nhiều chức năng
– Là I/O port
– Có công dụng chuyển đổi có liên hệ với cáctính năng đặc biệt của 89C51 được mô tảbởi bảng sau:
Trang 9CÁC TÍN HIỆU ĐIỀU KHIỂN
• PSEN ( Program Store Enable)
– Là tín hiệu để cho phép đọc bộ nhớ chươngtrình mở rộng ( bộ nhớ ngoài)
– Khi 89C51 đọc mã lệnh từ bộ nhớ chươngtrình mở rộng thì PSEN được tích cực (mứcthấp) 2 lần trong mỗi chu kỳ máy
– Khi 89C51 thi hành chương trình trong ROMnội thì PSEN sẽ ở mức cao
Trang 10• ALE/PROG ( Program Store Enable)
– ALE ( Address Latch Enable) là tín hiệu chốtbyte thấp của địa chỉ trong suốt quá trình truyxuất bộ nhớ ngoài
– Chân này cũng được làm ngõ vào xung lậptrình (PROG) cho EPROM
– Ở chế độ họat động bình thường thì xungALE có tốc độ bằng 1/6 tần số dao động trênchip và có thể được dùng làm nguồn xungnhịp cho các phần khác của hệ thống
Trang 12TỔ CHỨC BỘ NHỚ
• 89C51 có cả ROM nội và RAM nội, tuy nhiên có thể mở rộng thêm bằng các thiết
bị nhớ bên ngoài
• RAM nội bao gồm nhiều phần:
– RAM lưu trữ đa dụng
– RAM được địa chỉ hóa từng bit
– Các bank thanh ghi
– Các thanh ghi chức năng đặc biệt
Trang 14• RAM đa dụng có địa chỉ từ 30H đến 7FH
có thể được truy xuất tự do dùng cách đánh địa chỉ trực tiếp hoặc gián tiếp.
• RAM được địa chỉ hóa từng bit có địa chỉ
từ 20H đến 2FH và một phần trong các thanh ghi chức năng đặc biệt Các bit có thể được đặt, xóa, and, or…với một lệnh đơn.
• Có 4 bank thanh ghi, mỗi bank có 8 thanh ghi từ R0 đến R7.
Trang 15– Các bit RS1 và RS0 trong thanh ghi PSW sẽ được dùng để chọn bank thanh ghi tích cực
– Trạng thái mặc định thì các thanh ghi này sẽ ở bank 0
– Lệnh sử dụng các thanh ghi này sẽ ngắn
và nhanh hơn các lệnh tương ứng sử dụng địa chỉ trực tiếp
Trang 16• Thanh ghi PSW (từ trạng thái chương trình)
Trang 17– Cờ carry (CY) được xác lập khi phép cộng cónhớ ở bit 7 và phép trừ có mượn ở bit 7
• Ví dụ : thanh ghi A đang chứa giá trị FFH, sau khi thực hiện lệnh ADD A,#1 thì kết quả của phép tóan là 00H được chứa trong thanh ghi A đồng thời bit CY của thanh ghi PSW sẽ được xác lập (đặt lên mức 1)
– Cờ AC được xác lập khi phép cộng trên sốBCD có nhớ
– Cờ F0 là cờ có công dụng tổng quát dành chocác ứng dụng của người lập trình
– Cờ báo tràn OV được xác lập khi có sự tràn
số học trong các phép toán cộng, trừ Khithực hiện các phép toán với số không dấu thìkhông cần quan tâm đến cờ này
Trang 18– Bit parity chẵn P: tổng số các bit 1 trong thanhghi A và bit P phải là một số chẵn
• Các thanh ghi port
– P0, P1, P2, P3
– Tất cả các port này đều được địa chỉ hóatừng bit
Trang 19• Thanh ghi định thời gian
– 89C51 có 2 timer/counter 16 bit có chức năngđịnh thời gian và đếm sự kiện
– Timer 0 có 2 thanh ghi TH0 (byte cao) và TL0(byte thấp)
– Timer 1 có 2 thanh ghi TH1 (byte cao) và TL1(byte thấp)
– Hoạt động của timer được thiết lập bởi thanhghi chế độ TMOD và thanh ghi điều khiểnTCON
Trang 20TẬP LỆNH
Chương 2
Trang 22CÁC CÁCH ĐỊNH ĐỊA CHỈ
• Định địa chỉ thanh ghi (Rn):
– 89C51 có 8 thanh ghi làm việc được kí hiệu
từ R0 đến R7
– Trong định địa chỉ thanh ghi, mã lệnh luônluôn có 3 bit để chỉ thị một thanh ghi
– Ví dụ: MOV A, R0
Trang 24• Định địa chỉ trực tiếp (direct):
– Lệnh hiện hành sẽ cung cấp địa chỉ tuyệt đốicủa ô nhớ sử dụng
– Lệnh có ít nhất 2 byte, trong đó địa chỉ ô nhớchiếm 1byte
– Ví dụ : MOV A, 40H
Trang 25• Định địa chỉ gián tiếp thanh ghi (@Ri):
– i = 0,1
– Ri hoạt động như một con trỏ thanh ghi, nộidung của Ri chỉ ra một ô nhớ trong Ram nội– Mã lệnh có bit thấp nhất được dùng để xácđịnh con trỏ thanh ghi nào được sử dụng
– Ví dụ : MOV A, @R0
Trang 26• Định địa chỉ tức thời (#data):
– Với lệnh này thì data không phải là địa chỉ mà
là dữ liệu thật, dữ liệu 8bit (hằng số)
– Ví dụ: MOV A, #12
– Khi sử dụng con trỏ dữ liệu DPTR thì cầnphải có dữ liệu 16bit (#data16)
– Ví dụ : MOV DPTR, #8000H
Trang 27NHÓM LỆNH CHUYỂN DỮ LiỆU
• MOV đích, nguồn
– Chuyển dữ liệu trong không gian bộ nhớ nội
– Hướng chuyển dữ liệu là từ Nguồn đến Đích
MOV A, Rn: chuyển nội dung thanh ghi Rn vàoA
MOV A, @Ri: chuyển dữ liệu gián tiếp vào A
MOV A, direct: chuyển dữ liệu trực tiếp từ ônhớ vào A
MOV A, #data: chuyển giá trị dữ liệu tức thờivào A
Trang 28 MOV Rn, A: chuyển nội dung thanh ghi A vàothanh ghi Rn
MOV Rn, direct: chuyển dữ liệu trực tiếp từ ônhớ vào thanh ghi Rn
MOV Rn, #data: chuyển giá trị dữ liệu tức thờivào thanh ghi Rn
MOV direct, A
MOV direct, Rn
MOV direct, direct
MOV direct, @Ri
MOV direct, #data
Trang 29 MOV @Ri, A
MOV @Ri, direct
MOV @Ri, #data
Trang 30– Khi làm việc với bộ nhớ ngoài có dung lượngthấp ( <256byte) thì chỉ cần 8bit địa chỉ thấp và
ta sẽ sử dụng cách định địa chỉ gián tiếp thanhghi @Ri để chứa địa chỉ 8bit này
Trang 31 MOVX @Ri, A: ghi dữ liệu từ A ra ô nhớ ngòai
MOVX A, @Ri: đọc dữ liệu từ ô nhớ ngòai vềA
MOVX @DPTR, A : ghi dữ liệu từ A ra ô nhớngòai
MOVX A, @DPTR : đọc dữ liệu từ ô nhớngòai về A
Trang 32Ví dụ áp dụng:
• Ở trạng thái ban đầu thanh ghi R1 chứa giá trị40H, ô nhớ Ram nội ở địa chỉ 40H chứa giá trịFFH, sau khi thực thi lệnh các thanh ghi và ô nhớ
sẽ có giá trị như thế nào?
Trang 33NHÓM LỆNH SỐ HỌC VÀ LUẬN
LÝ
• ADD, ADDC : lệnh cộng dữ liệu
– Lệnh cộng sẽ lưu kết quả tính tóan vào thanhghi A
– Lệnh cộng sẽ tác động đến cờ CY trong thanhghi PSW
– Lệnh ADDC sẽ cộng cả nội dung của cờ nhớCY
– Ví dụ : A chứa giá trị là 12H, sau khi thực hiệnlệnh ADD A, #36H thì giá trị của A sẽ là 48H vàbit cờ CY=0
Trang 34• SUBB: lệnh trừ dữ liệu
– Lệnh trừ sẽ lưu kết quả tính tóan vào thanh ghiA
– Lệnh trừ sẽ tác động đến cờ CY trong thanhghi PSW
– Để cho kết quả của phép toán được chính xácthì trước khi dùng lệnh trừ ta nên xóa cờ CY
– Ví dụ lệnh SUBB A, R1 sẽ thực hiện phéptóan: nội dung của thanh ghi A - nội dung củathanh ghi R1 - nội dung bit cờ CY Kết quảcất trở lại vào thanh ghi A
Trang 35• INC: lệnh tăng lên 1 đơn vị
– Lệnh này không tác động đến cờ CY
• DEC: lệnh giảm đi 1 đơn vị
– Lệnh này không tác động đến cờ CY
• MUL A,B : lệnh nhân
– Lệnh này lấy nội dung của thanh ghi A nhânvới nội dung của thanh ghi B Byte thấp củakết quả được cất vào A, byte cao của kết quảđược cất vào B
• DIV A,B: lệnh chia
– Lệnh này lấy nội dung của thanh ghi A chia chonội dung của thanh ghi B Phần nguyên củakết quả được cất vào A, phần dư của kết quảđược cất vào B
Trang 36• Nhóm lệnh luận lý
– ANL : lệnh AND
– ORL : lệnh OR
– XRL : lệnh XOR
– RL A: lệnh quay trái thanh ghi A đi 1 bit
– RR A: lệnh quay phải thanh ghi A đi 1 bit
– RLC A: quay trái thanh ghi A có cờ CY
– RRC A: quay phải thanh ghi A có cờ CY
– SWAP A: hóan đổi nội dung 4 bit cao và 4 bitthấp của thanh ghi A ( tương đương với quay 4lần)
Trang 37NHÓM LỆNH THỰC HIỆN TRÊN
BIT
• CLR C : xóa cờ carry (CY) về 0
• CLR bit : xóa bit về 0
• SETB C : đặt bit cờ carry lên 1
• SETB bit : đặt bit lên 1
• CPL C : lấy bù 1 của cờ carry
• CPL bit : lấy bù 1 của bit
Trang 38• MOV C, bit : chuyển bit vào cờ carry
• MOV bit, C : chuyển cờ carry vào bit
• ANL C,bit : AND cờ carry với bit, kết quả cất vào C
• ANL C,/bit : AND cờ carry với bù 1 của bit, kết quả cất vào C
• ORL C,bit : OR cờ carry với bit, kết quả cất vào C
• ORL C,/bit : OR cờ carry với bù 1 của bit, kết quả cất vào C
Trang 39NHÓM LỆNH ĐIỀU KHIỂN
• Lệnh gọi chương trình con
– ACALL : gọi chương trình con dùng địa chỉtuyệt đối
– LCALL : gọi chương trình con dùng địa chỉ dài
Trang 40• Lệnh nhảy không điều kiện
– AJMP : lệnh nhảy tuyệt đối– LJMP : lệnh nhảy dài
– JB bit: nhảy nếu bit=1
– JNB bit: nhảy nếu bit=0
Trang 41– CJNE A, direct, rel : so sánh dữ liệu trong ônhớ trực tiếp với nội dung của A và nhảy đếnnhãn rel nếu kết quả không bằng nhau
– CJNE A, #data, rel : so sánh dữ liệu tức thờivới nội dung của A và nhảy đến nhãn rel nếukết quả không bằng nhau
– CJNE Rn, #data, rel : so sánh dữ liệu tức thờivới nội dung của thanh ghi Rn và nhảy đếnnhãn rel nếu kết quả không bằng nhau
– CJNE @Ri, #data, rel : so sánh dữ liệu tứcthời với gián tiếp thanh ghi và nhảy đến nhãnrel nếu kết quả không bằng nhau
Trang 42– DJNZ Rn, rel: giảm nội dung thanh ghi Rn đi 1đơn vị sau đó so sánh với 0 và nhảy đến nhãnrel nếu kết quả khác 0
– DJNZ direct, rel: giảm nội dung ô nhớ trực tiếp
đi 1 đơn vị sau đó so sánh với 0 và nhảy đếnnhãn rel nếu kết quả khác 0
– NOP: lệnh này không làm gì cả nhưng PC vẫntăng lên 1
Trang 43BÀI TẬP ÁP DỤNG
Chương 2: TẬP LỆNH
Trang 44• Bài 1:
Hãy cho biết các lệnh dưới đây thực hiện côngviệc gì? Các địa chỉ bit nào được đặt lên 1 saukhi thực hiện xong lệnh
Trang 45• Bài 2:
Hãy cho biết các lệnh dưới đây thực hiện côngviệc gì? Giá trị của thanh ghi và ô nhớ sau khithực hiện xong lệnh?
Trang 46• Bài 3:
Hãy cho viết chương trình thực hiện cổng logicsau:
MOV C, P1.4ORL C, P1.5CPL C
MOV P1.7, C
Trang 47Bài 4:
a Viết chương trình cho 8 led sáng
b Viết chương trình cho 4 led D1-D4 sáng
c Viết chương trình cho 2 led D3-D4
Trang 48Bài 5:
a Viết chương trình cho 8 led sáng
b Viết chương trình cho 4 led D1-D4 sáng
c Viết chương trình cho 2 led D3-D4
Trang 49TIMER- BỘ ĐỊNH THÌ
Chương 3
Trang 50– Phát tốc độ baud cho port nối tiếp
• Timer được truy cập khi sử dụng các
thanh ghi chức năng đặc biệt: TCON,
TMOD, TH0, TL0, TH1, TL1
Trang 51THANH GHI TMOD (Timer Mode Register)
• Thanh ghi TMOD dùng để xác định chế độ làm việc cho Timer 0 và Timer 1
• TMOD không được địa chỉ hóa từng bit
• Nạp bằng phần mềm khi bắt đầu chương trình
Trang 52• Gate: bit mở cổng cho timer
– Khi Gate=1: Timer/Counterx chỉ hoạt động khi chân INTx ở mức 1(phần cứng) và bit TRx =1 (trong thanh ghi TCON)
– Khi Gate=0: Timerx họat động khi bit TRx=1
• Ghi chú: X = 0,1
– TRx : TR0 hoặc TR1 – Timerx: Timer 0 hoặc Timer 1
• C/T : bit chọn Timer hay Counter
– C/T=1 : chọn Counter (đếm sự kiện)
– C/T=0 : chọn Timer (định khoảng thời gian)
Trang 53• M1,M0 : các bit chọn chế độ
Trang 54THANH GHI TCON (Timer Control Register)
• Thanh ghi TCON chứa các bit trạng thái và điều khiển cho Timer 0 và Timer 1
• Được địa chỉ hóa từng bit
• TFx: cờ báo tràn timer Cờ này được đặt bởi
phần cứng khi tràn timer, được xóa bằng phần mềm
Ví dụ: timer 16bit sẽ đếm lên từ 0000H đến
FFFFH, do đó tràn timer xảy ra khi số đếm tràn
từ FFFFH sang 0000H
Trang 55•TRx: bit điều khiển timer chạy, được đặt/xóa bằng phần mềm để điều khiển timer chạy/dừng
Trang 56– TRx=1: cho phép timer chạy
– TRx=0: dừng timer
• IE1: cờ ngắt ngoài 1, được đặt bởi phần cứng khi phát hiện một cạnh xuống hay
một mức thấp ở ngõ INT1, xóa bằng phần cứng khi xử lý ngắt
• IT1: bit điều khiển ngắt ngoài 1, được đặt hay xóa bằng phần mềm để xác định ngắt ngoài 1 tích cực khi có một cạnh xuống
hay khi có một mức thấp ở chân INT1
Trang 57• IE0: cờ ngắt ngoài 0, được đặt bởi phần cứng khi phát hiện một cạnh xuống hay
một mức thấp ở ngõ INT0, xóa bằng phần cứng khi xử lý ngắt
• IT0: bit điều khiển ngắt ngoài 0, được đặt hay xóa bằng phần mềm để xác định ngắt ngoài 1 tích cực khi có một cạnh xuống
hay khi có một mức thấp ở chân INT0
Trang 58CÁC CHẾ ĐỘ HOẠT ĐỘNG CỦA
TIMER
• Chế độ 0:
– Chế độ timer 13bit, tương thích với 8048
– Trong chế độ này không sử dụng 3bit cao của thanh ghi TLx, chỉ sử dụng THx và 5bit thấp của TLx
– Giá trị đếm được là từ 0 đến ( 213 -1)Ttimer
nghiã là từ 0 đến 8191Ttimer
Trang 60• Chế độ 2:
– Chế độ timer 8bit tự động nạp lại giá trị ban đầu
– Trong chế độ thanh ghi TLx hoạt động như
một timer 8bit, trong khi đó thanh ghi THx vẫn giữ nguyên giá trị được nạp
– Khi số đếm tràn từ FFH sang 00H thì cờ tràn timer được đặt lên 1 đồng thời giá trị trong
THx được nạp lại vào TLx và chu trình đếm mới được bắt đầu
– Chế độ này rất thông dụng vì sự tràn timer
xảy ra trong những khoảng thời gian nhất
định và tuần hòan một khi đã khởi động bộ
đếm
– Giá trị đếm được là từ 0 đến ( 28 -1)Ttimer
nghiã là từ 0 đến 255Ttimer
Trang 62NGUỒN TẠO XUNG NHỊP CHO
TIMER
Có 2 nguồn xung nhịp có thể được sử dụng
và nó được chọn bằng bit C/T trong thanh ghi TMOD khi khởi động timer.
• Xung nhịp định khoảng thời gian:
– Khi C/T =0 thì timer được dùng để địnhkhoảng thời gian
– Nguồn xung nhịp được lấy từ bộ dao độngtrên chip đưa qua một bộ chia 12 để giảm đếntần số thích hợp cho phần lớn các ứng dụng
– ftimer = fosc/12
Trang 63– Giá trị trong các thanh ghi timer (THx và TLx)
sẽ tăng lên 1 khi có một sự kiện xảy ra
– Số sự kiện được xác định bằng phần mềmbằng cách đọc các thanh ghi timer
Trang 64CÁC BƯỚC CƠ BẢN ĐỂ KHỞI
ĐỘNG TIMER
• Nạp giá trị bắt đầu cho thanh ghi TMOD: lựa chọn chế độ cho timer, cho bit Gate=0, C/T=0
• Nạp các giá trị thích hợp cho các thanh ghi THx và TLx
• Cho timer chạy : SETB TRx
• Chờ cờ báo tràn: có 2 cách:
– JNB TFx, $
– Wait: JNB TFx, Wait
Trang 65Viết chương trình tạo trễ (delay)100µs dùng
Timer 0, biết rằng bộ dao động trên chip sử dụng thạch anh 12MHz
Trang 66• Bước 1: Tìm tần số dao động và chu kỳ xung nhịp timer:
Trang 67– Do timer họat động như là một bộ đếm lên vàkhi bộ đếm bị tràn thì nó sẽ quay lại về giá trị
0 nên giá trị phải nạp cho các thanh ghi timer
• Bước 4: Cho timer chạy
• Bước 5: Chờ cờ báo tràn
• Bước 6: Xóa cờ báo tràn
• Bước 7: Dừng timer
Trang 68• Chương trình hoàn chỉnh khi sử dụng Timer 0 ở chế độ 2:
Trang 69• Chương trình hoàn chỉnh khi sử dụng Timer
0 ở chế độ 1:
MOV TMOD,# 0000 0001 B
MOV TH0,# high(-100) ; lệnh này sẽ chuyển giá trị -100
sang mã nhị phân và sau đó lấy 8bit cao của giá trị này gán vào thanh ghi TH0
MOV TL0,# low(-100) ; lệnh này sẽ chuyển giá trị -100
sang mã nhị phân và sau đó lấy 8bit thấp của giá trị này gán vào thanh ghi TL0
Trang 70 Ví dụ 2: Viết chương trình tạo trễ 10ms,
sử dụng timer 1, tần số dao động trên chip là 12MHz
• Bước 1: Tìm tần số dao động và chu kỳ xung nhịp timer:
– Ta có fosc =12MHz
– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz
– Ttimer = 1/ ftimer = 1/106 = 1µs
Trang 71• Bước 2: Xác định giá trị cần nạp cho các thanh ghi timer
– Ta có tdelay =10ms
– Mà Ttimer = 1µs
– Suy ra : tdelay =10000Ttimer
• Bước 3: Xác định giá trị cần nạp cho thanh ghi chế độ timer TMOD
– Do tdelay =10000Ttimer , nên ta chọn timer ởchế độ 1(16bit)
Trang 72• Chương trình hoàn chỉnh khi sử dụng Timer 1 ở chế độ 1:
Trang 73 Ví dụ 3: Viết chương trình tạo sóng
vuông 50% có tần số 10KHz ở ngõ ra P1.0, biết tần số dao động trên chip là 12MHz
• Bước 1: Tìm tần số dao động và chu kỳ xung nhịp timer:
– Ta có fosc =12MHz
– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz
– Ttimer = 1/ ftimer = 1/106 = 1µs
Trang 74• Bước 2: Xác định giá trị cần nạp cho các thanh ghi timer
– Ta có tần số xung vuông là 10KHz nên chu kỳcủa xung vuông là T=1/(10.103)=10-4s=100µs– Do xung vuông 50% nên thời gian xung ởmức cao bằng thời gian xung ở mức thấp :
tH = tL = T/2 = 50µs
– Ở đây ta có thể sử dụng 1 timer để tạo thờigian trể là 50µs
Trang 75• Cách 1:
MOV TMOD, # 0000 0010BMOV TH0,# -50
SETB TR0LOOP: JNB TF0,$
CLR TF0CPL P1.0SJMP LOOPEND
Trang 76• Cách 2:
LOOP: SETB P1.0
ACALL Delay_50us CLR P1.0
ACALL Delay_50us SJMP LOOP
Delay_50us:
MOV TMOD, # 0000 0010B MOV TH0,# -50
SETB TR0 JNB TF0,$
CLR TF0 RET
END
Trang 77 Ví dụ 4: Hãy cho biết đoạn chương trình
sau làm công việc gì? biết tần số dao động trên chip là 12MHz
LOOP: SETB P1.0
CLR P1.0 SJMP LOOP END
Trang 78 Ví dụ 5: Hãy cho biết đoạn chương trình
con SUB làm công việc gì? biết tần số dao động trên chip là 12MHz
SUB: MOV R0,#250
DJNZ R0,$
RET END