⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 received-part-of-supersonic-range-measured-that-mcs51_based.asm

📁 项目名称:超声波测距接收部分程序 功 能: 晶振采用12M
💻 ASM
字号:
;======================================================================
;项目名称:超声波测距接收部分程序
;功    能: 晶振采用12M,引脚定义:P0.1(SDA),P0.2(SCL),P3.2(即INT0,红外输入),P3.3(即INT1,超声波输入)
;硬件环境: 自制单片机实验板,
;软件环境: Windows操作系统
;使用软件:伟福 V3.20,
;          Easy 51Pro v2.0
;
;实验步骤:
;         1.打开伟福V3.20,创建一新文件
;         2.编写源代码
;         3.保存文件,文件名后缀为.asm
;         4.编译程序
;         5.打开Easy 51Pro v2.0将程序写进实验板
;程序范例:
; Create   date:  2004_07_26
; First  Modify:  2004_07_26
; second Modify:
; Last   Modify:  2004_07_26
;        Author:  Sujiande
;==============================================================================
;===========预定义==============================================
SDA        BIT   P0.1; P0.1;定义数据线引脚
SCL        BIT   P0.2;P0.2;定义时钟线引脚
LED0       EQU   40H ;预定义数码管
LED1       EQU   41H
LED2       EQU   42H
LED3       EQU   43H
ORG  0000H          ;主程序入口
AJMP MAIN           ;跳转到主程序
ORG  0100H          ;主程序在ROM中存放的位置
     MAIN:  MOV R0,#70H
            MOV R7,#0BH
            MOV 40H,#00H
            MOV 20H,#00H
CLEARDISP:  MOV @R0,#00H
            INC R0
            DJNZ R7,CLEARDISP
;===============================================================
    RECEIVE:SETB EA ;中断总允许
            JNB P3.2,START_TIMER
            JB  P3.3,STOP_TIMER

;==============================================
START_TIMER:MOV TMOD,#0DDH; 计数工作方式,外中断请求启动,工作方式1
            CLR P3.2;禁止计数器0外中断
            SETB TR0;开始计数
            RET
;==============================================
 STOP_TIMER:ACALL STOP
            ACALL SAVE_4_DATA
            ACALL CALCULATE
            ACALL HB2
            ACALL DISPLAY
;===================================
       STOP:CLR TR0;停止计数
            RET


;===================================
SAVE_4_DATA:MOV DPTR,#BRTAB;转移指令表首址
            CLR C;进位位CY清零
            MOV A,44H
            RLC A;A带进位位循环左移,即分支序号值乘2,原因是AJMP指令是2字节指令,P53、P147
            JMP @A+DPTR; 转各分支程序
      BRTAB:AJMP SAVE_DATA_1
            AJMP SAVE_DATA_2
            AJMP SAVE_DATA_3
            AJMP SAVE_DATA_4

     SAVE_DATA_1:CLR P3.3;禁止P3.3外中断
                 SETB EX0;允许外中断INT0
                 MOV 70H,TL0
                 MOV 71H,TH0
                 MOV R0,70H
                 MOV R1,71H
                 MOV 44H,#01H
                 AJMP RECEIVE
                 RET

     SAVE_DATA_2:CLR P3.3;禁止P3.3外中断
                 SETB EX0;允许外中断INT0MOV R1,#04H
                 MOV 72H,TL0
                 MOV 73H,TH0
                 MOV R2,72H
                 MOV R3,73H
                 MOV 44H,#02H
                 AJMP RECEIVE
                 RET

     SAVE_DATA_3:CLR P3.3;禁止P3.3外中断
                 SETB EX0;允许外中断INT0MOV R1,#04H
                 MOV 74H,TL0
                 MOV 75H,TH0
                 MOV R4,74H
                 MOV R6,75H
                 MOV 44H,#03H
                 AJMP RECEIVE
                 RET

     SAVE_DATA_4:CLR P3.3;禁止P3.3外中断
                 SETB EX0;允许外中断INT0MOV R1,#04H
                 MOV 76H,TL0
                 MOV 77H,TH0
                 MOV R6,76H
                 MOV R7,77H
                 AJMP AVERAGE_4;转求4个测量值的平均值
                 MOV 44H,#00H;重新开始检测4个测量值
                 AJMP RECEIVE
                 RET
;=================以下程序求四个测量值平均值=====================
                 MOV R0,71H
                 MOV R1,74H
                 MOV R7,#02H
                 CLR C
            LOOP:MOV A,@R0
                 ADDC A,@R1
                 MOV @R0,A
                 INC R0
                 INC R1
                 DJNZ R7,LOOP
                 CLR A
                 ADDC A,#00H
                 MOV @R0,A ;前2个数相加结果存于71—73H
;=======================
             MOV R0,71H
                 MOV R1,77H
                 MOV R7,#03H
                 CLR C
            LOOP:MOV A,@R0
                 ADDC A,@R1
                 MOV @R0,A
                 INC R0
                 INC R1
                 DJNZ R7,LOOP
                 CLR A
                 ADDC A,#00H
                 MOV @R0,A ;前3个数相加结果存于71—73H
;=======================
                 MOV R0,71H
                 MOV R1,80H
                 MOV R7,#03H
                 CLR C
            LOOP:MOV A,@R0
                 ADDC A,@R1
                 MOV @R0,A
                 INC R0
                 INC R1
                 DJNZ R7,LOOP
                 CLR A
                 ADDC A,#00H
                 MOV @R0,A ;4个测量值相加结果存于71—73H
;=======================
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;=========================以下计算平均值方法不对!!!!==================            
 ;      AVERAGE_4:CLR C;
 ;                MOV A,70H;第1个测量值低位,这里的测量值均为时间值
 ;                ADDC A,72H;第2个测量值低位
 ;                MOV 72H,A;前2个测量值的低位相加结果存于72H单元
 ;                MOV A,71H;第1个测量值高位
 ;                ADDC A,73H;第2个测量值高位
 ;                MOV 73H,A;前2个测量值的低位相加结果存于72H单元
 ;                CLR A;
 ;                ADDC A,#00H;进位处理
 ;                MOV 71H,A;进位存于71单元
 ;
 ;                MOV A,72H;
 ;                ADDC A,74H;第3个测量值低位
 ;                MOV 72H,A;存低位相加结果
 ;                MOV A,73H;
 ;                ADDC A,75H;第3个测量值高位
 ;                MOV 73H,A;存高位相加结果
 ;                CLR A;
 ;                ADDC A,71H;
 ;                MOV 71H,A;进位存于71单元
 ;
 ;                MOV A,72H;
 ;                ADDC A,76H;第4个测量值低位
 ;                MOV 72H,A;存低位相加结果
 ;                MOV A,73H;
 ;                ADDC A,77H;第4个测量值高位
 ;                MOV 73H,A;存高位相加结果
 ;                CLR A;
 ;                ADDC A,71H;
 ;                MOV 71H,A; 四个测量值相加结果的进位存于71单元,低位存于72H单元,高位存于73H单元
 ;
 ;                MOV A,71H;
 ;                RRC A;
 ;                MOV 71H,A;
 ;                MOV A,72H;
 ;                RRC A;
 ;                MOV 72H,A;
 ;                MOV A,73H;
 ;                RRC A;
 ;                MOV 73H,A;求四个测量值平均值,进位存于71单元,低位存于72H单元,高位存于73单元,
                          ;这里的测量值均为时间值
;=========================================================
;计算距离:S=v*t=340*t
  CALCULATE:






;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           BCD转换                   ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        HB2:CLR A           ;BCD码初始化
            MOV R3,A
            MOV R4,A
            MOV R5,A
            MOV R2,#10H     ;转换双字节十六进制整数
        HB3:MOV A,R7        ;从高端移出待转换数的一位到CY中
            RLC A
            MOV R7,A
            MOV A,R6
            RLC A
            MOV R6,A
            MOV A,R5        ;BCD码带进位自身相加,相当于乘2
            ADDC A,R5
            DA A            ;十进制调整
            MOV R5,A
            MOV A,R4
            ADDC A,R4
            DA A
            MOV R4,A
            MOV A,R3
            ADDC A,R3
            MOV R3,A
            DJNZ R2,HB3
            RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;           显示程序, 不用这个,用苏老师的显示模块,见后面
;
;    DISPLAY:MOV R1,#76H
;            MOV R5,#0FEH
;       PLAY:MOV A,R5
;            MOV P3,A         ;累加器A中的数值送P3口
;            MOV A,@R1
;            MOV DPTR,#TAB
;            MOVC A,@A+DPTR   ;
;            MOV P1,A         ;累加器A中的数值送P1口
;            MOV R6,#14H
;        DL1:MOV R7,#19H
;        DL2:DJNZ R7,DL2
;            DJNZ R6,DL1
;            INC R1
;            MOV A,R5
;            JNB ACC.2,ENDOUT
;            RL A
;            MOV R5,A
;            AJMP PLAY
;     ENDOUT:SETB P3.5
;            MOV P1,#0FFH     ;立即数0FEH送P1口
;            RET
;        TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0c6H,3fh
;            END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;===================================显示模块=====================================
DISPLAY:
      MOV   DPTR,#TAB   ;赋显示代码首地址
LP1:
      MOV     A,LED0    ;将LED0中的数据送A
      MOVC    A,@A+DPTR ;将A与DPTR相加的值作为代码地址,并将该代码赋给A
      ACALL   SHIFT     ;调用移位子程序

      MOV     A,LED1
      MOVC    A,@A+DPTR
      ACALL   SHIFT

      MOV     A,LED2
      MOVC    A,@A+DPTR
      ACALL   SHIFT

      MOV     A,LED3
      MOVC    A,@A+DPTR
      ACALL   SHIFT

      RET
;--------------显示代码表-------------------------------------------------------------------------- ----
TAB: DB   0EEH,28H,0CDH,6DH,2BH  ;11H,0D7H,032H,92H,0D4H
     DB   67H,0E7H,2CH,0EFH,6FH  ;98H,018H,0D3H,10H,090H
;------------------------------------------------------------------------
;================移位子程序============================
SHIFT:      push    A         ;将A中的值入栈保护
            MOV     R2,#8     ;循环8次
            CLR     C         ;清进位标志
            CLR     SCL       ;将时钟线拉底,准备发送数据
DL:
            RLC     A         ;将要发送的数据左移,发送入位C

            MOV     SDA,C     ;将C上的数据送上数据线

            SETB    SCL       ;将时钟线置高使数据线上的数据有效

            CLR     SCL       ;将时钟线拉底,准备下一次发送数据

            DJNZ    R2,DL
            POP     A         ;出栈恢复A值
            RET               ;子程序返回

;===================================================
; 子程序名: Delay_1s
; 功能描述: 延时约一秒钟
;===================================================
Delay_1s:
        MOV     R7,#0FFH;将数0FFH送给寄存器R7,确定外循环次数
LOOP7:  MOV     R6,#0FFH;将数0FFH送给寄存器R6,确定内循环次数
LOOP6:  NOP             ;空操作指令,指令执行时间为一个机械周期
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DJNZ    R6,LOOP6;循环转移指令,次数减一,不为零转移
        DJNZ    R7,LOOP7;循环转移指令,次数减一,不为零转移
        RET             ;子程序返回指令
;===================================================
END                     ;汇编结束伪指令



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -