單片機開發(fā)可以用手工匯編和機器匯編兩種方法。采用手工匯編就是先編寫出匯編程序,然后對照單片機匯編表手工將匯編程序翻譯成機器碼,最后將機器碼一個一個地送入開發(fā)仿真器的RAM中去進行調試。
由于采用手工匯編的機器碼是相對于存儲器的絕對地址進行定位的,因此在調試時,若要在程序中增加或刪除一條指令,就會造成指令的絕對地址發(fā)生變化。這樣除修改那條指令外,幾乎所有轉移、調用指令的操作數(shù)都要作相應的修改,稍有疏忽程序就會出錯。
而采用機器匯編,在很大程度上可以避免上述麻煩。只要通過鍵盤輸入源程序后,其余作工作都由計算機來進行,即查出相應的機器碼,對地址進行定位,建立能被開發(fā)裝置接收的機器碼文件、建立能打印出清單的列表文件等等。機器碼不需要再一個一個地從仿真器的鍵盤上鍵入,只要從PC機的通訊口直接傳送到開發(fā)裝置中去。因此使用機器匯編大大提高了單片機開發(fā)的速度。
源程序被輸入到機器中后,以一個文件的形式保存起來,然后就可以對這個文件進行處理了,要對這個文件進行匯編,必須有相應的匯編程序。在PC機上進行匯編的程序有多種,以下介紹的MASM51軟件就是其中的一種,它的主要特點有:
1.對用戶編寫的源程序格式要求不太嚴格,例如,英文字母的大、小寫不受限制,變量名或標號名沒有長度限制,對源程序中的空格數(shù)也沒有嚴格的要求等等。這些給用戶編寫程序帶來很大的方便。
2.具有較強的功能,例如支持宏語句,使同一程序中類似的程序結構,只要輸入一次,在使用時可用宏語句調用。此外還允許用條件匯編語句以及完善的偽指令系統(tǒng)等。減少了編寫、輸入源程序的工作量。
3.不管用戶的源程序有多少錯誤,它都能全部匯編完,并能形成列表文件及目標文件,以供用戶修改錯誤。
4.可以接收漢字注釋,并能完整的將漢字注釋復制到列表文件,而其它一些匯編軟件則不能處理漢字,或會使列表文件中的漢字注釋混亂。
運行MASM51軟件的條件很低,現(xiàn)在的PC機都能達到。
第二節(jié) 如何啟動MASM51宏匯編程序
一、啟動和退出
MASM51軟件有兩個文件:MASM51.EXE和MASM51.OVL,只要將這兩個文件拷入硬盤的一個目錄中(如MASM51)中,然后在DOS命令行中打入:
MASM51(回車)
即在顯示器上顯示如下信息:
The Cybernetic Micro Systems
CYS-8051 Software Package
Version 3.03`
for the IBM Personal Computer
(C)Copy right Cybrenetic MIcro Systems,Inc 1983,1984,1985,
1986
High Level Language Commands
ASM51[file] P8751 file P8744 file//
P27XX file COMP[file] READ[kbytes] DISP[start,num]
INITIALIZE CLEAR LIST EXIT
RUN[file] GOTO Label STOP CONT
DIR[spec] TYPE file DOS cmd HELP
PRINT arglist EQU = WARBLE
DELAY[secs] CLS HLSEARCH flag BEEP
OFFSET pc[,loc] PROM type SECURE SAVE file[,start,num]
LOAD file EDBYTE pc PVOLT value PSETUP num,value
>
信息的出現(xiàn)說明已進入MASM51宏匯編程序,在屏幕下方出現(xiàn)的符號‘〉’是宏匯編程序提示符,它的出現(xiàn)告訴用戶,宏匯編程序處于接收命令狀態(tài)。
雖然屏幕上提供了很多的命令,但大部份命令要在相應的硬件配合下才能實現(xiàn)。當用來匯編源程序時,使用的主要命令是:
ASM51 盤號:文件名 〈回車〉 進行匯編
DIR 盤號:文件名 〈回車〉 顯示目錄
EXIT 〈回車〉 退出宏匯編
-
- 二、進行匯編
用戶在使用宏匯編程序之前,應該已使用編緝器(如EDIT、CCED等)編好了8051匯編語言的源程序,并已作為一個文件存盤,該文件一般以.ASM為擴展名。
進入MASM51后,鍵入
ASM51 [d:filename[.asm] [選項]
如果省略擴展名,則系統(tǒng)默認為.asm,如果不以.asm為擴展名,則應鍵入文件的全名。匯編后,將產(chǎn)生兩個輸出文件:一個是16進制代碼文件,以.hex為擴展名,另一個是列表文件,以.lst為擴展名,文件名與輸入文件的文件名相同。
在匯編時,可以加入一些選項進行控制,可加的選項如下:
1./L選項:只在屏幕上顯示列表文件的內容,不生成列表文件。
2./H選項:匯編后不在磁盤上產(chǎn)生.hex文件。
3./S選項:產(chǎn)生的列表文件中將不包括符號表。
4./P選項:匯編程序序所生成的符號表將成為能被其他源程序引用的永久符號表的一部份,即如果不退出宏匯編,該符號表將保留在內存中,在匯編其它源程序時可以引用它們,以便連接幾個源文件。
5./N選項:使生成的列表文件在打。ɑ蝻@示)時不分頁。不加'/N'則每隔55行源代碼生成一個新頁頭。
一般情況下,我們不需要在命令后面加任何選項。
如下面所示:
ASM51 Filename[.asm] [回車]即可
下面列出DEMO51.ASM的源文件,及用MASM51匯編后產(chǎn)生的代碼文件和列表文件,以供參考。
T0_flag bit 0
T1_flag bit 1
INIT_Timer0 equ 0FE80H
INIT_Timer1 equ 0FD00H
X0_vector equ 0003H
X1_vector equ 0013H
T0_vector equ 000BH
T1_vector equ 001BH
S0_vector equ 0023H
INIT: AJMP SETUP
;Interrept Jump Table
ORG X0_vector
INT_0: SETB P3.2
RETI ;int0 interrupt
ORG T0_vector
T0INT: ACALL TIM0 ;timer0 interrupt
RETI
ORG X1_vector
INT_1: SETB P3.3
RETI ;int1 interrupt
ORG T1_vector
T1INT: ACALL TIM1 ;timer1 interrupt
RETI
ORG S0_vector
AJMP SERIAL ;UART interrupt
DB 'This is demo program for MCS-51TM'
SETUP: MOV SP,#5FH ;set sp point
MOV TMOD,#11H ;set timer mode
MOV TH0,#HIGH(INIT_Timer0)
MOV TL0,#LOW(INIT_Timer0)
MOV TH1,#HIGH(INIT_Timer1)
MOV TL1,#LOW(INIT_Timer1)
SETB EX0
SETB PX0
SETB EX1
CLR PX1
SETB PT1
SETB ET0
SETB ET1
SETB TR0
SETB TR1
SETB ES
MOV SCON,#99H
SETB EA ;enable interrupt
WAIT: NOP
AJMP WAIT ;wait
SERIAL: NOP ;serial interrupt process
CLR RI
RETI
TIM0: CLR TR0 ;timer0 interrupt process
CPL T0_flag
MOV TL0,#LOW(INIT_Timer0)
MOV A,#HIGH(INIT_Timer0)
MOV TH0,A
SETB TR0
CLR P3.3
RET
TIM1: CLR TR1 ;timer1 interrupt process
CPL T1_flag
MOV TL1,#LOW(INIT_Timer1)
MOV A,#HIGH(INIT_Timer1)
MOV TH1,A
SETB TR1
CLR P3.2
RET
END
;********************************************************
;DEMO51.ASM FILE END
;********************************************************
以上是DEMO51.ASM源程序文件。
The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1
08-25-96
0000 = T0_flag bit 0
0001 = T1_flag bit 1
FE80 = INIT_Timer0 equ 0FE80H
FD00 = INIT_Timer1 equ 0FD00H
0003 = X0_vector equ 0003H
0013 = X1_vector equ 0013H
000B = T0_vector equ 000BH
001B = T1_vector equ 001BH
0023 = S0_vector equ 0023H
0000 0146 INIT: AJMP SETUP
;Interrept Jump Table
0003 ORG X0_vector
0003 D2B2 INT_0: SETB P3.2
0005 32 RETI ;int0 interrupt
000B ORG T0_vector
000B 1178 T0INT: ACALL TIM0 ;timer0 interrupt
000D 32 RETI
0013 ORG X1_vector
0013 D2B3 INT_1: SETB P3.3
0015 32 RETI ;int1 interrupt
001B ORG T1_vector
001B 1188 T1INT: ACALL TIM1 ;timer1 interrupt
001D 32 RETI
0023 ORG S0_vector
0023 0174 AJMP SERIAL ;UART interrupt
0025 54 68 69 DB 'This is demo program for MCS-51TM'
0028 73 20 69 73 20 64 65 6D 6F 20
0032 70 72 6F 67 72 61 6D 20 66 6F
003C 72 20 4D 43 53 2D 35 31 54 4D
0046 75815F SETUP: MOV SP,#5FH ;set sp point
0049 758911 MOV TMOD,#11H ;set timer mode
004C 758CFE MOV TH0,#HIGH(INIT_Timer0)
004F 758A80 MOV TL0,#LOW(INIT_Timer0)
0052 758DFD MOV TH1,#HIGH(INIT_Timer1)
0055 758B00 MOV TL1,#LOW(INIT_Timer1)
0058 D2A8 SETB EX0
005A D2B8 SETB PX0
005C D2AA SETB EX1
005E C2BA CLR PX1
0060 D2BB SETB PT1
0062 D2A9 SETB ET0
0064 D2AB SETB ET1
0066 D28C SETB TR0
0068 D28E SETB TR1
006A D2AC SETB ES
006C 759899 MOV SCON,#99H
The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 2
08-25-96
006F D2AF SETB EA ;enable interrupt
0071 00 WAIT: NOP
0072 0171 AJMP WAIT ;wait
0074 00 SERIAL: NOP ;serial interrupt process
0075 C298 CLR RI
0077 32 RETI
0078 C28C TIM0: CLR TR0 ;timer0 interrupt process
007A B200 CPL T0_flag
007C 758A80 MOV TL0,#LOW(INIT_Timer0)
007F 74FE MOV A,#HIGH(INIT_Timer0)
0081 F58C MOV TH0,A
0083 D28C SETB TR0
0085 C2B3 CLR P3.3
0087 22 RET
0088 C28E TIM1: CLR TR1 ;timer1 interrupt process
008A B201 CPL T1_flag
008C 758B00 MOV TL1,#LOW(INIT_Timer1)
008F 74FD MOV A,#HIGH(INIT_Timer1)
0091 F58D MOV TH1,A
0093 D28E SETB TR1
0095 C2B2 CLR P3.2
0097 22 RET
0000 END
The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 3
08-25-96
;%T Symbol Name Type Value
INIT. . . . . . . . . . . . . . L 0000
INIT_TIMER0 . . . . . . . . . . I FE80
INIT_TIMER1 . . . . . . . . . . I FD00
INT_0 . . . . . . . . . . . . . L 0003
INT_1 . . . . . . . . . . . . . L 0013
S0_VECTOR . . . . . . . . . . . I 0023
SERIAL. . . . . . . . . . . . . L 0074
SETUP . . . . . . . . . . . . . L 0046
T0INT . . . . . . . . . . . . . L 000B
T0_FLAG . . . . . . . . . . . . B 0000
T0_VECTOR . . . . . . . . . . . I 000B
T1INT . . . . . . . . . . . . . L 001B
T1_FLAG . . . . . . . . . . . . B 0001
T1_VECTOR . . . . . . . . . . . I 001B
TIM0. . . . . . . . . . . . . . L 0078
TIM1. . . . . . . . . . . . . . L 0088
WAIT. . . . . . . . . . . . . . L 0071
X0_VECTOR . . . . . . . . . . . I 0003
X1_VECTOR . . . . . . . . . . . I 0013
;%Z
00 Errors (0000)
以上是DEMO51.LST文件。
:020000000146B7
:03000300D2B23244
:03000B0011783237
:03001300D2B33233
:03001B0011883217
:0D0023000174546869732069732064656D71
:100030006F2070726F6772616D20666F72204D4322
:10004000532D3531544D75815F758911758CFE7551
:100050008A80758DFD758B00D2A8D2B8D2AAC2BA9B
:10006000D2BBD2A9D2ABD28CD28ED2AC759899D257
:10007000AF00017100C29832C28CB200758A8074E0
:10008000FEF58CD28CC2B322C28EB201758B007485
:08009000FDF58DD28EC2B222F3
以上是DEMO51.HEX文件。