📄 received-part-of-supersonic-range-measured-that-mcs51_based.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 + -