logo

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
DMCA.com Protection Status Copyright by webtailieu.net