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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機超聲波測距程序C調(diào)匯編

          51單片機超聲波測距程序C調(diào)匯編

          作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
          #include

          #include //絕對地址存取

          本文引用地址:http://www.ex-cimer.com/article/201611/318300.htm

          #include

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

          #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(雙字節(jié))[0x32]/ DBYTE(1個字節(jié)),這兩種做法都不行?定義錯

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

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

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

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

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

          unsigned data a2 _at_ 0x56;

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

          {

          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 ;為了使系統(tǒng)穩(wěn)定,P3.1硬件須接地,軟件須清零

          SETB P3.2

          SETB EA ;開總中斷

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

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

          MOV R7,#4

          MOV 40H,#00H ;存放厘米位的數(shù)字

          MOV 41H,#00H ;存放分米位的數(shù)字

          MOV 42H,#00H ;存放米位的數(shù)字

          MOV 43H,#00H ;存放十米位的數(shù)字

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

          MOV TH0,#00H

          CLR TF0 ;溢出標志位清0

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

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

          LCALL DELAY1

          DJNZ R7,INT ;超聲波發(fā)送完畢

          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 ;進入外部中斷后,一般所做的工作為:關閉定時器/計數(shù)器,關閉外部 ;中斷,保護當前的值

          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



          評論


          技術專區(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); })();