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

          新聞中心

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

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

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

            

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

            5.2 部分程序清單

           ?。?) 輸入數(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 ;開(kāi)中斷

            。.

            。.

            。.

            RESEVE: CLR EA ;開(kāi)中斷

            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

            (2) 輸出數(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é)束語(yǔ)

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

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

            項(xiàng)目是有關(guān)機(jī)器人控制的實(shí)現(xiàn)??刂撇糠植捎肞IC16F7X系列單片機(jī),運(yùn)用匯編語(yǔ)言編程,運(yùn)行速度較快,能夠達(dá)到系統(tǒng)的要求。

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

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

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

            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

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

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

            list p=16c73

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

            lefthandfla8 cqu 0x0 ;0表示停止左手動(dòng)作

            rightbandflag equ Oxl ;O表示停止右手動(dòng)作

            :

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

            2 GOTO,cALL指令的不同使用

            在PIC的匯編程序中,CALL與GOT0指冷使用的場(chǎng)合不同。一般情況下,在于程序與主程序之間大多用CALL指令;而狀態(tài)轉(zhuǎn)換模塊之間大多用GOTO指令,即由此狀態(tài)進(jìn)入另一種狀態(tài)不需返回。由于PIC單片機(jī)的堆棧有限,在程序中,不能無(wú)止境地使用GOTO語(yǔ)句,這樣會(huì)使堆棧溢出,程序無(wú)法正常運(yùn)行。各個(gè)小程序內(nèi)部循環(huán)占用堆棧的級(jí)數(shù)不多,使用GOTO指令是可行的,但在大的程序中用GOTO則無(wú)法返回到調(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表示一個(gè)輸入超聲檢測(cè)信號(hào)。上面程序描寫(xiě)調(diào)用automatistmstate1狀態(tài),執(zhí)行完后進(jìn)行下面的檢測(cè)ultrasonicdetect],沒(méi)有觸發(fā)就一直循環(huán)檢測(cè),觸發(fā)就進(jìn)入autornatismstate2狀態(tài),執(zhí)行完也不再回到下面的程序。

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

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

            list D=16c76

            call opentimerO

            L4 movlw d’30’

            subwf t0_v2,W

            btfss status,c

            goto L4

            cau closetimer0

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

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


          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


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

          關(guān)閉
          看屁屁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); })();