我用0809采集数据(0到5伏),c51处理数据,三个4015作显示。
这是我的汇编程序。
ORG 0000H
LJMP MAIN
ORG 0003H ;中断0,当0809采集结束进入中断
LJMP INT0
MAIN:
MOV TCON,#01H ;设置中断
MOV IE,#81H
CLR P3.5 ;启动0809
CLR P3.6
SETB P3.6
CLR P3.6
SETB P3.5
CLR P3.5
YY: NOP ;等待进入中断
LJMP YY
INT0: ;中断
CLR EA ;关中断
SETB P3.7 ;让数据进入51
MOV P2,#0FFH ;从p2口进入
NOP
NOP
MOV A,P2
MOV B,#24 ;我的程序要求255对应120,所以先给数据乘以24再除以51,
MUL AB ;要调用双字节除法子程序,程序的入口R7(高),R6(低)为除数,R5(高),R4(低)为被除数,最后的商在R7(高),R6(低)
MOV R7,B
MOV R6,A
MOV R5,#00H
MOV R4,#51
LCALL CHUFA ;调用双字节除法子程序
CLR CY ; 我的商只有低位,在R6中,因为有三位7段数码管,可以显示三位,如果商大于等于99,则显示十位,个位,小数点后的第一位,小数点由P3.0控制(当P3.0为低时显示小数点);当商大于99时,则显示百位,十位,各位,不涉及小数点的显示
MOV A,R6
CJNE A,#99,LP1 ;判断等于99,不等转
LP6:CLR P3.0
MOV B,#10
DIV AB
MOV R0,A
LCALL XIAN1 ;显示最高位
MOV A,B
LCALL XIAN2 ;显示次位
MOV A,B
LCALL XIAN3 ;显示最低位
LJMP LP7
LP1:JC LP6 ;C等于1说明A小于99,转到LP6,否则继续
MOV B,#100
DIV AB
MOV R0,A
LCALL XIAN1
MOV A,#10
XCH A,B
DIV AB
LCALL XIAN2
MOV A,B
LCALL XIAN3
LP7: LCALL DELDY ;延时,隔一段时间采集一次
CLR P3.5 ;再次启动0809
CLR P3.6
SETB P3.6
CLR P3.6
SETB P3.5
CLR P3.5
SETB EA
RETI
XIAN1: ;P1口的低四位作显示输出,连接到三个4051,用P1.6,P1.5,P1.4分别控制最高位,次位,最低位的4051的工作,给该位赋0就是该位对应4051工作。
CJNE A,#00H,LP4
MOV P1,#0BAH
RET
LP4:ORL A,#0B0H
MOV P1,A
RET
XIAN2:
CJNE R0,#00H,LP5
CJNE A,#00H,LP5
MOV P1,#0BAH
RET
LP5:ORL A,#0D0H
MOV P1,A
RET
XIAN3:
ORL A,#0E0H
MOV P1,A
RET
CHUFA: 双字节除法子程序
MOV A,R4
JZ OVER
BEGIN: CLR A
MOV R3,A
MOV R2,A
MOV R1,#10H
DIV0: LCALL RLC4
MOV A,R2
SUBB A,R4
MOV R0,A
MOV A,R3
SUBB A,R5
JC NEXT
INC R6
MOV R3,A
MOV A,R0
MOV R2,A
NEXT: DJNZ R1,DIV0
MOV A,R3
RLC A
JC ROUND
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
SUBB A,R5
JC DONE
JNZ ROUND
MOV A,R2
SUBB A,R4
JC DONE
ROUND: LCALL ADD1
DONE: CLR A
RET
OVER: MOV A,#0FFH
RET
RLC4: CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
RET
ADD1: MOV A,R6
ADD A,#1
MOV R6,A
MOV A,R7
ADDC A,#0
MOV R7,A
RET
DELDY: 延时子程序
MOV 0AH,#0FAH
LP3:MOV 0BH,#0FAH
LP2:NOP
NOP
DJNZ 0BH,LP2
DJNZ 0AH,LP3
RET
该程序上电后显示的数字是正确的,但是就不再改变了。我测试了所有的子程序都正确,但是不知道为什么不循环,谢谢大家赐教!