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

📄 chao.asm

📁 用单片机来实现超声波的测距
💻 ASM
字号:
;********************************
;4位共阴LED数码管
;千位    P2.3
;百位    P2.4
;十位    P2.5
;个位    P2.6
;定时溢出  P1.1
;接收中断P1.7
;超声发射  P2.0
;可供选择信号指示:P1.1/P1.5/P1.6/P1.7
;注:此程序为方便学习者理解未进行优化
;如要增大量程可增加定时器时间及发射时间
;**************************
ORG 0000H
AJMP START
ORG 0003H;定时器0外中断向量地址
AJMP TIME1
ORG 000BH ;定时器0的溢出中断向量地址
AJMP TIME0 ;跳转到定时器程序处
ORG 36H

START:
	MOV TMOD,#00000001B ;定时/计数器0工作于方式1
	SETB EA ;开总中断允许
loop:	mov r0,#01h
	mov 14h,#0ah;超声波发射持续200us
	MOV TH0,#0b1h
	MOV TL0,#0e0h;赋值定时器定时20毫秒
	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,$
      	MOV R7,#200
      	DJNZ R7,$
	MOV R7,#200
	DJNZ R7,$
	MOV R7,#100
	DJNZ R7,$;*超声波谐振等待
	mov r4,0030h
	mov r5,0031h
	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 r6,#1h
        mov r7,#54h;R6/R7 154H,即340米/秒
        mov r2,30h
        mov r3,31h
acall muld
	mov r6,#4eh
	mov r7,#20h;除以20000
acall divd
	mov a,r3
	mov r7,a
	mov a,r2
	mov r6,a
	 ;**************** 
        jnz aaa1;非0转移
        mov a,r7
        cjne a,#28h,l2;累加器=28h顺序执行,否则转移*****判别测距小于等于40CM;
        ajmp l3
        l2:jc l3;CY=1(累加器>28h)顺序执行,否则转移
        ajmp aaa1
        l3:mov a,#0bbh
	mov 33h,a
	mov 34h,a
	ajmp l4
        ;****************超近距离判别

aaa1:	
acall hb2
l4:
stlop:acall display
AJMP LOOP    ;程序结束返回
        ret

;显示子程序
display:mov dptr,#tab ;指定查表启始地址
	mov r6,#255;显示255次
dplop:  ;************千位显示
	mov a,33h
	swap a
	anl a,#0fh;
	movc a,@a+dptr
	mov p0,a
	clr p2.3
	acall d1ms
	;***********如不需要千位显示可删掉
	mov a,33h
	anl a,#0fh;屏蔽A中的高四位
        MOVC A,@A+DPTR;查代码
        setb p2.3
        mov p0,a;送出百位的7段代码
        clr p2.4;开百位显示
        acall d1ms;显示1ms
        mov a,34h
        swap a
        anl a,#0fh
        movc a,@a+dptr
        setb p2.4
        mov p0,a
        clr p2.5;开十位显示
        acall d1ms
        mov a,34h
        anl a,#0fh;屏蔽A中的高四位
        MOVC A,@A+DPTR;查个位数的7段代码
        setb p2.5
        mov p0,a;送出个位的7段代码
        clr p2.6;开个位显示
        acall d1ms;显示1ms
        setb p2.6
        djnz r6,dplop;循环
        ret

  D1MS: MOV R7,#80;(按12MHZ算)
      	DJNZ R7,$
      	RET

;MULD 功能:双字节二进制无符号数乘法 
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
MULD: MOV A,R3; ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B; ;暂存部分积
MOV R5,A
MOV A,R3; ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4; ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2; ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4; ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2; ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3; ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET


;DIVD 功能:双字节二进制无符号数除法

;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C; ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV; ;溢出
RET
DVD1: MOV B,#10H; ;计算双字节商
DVD2: 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
XCH A,R2
RLC A
XCH A,R2
MOV F0,C; ;保存溢出位
CLR C
SUBB A,R7; ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0; ;结果判断
JC DVD3
MOV R2,A; ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5; ;商的低位置一
DVD3: DJNZ B,DVD2; ;计算完十六位商(R4R5)
MOV A,R4; ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV; ;设立成功标志
RET

;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

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 a,th0;高位
	subb a,#0b3h;0b1h
	mov 0030h,a
	mov a,tl0;低位
	subb a,#6fh;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  一。三。
END
;至此,应该能够掌握程序的编制方法,对之进行优化,增加功能。
;应继续完成课题:按键功能 数据储存 温度修正 通信 模拟量输出 

⌨️ 快捷键说明

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