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

📄 cj-2b.asm

📁 超声语音测距从板部分
💻 ASM
字号:
;********************************
;4位共阴LED数码管
;千位    P2.3
;百位    P2.4
;十位    P2.5
;个位    P2.6
;定时溢出指示:  P1.1
;定时无信号指示:  P1.7
;超近距离指示:    P1.5
;超远距离指示:    P1.6
;接收中断    P3.2
;超声发射  P2.0
;可供选择信号指示:P1.1/P1.5/P1.6/P1.7
;注:此程序为方便学习者理解未进行优化
;如要增大量程可增加定时器时间及发射时间
;**************************
T2CON   DATA 0C8H
T2MOD   DATA 0C9H
RCAP2L  DATA 0CAH
RCAP2H  DATA 0CBH
TL2     DATA 0CCH
TH2     DATA 0CDH
TR2    BIT 0CAH 
ABUF   DATA 50H

ORG 0000H
AJMP MAIN
ORG 0003H;定时器0外中断向量地址
AJMP TIME1
ORG 000BH ;定时器0的溢出中断向量地址
AJMP TIME0 ;跳转到定时器程序处
ORG 36H

;开机初始化
MAIN:MOV A,#0FFH
	MOV P0,A
	MOV P1,A
	MOV P2,A
	MOV P3,A
        LCALL init_timer2 
	MOV 40H,#11H
	MOV A,40H
	LCALL urtsend
	clr p2.0
	mov 25h,#1;100厘米初始报警信号1,以分米为单位
	mov 26h,#55;200厘米初始报警信号2,以分米为单位
main1:mov a,25h
	acall timea
;插入一段判断是否有按键输入的程序段
;C1:	JB P3.3,B1
;	ACALL DELAY10;延时10毫秒消抖
;	JB P3.3,C1
;	JNB P3.3,$;等待按键松开
;	AJMP main2
;B1:	JB P3.6,b2
;	ACALL DELAY10;延时10毫秒消抖
;	JB P3.6,B1
;	JNB P3.6,$;等待按键松开
;	inc 25h
;b2:	JB P3.7,b3
;	ACALL DELAY10;延时10毫秒消抖
;	JB P3.7,B2
;	JNB P3.7,$;等待按键松开
;	dec 25h
;b3:	AJMP main1
;main2:mov a,26h
;	acall timea
;c2:	jb p3.3,d1
;	acall delay10
;	jb p3.3,c2
;	jnb p3.3,$
;	ajmp main3
;D1:	jb p3.6,D2
;	acall delay10
;	jb p3.6,d1
;	jnb p3.6,$
;	inc 26h
;D2:	JB P3.7,D3
;	ACALL DELAY10;延时10毫秒消抖
;	JB P3.7,D2
;	JNB P3.7,$;等待按键松开
;	dec 26h
;D3:ajmp main2
;main3:mov b,#10
;	mov a,25h
;	mul ab
;	mov 25h,a
;	mov b,#10
;	mov a,26h
;;	mul ab
;	mov 27h,a
;	mov 26h,b


START:;测距程序开始
	MOV TMOD,#00000001B ;定时/计数器0工作于方式1
	
	SETB EA ;开总中断允许
loop:	mov r0,#01h
	mov 14h,#0ah;10h;超声波发射持续200us
	MOV TH0,#0h
	MOV TL0,#0h
	SETB ET0 ;开定时/计数器0益出中断允许
	SETB TR0 ;定时/计数器0开始运行
here:	cpl p2.0;;输出40KHz方波
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	djnz 14h,here
	nop
	nop
	MOV R7,#200
      	DJNZ R7,$
	MOV R7,#200
      	DJNZ R7,$
      	MOV R7,#200
      	DJNZ R7,$
      	MOV R7,#200
      	DJNZ R7,$
      	;CX20106增益电阻为4.7欧时,必留(最小测距20CM)
	MOV R7,#100
	DJNZ R7,$;*超声波谐振等待
	setb ex0;开定时器0外中断
deng:	mov a,r0;外中断r0为0,溢出中断r0为0
        jnz deng;累加器非0转移
        mov a,r1;外中断r1为0,溢出中断r1为1;
        jnz stlop;累加器非0转移,超远量程显示,
        MOV R7,#60
	NOP
	mov r3,#0
	mov r4,30h
	mov r5,31h
	acall DV31
	NOP
	mov a,r4
	mov r6,a
	mov a,r5
	mov r7,a
	;#########################超近距离判别(判别量255之内)
        mov a,r5;测距数值低位
        cjne a,25h,l2;;累加器中的数值=25H顺序执行,否则转移*****判别测距小于等于35H内数值
        ajmp l3
     l2:jc l3;CY=1(累加器>35h)顺序执行,否则转移
        setb p1.5
        ajmp l10
     l3:clr p1.5;测量数值小于设定范围时点亮LED
        ;#############超远距离判别(判别量16位二进制数)
l10:    mov a,r4;测距数值高位
        cjne a,26h,l4;;累加器=36H顺序执行,否则转移*****判别测距小于等于36H内数值
     l5:mov a,r5
        cjne a,27h,l6;;累加器=37H顺序执行,否则转移*****判别测距小于等于37H内数
        ajmp l7
        l6:jc l8;CY=1(累加器>37h)顺序执行,否则转移
        ajmp l7
     l4:jc l5;CY=1(累加器>36h)顺序执行,否则转移
     l7:clr p1.6;测距值大于设定范围时点亮LED
       ajmp l9
     l8:setb p1.6
     l9:nop
;########################## 
	ACALL HB2
	NOP
stlop:acall display
	NOP
AJMP LOOP
        ret        
        
;除以单字节二进制数
;入口条件:被除数在R3、R4、R5中,除数在R7中。
;出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
DV31:CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV; ;商溢出
RET
DV30:MOV R2,#10H; ;求R3R4R5/R7-→R4R5
DM23:CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24:DJNZ R2,DM23
MOV A,R3; ;四舍五入
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25:INC R5
MOV A,R5
JNZ DM26
INC R4
DM26:CLR OV
RET; ;商在R4R5

;HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
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; ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3; ;处理完16bit
mov 32h,r3
mov 33h,r4
mov 34h,r5
RET

;显示子程序
display:mov dptr,#tab ;指定查表启始地址
	mov r6,#50;显示50次
dplop:  ;************千位显示
	mov a,33h
	swap a
	anl a,#0fh;
	jz disp;第一位为0时,不显示
	movc a,@a+dptr
	mov p0,a
	clr p2.3
	acall DELY1
	;***********如不需要千位显示可删掉
disp:	mov a,33h
	anl a,#0fh;屏蔽A中的高四位
	jz disp1;第二位为0时,不显示
        MOVC A,@A+DPTR;查代码
        setb p2.3
        mov p0,a;送出百位的7段代码
        clr p2.4;开百位显示
        acall DELY1;显示1ms
disp1:  mov a,34h
        swap a
        anl a,#0fh
        movc a,@a+dptr
        setb p2.4
        mov p0,a
        clr p2.5;开十位显示
        acall DELY1
        mov a,34h
        anl a,#0fh;屏蔽A中的高四位
        MOVC A,@A+DPTR;查个位数的7段代码
        setb p2.5
        mov p0,a;送出个位的7段代码
        clr p2.6;开个位显示
        acall DELY1;显示1ms
        setb p2.6
        djnz r6,dplop;循环
        ret
        
;数码管显示定时时间的程序
timea:mov dptr,#tab ;指定查表启始地址
	mov b,#100 ;10进制/10=10进制
	div ab
	jz timea1;第一位为0时,不显示
	MOVC A,@A+DPTR ;查百位数的7段代码
	mov p0,a ;送出百位的7段代码
	clr p2.3 ;开百位显示
	ACALL DELY1;显示1毫秒
timea1:	setb p2.3;关闭百位显示,防止鬼
	mov a,b
	mov b,#10
	div ab
	MOVC A,@A+DPTR ;查十位数的7段代码
	mov p0,a ;送出十位的7段代码
	clr p2.4 ;开十位显示
	ACALL DELY1;显示1毫秒
	setb p2.4;关闭十位显示,防止鬼影
	mov a,b;个位
	MOVC A,@A+DPTR ;查个位数的7段代码
	mov p0,a ;送出个位的7段代码
	clr p2.5 ;开个位显示
	ACALL DELY1;显示1毫秒
	setb p2.5;关闭个位显示,防止鬼影
	mov a,#0;补充个位
	MOVC A,@A+DPTR ;查个位数的7段代码
	mov p0,a ;送出个位的7段代码
	clr p2.6 ;开个位显示
	ACALL DELY1;显示1毫秒
	setb p2.6
	ret
      	
;1毫秒延时子程序
DELY1:	MOV R4,#2
DD1:	MOV R5,#248
	DJNZ R5,$
	DJNZ R4,DD1
	RET

;10毫秒延时子程序
DELAY10:MOV R4,#20
DD2:	MOV R5,#248
	DJNZ R5,$
	DJNZ R4,DD2
	RET      	

TIME0: ;定时器0溢出中断
	PUSH ACC
	PUSH PSW ;将PSW和ACC入栈
	clr tr0;关定时器
	clr ex0;关外中断
	mov a,#0aah
	mov 32h,a
	mov 33h,a
	mov 34h,a
	mov r0,#00h
	mov r1,#01h
	cpl p1.1
	POP PSW
	POP ACC
	RETI
TIME1: ;定时器0的外中断
	PUSH ACC
	PUSH PSW ;将PSW和ACC入栈
	clr tr0;关定时器
	clr ex0;关外中断
	clr et0
	CPL P1.7
	MOV     44H,TL0    ;将计数值移入处理单元
        MOV     45H,TH0    ;
	lcall urtsendflag
	mov a,th0;高位
	subb a,#0h;8bh;0b1h
	mov 0030h,a
	mov a,tl0;低位
	subb a,#78h;48h;0d0h;0f4h;0e0h
	mov 0031h,a
	mov r0,#00h
	mov r1,#00h
	POP PSW
	POP ACC
	RETI

;4位7段数码管各划的数字排列表(共阴)
tab:DB 0ebh,00ah,067h,06eh,08eh,0ech,0edh,02ah,0efh,0eeh,014h,074h
;0 1 2 3 4 5 6 7 8 9  一。三。
init_timer2:  
        MOV SCON,#50H
	;   //0101 0000 8位可变波特率,无奇偶效验
	mov RCAP2H,#0ffH; 		// Reload value
	mov RCAP2L,#0d7H;     //11.0592   9600
	mov TH2,#0ffH;				// Initial load value
        mov TL2,#0d7H;  
	setb TR2 ;
        mov T2CON,#34H;  //使用T2作波特率发生器
         
        ret
urtsend:mov SBUF,A
WAIT1:  JNB TI,WAIT1
        CLR TI	
        ret
urtsendflag:
         mov a,#01
         lcall urtsend
         mov a,#02
         lcall urtsend
         
	 mov a,44h
	 lcall urtsend
         mov a,45h
	 lcall urtsend
	 mov a,#00h
	 add a,#01
         add a,#02
         add a,44h
	 add a,45h
	 cpl a
         lcall urtsend
	 
	 ret
END

⌨️ 快捷键说明

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