×
单片机 > 单片机程序设计 > 详情

AT89C52超声波测距器

发布时间:2020-06-04 发布时间:
|

AT89C52超声波测距器

;测距范围7CM-11M,堆栈在4FH以上,20H用于标志 
;显示缓冲单元在40H-43H,使用内存44H、45H、46H用于计算距离 

              VOUT     EQU     P1.0    ; 红外脉冲输出端口


;******************************************** 
;*             中断入口程序                 * 
;******************************************** 

              ORG 0000H 
                  LJMP      START 
              ORG 0003H 
                  LJMP      PINT0 
              ORG 000BH 
                  LJMP      INTT0 
              ORG 0013H 
                  RETI 
              ORG 001BH 
                  LJMP      INTT1 
              ORG 0023H 
                  RETI 
              ORG 002BH 
                   RETI      

;******************************************** 
;*               主 程 序                   * 
;******************************************** 

            START: MOV     SP,#4FH 
                   MOV     R0,#40H     ;40H-43H为显示数据存放单元(40H为最高位) 
                   MOV     R7,#0BH 
       CLEARDISP:  MOV     @R0,#00H 
                   INC     R0 
                   DJNZ    R7,CLEARDISP 
                   MOV     20H,#00H 
                   MOV     TMOD,#21H     ;T1为8位自动重装模式,T0为16位定时器 
                   MOV     TH0,#00H      ;65毫秒初值 
                   MOV     TL0,#00H 
                   MOV     TH1,#0F2H     ;40KHz初值 
                   MOV     TL1,#0F2H 
                   MOV     P0,#0FFH 
                   MOV     P1,#0FFH 
                   MOV     P2,#0FFH 
                   MOV     P3,#0FFH 
                   MOV     R4,#04H       ;超声波肪冲个数控制(为赋值的一半) 
                   SETB    PX0 
                   SETB    ET0 
                   SETB    EA 
                   SETB    TR0           ;开启测距定时器 
            start1: LCALL  DISPLAY 
                    JNB    00H,START1    ;收到反射信号时标志位为1 
                    CLR    EA 
                    LCALL  WORK          ;计算距离子程序 
                    SETB   EA 
                    CLR    00H 
                    SETB   TR0          ;重新开启测距定时器 
                    MOV    R2,#64H      ;测量间隔控制(约4*100=400MS) 
              LOOP: LCALL  DISPLAY 
                    DJNZ   R2,LOOP 
                    SJMP   Start1 

;**************************************************** 
;*                    中断程序*                     * 
;**************************************************** 
;T0中断,65毫秒中断一次 
INTT0:          CLR     EA 
                CLR     TR0 
                MOV     TH0,#00H 
                MOV     TL0,#00H 
                SETB    ET1 
                SETB    EA 
                SETB    TR0       ;启动计数器T0,用以计算超声来回时间 
                SETB    TR1       ;开启发超声波用定时器T1 
OUT:            RETI 
;T1中断,发超声波用 
INTT1:          CPL     VOUT 
                DJNZ    R4,RETIOUT 
                CLR     TR1        ;超声波发送完毕,关T1 
                CLR     ET1        ; 
                MOV     R4,#04H 
                SETB    EX0        ;开启接收回波中断 
RETIOUT:        RETI 
;外中断0,收到回波时进入 
PINT0:          CLR     TR0        ;关计数器 
                CLR     TR1 
              CLR     ET1 
                CLR     EA         ; 
                CLR     EX0        ; 
                MOV     44H,TL0    ;将计数值移入处理单元 
                MOV     45H,TH0    ; 
                SETB    00H        ;接收成功标志 
                RETI 

;**************************************************** 
;*                    显示程序                      * 
;**************************************************** 
; 40H为最高位,43H为最低位,先扫描高位 
          DISPLAY: MOV   R1,#40H;G 
                   MOV   R5,#0F7H;G 
             PLAY: MOV   A,R5 
                   MOV   P0,#0FFH 
                   MOV   P2,A 
                   MOV   A,@R1 
                   MOV   DPTR,#TAB 
                   MOVC  A,@A+DPTR 
                   MOV   P0,A 
                   LCALL DL1MS 
                   INC   R1 
                   MOV   A,R5 
                   JNB    ACC.0,ENDOUT;G 
                   RR    A 
                   MOV   R5,A 
                   AJMP  PLAY 
           ENDOUT: MOV   P2,#0FFH 
                   MOV   P0,#0FFH 
                   RET 

            TAB:   DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH 
;共阳段码表            "0" "1"  "2"   "3"  "4" "5""6"  "7" "8" "9" "不亮""A""-" 


;**************************************************** 
;*                    延时程序                      * 
;**************************************************** 

             DL1MS: MOV    R6,#14H 
             DL1:   MOV    R7,#19H 
             DL2:   DJNZ   R7,DL2 
                    DJNZ   R6,DL1 
                    RET 

;**************************************************** 
;*        距离计算程序 (=计数值*17/1000cm)          * 
;**************************************************** 

work:     PUSH  ACC 
          PUSH  PSW 
          PUSH  B 
          MOV   PSW, #18h 
          MOV   R3,  45H 
          MOV   R2,  44H 
          MOV   R1,  #00D 
          MOV   R0,  #17D 
          LCALL MUL2BY2 
          MOV   R3,  #03H 
          MOV   R2,  #0E8H 
          LCALL DIV4BY2 
          LCALL DIV4BY2 
          MOV   40H, R4 
          MOV   A,40H 
          JNZ   JJ0 
          MOV   40H,#0AH    ;最高位为零,不点亮 
JJ0:      MOV   A,  R0 
          MOV   R4, A 
          MOV   A,  R1 
          MOV   R5, A 
          MOV   R3,  #00D 
          MOV   R2,  #100D 
          LCALL DIV4BY2 
          MOV   41H, R4 
          MOV   A,41H 
          JNZ   JJ1 
          MOV   A,40H    ;次高位为0,先看最高位是否为不亮 
          SUBB  A,#0AH 
          JNZ   JJ1 
          MOV   41H,#0AH ;最高位不亮,次高位也不亮 
JJ1:      MOV   A,  R0 
          MOV   R4, A 
          MOV   A,  R1 
          MOV   R5, A 
          MOV   R3,  #00D 
          MOV   R2,  #10D 
          LCALL DIV4BY2 
          MOV   42H, R4 
          MOV   A,42H 
          JNZ   JJ2 
          MOV   A,41H    ;次次高位为0,先看次高位是否为不亮 
          SUBB  A,#0AH 
          JNZ   JJ2 
          MOV   42H,#0AH ;次高位不亮,次次高位也不亮 
JJ2:      MOV   43H, R0 
          POP   B 
          POP   PSW 
          POP   ACC 
          RET 

;**************************************************** 
;*            两字节无符号数乘法程序                * 
;**************************************************** 
; R7R6R5R4 <= R3R2 * R1R0 

MUL2BY2:  CLR   A 
          MOV   R7,  A 
          MOV   R6,  A 
          MOV   R5,  A 
          MOV   R4,  A 
          MOV   46H, #10H 
MULLOOP1: CLR   C 
          MOV   A,   R4 
          RLC   A 
          MOV   R4,  A 
          MOV   A,   R5 
          RLC   A 
          MOV   R5,  A 
          MOV   A,   R6 
          RLC   A 
          MOV   R6,  A 
          MOV   A,   R7 
          RLC   A 
          MOV   R7,  A 
          MOV   A,   R0 
          RLC   A 
          MOV   R0,  A 
          MOV   A,   R1 
          RLC   A 
          MOV   R1,  A 
          JNC   MULLOOP2 
          MOV   A,   R4 
          ADD   A,   R2 
          MOV   R4,  A 
          MOV   A,   R5 
          ADDC  A,   R3 
          MOV   R5,  A 
          MOV   A,   R6 
          ADDC  A,   #00H 
          MOV   R6,  A 
          MOV   A,   R7 
          ADDC  A,   #00H 
          MOV   R7,  A 
MULLOOP2: DJNZ  46H, MULLOOP1 
          RET 


;**************************************************** 
;*            四字节/两字节无符号数除法程序         * 
;**************************************************** 
;R7R6R5R4/R3R2=R7R6R5R4(商)...R1R0(余数) 

DIV4BY2:  MOV   46H,  #20H 
          MOV   R0,  #00H 
          MOV   R1,  #00H 
DIVLOOP1: MOV   A,   R4 
          RLC   A 
          MOV   R4,  A 
          MOV   A,   R5 
          RLC   A 
          MOV   R5,  A 
          MOV   A,   R6 
          RLC   A 
          MOV   R6,  A 
          MOV   A,   R7 
          RLC   A 
          MOV   R7,  A 
          MOV   A,   R0 
          RLC   A 
          MOV   R0,  A 
          MOV   A,   R1 
          RLC   A 
          MOV   R1,  A 
          CLR   C 
          MOV   A,   R0 
          SUBB  A,   R2 
          MOV   B,   A 
          MOV   A,   R1 
          SUBB  A,   R3 
          JC    DIVLOOP2 
          MOV   R0,  B 
          MOV   R1,  A 
DIVLOOP2: CPL   C 
          DJNZ  46H,  DIVLOOP1 
          MOV   A,   R4 
          RLC   A 
          MOV   R4,  A 
          MOV   A,   R5 
          RLC   A 
          MOV   R5,  A 
          MOV   A,   R6 
          RLC   A 
          MOV   R6,  A 
          MOV   A,   R7 
          RLC   A 
          MOV   R7,  A 
          RET 

          END 




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式