国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺談PIC單片機(jī)程序設(shè)計(jì)

2009-06-17 06:48梁凱淋
中國高新技術(shù)企業(yè) 2009年7期
關(guān)鍵詞:電氣控制程序設(shè)計(jì)

梁凱淋

摘要:PIC系列單片機(jī)具有指令集簡潔、速度高、功能強(qiáng)、功耗低、價(jià)格低廉、體積小巧、適用性好及抗干擾能力強(qiáng)等特點(diǎn),大量應(yīng)用于各種電氣控制、電機(jī)控制、工業(yè)控制儀表和儀表、通信、家電、玩具、低功耗的測控應(yīng)用等領(lǐng)域;在采用PIC單片機(jī)進(jìn)行設(shè)計(jì)過程中,應(yīng)注意到PIC單片機(jī)自身的特點(diǎn),可少走彎路,從而縮短開發(fā)周期。

關(guān)鍵詞:PIC單片機(jī);程序設(shè)計(jì); CM0S工藝;電氣控制

中圖分類號(hào):TP368文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-2374(2009)07-0018-02

美國微芯公司開發(fā)的CM0S工藝PIC系列單片機(jī),特別是采用內(nèi)置第二代Flash存儲(chǔ)器的微控制器在快速應(yīng)用方面具有獨(dú)到之處。PIC單片機(jī)系列內(nèi)大都包含運(yùn)算器、存儲(chǔ)器、A/D、PWM、輸入和輸出I/O、通信等常用接口。自由靈活的定義功能可以適應(yīng)不同的控制要求。

PIC單片機(jī)采用精簡指令集,例如對(duì)于PICl6F716單片機(jī),只有35條單字節(jié)指令。要用這么少的指令實(shí)現(xiàn)復(fù)雜

的控制或計(jì)算,顯然要在程序設(shè)計(jì)上多做文章,以下就程序設(shè)計(jì)需要注意的問題談一些看法。

一、區(qū)分指令的大小寫

編寫PIC單片機(jī)的源程序,除了源程序的開始處需要嚴(yán)格的列表指令外,還須注意源程序中字母符號(hào)的大小寫規(guī)則,否則在PC機(jī)上匯編程序時(shí)不會(huì)成功。在源程序中都會(huì)使用偽指令I(lǐng)NCLUDE。這條指令將列表中指定的單片機(jī)文件(在MPLAB中)讀入源程序作為源程序的一部分,所以凡是MPLAB中有關(guān)該單片機(jī)已有的寄存器在源程序中無須再用賦值指令(EQU)賦值,這就使所建立的源程序大為簡化。

此外,由于有了偽指令I(lǐng)NCLUDE,所以根據(jù)MPLAB軟件中的格式,在源程序中的操作數(shù)凡是涉及MPLAB已規(guī)定的寄存器名稱的,其字母一律只能大寫,不能小寫。其余操作碼、符號(hào)字母可任意大小寫,但0x中的x應(yīng)小寫。否則匯編不會(huì)成功。鑒于上述原因,為了書寫方便,在使用MPLAB軟件時(shí),PIC單片機(jī)的源程序均用大寫字母為宜(0x例外)。

以下舉例有關(guān)機(jī)器人控制的實(shí)現(xiàn)??刂撇糠植捎肞ICl6F7X系列單片機(jī),運(yùn)用匯編語言編程,運(yùn)行速度較快,

能夠達(dá)到系統(tǒng)的要求。

二、動(dòng)作標(biāo)志位的使用

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

list P=16c73

call lefthandup

call righthandup

L0call readinsignal

bdss csl_v,lefthandligbts

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ī)械動(dòng)作是有慣性的,機(jī)械停止位可能在該位的上一點(diǎn)或下一點(diǎn),這就影響下面動(dòng)作的進(jìn)行,可能在若干動(dòng)作后機(jī)械動(dòng)作出現(xiàn)失常,也就是程序沒法正常地運(yùn)行。在此情況下,需要修改程序的編寫方式,采用標(biāo)志位來控制動(dòng)作的進(jìn)行。如果采用控制標(biāo)志位,一定要在動(dòng)作子函數(shù)中對(duì)標(biāo)志位置零。

三、區(qū)分GOTO和CALL指令的使用場合

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

list D=16c76

start:call setcpu

call automatlsmstate1

L3 call readinsignal

btfsc cs2_v,ultrasonicdetect1

goto L3

goto automatlsmstate2 :

automatlsmstate2:

return

automatismstatel

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

由于PIC單片機(jī)的堆棧有限,在程序中不能無止境地使用GOTO指令,否則會(huì)使堆棧溢出,程序無法正常運(yùn)行。但是在有些時(shí)候,例如當(dāng)程序出現(xiàn)分支時(shí),則不得不使用GOTO指令。對(duì)于PICl6F7X系列單片機(jī),程序出現(xiàn)分支時(shí)只能通過STATUS寄存器的Z位或C位進(jìn)行判斷。這時(shí)在兩種情況的前一種情況下,必須使用GOTO指令進(jìn)行轉(zhuǎn)移;否則在執(zhí)行完第一種情況后,緊接著又執(zhí)行第二種情況。因此,在使用匯編語言進(jìn)行程序設(shè)計(jì)時(shí),應(yīng)該將程序分解成一級(jí)級(jí)的子程序;然后在程序之間進(jìn)行調(diào)用,盡量將GOTO指令跳轉(zhuǎn)的范圍縮小。

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

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

list D=16c76

call opentimer0

L4movlw d'30'

subwf t0_v2,W

btfsc status,c

goto L4

call closetimer0

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

總之,在PIC單片機(jī)的編程中采用合適的方法,可以使整個(gè)程序運(yùn)行穩(wěn)定,而且程序空間的使用也將有所減小,避免了調(diào)試中的Bug。

猜你喜歡
電氣控制程序設(shè)計(jì)
基于Visual Studio Code的C語言程序設(shè)計(jì)實(shí)踐教學(xué)探索
從細(xì)節(jié)入手,談PLC程序設(shè)計(jì)技巧
PLC控制變頻調(diào)速電梯電氣控制系統(tǒng)分析
對(duì)基于PLC技術(shù)的電氣控制技術(shù)的幾點(diǎn)探討
對(duì)基于PLC的電氣控制技術(shù)應(yīng)用的幾點(diǎn)探討
基于PLC技術(shù)的電氣控制應(yīng)用分析
高職高專院校C語言程序設(shè)計(jì)教學(xué)改革探索
OBE理念下基于Greenfoot的Java程序設(shè)計(jì)課程教學(xué)改革
PLC梯形圖程序設(shè)計(jì)技巧及應(yīng)用
三級(jí)甲等公立醫(yī)院績效考核程序設(shè)計(jì)
麻江县| 鹿泉市| 阳谷县| 潼关县| 玉田县| 福泉市| 永修县| 洪雅县| 临城县| 湖南省| 武山县| 兰考县| 车致| 休宁县| 广宁县| 榕江县| 江津市| 开平市| 灵川县| 安图县| 五寨县| 股票| 灵武市| 柞水县| 邛崃市| 洞头县| 固阳县| 务川| 南召县| 河曲县| 仁怀市| 盐边县| 桦甸市| 保康县| 治多县| 盘山县| 连江县| 桂阳县| 古丈县| 新宾| 白河县|