新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(一)

單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(一)

作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏

  

  圖7 數(shù)據(jù)輸出程序流程圖

  5.2 部分程序清單

  (1) 輸入數(shù)據(jù)程序清單

  ORG 0000H

  JMP START

  ORG 0003H

  JMP RESEVE

  START: MOV TCON,#0 ;設(shè)置中斷INT0

  MOV TMOD,#11H

  CALL SZSRDK ;設(shè)置輸入端口

  MOV IE,#81H

  MOV IP,#1 ;開中斷

  。.

  。.

  。.

  RESEVE: CLR EA ;開中斷

  PUSH PSW

  PUSH DPH

  PUSH DPL

  RESEV1: JB ZDQQ,RESEV1

  ;判ZDQQ是否為低

  MOV DPTR,#ADDR0

  ;為U5(輸入數(shù)據(jù)端口)的地址

  MOVX A, @DPTR

  。.

  。.

  CALL SZSRDK

  POP DPL

  POP DPH

  POP PSW

  SETB EA

  RETI

  SZSRDK: CLRN EQU 2CH.0

  CLR CLRN ;

  MOV DPTR,#ADDR1

  ;為U1的地址

  MOV A,2CH

  MOVX @DPTR,A

  SETB CLRN

  MOV A,2CH

  MOV DPTR,#ADDR1

  MOVX @DPTR,A

  RET

 ?。?) 輸出數(shù)據(jù)程序清單

  SEND: MOV DPTR,#ADDR3

  MOVX A,@DPTR

  JB ACC.0,SEND

  ;為U3的Q端輸出

  MOV DPTR,#ADDR4

  ;為U4(輸出端口)的地址

  MOVX @DPTR,A

  CALL SZSCDK

  RET

  SZSCDK: PRN EQU 2CH.1

  SETB PRN

  MOV DPTR,#ADDR1

  ;為U1的地址

  MOV A,2CH

  MOVX @DPTR,A

  CLR PRN

  MOV DPTR,#ADDR1

  MOV A,2CH

  MOVX @DPTR,A

  RET

  6 結(jié)束語

  設(shè)計中采用了AT1504AS器件,該器件實現(xiàn)了硬件設(shè)計軟件化,方便了硬件設(shè)計,縮短了設(shè)計周期,降低了設(shè)計成本,應(yīng)用也十分方便,該系統(tǒng)經(jīng)過采取以上措施后,以達(dá)到最初的設(shè)計要求?,F(xiàn)產(chǎn)品已投放市場,市場的反映良好。

四、PIC單片機(jī)軟件開發(fā)技巧

  項目是有關(guān)機(jī)器人控制的實現(xiàn)。控制部分采用PIC16F7X系列單片機(jī),運用匯編語言編程,運行速度較快,能夠達(dá)到系統(tǒng)的要求。

  在這里使用的大多是數(shù)字信號的控制,電機(jī)的控制只有開和合兩種狀態(tài)。在動作的過程中需要兩只手臂、身體、頭部、腳部等的協(xié)調(diào)動作。整個控制系統(tǒng)比較復(fù)雜,因而在PIC程序編寫和空間分配方面需要注意一些問題。

  1 動作標(biāo)志位的使用

  在整個控制中,組合的動作很多,當(dāng)所有動作定位都通過光電開關(guān)控制時,在程序編寫上就有一些問題。如要求左手上升到鼓掌位、右手上升到舉手位(手初始位置在最下的放下位),光電開關(guān)0有效(即為0時是擋?。?,到達(dá)正確位置。用簡單的理解可以寫成下面的程序:

  list P=16c73

  call lefthandup

  call righthandup

  LO call readinsignal

  bdss csl_v,1efthandligbts

  call lefthandstop

  btfsc csl_v,righthandlight4

  goto L0

  call righthandstop

  L1 call readinsignal

  btfsc csl_v,lefthandlight3

  goto L1

  call lefthandstop

  :

  lefthandlight表示光電開關(guān),由此判斷是否到相應(yīng)的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高舉手位置。上面程序描寫左手臂上升到舉手位置和右手臂上升到鼓掌位置并停止的過程。先判斷左手到達(dá)否,到達(dá)則左手停止,接著看右手是否到達(dá)舉手位,到達(dá)則停止,否則循環(huán)上述的檢測,直到左手到達(dá)鼓掌位,右手到達(dá)舉手位。

  注意,這里的3,4表示的就是鼓掌位,舉手位。經(jīng)過循環(huán)檢測可以讓手臂停在各位上,然而機(jī)械動作是有慣性的,機(jī)械停止位可能在該位的上一點或下一點,這就影響下面動作的進(jìn)行,可能在若干動作后機(jī)械動作出現(xiàn)失常,也就是程序沒法正常的運行。在此情況下,需要修改程序的編寫方式,采用標(biāo)志位來控制動作的進(jìn)行。如果采用控制標(biāo)志位,一定要在動作子函數(shù)中對標(biāo)志位置零。程序如下:

  list p=16c73

 ?。?p>  actlonstopflag equ Ox6e ;位定義

  lefthandfla8 cqu 0x0 ;0表示停止左手動作

  rightbandflag equ Oxl ;O表示停止右手動作

 ?。?p>  movlw Ox03

  movWf actionstopflag

  call lefthanduo

  call righthandup

  L2 call readinsignal

  btfss csl_v,lefthandhght3

  call lefthatldotop

  btfss csl_v,righthandlight4

  call righthandstop

  movlw Ox00

  subwf actionstopflag,w

  btfss status,z

  goto L2

  繼續(xù)下面的程序

  actionstopflag表示動作標(biāo)志位參數(shù),給動作標(biāo)志位賦值,動作停止函數(shù)中將清零標(biāo)志位的值。上述程序和前面所述程序的功能一樣,實現(xiàn)兩支手臂的動作。上面程序描寫左手是否到達(dá)鼓掌位,到達(dá)停止,右手是否到達(dá)舉手位,到達(dá)停止??磩幼鳂?biāo)志位是否為零,不是,不斷地循環(huán)檢測;是,執(zhí)行下面的程序。

  2 GOTO,cALL指令的不同使用

  在PIC的匯編程序中,CALL與GOT0指冷使用的場合不同。一般情況下,在于程序與主程序之間大多用CALL指令;而狀態(tài)轉(zhuǎn)換模塊之間大多用GOTO指令,即由此狀態(tài)進(jìn)入另一種狀態(tài)不需返回。由于PIC單片機(jī)的堆棧有限,在程序中,不能無止境地使用GOTO語句,這樣會使堆棧溢出,程序無法正常運行。各個小程序內(nèi)部循環(huán)占用堆棧的級數(shù)不多,使用GOTO指令是可行的,但在大的程序中用GOTO則無法返回到調(diào)用前程序的下一條指令。CALL指令完成調(diào)用完子程序后返回到調(diào)用前的程序。程序如下:

  list D=16c76

  start:ca11 setcpu

  call automatlsn、statel

  L3 call readinsignal

  btfsc cs2_v,ultrasonicdetectl

  goto L3

  goto autonatlsmstate2

 ?。?p>  automatlsmstate2:

  return

  auatomatismstatel、automatismstate2表示兩種狀態(tài),uhrasonicdetectl表示一個輸入超聲檢測信號。上面程序描寫調(diào)用automatistmstate1狀態(tài),執(zhí)行完后進(jìn)行下面的檢測ultrasonicdetect],沒有觸發(fā)就一直循環(huán)檢測,觸發(fā)就進(jìn)入autornatismstate2狀態(tài),執(zhí)行完也不再回到下面的程序。

  3 狀態(tài)標(biāo)志位Z、C的不同使用情況

  在進(jìn)行判斷標(biāo)志位時,Z(零標(biāo)志)、C(借位標(biāo)志)是不同的。Z為l時,表示上面的結(jié)果為0,Z為0時,則結(jié)果不為0。C為l時,借位,C為0時,沒有借位。在使用定時器的時候,一般使用C標(biāo)志位,這是由于當(dāng)完成某一動作去檢查定時器時,時間可能沒到,或是正好,或是已經(jīng)超過時間,只要到了或超過時間,都要按照要求關(guān)閉定時器,如下面程序所述。如果用Z標(biāo)志位,等于0時可能沒有檢測到,無法判斷停止的狀態(tài),而用z可以很好地控制時間定時。進(jìn)行一般的計算時大多用Z,如前面的動作標(biāo)志位中就是如此使用的。

  list D=16c76

  call opentimerO

  L4 movlw d’30’

  subwf t0_v2,W

  btfss status,c

  goto L4

  cau closetimer0

  程序檢測時間是否到達(dá)1.5s,沒有則循環(huán)等待,到了或檢測時間過了就關(guān)閉定時器,執(zhí)行下面的程序。

  總之,在PIC單片機(jī)的編程中采用合適的方法,可以使整個程序運行穩(wěn)定,而且程序空間的使用也將有所減小,避免了調(diào)試中的Bug。這是筆者在實際中的一點體會,還有許多不足或沒有考慮到的問題,希望在和大家的探討中不斷學(xué)習(xí)PIC單片機(jī)的精髓。


上一頁 1 2 3 下一頁

評論


技術(shù)專區(qū)

關(guān)閉