5.4.1. Lưu đoă:
5.4.2. Giại thích:
Chương trình con Display được dùng đeơ hieơn thị led đốn khi nó được gĩi. Đaău tieđn, địa chư cụa led 1 (địa chư coơng PB cụa 8255) được đưa vào con trỏ dữ lieơu DPTR bởi leơnh MOV. Sau đó ghi dữ lieơu ở ođ nhớ Led1 ra địa chư được lưu trong con trỏ dữ lieơu DPTR, noơi dung cụa ođ nhớ Led1 là mã hieơn thị led 7 đốn cụa ođnhớ thứ Keybuf1 trong bạng Table, mã này được lưu vào biên Led1 trong quá trình thực hieơn chương trình con Indec. Quá trình hieơn thị led 2 hoàn toàn tương tự như quá trình hieơn thị led 1. Khi đã hieơn thị xong led 2 chương trình được kêt thúc và trở lái chương trình chính.
DISPLAY
DPTR trỏ đên địa chư cụa led 1 (6001H) Ghi dữ lieơu ở ođ nhớ Led1 ra địa chư này
DPTR trỏ đên địa chư cụa led 2 (6002H) Ghi dữ lieơu ở ođ nhớ Led2 ra địa chư này
THAƠP PHAĐN:
5.5.1. Lưu đoă:
5.5.2. Giại thích:
Chương trình NumDecChar được sử dúng mã hoá moơt sô thaơp phađn có hai chữ sô thành hai ký tự dáng sô thaơp phađn đeơ hieơn thị ra hai led 7 đốn.
Đaău tieđn, đưa sô thaơp phađn caăn mã hoá vào thanh ghi A, và sô 10 vào thanh chứa B baỉng leơnh MOV. Tiêp theo ta thực hieơn leơnh DIV đeơ chia noơi dung trong thanh ghi A cho noơi dung trong thanh chứa B, kêt quạ thu được là kêt phaăn nguyeđn được lưu trong thanh ghi A, còn phaăn dư được lưu trong thanh chứa B. Sau đó, ta đưa mã hieơn thị led 7 đốn ở ođ nhớ thứ A trong bạng Table vào thanh ghi R1 và mã hieơn thị led 7 đốn ở ođ nhớ thứ B trong bạng Table vào thanh ghi R2. Sau khi hoàn tât các cođng vieơc tređn chương trình kêt thúc và trở veă thực hieơn tiêp các leơnh sau leơnh gĩi chương trình này.
NumDecChar
Đưa sô caăn chuyeơn vào A Đưa 10 vào B
Chia A cho B
R2 = ođ nhớ thứ A trong bạng Table R1 = ođ nhớ thứ B trong bạng Table
5.6. CHƯƠNG TRÌNH CON RUN ĐIEĂU KHIEƠN XE CHÁY:
5.6.1. Lưu đoă:
5.6.2. Giại thích:
Khi chương con Run đieău khieơn xe được gĩi, đaău tieđn nó kieơm tra xem thời gian vaơn RUN
Khởi đoơng Timer 0
Khởi đoơng Timer 1 Khởi đoơng motor kéo
RET Dừng 3s, baơt đèn báo hieơu Cháy 1s, taĩt đèn báo hieơu Num1 = 0 S Đ P1.7 = 0? (Go/stop) S S S S S Đ Đ Đ Đ Đ Num1 = 0? P1.3 = 0? Cạm biên (4) P1.4 = 0? Cạm biên (5) Taíng tôc bánh xe (2) Giạm tôc bánh xe (3) P1.4 = 0? Cạm biên (5) Giạm tôc bánh xe (2) Taíng tôc bánh xe (3) Num1 = 0?
Taĩt motor kéo R6 = 15 R7 = 60 TF1=1? Giạm R6 R6 = 0? Giạm R7 R7 = 0? S Đ S Đ S Đ Giạm Num1
các giá trị 70 và15. Sau đó, khởi đoơng các motor kéo làm cho xe cháy tới. Trong quá trình cháy tới 8051 kieơm tra xem phím Go/Stop có được ân khođng, nêu được ân thì nó gán cho biên Num1 giá trị 0, giá trị này sẽ được chương trình kieơm tra sau đó, khi kieơm tra đúng là Num1 baỉng 0 thì chương trình sẽ taĩt các motor làm cho xe dừng lái roăi kêt thúc chương trình. Trường hợp phím Go/Stop khođng được ân thì 8051 sẽ tiêp túc kieơm tra tráng thái cụa các boơ phaơn cạm biên nôi với các chađn P1.3 và P1.4 cụa nó. Các khạ naíng có theơ xạy ra ứng với moêi tráng thái khác nhau cụa các boơ cạm biên được chư rõ dưới đađy:
- Trường hợp ngõ ra cạ hai boơ cạm biên đeău ở mức 1 thì xe sẽ tiêp túc chuyeơn đoơng với vaơn tôc khođng đoơi.
- Trường hợp ngõ ra cụa 1 trong hai boơ cạm biên ở mức 0 thì bánh xe ở phía beđn boơ cạm biên đó sẽ giạm tôc đoơ quay, đoăng thời tôc đoơ quay cụa bánh xe ở phía beđn kia sẽ taíng leđn nhaỉm làm cho xe tiêp túc di chuyeơn đúng hướng cụa nó. - Trường hợp ngõ ra cạ hai boơ cạm biên đeău ở mức 0 thì xe sẽ dừng lái trong ba
giađy và baơt đèn báo hieơu, sau đó tiêp túc cháy trong 1 giađy mà khođng quan tađm đên tín hieơu cụa các boơ cạm biên. Sau đó, hốt đoơng cụa xe trở lái như mođ tạ ở tređn.
Trong quá trình hốt đoơng 8051 sẽ luođn kieơm tra tráng thái cờ tràn cụa boơ định thời 1, sau 15 laăn tràn tức là ứng với 1 giađy nó sẽ giạm R7 moơt đơn vị, sau 60 laăn giạm giá trị R7 tức là ứng với 1 phút, biên Num1 sẽ giạm giá trị đi 1, quá trình hốt đoơng cụa xe tiêp túc như dieên ra như tređn cho đên khi giá trị lưu trong biên Num1 baỉng 0 thì dừng lái. Chương trình kêt thúc và trở lái chương trình chính.
5.7. CHƯƠNG TRÌNH INDEC NHAƠP VAØO MOƠT SÔ THAƠP PHAĐN:
5.7.1. Lưu đoă:
5.7.2. Giại thích:
Chương trình con Indec được sử dúng đeơ nhaơn vào moơt sô thaơp phađn hai chữ sô từ bàn phím, đoăng thời lưu vào 2 biên Led1 và Led2 mã hieơn thị led 7 đốn cụa hai chữ sô thaơp phađn đó.
Đaău tieđn, chương trình sẽ kieơm tra xem biên Keybuf có phại chứa giá trị 1 khođng, nêu phại nghĩa là phím 1 được ân, nêu khođng phại nghĩa là phím 2 được ân. Trường hợp phím 1 được ân thì chữ sô hàng chúc chứa trong biên Keybuf1 được taíng leđn 1 nêu nó chưa baỉng 9, còn nêu nó đã baỉng 9 thì gán nó baỉng 0, sau đó mã hieơn thị led 7 đốn cụa chữ sô
INDEC S Đ Keybuf = 1? Đ Đ S S
Taíng Keybuf2 theđm 1
Keybuf1 = 0
Taíng Keybuf1 theđm 1
Keybuf1 = 9? Keybuf2 = 9?
Num1 = Keybuf1 x 10 + Keybuf2
RET
Keybuf2 = 0
Lưu mã hieơn thị led 7 đốn cụa sô Keybuf1 vào biên led 1
Lưu mã hieơn thị led 7 đốn cụa sô Keybuf2 vào biên led 2
được ân thì quá trình nhaơn phím và lưu mã hieơn thị led 7 đốn cụa chữ sô hàng đơn vị cũng dieên ra hoàn toàn tương tự như tređn. Sau khi đã hoàn tât các cođng vieơc tređn chương trình kêt thúc và trở veă lái chương trình gĩi nó đeơ thực hieơn các leơnh tiêp theo.
PHÚ LÚC
I. CHƯƠNG TRÌNH NÁP CHO 8051:
;====================================================== ; Khai bao cac bien su dung trong RAM noi cua 8051
;====================================================== ;Bo nho RAM noi. Dia chi byte: 30h-7fh
led1 equ 30h ;bien luu du lieu de hien thi led1 led2 equ 31h ; bien luu du lieu de hien thi led2 duty equ 32h
dutyC equ 33h
keybuf equ 34h ;ma ban phim skeybuf equ 35h
keybuf1 equ 36h keybuf2 equ 37h keybuf3 equ 38h temp data 40h
num1 data 43h ;bien luu thoi gian van hanh keybit bit 00h ;bit trang thai ban phim run bit 01h ;bit trang thai motor PAout equ 6000h ;dia chi cong PA cua 8255 addled1 equ 6001h ;dia chi cua led1
addled2 equ 6002h ;dia chi cua led2
;====================================================== ; Chuong trinh chinh
;====================================================== Org 2000h
START: acall Init
S_loop: mov DPTR,#Table ;hien thi tin hieu san sang mov A,#10
mov Led1,A mov Led2,A
acall Display ;hien thi tin hieu san sang S_read: acall Keyscan ;cho nhan phim
jnb Keybit,S_read
clr Keybit ;xoa bit trang thai ban phim mov R1,Keybuf ;an phim Go/stop?
cjne R1,#3,Indec lcall Run0
sjmp S_loop
;======================================================
; Chuong trinh doc vao 1 so thap phan
;====================================================== Indec:
cjne R1,#2,Inkey2 ;an phim 1 hay 2? mov A,Keybuf1 ;thay doi so hang chuc cjne A,#9,In_tiep0
mov A,#0 sjmp In_tiep1 In_tiep0: inc A
In_tiep1: mov Keybuf1,A
mov DPTR,#Table ;xuat ra led1
movc A,@A+DPTR
mov Led1,A sjmp In_tiep5
sjmp In_tiep3 In_tiep2: inc A
In_tiep3: mov Keybuf2,A
mov DPTR,#Table ;xuat ra led2
movc A,@A+DPTR
mov Led2,A
In_tiep5: acall Display
mov A,Keybuf1 ;Num1=10 x Keybuf1+Keybuf2 mov B,#10 mul AB mov R0,Keybuf2 add A,R0 da A mov Num1,A sjmp S_loop ;====================================================== ; Chuong trinh khoi tao cac trang thai dau va cac bien
;====================================================== Init:
mov DPTR,#6003h ;khoi tao 8255 pa,pb,pc: out mov A,#80h
movx @DPTR,A
mov TMOD,#12h ;timer1 che do 1,timer0 che do 2 mov Num1,#0 mov Keybuf1,#0 mov Keybuf2,#0 mov Keybuf3,#0 ret ;======================================================
;====================================================== Display: mov DPTR,#addled1 mov A,led1 movx @DPTR,A mov DPTR,#addled2 mov A,led2 movx @DPTR,A ret ;====================================================== ; Chuong trinh quet phim
;====================================================== Keyscan: jnb keybit,Kstt ret Kstt: jnb P1.5,Kstt1 jnb P1.6,Kstt2 jnb P1.7,Kstt3 ret Kstt1: mov Keybuf,#1 setb Keybit Kstt2: mov Keybuf,#2 setb Keybit Kstt3: mov Keybuf,#3 setb Keybit Ksnha: jnb P1.5,Ksnha
ret ;scankey end
;====================================================== ; Chuong trinh ma hoa so 8 bit thanh ky tu dang so thap phan ;====================================================== NumDecChar: mov A,Num1 mov B,#10 div AB mov DPTR,#Table movc A,@A+DPTR mov R2,A mov DPTR,#Table mov A,B movc A,@A+DPTR mov R1,A ret ;end NumDecChar ;====================================================== ; Chuong trinh dieu khien xe chay
;====================================================== Run0:
mov A,Num1 cjne A,#0,R_tiep ret
R_tiep: mov duty,#200 mov A,duty cpl A
clr ACC.0 ;tat motor clr ACC.1 mov DPTR,#PAout movx @DPTR,A mov TH0,dutyC setb TR0
R_loop: mov A,Num1 cjne A,#0,R_tiep0 mov A,#0 mov DPTR,#PAout movx @DPTR,A ret R_tiep0: mov R7,#60 R_loop0: mov R6,#15 R_loop1: mov TH1,#0 mov TL1,#0 setb TR1 R_loop2: jb TF1,R_tiep3 jnb TF0,R_loop2 clr TF0 jb run,Turn_off
Turn_on: jb P1.7,R_tiep4 ;kiem tra phim Go/Stop mov Num1,#0
sjmp R_loop
R_tiep4: jnb P1.3,Turn_on1 ;ktra cam bien 1 jnb P1.4,Turn_on2 ;cam bien 2
setb ACC.1 sjmp Ttuc1 Turn_on1: jnb P1.4,R_dung1 clr ACC.0 setb ACC.1 sjmp Ttuc1
R_dung1: clr ACC.0 ;dung tam thoi clr ACC.1
setb ACC.2
mov DPTR,#PAout
movx @DPTR,A
sjmp R_dung2 Turn_on2: setb ACC.0
clr ACC.1
Ttuc1: mov DPTR,#PAout
movx @DPTR,A mov TH0,duty setb run sjmp R_loop2 Turn_off: jnb P1.3,Turn_off1 jnb P1.4,Turn_off2 clr ACC.0 clr ACC.1 sjmp Ttuc2
Turn_off1: setb ACC.0
clr ACC.1 sjmp Ttuc2
Ttuc2: mov DPTR,#PAout movx @DPTR,A mov TH0,dutyC clr run sjmp R_loop2 R_tiep3: clr TF1 djnz R6,R_loop1 djnz R7,R_loop0 mov A,Num1 dec A mov Num1,A acall NumDecChar mov Led1,R2 mov Led2,R1 acall Display ljmp R_loop R_dung2: clr TR1 clr TF1 mov R5,#45 ;dung 3s R_loop4: mov TH1,#0 mov TL1,#0 setb TR1 R_loop5: jnb TF1,R_loop5 clr TF1 djnz R5,R_loop4 setb ACC.0
clr ACC.2 mov DPTR,#PAout movx @DPTR,A clr TR1 clr TF1 mov R5,#15 R_loop6: mov TH1,#0 mov TL1,#0 setb TR1 R_loop7: jnb TF1,R_loop7 clr TF1 djnz R5,R_loop6 ljmp R_loop0 ;====================================================== ; Bang ma ky tu ;====================================================== Table: c0 : db 3fh c1 : db 06h c2 : db 5bh c3 : db 4fh c4 : db 66h c5 : db 6dh c6 : db 7dh c7 : db 07h c8 : db 7fh c9 : db 6fh ct10: db 04h ;'-' END
8051: Option Explicit
Dim data As Byte, d As Byte Const maxtime = 10000 Dim path As String
Dim b() As Byte, truyen As Byte Dim thu As Boolean
Private Sub cmdTim_Click()
CommonDialog1.CancelError = True On Error GoTo DoNothing
CommonDialog1.ShowOpen
Text1.Text = CommonDialog1.FileName Exit Sub
DoNothing: End Sub
Public Sub truyen_file()
Dim number As Integer, n As Integer, i As Integer path = Text1.Text ' ten file can truyen number = FreeFile ' lay ID con trong Open path For Binary As #number
n = LOF(number) - 8192 ' kich thuoc cua mang ReDim Preserve b(n) ' cap phat mang
StatusBar1.SimpleText = "Kich thuoc ma lenh: " & Hex(n) & "H bytes" Get #number, 8193, b
truyen = (n And &HFF)
viet (Hex(truyen) + "H") ' Byte thap cua kich thuoc TxD
RxD
viet (Hex(data) + "H") ' Byte thap cua kich thuoc truyen = n \ (&HFF) ' byte cao cua kich thuoc viet (Hex(truyen) + "H") TxD RxD viet (Hex(data) + "H") viet (Hex(n)) '============ truyen ma lenh =========================== For i% = 0 To n - 1 truyen = b(i) TxD RxD
viet ("Byte: " & (i + 1) & " Truyen: " & Hex(truyen) & "H" & " Nhan: " & Hex(data) & "H")
If truyen <> data Then
MsgBox "Co mot loi xay ra khi truyen ! " & vbCrLf & " Truyen: " & Hex(truyen) & "H" & vbCrLf & " Nhan: " & Hex(data) & "H"
End If Next i%
'====================================================== TxD
RxD
MsgBox "Da truyen file xong ! Tong so bytes: " & n End Sub
End Sub
Public Sub delay(max As Byte) d = 0
Timer1.Enabled = True
Timer1.Interval = Val(Text2.Text) Do
DoEvents
Loop Until d >= max Timer1.Enabled = False End Sub
Private Sub cmdTruyen_Click()
' vo hieu hoa cac nut lenh va cac nut chon OptCom1.Enabled = False optcom2.Enabled = False cmdTruyen.Enabled = False cmdTim.Enabled = False Text1.Enabled = False Text2.Enabled = False
' xac dinh cong COM da duoc nguoi dung chon If OptCom1.Value Then
MSComm.CommPort = 1 Else
MSComm.CommPort = 2 End If
MSComm.PortOpen = False End If
MSComm.Settings = "4800,N,8,1" ' 4800 baud
MSComm.InputLen = 1 ' moi lan doc 1 ki tu MSComm.InBufferSize = 1024 ' Bo dem nhan
MSComm.OutBufferSize = 1 'moi lan chi xuat 1 ki tu
MSComm.SThreshold = 0 'khong cho phep ngat CPU khi dem truyen rong MSComm.RThreshold = 0 'khong cho phep ngat CPU moi khi nhan duoc ki tu
MSComm.CommPort = 1 'If Not (thu) Then
'On Error GoTo tiep
MSComm.PortOpen = False ' Mo cong 'Else
'tiep:
' MsgBox "Co loi khi mo cong COM " & MSComm.CommPort & ". Cong da duoc dung boi ung dung khac !"
' GoTo Thoat ' End If
'===================================================== Call hand_shake ' qua trinh bat tay voi KIT
If data = 0 Then
MSComm.PortOpen = False ' va dong cong COM lai GoTo Thoat
End If
Call truyen_file
MSComm.PortOpen = False ' va dong cong COM lai
'===================================================== Thoat:
OptCom1.Enabled = True optcom2.Enabled = True If MSComm.CommPort = 1 Then OptCom1.Value = True optcom2.Value = False Else OptCom1.Value = False optcom2.Value = True End If cmdTim.Enabled = True Text1.Enabled = True Text2.Enabled = True cmdTruyen.Enabled = True End Sub
Public Sub hand_shake() Dim dem As Integer truyen = 85
dem = 0 Do
dem = dem + 1
StatusBar1.SimpleText = "Đang liên lac vơi KIT ! Cố gắng ..." & Str$(dem) & " lần. Nhận được " & Hex(data) & "H"
TxD ' truyen ki tu 55H xuong KIT RxD1 ' nhan ki tu tra loi tu KIT Loop Until (data = 85) Or (dem >= 10)
MsgBox "Khong lien lac duoc voi KIT ! Ban can kiem tra lai cap noi va RESET lai KIT !"
data = 0 Else 'Exit Sub StatusBar1.SimpleText = "" RxD Do
StatusBar1.SimpleText = StatusBar1.SimpleText & Chr(data) RxD
Loop While data <> Asc("$") End If
End Sub
Public Sub TxD() Do
DoEvents
Loop Until MSComm.OutBufferCount <= 0 MSComm.Output = Chr$(truyen)
'delay (1) End Sub
Public Sub RxD()
Dim dem As Integer Dim i As Integer dem = 0
Do
DoEvents
End Sub
Public Sub RxD1()
Dim dem As Integer Dim i As Integer dem = 0
Do
DoEvents dem = dem + 1
Loop Until (MSComm.InBufferCount >= 1) Or (dem > maxtime) If dem > maxtime Then
data = 0 Else
data = Asc(MSComm.Input) End If
End Sub
Private Sub Form_Load() MSComm.CommPort = 2 If MSComm.PortOpen Then MSComm.PortOpen = False End If
End Sub
Private Sub Form_Unload(Cancel As Integer) ' Turn off COM Port
End If End Sub
Private Sub Text1_Change() Dim n As Long
If (Text1.Text <> "*.BIN") And (Text1.Text <> "") Then cmdTruyen.Enabled = True
StatusBar1.SimpleText = "Nếu đã sẵn sàng thì bấm TRUYỀN" Else
cmdTruyen.Enabled = False
StatusBar1.SimpleText = "Hãy thiết lập các thơng số cần thiết" End If
n = InStrRev(Text1.Text, "\") + 1
Form1.Caption = "PC --> KIT 8051 ...\" & Mid(Text1.Text, n) End Sub
Private Sub Timer1_Timer() d = d + 1
1. Kỹ Thuaơt Vi Xử Lý. Tác giạ: Vaín Thê Minh.
Nhà xuât bạn giáo dúc naím 1997. 2. Hĩ Vi Đieău Khieơn 8051.
Tác giạ: Tông Vaín On - Hoàng Đức Hại. Nhà xuât bạn Lao Đoơng - Xã Hoơi.
3. THE 8051 MICROCONTROLLER
Tác Giạ: Scott MacKenzie 4. Trình Bieđn Dịch ASM51.
Contents
CHƯƠNG 1: TOƠNG QUAN... 1
1.1. GIỚI THIEƠU: ... 1
1.2. GIỚI HÁN ĐEĂ TAØI : ... 1
1.3. MÚC ĐÍCH NGHIEĐN CỨU : ... 1
1.4. KHÁI QUÁT VEĂ ĐEĂ TAØI: ... 2
1.4.1. Bàn phím và boơ phaơn hieơn thị: ... 2
1.4.2. Quá trình vaơn hành cụa xe: ... 2
CHƯƠNG 2: TOƠNG QUAN VEĂ HĨ VI ĐIEĂU KHIEƠN MCS-51. ... 4
2.1. CÂU TÁO VI ĐIEĂU KHIEƠN 8051: ... 4
2.1.1. Giới thieơu hĩ MSC-51: ... 4
2.1.1. Câu trúc beđn trong và sơ đoă chađn cụa 8051: ... 5
2.2. TAƠP LEƠNH CỤA HĨ 8051 :... 12
2.2.1. Các kieơu định địa chư (addressing mode): ... 12
2.2.2. Các lối leơnh cụa 8051: ... 13
2.3. HỐT ĐOƠNG ĐỊNH THỜI CỤA 8051: ... 13
2.3.1. Giới Thieơu: ... 13
2.3.2. Thanh ghi chê đoơ định thời TMOD: ... 14
2.3.3. Thanh ghi đieău khieơn định thời TCON: ... 14
2.3.4. Các chê đoơ định thời và cờ tràn: ... 14
2.3.5. Các nguoăn xung clock định thời: ... 15
2.3.6. Khởi đoơng dừng và đieău khieơn các boơ định thời: ... 15
2.3.7. Khởi đoơng và truy xuât các thanh ghi định thời: ... 15
2.4. HỐT ĐOƠNG CỤA PORT NÔI TIÊP: ... 16
2.4.1. Giới thieơu: ... 16
2.4.2. Thanh ghi đieău khieơn port nôi tiêp:... 16
2.4.3. Các chê đoơ hốt đoơng: ... 16
2.4.4. Khởi đoơng và truy xuât các thanh ghi coơng nôi tiêp: ... 17
2.4.5. Tôc đoơ baud cụa port nôi tiêp: ... 18
2.5. HỐT ĐOƠNG NGAĨT: ... 18
2.5.1. Giới thieơu: ... 18
2.5.2. Toơ chức ngaĩt: ... 19
2.5.3. Xử lý ngaĩt: ... 19
CHƯƠNG 3: KHẠO SÁT CÁC IC NGỐI VI ... 21
3.1. VI MÁCH GIAO TIÊP NGỐI VI 8255A: ... 21
3.1.1. Câu trúc cụa 8255A:... 21
3.1.2. Các mode hốt đoơng: ... 23
3.2. KHẠO SÁT BOƠ NHỚ EPROM 2764: ... 25
3.2.1. Sơ đoă chađn: ... 25