<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

淺談PIC單片機程序設計

作者: 時(shí)間:2012-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏

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

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

二、動(dòng)作標志位的使用
在整個(gè)控制中,組合的動(dòng)作很多,當所有動(dòng)作定位都通過(guò)光電開(kāi)關(guān)控制時(shí),在程序編寫(xiě)上就有一些問(wèn)題。如要求左手上升到鼓掌位、右手上升到舉手位(手初始位置在最下的放下位),光電開(kāi)關(guān)0有效(即為0時(shí)是擋住),到達正確位置。用簡(jiǎn)單的理解可以寫(xiě)成下面的程序:
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表示光電開(kāi)關(guān),由此判斷是否到相應的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高舉手位置。上面程序描寫(xiě)左手臂上升到舉手位置和右手臂上升到鼓掌位置并停止的過(guò)程。先判斷左手到達否,到達則左手停止,接著(zhù)看右手是否到達舉手位,到達則停止,否則循環(huán)上述的檢測,直到左手到達鼓掌位,右手到達舉手位。
注意,這里的3,4表示的就是鼓掌位、舉手位。經(jīng)過(guò)循環(huán)檢測可以讓手臂停在各位上,然而機械動(dòng)作是有慣性的,機械停止位可能在該位的上一點(diǎn)或下一點(diǎn),這就影響下面動(dòng)作的進(jìn)行,可能在若干動(dòng)作后機械動(dòng)作出現失常,也就是程序沒(méi)法正常地運行。在此情況下,需要修改程序的編寫(xiě)方式,采用標志位來(lái)控制動(dòng)作的進(jìn)行。如果采用控制標志位,一定要在動(dòng)作子函數中對標志位置零。

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

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

光電開(kāi)關(guān)相關(guān)文章:光電開(kāi)關(guān)原理


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>