📄 复件 综合程序.asm
字号:
ORG 0000H
LJMP START
ORG 0003H ;中断INT0入口
LJMP INT0
ORG 0023H
LJMP RECE
START: MOV SP,#70H
SETB P3.5 ;上电后指示灯亮
MOV IE,#90H ;EA=1,ES=1,CPU开串行中断
MOV SCON,#50H ;设置串行口方式1,允许串行接收
MOV TMOD,#20H ;设置定时器T1为方式2
MOV TH1,#0FDH ;设置波特率为9600b/s
MOV TL1,#0FDH
MOV R6,#00H
MOV R1,#00H
SETB TR1
WAIT: NOP
CJNE R6,#01H,WAIT
LJMP CAIJI
RECE: CLR EA
PUSH A
MOV A,SBUF ;接收到一个数据
CLR RI
CJNE A,#43H,RECE1 ;是否收到传送信号"C"
MOV R6,#01H ;收到"C"进入波形采集程序,闪2次
LCALL SH2
LJMP OUT
RECE1: CJNE A,#44H,RECE2 ;收到"D"进入有效值采集程序,R1置1
MOV R6,#01H
MOV R1,#01H
CLR P3.5 ;闪1次
LCALL D1s
SETB P3.5
LJMP OUT
RECE2: CJNE A,#53H,OUT ;收到"S",传输数据
LCALL SEND
OUT: POP A
SETB EA ;开中断
RETI
CAIJI: CJNE R1,#01H,CJ1 ;R1为1进行有效值采集,否则转至CJ1正常波形采集
CJ0: MOV TCON,#01H ;IT0=1,边沿触发
MOV R4,#01H
MOV R7,#00H
MOV R0,#08H
CLR P2.0 ;ST=0
CLR P3.4 ;OE=0
CLR P2.2 ;ALE=0
CLR P2.7 ;片选
CLR P3.3 ;选通4路,电流正半波
CLR P3.5
SETB P2.1
LJMP CAIJI1
CJ1: MOV DPTR,#0000H ;DPTR=0,偶数地址存0路数据,奇数地址存1路数据
MOV TCON,#01H ;IT0=1,边沿触发方式,负跳变
MOV R2,#00H
MOV R7,#00H
CLR P2.0 ;ST=0
CLR P3.4 ;OE=0
CLR P2.2 ;ALE=0
CLR P2.7 ;片选
CLR P3.3 ;选通0路,,输入电压
CLR P3.5
CLR P2.1
MOV R2,#01H
CAIJI1: SETB P2.2 ;通路地址锁存
CLR P2.2
SETB P2.0 ;ADC0809输出端清零
CLR P2.0 ;启动A/D转换
MOV IE,#81H
WAIT1: NOP ;等待中断
CJNE R1,#01H,WAIT2 ;判断是有效值采集则顺序执行
JNB RI,WAIT2
CLR RI
MOV A,SBUF
CJNE A,#54H,WAIT2
LJMP START
WAIT2: CJNE R7,#01H,WAIT3
LJMP BJ00
WAIT3: LJMP WAIT1
INT0: CLR EA
PUSH A
CJNE R1,#01H,INT02
INT01: SETB P3.4 ;输出使能有效
MOV P1,#0FFH
NOP
NOP
LCALL D5ms ;0.5ms延时
MOV A,P1
MOV @R0,A ;数据转存
CLR P3.4 ;关闭输
CJNE R0,#3AH,C1
MOV R7,#01H
LJMP SHAN
C1: INC R0
INT1: CJNE R4,#01H,INT2
CLR P3.3 ;选通4路,电流正半波
CLR P3.5
SETB P2.1
SETB P2.2 ;通路地址锁存
CLR P2.2
LJMP NEXT
INT2: CLR P3.3 ;选通0路,电压正半波
CLR P3.5
CLR P2.1
SETB P2.2 ;通路地址锁存
CLR P2.2
LJMP NEXT
INT02: SETB P3.4 ;输出使能有效
MOV P1,#0FFH
NOP
NOP
MOV A,P1
MOVX @DPTR,A ;数据转存
CLR P3.4 ;关闭输出
MOV A,DPH ;判断是否存满
CJNE A,#7FH,SL
MOV A,DPL
CJNE A,#0FFH,SL
MOV R7,#01H
LJMP SHAN
SL: INC DPTR ;继续采集
Zero: CJNE R2,#00H,First
CLR P3.3 ;选通0路,电压正半波
CLR P3.5
CLR P2.1
SETB P2.2 ;通路地址锁存
CLR P2.2
MOV R2,#01H
LJMP NEXT
First: CJNE R2,#01H,Second
SETB P3.3 ;选通1路,电压负半波
CLR P3.5
CLR P2.1
SETB P2.2 ;通路地址锁存
CLR P2.2
MOV R2,#02H
LJMP NEXT
Second: CJNE R2,#02H,Third
CLR P3.3 ;选通4路,电流正半波
CLR P3.5
SETB P2.1
SETB P2.2 ;通路地址锁存
CLR P2.2
MOV R2,#03H
LJMP NEXT
Third: SETB P3.3 ;选通5路,电流负半波
CLR P3.5
SETB P2.1
SETB P2.2 ;通路地址锁存
CLR P2.2
MOV R2,#00H
NEXT: SETB P2.0 ;ADC0809再次采集
CLR P2.0
SETB EA
SHAN: NOP
POP A
RETI
BJ00: NOP
CJNE R1,#00H,BJ01
NOP
LCALL SH2
LJMP START
BJ01: LCALL BB ;调用去毛刺,比较求最大值子程序
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FDH ;设置波特率为9600b/s
MOV TL1,#0FDH
SETB TR1
MOV A,@R0 ;最大值放入A中
MOV SBUF,A
JNB TI,$
CLR TI ;发送完毕
CJNE R4,#01H,ZH ;R2=0,采集的是电压值,
MOV R4,#00H ;采集电压
MOV R7,#00H
MOV R0,#08H
CLR P2.0 ;ST=0
CLR P3.4 ;OE=0
CLR P2.2 ;ALE=0
CLR P2.7 ;片选
CLR P3.3 ;选通0路,输入电压
CLR P3.5
CLR P2.1
LJMP CAIJI1
ZH: LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LCALL D1s
LJMP CJ0
;比较子程序
BB: MOV R0,#08H
CJNE R4,#01H,J1
B0: CJNE R0,#39H,B1 ;判断是否比较完
LJMP J1
B1: CLR C
MOV A,@R0
INC R0
MOV 7AH,@R0
CJNE A,7AH,B2
LJMP B0
B2: JNC B0 ;C=0则A>R0,转B0
B3: CJNE R0,#39H,B4
LJMP J1
B4: MOV A,@R0 ;A<R0,把R0赋给A
CLR C
INC R0
MOV 7AH,@R0
CJNE A,7AH,B5
LJMP B0
B5: JNC B6 ;C=0则A>R0,转B6
LJMP B3
B6: DEC R0
MOV @R0,#00H ;把毛刺赋0
INC R0 ;指向下一单元
LJMP B0
J1: MOV R0,#0AH
MOV A,@R0
BJ: CJNE R0,#38H,BJ1
LJMP BJ2
BJ1: INC R0
MOV 7AH,@R0
CJNE A,7AH,BJ3
LJMP BJ
BJ3: JNC BJ ;A>R0,返回继续比较
MOV A,@R0 ;A<R0,将R0赋给A
LJMP BJ
BJ2: MOV @R0,A ;最大值放在R0中
RET
;发送1字节子程序
SEND1: CLR ES
MOV SBUF,A
JNB TI,$
CLR TI
SETB ES
RET
;发送32K外部存储器数据子程序
SEND: MOV DPTR,#0000H ;首地址
S1: MOVX A,@DPTR
LCALL SEND1 ;调发送1字节子程序
MOV R2,DPH ;判断是否传完
CJNE R2,#07FH, NEXT1
MOV R3,DPL
CJNE R3,#0FFH,NEXT1
CLR P3.5 ;发送完灯熄灭
LJMP OVER
NEXT1: INC DPTR
LJMP S1
OVER: RET
D1s: MOV R3,#0C8H ;延时1s
DL1: LCALL D5ms
LCALL D5ms
LCALL D5ms
LCALL D5ms
LCALL D5ms
LCALL D5ms
LCALL D5ms
LCALL D5ms
LCALL D5ms
LCALL D5ms
DJNZ R3,DL1
RET
D5ms: MOV R5,#49H
DL2: NOP
NOP
DJNZ R5,DL2
RET
SH2: CLR P3.5
LCALL D1s ;闪2次
SETB P3.5
LCALL D1s
CLR P3.5
LCALL D1s
SETB P3.5
LCALL D1s
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -