新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機超聲波測距程序C調匯編

        51單片機超聲波測距程序C調匯編

        作者: 時間:2016-11-19 來源:網絡 收藏
        #include

        #include //絕對地址存取

        本文引用地址:http://www.104case.com/article/201611/318300.htm

        #include

        #pragma NOREGPARMS //固定單元參數傳遞,以減少C與匯編在寄存器Rn參數傳

        #define f DBYTE[0x40] //cm

        #define g DBYTE[0x41] //dm

        #define h DBYTE[0x42] //m

        #define i DBYTE[0x43]

        unsigned data a _at_ 0x32; // #define a DWORD(雙字節)[0x32]/ DBYTE(1個字節),這兩種做法都不行?定義錯

        //誤導致數據傳送不過來,導致不能進行計算,顯示0000。高字節TH0存放于32h,低字節TL0存放

        //于33h,在c語言中只定義高字節即可,運算時,將高字節低字節看作一個整體進行運

        //算,見《混合編程》20頁;此為無符號整型,兩個字節,可以存放高低16位。。

        unsigned data a0 _at_ 0x52; //第一個數存儲單元

        unsigned data a1 _at_ 0x54; //第二個數存儲單元

        unsigned data a2 _at_ 0x56;

        void count() //被匯編調用的子程序

        {

        unsigned long int temp; //中間變量定義

        a0=a/10;

        a1=a0*17;

        a2=a1/100;

        f=a2%10;

        temp=a2/10;

        g=temp%10;

        temp=temp/10;

        h=temp%10;

        i=temp/10;

        }

        EXTRN CODE(COUNT)

        ORG 0000H

        JMP MAIN

        ORG 0003H

        LJMP EXT0

        MAIN: MOV TMOD,#01H ;設置為定時器且為方式為1

        CLR P3.1 ;為了使系統穩定,P3.1硬件須接地,軟件須清零

        SETB P3.2

        SETB EA ;開總中斷

        CLR IT0 ;設置為電平觸發方式,為低電平則會觸發外部零中斷 MOV SP,#60H

        START:MOV R6,#0 ;進入中斷的標識

        MOV R7,#4

        MOV 40H,#00H ;存放厘米位的數字

        MOV 41H,#00H ;存放分米位的數字

        MOV 42H,#00H ;存放米位的數字

        MOV 43H,#00H ;存放十米位的數字

        MOV TL0,#00H ;設置定時時間為65536微秒

        MOV TH0,#00H

        CLR TF0 ;溢出標志位清0

        SETB P3.0 ;從此處開始到下一個高電平到來的時間必須在*12--13 ;微秒*之間,保證頻率為40khz,若頻率范圍相差太大 ;則導致接收器接收不到信號 ;/*要注意程序運行時時間帶來的影響*/

        INT: CPL P3.0 ;40KHZ超聲波發射子程序 1個

        LCALL DELAY1

        DJNZ R7,INT ;超聲波發送完畢

        CALL DELAY2 ;延時0.1MS避免錯誤

        SETB EX0

        SETB TR0 ;開始計時

        LOOP2:JBC TF0,LOOP3 ;檢查是否有溢出,若為1則跳到LOOP3,并清零

        CJNE R6,#0,LOOP4

        JMP LOOP2

        LOOP4:

        LCALL COUNT

        LCALL dis

        LJMP START

        LOOP3:CLR TR0

        CLR EX0

        MOV 40H,#09H

        MOV 41H,#09H

        MOV 42H,#09H

        MOV 43H,#09H

        LCALL dis

        LJMP START

        EXT0: CLR TR0 ;進入外部中斷后,一般所做的工作為:關閉定時器/計數器,關閉外部 ;中斷,保護當前的值

        CLR EX0 ;改動1

        PUSH ACC

        PUSH PSW

        MOV 32H,TH0

        MOV 33H,TL0 ;改動2

        MOV R6,#1

        POP PSW

        POP ACC

        RETI

        dis: MOV R0,#250 ;目前顯示時間為1S

        D0: MOV A,40H

        MOV P2, A

        ACALL DELAY

        MOV A, 41H

        ADD A, #10H

        MOV P2, A

        ACALL DELAY

        MOV A, 42H

        ADD A, #20H

        MOV P2, A

        ACALL DELAY

        MOV A, 43H

        MOV P2, A

        ADD A, #30H

        MOV P2, A

        ACALL DELAY

        DJNZ R0,D0

        RET

        DELAY: MOV R1,#02 ;1MS

        D1: MOV R2,#248

        DJNZ R2,$

        DJNZ R1,D1

        RET

        DELAY1:MOV R3,#2 ;1US

        D3: DJNZ R3,D3 ;6*2=12US+1=13US

        RET

        DELAY2:MOV R4,#50

        D4: DJNZ R4,D4 ;50*2=100US=0.1MS

        RET

        END



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巴林右旗| 莲花县| 甘孜| 武宁县| 台中市| 晴隆县| 怀柔区| 平原县| 胶南市| 韶山市| 荥阳市| 乌兰察布市| 石泉县| 崇州市| 梁平县| 江北区| 社旗县| 榕江县| 连州市| 湖北省| 桐城市| 黔东| 尼玛县| 崇明县| 竹北市| 清远市| 河东区| 仁布县| 淮北市| 图木舒克市| 年辖:市辖区| 上思县| 留坝县| 光山县| 游戏| 昌黎县| 铁力市| 临颍县| 平乐县| 噶尔县| 盐边县|