<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 淺談PIC單片機程序設計

          淺談PIC單片機程序設計

          作者: 時間:2012-11-27 來源:網絡 收藏

          美國微芯公司開發(fā)的CMOS工藝PIC系列單片機,特別是采用內置第二代Flash存儲器的微控制器在快速應用方面具有獨到之處。系列內大都包含運算器、存儲器、A/D、PWM、輸入和輸出I/O、通信等常用接口。自由靈活的定義功能可以適應不同的控制要求。
          采用精簡指令集,例如對于PIC16F716單片機,只有35條單字節(jié)指令。要用這么少的指令實現復雜的控制或計算,顯然要在上多做文章,以下就需要注意的問題談一些看法。

          一、區(qū)分指令的大小寫
          編寫的源程序,除了源程序的開始處需要嚴格的列表指令外,還須注意源程序中字母符號的大小寫規(guī)則,否則在PC機上匯編程序時不會成功。在源程序中都會使用偽指令INCLUDE。這條指令將列表中指定的單片機文件(在MPLAB中)瀆入源程序作為源程序的一部分,所以凡是MPLAB中有關該單片機已有的寄存器在源程序中無須再用賦值指令(EQU)賦值,這就使所建立的源程序大為簡化。
          此外,由于有了偽指令INCLUDE,所以根據MPLAB軟件中的格式,在源程序中的操作數凡是涉及MPLAB已規(guī)定的寄存器名稱的,其字母一律只能大寫,不能小寫。其余操作碼、符號字母可任意大小寫,但0x中的X應小寫。否則匯編不會成功。鑒于上述原因,為了書寫方便,在使用MPLAB軟件時,PIC單片機的源程序均用大寫字母為宜(0x例外)。
          以下舉例有關機器人控制的實現??刂撇糠植捎肞IC16F7X系列單片機,運用匯編語言編程,運行速度較快,能夠達到系統(tǒng)的要求。

          二、動作標志位的使用
          在整個控制中,組合的動作很多,當所有動作定位都通過光電開關控制時,在程序編寫上就有一些問題。如要求左手上升到鼓掌位、右手上升到舉手位(手初始位置在最下的放下位),光電開關0有效(即為0時是擋住),到達正確位置。用簡單的理解可以寫成下面的程序:
          list P=16c73
          call lefthandup
          call righthandup
          L0 call readinsignal
          bdss csl_v,lefthandligbts
          call lefthandstop
          bfsc csl_v,righthandlight4
          goto L0
          call righthandstop
          L1 call readinsignal
          bfsc csl_v,lefthandlight3
          goto L1
          call lefthandstop
          lefthandlight表示光電開關,由此判斷是否到相應的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高舉手位置。上面程序描寫左手臂上升到舉手位置和右手臂上升到鼓掌位置并停止的過程。先判斷左手到達否,到達則左手停止,接著看右手是否到達舉手位,到達則停止,否則循環(huán)上述的檢測,直到左手到達鼓掌位,右手到達舉手位。
          注意,這里的3,4表示的就是鼓掌位、舉手位。經過循環(huán)檢測可以讓手臂停在各位上,然而機械動作是有慣性的,機械停止位可能在該位的上一點或下一點,這就影響下面動作的進行,可能在若干動作后機械動作出現失常,也就是程序沒法正常地運行。在此情況下,需要修改程序的編寫方式,采用標志位來控制動作的進行。如果采用控制標志位,一定要在動作子函數中對標志位置零。

          三、區(qū)分GOTO和CALL指令的使用場合
          在PIC的匯編程序中,CALL與GOTO指令的使用比較多、且容易混淆,一般情況下,在于程序與主程序之間大多用CALL指令;而狀態(tài)轉換模塊之間大多用GOTO指令,即由此狀態(tài)進入另一種狀態(tài)不需返回。由于PIC單片機的堆棧有限,在程序中,不能無止境地使用GOTO語句,否則會使堆棧溢出,程序無法正常運行。各個小程序內部循環(huán)占用堆棧的級數不多,使用GOTO指令是可行的,但在大的程序中用GOTO則無法返回到調用前程序的下一條指令。CALL指令完成調用完子程序后返回到調用前的程序。如在超聲檢測中程序如下:
          list D=16c76
          start:call setcpu
          call automaflsmstate1
          L3 call readinsignal
          bfsc es2_v,ultrasonicdetect1
          goto L3
          goto automatlsmstate2:
          automatlsmstate2:
          return
          automafismstate1、automatlsmstate2表示兩種狀態(tài),ultrasonicdetect1表示一個輸入超聲檢測信號。上面程序描寫調用automatlstmstatei狀態(tài),執(zhí)行完后進行下面的檢測uhrasonicdetect1,沒有觸發(fā)就一直循環(huán)檢測,觸發(fā)就進入automatlsmstate2狀態(tài),執(zhí)行完也不再回到下面的程序。
          由于PIC單片機的堆棧有限,在程序中不能無止境地使用GOTO指令,否則會使堆棧溢出,程序無法正常運行。但是在有些時候,例如當程序出現分支時,則不得不使用GOTO指令。對于PIC16F7X系列單片機,程序出現分支時只能通過STATUS寄存器的z位或c位進行判斷。這時在兩種情況的前一種情況下,必須使用GOTO指令進行轉移;否則在執(zhí)行完第一種情況后,緊接著又執(zhí)行第二種情況。因此,在使用匯編語言進行時,應該將程序分解成一級級的子程序;然后在程序之間進行調用,盡量將GOTO指令跳轉的范圍縮小。

          四、注意Z、C的不同使用情況
          在進行判斷標志位時,Z(零標志)、C(借位標志)是不同的。Z為1時,表示上面的結果為0,Z為0時,則結果不為0。C為1時,借位,C為0時,沒有借位。在使用定時器的時候,一般使用C標志位,這是由于當完成某一動作去檢查定時器時,時間可能沒到,或是正好,或是已經超過時間,只要到了或超過時間,都要按照要求關閉定時器,如下面程序所述。如果用Z標志位,等于0時可能沒有檢測到,無法判斷停止的狀態(tài),而用Z可以很好地控制時間定時。進行一般的計算時大多用Z,如前面的動作標志位中就是如此使用的。
          list D=16c76
          call openfimer0
          L4 movlw d'30'
          subwf t0_v2,W
          bfsc status,c
          goto L4
          call dosetimer0
          程序檢測時間是否到達1.5s,沒有則循環(huán)等待,到了或檢測時間過了就關閉定時器,執(zhí)行下面的程序。
          總之,在PIC單片機的編程中采用合適的方法,可以使整個程序運行穩(wěn)定,而且程序空間的使用也將有所減小,避免了調試中的Bug。

          光電開關相關文章:光電開關原理


          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();