簡要:
??? 單片機編程語言編寫程序,即可使用單片機C語言編程,也可以使用單片機匯編語言。C語言編程具有模塊化管理特性、可移植性高,適合編寫較大的程序。但作為單片機高級程序設計,許多高級單片機ARM、很多新產(chǎn)品的單片機也是先需要經(jīng)過匯編語言編譯器之后才有C語言編輯器的。所以學好單片機匯編語言也是很重要的編程語言課程。
??? 此外,單片機有通用型和專用型之分。專用型是廠家為固定程序專門開發(fā)的一種單片機,其程序在研發(fā)時已經(jīng)寫入,后期不可以修改。通用型單片機則是我們可以平常自主學習與編織程序的單片機,其程序需要自己寫入,可以更改。單片機根據(jù)其基本操作處理位數(shù)不同,還可以分為:1位、4位、8位、16、32位單片機。
正文:
在此我們主要講解美國ATMEL公司的89C51單片機。
一、89C51單片機PDIP(雙列直插式)封裝引腳圖:
其引腳功能如下:
P0口(p0.0—p0.7):為雙向三態(tài)口,可以作為輸入/輸出口。但在實際應用中通常作為地址/數(shù)據(jù)總線口,即為低8位地址/數(shù)據(jù)總線分時復用。低8位地址在ALE信號的負跳變鎖存到外部地址鎖存器中,而高8位地址由P2口輸出。
P1口(p1.0—p1.7):其每一位都能作為可編程的輸入或輸出線。
P2口(p2.0—p2.7):每一位也都可作為輸入或輸出線用,當擴展系統(tǒng)外設時,可作為擴展系統(tǒng)的地址總線高8位,與P0口一起組成16位地址總線。對89c51單片機來說,P2口一般只作為地址總線使用,而不作為I/O線直接與外設相連。
P3口(p3.0—p3.7):其為雙功能口,作為第一功能使用時,其功能與P1口相同。當作為第二功能使用時,每一位功能如下表所示。
P3口第二功能
?
Rst\Vpd:上電復位端和掉電保護端。
XTAL1(xtal2):外接晶振一腳,分別接晶振的一端。
Gnd:電源地。
Vcc:電源正級,接+5V。
PROG\ALE:地址鎖存控制端
PSEN:片外程序存儲器讀選通信號輸出端,低電平有效。
EA\vpp:訪問外部程序儲存器控制信號,低電平有效。當EA為高電平時訪問片內(nèi)存儲器,若超出范圍則自動訪問外部程序存儲器。當EA為低電平時只訪問外部程序存儲器。
二.? 常用指令及其格式介紹:
1、指令格式:
?? [標號:]操作碼 ?[?目的操作數(shù)][,操作源][;注釋]
?? 例如:LOOP:ADD ??A,#0FFH????;(A)←(A)+FFH
2、常用符號:
?? Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。
?? rel:相對地址、地址偏移量,主要用于無條件相對短轉移指令和條件轉移指令。
?? #data:包含于指令中的8位立即數(shù)。
?? #data16:包含于指令中的16位立即數(shù)。
?? addr16:16位目的地址。
?? direct:直接尋址的地址。
?? bit:內(nèi)部數(shù)據(jù)存儲器RAM和特殊功能寄存器SFR中的可直接尋址位地址。
?? @:間接尋址寄存器或基地址寄存器的前綴。
? (X):表示X中的內(nèi)容。
? ((X)):表示由X尋址的單元中的內(nèi)容,也就是(X)作地址,該地址的內(nèi)容用((X))表示。
3、常用偽指令:
?? ORG:規(guī)定目標程序段或數(shù)據(jù)塊的起始地址。????格式:ORG+空格+地址 ???例如:ORG ?0000H ?
?? END:結束指令,放在程序的末尾,單獨使用,一段程序只用一次。
?? DB(定義字節(jié)):從指定地址單元開始,定義若干字節(jié)存儲單元并賦初始值。
4、常用尋址方式:
???直接尋址:?MOV ???A,30H
???立即數(shù)尋址:MOV ???A,#20H
???寄存器間接尋址:MOV ??A,@Ri(i=1,2)
???基址加變址寄存器尋址:MOV ??A,@A+DPTR
???寄存器尋址:MOV ???A,Rn(n=0—7)
5、指令大集合:
傳送類指令:
傳送類指令:
邏輯操作類指令:
控制轉移類指令:
位操作類指令:
三、一般常用程序模式:
1、開始程序:ORG ??0000H
?????????????JMP ???0030H
?????????????ORG ??0030H
?????????????…
?????????????…
2、軟件延時子程序:YANSHI: ?MOV ??R7,#25
????????????????????????D1: ?MOV ??R6,#50
????????????????????????D2: ?MOV ??R5,#200
?????????????????????????????DJNZ ??R5,$
?????????????????????????????DJNZ ??R6,D2
?????????????????????????????DJNZ ??R7,D1
?????????????????????????????RET
若12M晶振則延時時長約為:25×50×200×2×10-6s,若為6M晶振則延時時長為:25×50×200×2×2×10-6s
3、硬件延時子程序:(1)查詢方式:
?????????????????????YANSHI: ?MOV ?TMOD,#01H
???????????????????????????????MOV ??R0,#20
????????????????????????UP:????MOV ?TH0,#3CH
???????????????????????????????MOV ?TL0,#0B0H
???????????????????????????????SETB ?TR0
???????????????????????????????JNB ???TF0,$
???????????????????????????????CLR ??TF0
???????????????????????????????DJNZ ?R0,UP
???????????????????????????????RET
此延時程序為20(R0)×50ms,即為一秒,若需要更長的延時只需要改變R0的值。
4、一級中斷程序:外部定時器0中斷
????????????????????????????????????ORG ??0000H
????????????????????????????????????JMP ???002CH
????????????????????????????????????ORG ??0003H
????????????????????????????????????JMP ???ZHONGDUAN
????????????????????????????????????ORG ??002CH
?????????????????????????????MAIN: ?MOV ??TCON,#01H
????????????????????????????????????MOV ??IP,#01H
????????????????????????????????????MOV ???IE,#81H
????????????????????????????????????…
????????????????????????????????????…
?????????????????????????ZHONGDUAN: PUSH ?A
????????????????????????????????????PUSH ?PSW
????????????????????????????????????SETB ?RS0
????????????????????????????????????CLR ??RS1
????????????????????????????????????…
????????????????????????????????????…
????????????????????????????????????POP ?PSW
????????????????????????????????????POP ?A
????????????????????????????????????RETI
若不需要對主程序的值進行保護則中斷的子程序只需直接載入中斷主程序需要執(zhí)行的子程序便可。
??? 單片機編程語言編寫程序,即可使用單片機C語言編程,也可以使用單片機匯編語言。C語言編程具有模塊化管理特性、可移植性高,適合編寫較大的程序。但作為單片機高級程序設計,許多高級單片機ARM、很多新產(chǎn)品的單片機也是先需要經(jīng)過匯編語言編譯器之后才有C語言編輯器的。所以學好單片機匯編語言也是很重要的編程語言課程。
??? 此外,單片機有通用型和專用型之分。專用型是廠家為固定程序專門開發(fā)的一種單片機,其程序在研發(fā)時已經(jīng)寫入,后期不可以修改。通用型單片機則是我們可以平常自主學習與編織程序的單片機,其程序需要自己寫入,可以更改。單片機根據(jù)其基本操作處理位數(shù)不同,還可以分為:1位、4位、8位、16、32位單片機。
正文:
在此我們主要講解美國ATMEL公司的89C51單片機。
一、89C51單片機PDIP(雙列直插式)封裝引腳圖:
其引腳功能如下:
P0口(p0.0—p0.7):為雙向三態(tài)口,可以作為輸入/輸出口。但在實際應用中通常作為地址/數(shù)據(jù)總線口,即為低8位地址/數(shù)據(jù)總線分時復用。低8位地址在ALE信號的負跳變鎖存到外部地址鎖存器中,而高8位地址由P2口輸出。
P1口(p1.0—p1.7):其每一位都能作為可編程的輸入或輸出線。
P2口(p2.0—p2.7):每一位也都可作為輸入或輸出線用,當擴展系統(tǒng)外設時,可作為擴展系統(tǒng)的地址總線高8位,與P0口一起組成16位地址總線。對89c51單片機來說,P2口一般只作為地址總線使用,而不作為I/O線直接與外設相連。
P3口(p3.0—p3.7):其為雙功能口,作為第一功能使用時,其功能與P1口相同。當作為第二功能使用時,每一位功能如下表所示。
P3口第二功能
?
XTAL1(xtal2):外接晶振一腳,分別接晶振的一端。
Gnd:電源地。
Vcc:電源正級,接+5V。
PROG\ALE:地址鎖存控制端
PSEN:片外程序存儲器讀選通信號輸出端,低電平有效。
EA\vpp:訪問外部程序儲存器控制信號,低電平有效。當EA為高電平時訪問片內(nèi)存儲器,若超出范圍則自動訪問外部程序存儲器。當EA為低電平時只訪問外部程序存儲器。
二.? 常用指令及其格式介紹:
1、指令格式:
?? [標號:]操作碼 ?[?目的操作數(shù)][,操作源][;注釋]
?? 例如:LOOP:ADD ??A,#0FFH????;(A)←(A)+FFH
2、常用符號:
?? Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。
?? rel:相對地址、地址偏移量,主要用于無條件相對短轉移指令和條件轉移指令。
?? #data:包含于指令中的8位立即數(shù)。
?? #data16:包含于指令中的16位立即數(shù)。
?? addr16:16位目的地址。
?? direct:直接尋址的地址。
?? bit:內(nèi)部數(shù)據(jù)存儲器RAM和特殊功能寄存器SFR中的可直接尋址位地址。
?? @:間接尋址寄存器或基地址寄存器的前綴。
? (X):表示X中的內(nèi)容。
? ((X)):表示由X尋址的單元中的內(nèi)容,也就是(X)作地址,該地址的內(nèi)容用((X))表示。
3、常用偽指令:
?? ORG:規(guī)定目標程序段或數(shù)據(jù)塊的起始地址。????格式:ORG+空格+地址 ???例如:ORG ?0000H ?
?? END:結束指令,放在程序的末尾,單獨使用,一段程序只用一次。
?? DB(定義字節(jié)):從指定地址單元開始,定義若干字節(jié)存儲單元并賦初始值。
4、常用尋址方式:
???直接尋址:?MOV ???A,30H
???立即數(shù)尋址:MOV ???A,#20H
???寄存器間接尋址:MOV ??A,@Ri(i=1,2)
???基址加變址寄存器尋址:MOV ??A,@A+DPTR
???寄存器尋址:MOV ???A,Rn(n=0—7)
5、指令大集合:
傳送類指令:
傳送類指令:
邏輯操作類指令:
控制轉移類指令:
位操作類指令:
三、一般常用程序模式:
1、開始程序:ORG ??0000H
?????????????JMP ???0030H
?????????????ORG ??0030H
?????????????…
?????????????…
2、軟件延時子程序:YANSHI: ?MOV ??R7,#25
????????????????????????D1: ?MOV ??R6,#50
????????????????????????D2: ?MOV ??R5,#200
?????????????????????????????DJNZ ??R5,$
?????????????????????????????DJNZ ??R6,D2
?????????????????????????????DJNZ ??R7,D1
?????????????????????????????RET
若12M晶振則延時時長約為:25×50×200×2×10-6s,若為6M晶振則延時時長為:25×50×200×2×2×10-6s
3、硬件延時子程序:(1)查詢方式:
?????????????????????YANSHI: ?MOV ?TMOD,#01H
???????????????????????????????MOV ??R0,#20
????????????????????????UP:????MOV ?TH0,#3CH
???????????????????????????????MOV ?TL0,#0B0H
???????????????????????????????SETB ?TR0
???????????????????????????????JNB ???TF0,$
???????????????????????????????CLR ??TF0
???????????????????????????????DJNZ ?R0,UP
???????????????????????????????RET
此延時程序為20(R0)×50ms,即為一秒,若需要更長的延時只需要改變R0的值。
4、一級中斷程序:外部定時器0中斷
????????????????????????????????????ORG ??0000H
????????????????????????????????????JMP ???002CH
????????????????????????????????????ORG ??0003H
????????????????????????????????????JMP ???ZHONGDUAN
????????????????????????????????????ORG ??002CH
?????????????????????????????MAIN: ?MOV ??TCON,#01H
????????????????????????????????????MOV ??IP,#01H
????????????????????????????????????MOV ???IE,#81H
????????????????????????????????????…
????????????????????????????????????…
?????????????????????????ZHONGDUAN: PUSH ?A
????????????????????????????????????PUSH ?PSW
????????????????????????????????????SETB ?RS0
????????????????????????????????????CLR ??RS1
????????????????????????????????????…
????????????????????????????????????…
????????????????????????????????????POP ?PSW
????????????????????????????????????POP ?A
????????????????????????????????????RETI
若不需要對主程序的值進行保護則中斷的子程序只需直接載入中斷主程序需要執(zhí)行的子程序便可。
評論
查看更多