📄 chao.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 + -