Giáo trình Vi điều khiển - Phục lục 1
Giáo trình Vi điều khiển - Phụ lục 1: SOẠN THẢO VÀ NẠP CHƯƠNG TRÌNH CHO AT89C51
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Phụ lục 1: SOẠN THẢO VÀ NẠP CHƯƠNG TRÌNH
CHO AT89C51
1. Soạn thảo chương trình
Soạn thảo chương trình cho AT89C51 có thể dùng nhiều chương trình khác
nhau. Phần phụ lục này giới thiệu một chương trình cho phép soạn thảo bằng hợp ngữ:
Crimson Editor. Download chương trình tại: http://www.crimsoneditor.com hay
ftp://eed.hutech.edu.vn/Soft/Crimson
Sau khi cài đặt, khởi động Crimson từ Start > All Programs > Crimson Editor
> Crimson Editor.
Phạm Hùng Kim Khánh Trang 136
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
1.1. Định nghĩa cú pháp
Vào menu Document > Syntax Type > Customize
Tại cửa sổ Preference, trong phần Syntax Type chọn một mục còn trống:
Phạm Hùng Kim Khánh Trang 137
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Trong phần Lang Spec, nhấn vào nút Browse bên phải, chọn file spec là
C:\Program Files\Crimson Editor\spec\8051-asm.spc.
Tương tự, chọn file Keywords là 8051-asm.key và phần Description có thể gõ
tuỳ ý:
Sau đó, trong menu Document > Syntax Type, chọn vào phần 8051 (là phần
định nghĩa tại trường Description).
Phạm Hùng Kim Khánh Trang 138
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
1.2. Định nghĩa chương trình dịch
Phần này hướng dẫn cách chọn chương trình dịch cho 8051, có thể dùng bất kỳ
chương trình nào cho phép dịch từ file .asm hay .a51 sang file hex: một chương trình
có thể dùng là ASEM51.EXE (download tại ftp://eed.hutech.edu.vn/Soft/ASEM51).
Vào menu Tools > Conf. User Tools
Phạm Hùng Kim Khánh Trang 139
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Định nghĩa chương trình dịch như sau:
Tại menu Tools sẽ xuất hiện thêm phần dịch ASEM51:
Thực hiện soạn thảo chương trình và lưu file. Sau đó, thực hiện biên dịch bằng
cách chọn menu Tools > ASEM51 hay nhấn tổ hợp phím Ctrl+1. Sau khi dịch,
chương trình ASEM51 sẽ tạo thêm file .HEX và .LST. File .HEX được dùng để nạp
Phạm Hùng Kim Khánh Trang 140
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
chương trình cho AT89C51 (xem thêm phần nạp chương trình) còn file .LST chứa
thêm các thông tin khác do ASEM51 tạo ra (quan trọng nhất là số lỗi xảy ra, dòng lỗi,
lỗi gì).
Phạm Hùng Kim Khánh Trang 141
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
2. Nạp chương trình
Để thực hiện nạp chương trình, cần một file .hex chứa chương trình cần nạp
(được tạo ra như ở phần 1), chương trình điều khiển trên máy tính và một mạch nạp.
Phần này giới thiệu một mạch nạp sử dụng cổng COM và chương trình điều khiển
dùng Visual Basic 6.0.
2.1. Chương trình điều khiển
Giao diện chương trình:
Chương trình nguồn (có thể download tại ftp://eed.hutech.edu.vn/Soft/up_8951):
Private Buffer_wr As String
Private kk As Integer
Private Prog_Type As Byte
Private Chip_Type As Byte
Private Time_Set As Integer
Private Sub AT2051_Click()
If AT2051.Checked = False Then
AT2051.Checked = True
End If
AT55.Checked = False
Phạm Hùng Kim Khánh Trang 142
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
AT52.Checked = False
AT51.Checked = False
AT2052.Checked = False
Frame4.Caption = "FLASH ROM AT89C2051"
Chip_Type = 4
End Sub
Private Sub AT2052_Click()
If AT2052.Checked = False Then
AT2052.Checked = True
End If
AT52.Checked = False
AT55.Checked = False
AT2051.Checked = False
AT51.Checked = False
Frame4.Caption = "FLASH ROM AT89C2052"
Chip_Type = 5
End Sub
Private Sub AT51_Click()
If AT51.Checked = False Then
AT51.Checked = True
End If
AT52.Checked = False
AT55.Checked = False
AT2051.Checked = False
AT2052.Checked = False
Frame4.Caption = "FLASH ROM AT89C51"
Chip_Type = 1
End Sub
Private Sub AT52_Click()
If AT52.Checked = False Then
AT52.Checked = True
End If
AT51.Checked = False
AT55.Checked = False
AT2051.Checked = False
AT2052.Checked = False
Frame4.Caption = "FLASH ROM AT89C52"
Phạm Hùng Kim Khánh Trang 143
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Chip_Type = 2
End Sub
Private Sub AT55_Click()
If AT55.Checked = False Then
AT55.Checked = True
End If
AT2051.Checked = False
AT52.Checked = False
AT51.Checked = False
AT2052.Checked = False
Frame4.Caption = "FLASH ROM AT89C55"
Chip_Type = 3
End Sub
Private Sub Bar1_MouseDown(Button As Integer, Shift As Integer, x As
Single, y As Single)
Bar1.Value = 0
End Sub
Private Sub cm1_Click()
If cm1.Checked = False Then
cm1.Checked = True
End If
Cm2.Checked = False
Cm4.Checked = False
If COMM.PortOpen = True Then
COMM.PortOpen = False
End If
If Emul.SubCOM.PortOpen = True Then
Emul.SubCOM.PortOpen = False
End If
COMM.CommPort = 1
Emul.SubCOM.CommPort = 1
End Sub
Private Sub Cm2_Click()
If Cm2.Checked = False Then
Cm2.Checked = True
End If
Phạm Hùng Kim Khánh Trang 144
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
cm1.Checked = False
Cm4.Checked = False
If COMM.PortOpen = True Then
COMM.PortOpen = False
End If
If Emul.SubCOM.PortOpen = True Then
Emul.SubCOM.PortOpen = False
End If
COMM.CommPort = 2
Emul.SubCOM.CommPort = 2
End Sub
Private Sub Cm4_Click()
If Cm4.Checked = False Then
Cm4.Checked = True
End If
cm1.Checked = False
Cm2.Checked = False
If COMM.PortOpen = True Then
COMM.PortOpen = False
End If
If Emul.SubCOM.PortOpen = True Then
Emul.SubCOM.PortOpen = False
End If
COMM.CommPort = 4
Emul.SubCOM.CommPort = 4
End Sub
Private Sub Command1_Click()
Dim nn As Integer
Dim i As Integer
Dim Et As Double
Dim temp As String
Dim CPU_TYPE As String
Command1.Enabled = False
If COMM.PortOpen = False Then
COMM.PortOpen = True
End If
' Xac dinh loai CHIP dang chon de nap
Phạm Hùng Kim Khánh Trang 145
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Dim Max_Buffer As Integer
Select Case Chip_Type
Case 1
Max_Buffer = 4 * 1024 - 1
CPU_TYPE = "****ATLAR"
Case 2
Max_Buffer = 8 * 1024 - 1
CPU_TYPE = "****ATLAR"
Case 3
Max_Buffer = 16 * 1024 - 1
CPU_TYPE = "****ATLAR"
Case 4
Max_Buffer = 2 * 1024 - 1
CPU_TYPE = "****ATSML"
Case 5
Max_Buffer = 4 * 1024 - 1
CPU_TYPE = "****ATSML"
End Select
If Len(Buffer_wr) > Max_Buffer Then
i = MsgBox("Buffer overflow! Select chip again", vbOKOnly +
vbApplicationModal, "Warning")
If i = vbOK Then
Command1.Enabled = True
Exit Sub
End If
End If
'*********CHON LOAI CPU TREN CARD NAP: 20PINS HOAC 40
PINS**********************
COMM.Output = CPU_TYPE
Do While COMM.OutBufferCount 0
Loop
'*********************************************************************
**********
' Xac dinh loai hinh dieu khien
Select Case Prog_Type
Case 1
Erase_Chip_New
If Label1.Caption = "Error Timeout" Then
Command1.Enabled = True
Exit Sub
Phạm Hùng Kim Khánh Trang 146
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
End If
If Len(Buffer_wr) = 0 Then
i = MsgBox(" BUFFER is empty!", vbOKOnly + vbApplicationModal
+ vbCritical, "Warning")
Label1.Caption = " BUFFER is empty!"
Command1.Enabled = True
Exit Sub
End If
Pro_Unlock_Bit
Case 2
Erase_Chip_New
If Label1.Caption = "Error Timeout" Then
Command1.Enabled = True
Exit Sub
End If
If Len(Buffer_wr) = 0 Then
i = MsgBox(" BUFFER is empty!", vbOKOnly + vbApplicationModal
+ vbCritical, "Warning")
Label1.Caption = " BUFFER is empty!"
Command1.Enabled = True
Exit Sub
End If
Pro_Lock_Bit
Case 3
If Len(Buffer_wr) = 0 Then
i = MsgBox(" BUFFER is empty!", vbOKOnly + vbApplicationModal
+ vbCritical, "Warning")
Label1.Caption = " BUFFER is empty!"
Command1.Enabled = True
Exit Sub
End If
Compare_Buffer
Case 4
Read_chip_new
Case 5
Erase_Chip_New
End Select
Command1.Enabled = True
End Sub
Private Sub Command2_Click()
Phạm Hùng Kim Khánh Trang 147
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Save_Buffer
End Sub
Private Sub Command3_Click()
Dim Result As Double
Dim AppPath As String
On Error GoTo Loi
AppPath = GetSetting("up_kit 89c51", "editor", "App editor")
Result = Shell(AppPath, vbNormalNoFocus)
Exit Sub
Loi:
Call MsgBox("No editor program", vbCritical + vbOKOnly, "Error")
End Sub
Private Sub Command4_Click()
Dim l As Integer
If Label2.Caption = 0 Then
l = MsgBox(" BUFFER is empty!", vbOKOnly + vbApplicationModal +
vbCritical, "Warning")
Exit Sub
End If
Command4.Enabled = False
If COMM.PortOpen = False Then
COMM.PortOpen = True
End If
'************************************************************
Write_Ram
Command4.Enabled = True
End Sub
Private Sub Command5_Click()
cmdl1.Filter = "*.exe|*.exe"
cmdl1.ShowOpen
If cmdl1.filename = "" Then Exit Sub
SaveSetting "up_kit 89c51", "editor", "App editor", cmdl1.filename
End Sub
Private Sub cp_Click()
If cp.Checked = False Then
Phạm Hùng Kim Khánh Trang 148
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
cp.Checked = True
End If
Lk.Checked = False
ulk.Checked = False
Rd.Checked = False
Ers.Checked = False
Command1.Caption = "Compare"
Command1.SetFocus
Prog_Type = 3
End Sub
Private Sub Dir1_Change()
File1.Path = Dir1.Path
Lbdir = File1.Path
End Sub
Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
Lbdir.Caption = Dir1.Path
End Sub
Private Sub Ers_Click()
If Ers.Checked = False Then
Ers.Checked = True
End If
Lk.Checked = False
ulk.Checked = False
cp.Checked = False
Rd.Checked = False
Command1.Caption = "Erase"
Command1.SetFocus
Prog_Type = 5
End Sub
Private Sub File1_Click()
Dim Name_of_File As String
Dim temp As String
temp = Right(File1.Path, 1)
If temp "\" Then
Name_of_File = File1.Path + "\" + File1.filename
Phạm Hùng Kim Khánh Trang 149
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Else
Name_of_File = File1.Path + File1.filename
End If
Slfile.Caption = Name_of_File
Load_File
End Sub
Private Sub Form_Load()
Prog_Type = 1
Chip_Type = 1 '4
Dir1.Path = App.Path
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MsgBox("Do you want to quit?", vbYesNo + vbQuestion, "Quit") = vbNo
Then Cancel = -1
End Sub
Private Sub Hp_Click()
Dim i As Integer
'i = MsgBox("Please call 090.3386554 if you have problems",
vbOKOnly, "Call for help!")
End Sub
Private Sub Lk_Click()
If Lk.Checked = False Then
Lk.Checked = True
End If
Rd.Checked = False
ulk.Checked = False
cp.Checked = False
Ers.Checked = False
Command1.Caption = "Clr_Lock"
Command1.SetFocus
Prog_Type = 2
End Sub
Private Sub Option1_Click()
File1.Pattern = "*.HEX"
End Sub
Phạm Hùng Kim Khánh Trang 150
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Private Sub Option2_Click()
File1.Pattern = "*.BIN"
End Sub
Private Sub Option3_Click()
File1.Pattern = "*.*"
End Sub
Private Sub Qt_Click()
Unload Me
End Sub
Private Sub Rd_Click()
If Rd.Checked = False Then
Rd.Checked = True
End If
Lk.Checked = False
ulk.Checked = False
cp.Checked = False
Ers.Checked = False
Command1.Caption = "Read"
Command1.SetFocus
Prog_Type = 4
End Sub
Private Sub Timer1_Timer()
Time_Set = Time_Set + 1
End Sub
Private Sub ulk_Click()
If ulk.Checked = False Then
ulk.Checked = True
End If
Lk.Checked = False
Rd.Checked = False
cp.Checked = False
Ers.Checked = False
Command1.Caption = "Clr_Unlock"
Command1.SetFocus
Prog_Type = 1
Phạm Hùng Kim Khánh Trang 151
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
End Sub
Public Function Read_File_Hex(filename As String) As String
Dim buffer As String
Dim temp As String
Dim length As Integer
Dim Sample As String
Dim val1 As Integer
Dim val2 As Integer
Dim FileNum As Integer
FileNum = FreeFile
Open filename For Input As #FileNum
buffer = ""
Do While (Not EOF(1))
val2 = 0
Line Input #FileNum, temp
length = Len(temp)
Bar1.Value = Bar1.Value + length
Sample = Right(temp, Len(temp) - 3)
val1 = Asc(Sample)
If val1 > 60 Then
val2 = val2 + (val1 - 55) * 16 * 16 * 16
Else
val2 = val2 + (val1 - 48) * 16 * 16 * 16
End If
Sample = Right(Sample, Len(Sample) - 1)
val1 = Asc(Sample)
If val1 > 60 Then
val2 = val2 + (val1 - 55) * 16 * 16
Else
val2 = val2 + (val1 - 48) * 16 * 16
End If
Sample = Right(Sample, Len(Sample) - 1)
val1 = Asc(Sample)
If val1 > 60 Then
val2 = val2 + (val1 - 55) * 16
Else
val2 = val2 + (val1 - 48) * 16
End If
Phạm Hùng Kim Khánh Trang 152
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Sample = Right(Sample, Len(Sample) - 1)
val1 = Asc(Sample)
If val1 > 60 Then
val2 = val2 + (val1 - 55)
Else
val2 = val2 + (val1 - 48)
End If
val2 = val2 * 2
If Len(buffer) < val2 Then
Dim k As Single
For k = Len(buffer) + 1 To val2 Step 1
buffer = buffer + "0"
Next k
End If
If length > 12 Then
temp = Mid(temp, 10, length - 11)
buffer = buffer + temp
End If
Loop
'Bar1.Value = Bar1.Max
Bar1.Value = 0
Read_File_Hex = buffer
Close #FileNum
End Function
Public Function Change_Hex2bin(buffer As String) As String
Dim i As Single
Dim temp As String
Dim val1 As Byte
Dim val2 As Byte
temp = ""
For i = 1 To Len(buffer) Step 2
Bar1.Value = i
val1 = Asc(buffer)
buffer = Right(buffer, Len(buffer) - 1)
val2 = Asc(buffer)
buffer = Right(buffer, Len(buffer) - 1)
If val1 > 60 Then
val1 = val1 - 55
Phạm Hùng Kim Khánh Trang 153
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
Else
val1 = val1 - 48
End If
If val2 > 60 Then
val2 = val2 - 55
Else
val2 = val2 - 48
End If
val1 = val1 * 16 + val2
temp = temp + Chr(val1)
Next i
Bar1.Value = 0
Change_Hex2bin = temp
End Function
Public Function Read_File_Bin(filename As String) As String
Dim buffer As String
Dim temp As String
Dim i As Integer
Dim tp1 As Tp
Dim FileNum As Integer
FileNum = FreeFile
Open filename For Random As #FileNum Len = Len(tp1)
i=1
buffer = ""
Do While (Not EOF(1))
Get #FileNum, i, tp1
Bar1.Value = i
i=i+1
buffer = buffer + Chr(tp1.el)
Loop
temp = Right(buffer, 3)
If Asc(temp) = 13 Then
buffer = Left(buffer, Len(buffer) - 2)
End If
buffer = Left(buffer, Len(buffer) - 1)
Read_File_Bin = buffer
Bar1.Value = 0
Close #FileNum
Phạm Hùng Kim Khánh Trang 154
Giáo trình Vi điều khiển Phụ lục 1 – Soạn thảo và nạp chương trình cho AT89C51
End Function
Public Sub Save_Buffer()
Dim FileNum As Integer
FileNum = FreeFile
cmdl1.filename = "*.bin"
cmdl1.Flags = cdlOFNHideReadOnly
cmdl1.ShowSave
If cmdl1.filename "*.bin" Then
Open cmdl1.filename For Output As #FileNum
Print #FileNum, Buffer_wr
Close #FileNum
End If
End Sub
Public Sub Compare_Buffer()
Dim Count As Integer
Dim i As Integer
Dim i1 As Byte
Dim i2 As Byte
Dim k As Integer
Dim j As Integer
Dim Et As Double
Dim add As String
Dim temp As String
Dim Sample As String
Dim Sample1 As String
i=0
COMM.Output = "*INITL"
temp = ""
Do While temp "OK" And temp "DATA ERROR"
If COMM.InBufferCount > 1 Then
temp = temp + COMM.Input
End If
Et = Et + 1
If Et = 100000 Then
Frame2.Caption = "Response"
Label1.Caption = "Error Timeout"
Exit Sub
End If
Phạm Hùng Kim Khánh Trang 155