!
Hoạt động của một vi điều khiển:
1. Khi không có nguồn điện cung cấp, vi điều khiển chỉ là một con chip có chương trình nạp
sẵn vào trong đó và không có hoạt động gì xảy ra.
2. Khi có nguồn điện, mọi hoạt động bắt đầu được xảy ra với tốc độ cao. Đơn vị điều khiển
logic có nhiệm vụ điều khiển tất cả mọi hoạt động. Nó khóa tất cả các mạch khác, trừ mạch dao động
thạch anh. Sau mini giây đầu tiên tất cả đã sẵn sàng hoạt động.
3. Điện áp nguồn nuôi đạt đến giá trị tối đa của nó và tần số dao động trở nên ổn định. Các bit
của các thanh ghi SFR cho biết trạng thái của tất cả các mạch trong vi điều khiển. Toàn bộ vi điều
khiển hoạt động theo chu kỳ của chuỗi xung chính.
4. Thanh ghi bộ đếm chương trình được xóa về 0. Câu lệnh từ địa chỉ này được gửi tới bộ giải
mã lệnh sau đó được thực thi ngay lập tức.
5. Giá trị trong thanh ghi PC được tăng lên 1 và toàn bộ quá trình được lặp lại vài triệu lần
trong một giây.
"#$%&'()&*( !
Bộ nhớ (Memory)
- &+,'-(+.&'(!
Read Only Memory (ROM) là một loại bộ nhớ được sử dụng để lưu vĩnh viễn các chương
trình được thực thi.
trường ngoại vi. Kích thước của dãy ROM từ 512B đến 64KB
-
&,.*+//(+.&*(!
Random Access Memory (RAM) là một loại bộ nhớ sử dụng cho các dữ liệu lưu trữ tạm thời
và kết quả trung gian được tạo ra và được sử dụng trong quá trình hoạt động của bộ vi điều khiển. Nội
dung của bộ nhớ này bị xóa một khi nguồn cung cấp bị tắt.
- 0-+ 0/-+1 -+&'(001&'(!
EEPROM là một kiểu đặc biệt của bộ nhớ chỉ có ở một số loại vi điều khiển. Nội dung của nó
có thể được thay đổi trong quá trình thực hiện chương trình (tương tự như RAM), nhưng vẫn còn lưu
giữ vĩnh viễn, ngay cả sau khi mất điện (tương tự như ROM).
Các
thanh
ghi chức năng đặc biệt (SFR)
Thanh ghi chức năng đặc biệt (Special Function Registers) là một phần của bộ nhớ RAM.
Mục đích của chúng được định trước bởi nhà sản xuất và không thể thay đổi được.
Bộ đếm
chương
trình (PC: Program Counter)
Bộ đếm chương trình chứa địa chỉ chỉ đến ô nhớ chứa câu lệnh tiếp theo sẽ được kích hoạt.
Central
Processor
Unit (CPU)
Đây là một đơn vị có nhiệm vụ điều khiển và giám sát tất cả các hoạt động bên trong vi điều
khiển và người sử dụng không thể tác động vào hoạt động của nó.
Các
cổng
vào/ra (I/O Ports)
Để vi điều khiển có thể hoạt động hữu ích, nó cần có sự kết nối với các thiết bị ngoại vi. Mỗi
vi điều khiển sẽ có một hoặc một số thanh ghi (được gọi là cổng) được kết nối với các chân của vi
điều khiển.
Bộ dao động (Oscillator)
Bộ dao động làm nhiệm vụ đồng bộ hóa hoạt động của tất cả các mạch bên trong vi điều khiển
Bộ định thời/đếm (Timers/Counters)
Truyền thông nối tiếp
Truyền thông giữa các thiết bị ở khoảng cách xa
Chương trình
2345/678/629) )92/45/65/6: !
Bài làm:
Chuyển sang nhị phân
34 : 100010
225: 11100001
143: 10001111
Chuyển sang hệ 16:
34: 22H
225: 0E1H
143: 8FH
98/6//472;)77<)77<)9*; !
23H: 2x16 + 3 = 35
11010B = 2x2x2x2 + 2x2x2 + 2x1 = 26
101011B = 2x2x2x2x2 + 2x2x2 + 2x1 + 1 = 43
4AH = 4x16 + 10 = 74
Bài tập chương 4
Bài làm:
47 sang nhị phân là: 00101111
30 sang nhị phân là: 00011110
Thực hiện phép cộng:
00101111
+ 00011110
01001101
Vậy S1 = 00101111 + 00011110 = 01001101
:=>7 !
<-.
AT89C51 là vi điều khiển do Atmel sản xuất, chế tạo theo công nghệ CMOS có các đặc tính như
sau:
+ 4 KB PEROM (Flash Programmable and Erasable Read Only Memory), có khả năng tới
1000 chu kỳ ghi xoá
+ Tần số hoạt động từ: 0Hz đến 24 MHz
+ 3 mức khóa bộ nhớ lập trình
+ 128 Byte RAM nội.
+ 4 Port xuất /nhập I/O 8 bit.
+ 2 bộ Timer/counter 16 Bit.
+ 6 nguồn ngắt.
+ Giao tiếp nối tiếp điều khiển bằng phần cứng.
+ 64 KB vùng nhớ mã ngoài
+ 64 KB vùng nhớ dữ liệu ngoài.
+ Cho phép xử lý bit.
+ 210 vị trí nhớ có thể định vị bit.
+ 4 chu kỳ máy (4 µs đối với thạch anh 12MHz) cho hoạt động nhân hoặc chia.
+ Có các chế độ nghỉ (Low-power Idle) và chế độ nguồn giảm (Power-down).
+ Ngoài ra, một số IC khác của họ MCS-51 có thêm bộ định thời thứ 3 và 256
byte RAM nội.
?@A/5B>7 "#CD827!
<-.
E5B*>F
Ý nghĩa các chân:
- Tín hiệu vào /EA trên chân 31 thường đặt lên mức cao ( +5V) hoặc mức thấp (GND). Nếu ở
mức cao, 8951 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp (4K hoặc tối đa
8k đối với 89C52). Nếu ở mức thấp, chương trình được thi hành từ bộ nhớ mở rộng (tối đa
đến 64Kbyte).
-
Các chân nguồn:
AT89C51 hoạt động ở nguồn đơn +5V. Vcc được nối vào chân 40, và Vss (GND) được nối
G4HIH8/J>K !
S1 = 47 + 30 ;
S2 = 64 – 37 ;
S3 = 28H + 33H ;
S4 = 49H – 2CH ;
vào chân 20.
+ Chân 40: VCC = 5V± 20%
+ Chân 20: GND
- /PSEN
/PSEN
(chân 29) cho phép đọc bộ nhớ chương trình mở rộng đối với các ứng dụng sử dụng
ROM ngoài.
-
ALE/ PROG (chân 30) cho phép tách các đường địa chỉ và dữ liệu tại Port 0 khi truy xuất
bộ nhớ ngoài.
-
EA (chân 31) dùng để cho phép thực thi chương trình từ ROM ngoài. Khi nối chân 31 với
Vcc, AT89C51 sẽ thực thi chương trình từ ROM nội (tối đa 8KB), ngược lại thì thực thi từ
ROM ngoài (tối đa 64KB).
-
RST (chân 9) cho phép reset AT89C51 khi ngõ vào tín hiệu đưa lên mức 1 trong ít nhất là
2 chu kỳ máy.
-
X1, X2: Ngõ vào và ngõ ra bộ dao động, khi sử dụng có thể chỉ cần kết nối thêm thạch anh
và các tụ như hình vẽ trong sơ đồ. Tần số thạch anh thường sử dụng cho AT89C51 là
12Mhz.
Port 0 : có 2 chức năng ở các chân 32 – 39 của AT89C51:
- Chức năng I/O (xuất/nhập): dùng cho các thiết kế nhỏ.
- Chức năng địa chỉ / dữ liệu đa hợp: khi dùng các thiết kế lớn, đòi hỏi phải sử dụng bộ nhớ
ngoài thì Port 0 vừa là bus dữ liệu (8 bit) vừa là bus địa chỉ (8 bit thấp).
Port 1:
Port1 (chân 1 – 8) chỉ có một chức năng là I/O,
Port 2: Port 2 (chân 21 – 28) là port có 2 chức năng:
- Chức năng I/O (xuất / nhập)
- Chức năng địa chỉ: dùng làm 8 bit địa chỉ cao khi cần bộ nhớ ngoài có địa chỉ 16 bit. Khi
đó, Port 2 không được dùng cho mục đích I/O.
Port 3: Port 3 (chân 10 – 17) là port có 2 chức năng:
- Chức năng I/O. Khi dùng làm ngõ vào, Port 3 phải được set mức logic 1 trước đó.
- Chức năng khác mô tả như sau:
>8L,MN>7 O$K,P.Q !
1. Địa chỉ tức thời
Trong chế độ đánh địa chỉ này toán hạng nguồn là một hằng số, toán hạng đích là một thanh ghi
Ví dụ: MOV A, #20;
2. Địa chỉ thanh ghi: cả toán hạng đích và toán hạng nguồn là các thanh ghi
Ví dụ: MOV A, R1
3. Địa chỉ trực tiếp: Một toán hạng là thanh ghi, toán hạng còn lại là địa chỉ của ô nhớ
Ví dụ: MOV R1, 30H;
4.
Địa chỉ gián tiếp: Một toán hạng là thanh ghi, toán hạng còn lại là thanh ghi R0 hoặc R1
chứa địa chỉ của ô nhớ.
Ví dụ: MOV A, @R1
5. Địa chỉ theo chỉ số: Một toán hạng là thanh ghi tích lũy A, toán hạng còn lại là ô nhớ của bộ
nhớ ROM
Ví dụ: MOVC A, @A + DPTR
F$%.-4RHSK,P !
Bài làm:
Câu trúc chung của một lệnh hợp ngữ:
nhãn: từ gợi nhớ các toán hạng T%U
Ví dụ:
KIEMTRA: JNB P3.2, BAT T<*V0"
JNB P3.3, TAT T*V0"
- Nhãn: là tên chương trình con. Kết thúc bằng dấu hai chấm (:)
- Từ gợi nhớ: là các câu lệnh của hợp ngữ.
- Các toán hạng: là các thanh ghi, giá trị, địa chỉ, …
- Chú giải: là phần giải thích ý nghĩa của câu lệnh. Bắt đầu bằng dấu chấm
phẩy (;)
7@LW597;XY27;&*(/Z,PL8MN
GLH8LH27!
<-.
L8MNGLH
('@*)[97;T97;*
('@27;)*T,*XY\MN27;
LMN8LH
('@&7)[27;TV]&7^MNXY&*(-27;
('@*)[97;T97;*
('@_&)*T,*XY\MN^
&7
@LW5.`,S-4B.7+&*(\MNa-
27;L]&*(\MNa-97;27!
<-.
('@&7)[27;T,]&7^MNa27;
('@&)[97;T,]&^MNa97;
('@&)[7T,]&-.L.7-a
OH
('@*)_&7T,XY\MN&7*
('@_&)*T,*XY\MNXY^&
b"&7
b"&
Vc"d&)OHT3U.&3.e+.&7WLW7-fH-
TW58,$g3OH)L&7L%
@LW5Kh/27!
S = 1 + 2 + 3 + … + 10;
Bài làm:
MOV A, #0 ; ban đầu tổng trong thanh ghi A là 0
MOV R1, #1 ;
MOV R2, 10 ; chứa số đếm là 10 lần
Lap:
ADD A, R1 ;
INC R1 ;
DJNZ R2, Lap
Bài 13: Chương trình con tạo trễ 0.5ms dùng timer (Xtal = 11.0592MHZ)
MOV TMOD, #01H ; sử dụng Timer 0 chế độ 16 bít
Delay1:
MOV TH0, #0FDH ; TIMER TRỄ 0.5ms
MOV TL0, #0BH ; số đếm 0FFFFH – 0FD0BH = 2F4H = 500
SETB TR0 ;
LAP:
JNB TF0, LAP ;
CLR TF0 ;
CLR TR0 ;
Bài 14: Viết chương trình con tạo sóng vuông 1k HZ trên chân p1.0 (Xtal = 11.0592MHZ)
T = 1/f = 1ms
ORG 000H
MOV TMOD, #01H ; sử dụng timer0 chế độ 16 bít
ANSWER_BACK:
MOV TL0, # 08H ; số đếm 0FFFFH – 0FB08H = 3E7H = 999 (hệ 10)
MOV TH0, #FBH ;
CPL P1.0
ACALL PENDING
SJMP ANSWER_BACK
; chương trình tạo trễ sử dụng Timer 0
PENDING:
SETB TR0 ;
STANDBY:
JNB TF0, STANDBY ;
CLR TR0 ;
CLR TF0 ;
RET
END
Bài 15. Chương trình hiển thị led 7 thanh số từ 00 đến 99
Dùng Led 7 thanh Cathode chung
MOV 30H,#0
SJMP Hienthi
Main:
INC 30H ; Tăng ô nhớ 30h
MOV A,30H
CJNE A,#100,Hienthi ; Nếu giá trị ô nhớ 30h = 10
MOV 30H,#0 ; thì gán 30h = 0
SJMP Hienthi ; Hiển thị ma Led 7 đoạn
ACALL Delay
SJMP Main
;
Hienthi:
MOV A,30H
MOV B,#10
DIV AB
MOV DPTR,#Maled7
MOVC A,@A+DPTR
MOV P2,A
CLR P1.1
SETB P1.1
MOV A,B
MOV DPTR,#Maled7
MOVC A,@A+DPTR
MOV P2,A
CLR P1.0
SETB P1.0
CALL Delay
SJMP Main
Maled7: DB
0C0H,0F9H,0A4H,0B0H,
99H,92H,82H,0F8H,80H,90H
;
Delay:
MOV R7,#255
DJNZ R7,$
RET
END
Câu 21: Thiết kế mạch, Viết chương trình hiển thị trên Led 7 thanh từ 0 đến 9 khi ấn nút tăng INC hay
nút giảm DEC
Thiết kế mạch:
Chương trình:
MOV 30H,#0
SJMP Hienthi
Main:
JNB P1.0,Sw1 ; Nếu P3.0 = 0 thì nhấn SW1
JNB P1.1,Sw2 ; Nếu P3.1 = 0 thì nhấn SW2
SJMP Main
SW1:
INC 30H ; Tăng ô nhớ 30h
MOV A,30H
CJNE A,#10,Hienthi ; Nếu giá trị ô nhớ 30h = 10
MOV 30H,#0 ; thì gán 30h = 0
SJMP Hienthi ; Hiển thị ra Led 7 đoạn
;
Sw2:
DEC 30H ; Giảm ô nhớ 30h
MOV A,30H
CJNE A,#255,Hienthi ; Nếu giá trị giảm = -1 (255)
MOV 30H,#9
SJMP Hienthi ; thì gán 30h = 9
Hienthi:
MOV A,30H
MOV DPTR,#Maled7
MOVC A,@A+DPTR
MOV P2,A
CALL Delay
SJMP Main
Maled7: DB
0C0H, 0F9H, 0A4H, 0B0H,
99H, 92H,82H, 0F8H, 80H, 90H
;
Delay:
MOV R7,#255
DJNZ R7,$
RET
END
Câu 16: Chương trình khởi động động cơ qua 3 cấp điện trở phụ
Main:
SETB P1.0 ; khởi động từ chính
ACALL Delay ; trễ 10s
SETB P1.1 ; khởi động từ loại Rf1
ACALL Delay ; trễ 10s
SETB P1.2 ; khởi động từ loại Rf2
ACALL Delay ; trễ 10s
SETB P1.3 ; khởi động từ loại Rf3
ACALL Delay
Delay:
PUSH 07h
PUSH 06h
PUSH 05H
MOV R6,#200
Delay1:
MOV R7,#250
Delay2:
MOV R5, # 200
DJNZ R5, $
DJNZ R7, Delay1
DJNZ R6, Delay1
POP 05h
POP 06h
POP 07h
RET
END
Bài 17: Viết chương trình điều khiển động cơ 1 chiều quay thuận, quay nghịch
- Vẽ sơ đồ
- Viết chương trình
MAIN:
MOV P0, #00h;
STAY:
JNB P1.0, THUAN
;JNB P1.1, NGUOC
;JNB P1.2, STOP ;
SJMP STAY
; chương trình quay thuận
THUAN:
SETB P0.0
RET
; chương trình quay ngược
NGUOC:
SETB P0.1
RET
; chương trình dừng
STOP: ;
CLR P0.0
CLR P0.1
RET
;
END
Câu 18: LL.)LW55WYijMkUKC
D8-4
LL.
Chương trình:
// Chuong trinh dieu khien dong co buoc don gian
ORG 0H
MAIN:
JNB P2.0, THUAN
JNB P2.1, NGUOC
JNB P2.2, STOP
SJMP MAIN
THUAN:
MOV P1, #00000001B
ACALL DELAY
MOV P1, #00000010B
ACALL DELAY
MOV P1, #00000100B
ACALL DELAY
MOV P1, #00001000B
ACALL DELAY
RET
NGUOC:
MOV P1, #00000001B
ACALL DELAY
MOV P1, #00000010B
ACALL DELAY
MOV P1, #00000100B
ACALL DELAY
MOV P1, #00001000B
ACALL DELAY
RET
DELAY:
MOV R1, #20
H1: MOV R2,#255
H2: MOV R3,#255
H3: DJNZ R3,H3
DJNZ R2,H2
DJNZ R1,H1
RET
END
7@LW5.L./UH=./Z,P.+LM#
.O+,?kUKCD8-4 7!
MOV TMOD, #01100000B; Chọn bộ đếm 1, chế độ 2, bít C/T = 1 xung ngoài.
MOV TH1, #0 ; Xoá TH1
SETB
P3.5 ; Lấy đầu vào T1
AGAIN:
SETB
TR1 ; Khởi động bộ đếm
BACK: MOV A, TL1 ; Lấy bản sao số đếm TL1
CALL Hienthi
JNB TF1, Back ; Duy trì nó nếu TF = 0
CLR TR1 ; Dừng bộ đếm
CLR TF1 ; Xoá cờ TF
SJMP
AGAIN ; Tiếp tục thực hiện
Hienthi:
MOV DPTR,#Maled7
MOVC A,@A+DPTR
MOV P2,A
CLR P1.2
SETB P1.2
CALL Delay
Maled7: DB
0C0H,0F9H,0A4H,0B0H,
99H,92H,82H,0F8H,80H,90H ; MÃ SỐ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
RET
;
Delay:
MOV R7,#255
DJNZ R7,$
RET
END
Câu 19. Thiết kế mạch, viết chương trình điều khiển dãy 8 led đơn sáng dần từ trái qua phải,
nhấp nháy, sau đó sáng lần lượt từ phải qua trái. Giải thích ý nghĩa các câu lệnh.
Bài làm:
Thiết kế mạch:
Chương trình:
Main:
MOV P0,#01h
CALL Delay
MOV P0,#03h
CALL Delay
MOV P0,#07h
CALL Delay
MOV P0,#0fh
CALL Delay
MOV P0,#1fh
CALL Delay
MOV P0,#3fh
CALL Delay
MOV P0,#7fh
CALL Delay
MOV P0,#0ffh
CALL Delay
; nhấp nháy
MOV P0, #00H;
CALL Delay
; sáng dần từ phải sang trái
MOV P0,#80h
CALL Delay
MOV P0,#40h
CALL Delay
MOV P0,#20h
CALL Delay
MOV P0,#10h
CALL Delay
MOV P0,#08h
CALL Delay
MOV P0,#04h
CALL Delay
MOV P0,#02h
CALL Delay
MOV P0,#01h
SJMP main