一、主程序及其说明
ORG 0000H
AJMP MAIN ;主程序
ORG 0003H
AJMP X0S ;外部中断入口
ORG 000BH
LJMP T0S ;定时器T0中断入口
ORG 001BH
AJMP T1S ;定时器T1中断入口
ORG 0023H
LJMP SSV ;串行中断入口
ORG 0030H
MAIN: CLR EA
MOV SP, #50H
MOV A, 48H ;48H、49H单元为冷热启动标志单元
CJNE A, #0AAH, LRE ;如等于0AAH、55H,则说明为热启动
MOV A, 49H ;否则,为冷启动,则进行自检
CJNE A, #55H, LRE
SJMP HRE
LRE: LCALL ZJ ;冷启动,则自检
SETD: MOV 48H,#0AAH ;自检完后,设置为热启动标志字节
MOV 49H,#55H
HRE: MOV A, P1 ;读判采样周期档位
ANL A, #0FH
XRL A, #09H
JZ M17 ;数据掉电保护故不进行采样,分析原数据
SJMP M18
M17: CLR P3.5
AJMP M19
M18: MOV R7, #00H ;非掉电保护方式,则将所有采样数据单元
MOV DPTR,#8020H ;清0
MOV R6, #00H
MOV A, R6
M20: MOVX @DPTR,A
INC R7
INC DPTR
CJNE R7,#00H, M20
M21: MOV R7,#19H
MOV DPTR, #8000H
MOV A, #14H
M1: MOVX @DPTR, A
INC DPTR
DJNZ R7,M1
SETB IT0
CLR P3.5
MOV TMOD,#11H
M0: MOV A, P1
ANL A, #0FH
JNZ M2
MOV TH0,#0FFH ;由T0设置采样周期
MOV TL0,#0F6H
MOV 3EH,#02H
AJMP M10
M2: JB ACC.3,M10
JB ACC.2,M8
JB ACC.1,M7
MOV TH0,#0FFH
MOV TL0,#0CEH
MOV 3EH,#00H
AJMP M9
M8: JB ACC.1,M6
JB ACC.0,M5
MOV TH0,#0FCH
MOV TL0,#18H
MOV 3EH,#10H
AJMP M9
M7: JB ACC.0,M4
MOV TH0,#0FFH
MOV TL0,#9CH
MOV 3EH,#01H
AJMP M9
M6: JB ACC.0,M3
MOV TH0,#0ECH
MOV TL0,#78H
MOV 3EH,#13H
AJMP M9
M5: MOV TH0,#0F8H
MOV TL0,#30H
MOV 3EH,#12H
SJMP M9
M4: MOV TH0,#0FEH
MOV TL0,#0CH
MOV 3EH,#03H
SJMP M9
M3: MOV TH0,#0D8H
MOV TL0,#0F0H
MOV 3EH,#11H
SJMP M9
M10: LCALL ERR
AJMP M0
M9: MOV 3CH,TL0
MOV 3DH,TH0
MOV A, 3EH
MOV DPTR,#8019H
MOVX @DPTR,A
MOV IE, #8BH
MOV IP, #02H
CLR 00H ;等待INT0采样中断
M11: JNB 00H,M11
MOV IE, #88H
M23: MOV DPTR,#0E000H
MOVX A, @DPTR
MOV A, P1
ANL A, #0F0H
MOV DPTR,#801AH
MOVX @DPTR,A
M19: MOV IE, #88H
ACALL ST2 ;建立TB2显示内容表
ACALL CALS ;计算信号峰值、均值、脉宽
LCALL TRS ;工程量转换
M12: MOV DPTR,#0F000H
MOVX A, @DPTR
MOV A, P1 ;读显示方式开关
JB ACC.4, M13
ACALL SD ;固定显示
SJMP M12
M13: JB ACC.5, M14
LCALL XPD ;分页显示
SJMP M12
M14: JB ACC.6, M15
LCALL SLD ;滑移显示
SJMP M12
M15: JB ACC.7, M16
ACALL DCH ;字符显示,将分析结果显示在示波器上
SJMP M12
M16: JB P3.4, M12 ;是否通信?=0,说明要通信
JB P3.3, M16 ;开始通信?=0,说明开始通信
;数据通信,以便在上位机上进行数据硬拷贝、FFT分析等
LCALL SENT ;数据向上位机发送通信
SJMP M12
外部中断INT0中断服务程序清单如下:
X0S: MOV DPTR, #2000H ;启动A/D转换
MOVX @DPTR, A
SETB TR0 ;启动T0定时
MOV 3AH, #20H ;存储区首地址0020H
MOV 3BH, #00H
MOV R7, #00H ;存储计数器送初值1024
MOV R6, #04H
CLR 70H ;系统自检标志清除,即为正常的工作程序而非自检
X0S0: CLR 01H
X0S1: JNB 01H, X0S1 ;等待T0定时中断
CJNE R6, #00H, X0S0 ;1024个数据全部采样完成?
CJNE R7, #00H, X0S0 ;否,则继续采集
CLR TR0 ;是,则停T0
CLR EX0 ;关外中断INT0
SETB 00H
RETI
定时器TIMER0中断服务程序清单如下:
T0S: JNB 70H, T0S1 ;判是否为系统自检(其中的中断系统)
CLR 70H ;是,则清标志后直接返回
RETI
T0S1: SETB 01H
CLR TR0 ;停止T0
MOV TH0, 3DH ;送T0原时间常数
MOV TL0, 3CH
SETB TR0 ;启动T0定时
MOVX A, @DPTR ;读入A/D结果
MOV DPH, 3BH ;按指针存储
MOV DPL, 3AH
MOVX @DPTR, A
INC DPTR ;指向下一个单元
MOV 3BH, DPH ;指针保护
MOV 3AH, DPL
MOV DPTR, #2000H ;指向A/D接口
DEC R7 ;存储计数器减1
CJNE R7, #0FFH, T0S2
DEC R6
T0S2: RETI
2.显示字符与汉字的程序实现
;***********************************************************************
;显示字符示例子程序,程序中的TB1、TB2、TB3三表分别为
;TB1:各字符的显示点阵在字库中的首地址表,在内部EEPROM中
;TB2:各字符的代码表,在外部RAM中,由子程序建立,例如:0AH代表“峰”
;TB3:各字符的位置坐标,在内部EEPROM中
;***********************************************************************
DCH: MOV R0, #00H ;当前显示字符序号指针
DCH1: MOV DPTR, #0000H ;查TB2表得当前显示字符的代码
MOV A, DPL
ADD A, R0
MOV DPL,A
JNC DCH2
INC DPH
DCH2: MOVX A, @DPTR ;送存30H单元
MOV 30H,A
CJNE A, #14H, DCH3 ;非空格码转DCH3
AJMP DCH7 ;是空格码转DCH7
DCH3: MOV A, R0 ;查TB3表得显示字符的位置坐标
ADD A, 0E0H
PUSH ACC
MOV DPTR, #0630H
MOVC A, @A+DPTR
MOV 31H,A ;位置X坐标送存31H
POP ACC
INC ACC
MOVC A, @A+DPTR
MOV 32H,A ;位置Y坐标送存32H
MOV A, 30H ;查TB1表得字符点阵在字库中的地址
ADD A, 30H
PUSH ACC
MOV DPTR, #0600H
MOVC A, @A+DPTR
MOV 33H,A ;地址高字节送33H
POP ACC
INC ACC
MOVC A, @A+DPTR
MOV 34H,A ;地址低字节送34H
MOV DPH,33H ;取本字符光点数送R1
MOV DPL,34H
MOV A, #00H
MOVC A, @A+DPTR
MOV R1, A
DCH4: INC DPTR ;取光点坐标数据
MOV A, #00H
MOVC A, @A+DPTR ;光点X坐标送R7
ANL A, #0F0H
SWAP A
ADD A, 31H
MOV R7, A
MOV A, #00H ;光点Y坐标送R6
MOVC A, @A+DPTR
ANL A, #0FH
ADD A, 32H
MOV R6, A
PUSH DPH
PUSH DPL
MOV DPTR, #4000H ;输出光点X坐标
MOV A, R7
MOVX @DPTR,A
MOV DPTR, #6000H ;输出光点Y坐标
MOV A, R6
MOVX @DPTR,A
MOV DPTR, #8000H ;X、Y同时输出至CRT
MOVX @DPTR, A
DEC R1 ;光点计数器减1
CJNE R1, #00H, DCH5 ;本字符显示完未成,转显示下个点
SJMP DCH6
DCH5: POP DPL
POP DPH
AJMP DCH4
DCH6: POP DPL ;恢复指针
POP DPH
DCH7: INC R0 ;序号指针增1
CJNE R0, #19H, DCH8 ;一帧未完成转显示下个字符
RET ;一帧完成,则返回
DCH8: AJMP DCH1
5.程序设计示例
;*************************************************************************
;滑移显示子程序,具有暂停功能,在CRT右上角显示对应页号.
;*************************************************************************
SLD: MOV DPTR,#0020H ;数据指针初值0020H
MOV TH1, #0FFH ;送T1时间常数,每点50us
MOV TL1, #0EEH
MOV 46H, #0FFH
MOV 45H, #0EEH
SETB ET1 ;开放T1中断
SLD0: MOV R7,#00H ;每帧点数计数器清零
PUSH DPH ;保护数据指针
PUSH DPL
SETB TR1 ;启动T1
SLD1: CLR 02H
SLD2: JNB 02H,SLD2 ;等待T1中断
MOVX A,@DPTR ;按指针取数
PUSH DPH
PUSH DPL
MOV DPTR,#6000H ;向Y轴输出
MOVX @DPTR, A
MOV A, R7
MOV DPTR, #4000H ;向X轴输出
MOVX @DPTR, A
MOV DPTR, #8000H ;同时联合输出到CRT
MOVX @DPTR, A
POP DPL
POP DPH
INC DPTR ;指向下个数据
INC DPTR ;计数器减1
INC R7
CJNE R7, #00H, SLD1 ;本帧(256个数据)未完成则循环
SLD3: POP DPL ;恢复数据指针
POP DPH
MOV A, DPL ;判是否已到数据末地址(即最后一个数据)
CJNE A, #20H, SLD4 ;未到,修改数据指针初值转显示下帧
MOV A, DPH
CJNE A, #04H, SLD4
CLR ET1 ;滑移显示完成,关T1
LR TR1
RET
SLD4: JNB P3.0, SLD0 ;是暂停?是则转SLD0
INC DPTR ;否则继续滑移显示
SJMP SLD0
串行通信中断服务子程序清单及其说明如下:
SSV: CLR TI ;清发送中断标志
DEC R7 ;计数器减1
CJNE R7, #0FFH, SSV1
DEC R6
SSV1: CJNE R6, #00H, SSV2 ;计数器非0,则转SSV2
CJNE R7, #00H, SSV2
CLR ES ;为0,则发送完成,关串行中断
SJMP SSV3
SSV2: INC DPTR ;指向下一个数据
MOVX A, @DPTR ;取数
LCALL XSS ;补校验位后发送
SSV3: RETI
补校验位并发送子程序清单:
XSS: ADD A, #00H ;加入校验位
MOV C, P
MOV TB8, C
MOV SBUF, A ;发送
RET