📄 cj-2b.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 + -