§2.3.2软件结构及程序设计一、主程序及其说明ORG 0000HAJMP MAIN ;主程序ORG 0003HAJMP X0S ;外部中断入口ORG 000BHLJMP T0S ;定时器T0中断入口ORG 001BHAJMP T1S ;定时器T1中断入口ORG 0023HLJMP SSV ;串行中断入口ORG 0030HMAIN: CLR EAMOV SP, #50HMOV A, 48H ;48H、49H单元为冷热启动标志单元CJNE A, #0AAH, LRE ;如等于0AAH、55H,则说明为热启动MOV A, 49H ;否则,为冷启动,则进行自检CJNE A, #55H, LRESJMP HRELRE: LCALL ZJ ;冷启动,则自检SETD: MOV 48H,#0AAH ;自检完后,设置为热启动标志字节MOV 49H,#55HHRE: MOV A, P1 ;读判采样周期档位ANL A, #0FHXRL A, #09HJZ M17 ;数据掉电保护故不进行采样,分析原数据 SJMP M18M17: CLR P3.5AJMP M19M18: MOV R7, #00H ;非掉电保护方式,则将所有采样数据单元 MOV DPTR,#8020H ;清0MOV R6, #00HMOV A, R6M20: MOVX @DPTR,AINC R7INC DPTRCJNE R7,#00H, M20M21: MOV R7,#19HMOV DPTR, #8000HMOV A, #14HM1: MOVX @DPTR, AINC DPTRDJNZ R7,M1SETB IT0CLR P3.5MOV TMOD,#11HM0: MOV A, P1ANL A, #0FHJNZ M2MOV TH0,#0FFH ;由T0设置采样周期MOV TL0,#0F6HMOV 3EH,#02HAJMP M10M2: JB ACC.3,M10JB ACC.2,M8JB ACC.1,M7MOV TH0,#0FFHMOV TL0,#0CEHMOV 3EH,#00HM8: JB ACC.1,M6 JB ACC.0,M5 MOV TH0,#0FCH MOV TL0,#18H MOV 3EH,#10H AJMP M9M7: JB ACC.0,M4 MOV TH0,#0FFH MOV TL0,#9CH MOV 3EH,#01H AJMP M9M6: JB ACC.0,M3 MOV TH0,#0ECH MOV TL0,#78H MOV 3EH,#13H AJMP M9M5: MOV TH0,#0F8H MOV TL0,#30H MOV 3EH,#12H SJMP M9M4: MOV TH0,#0FEH MOV TL0,#0CH MOV 3EH,#03H SJMP M9M3: MOV TH0,#0D8H MOV TL0,#0F0H MOV 3EH,#11H SJMP M9M10: LCALL ERRM9: MOV 3CH,TL0MOV 3DH,TH0MOV A, 3EHMOV DPTR,#8019HMOVX @DPTR,AMOV IE, #8BHMOV IP, #02HCLR 00H ;等待INT0采样中断M11: JNB 00H,M11MOV IE, #88HM23: MOV DPTR,#0E000HMOVX A, @DPTRMOV A, P1ANL A, #0F0HMOV DPTR,#801AHMOVX @DPTR,AM19: MOV IE, #88HACALL ST2 ;建立TB2显示内容表ACALL CALS ;计算信号峰值、均值、脉宽 LCALL TRS ;工程量转换M12: MOV DPTR,#0F000HMOVX A, @DPTRMOV A, P1 ;读显示方式开关JB ACC.4, M13ACALL SD ;固定显示SJMP M12M13: JB ACC.5, M14LCALL XPD ;分页显示SJMP M12M14: JB ACC.6, M15LCALL SLD ;滑移显示SJMP M12M15: JB ACC.7, M16ACALL DCH ;字符显示,将分析结果显示在示波器上SJMP M12M16: JB P3.4, M12 ;是否通信?=0,说明要通信JB P3.3, M16 ;开始通信?=0,说明开始通信;数据通信,以便在上位机上进行数据硬拷贝、FFT分析等LCALL SENT ;数据向上位机发送通信SJMP M12外部中断INT0中断服务程序清单如下:X0S: MOV DPTR, #2000H ;启动A/D转换MOVX @DPTR, ASETB TR0 ;启动T0定时MOV 3AH, #20H ;存储区首地址0020HMOV 3BH, #00HMOV R7, #00H ;存储计数器送初值1024MOV R6, #04HCLR 70H ;系统自检标志清除,即为正常的工作程序而非自检X0S0: CLR 01HX0S1: JNB 01H, X0S1 ;等待T0定时中断CJNE R6, #00H, X0S0 ;1024个数据全部采样完成?CJNE R7, #00H, X0S0 ;否,则继续采集CLR TR0 ;是,则停T0CLR EX0 ;关外中断INT0SETB 00HRETI定时器TIMER0中断服务程序清单如下:T0S: JNB 70H, T0S1 ;判是否为系统自检(其中的中断系统)CLR 70H ;是,则清标志后直接返回RETIT0S1: SETB 01HCLR TR0 ;停止T0MOV TH0, 3DH ;送T0原时间常数MOV TL0, 3CHSETB TR0 ;启动T0定时MOVX A, @DPTR ;读入A/D结果MOV DPH, 3BH ;按指针存储MOV DPL, 3AHMOVX @DPTR, AINC DPTR ;指向下一个单元MOV 3BH, DPH ;指针保护MOV 3AH, DPLMOV DPTR, #2000H ;指向A/D接口DEC R7 ;存储计数器减1CJNE R7, #0FFH, T0S2DEC R6T0S2: RETI2.显示字符与汉字的程序实现;*********************************************************************** ;显示字符示例子程序,程序中的TB1、TB2、TB3三表分别为;TB1:各字符的显示点阵在字库中的首地址表,在内部EEPROM中;TB2:各字符的代码表,在外部RAM中,由子程序建立,例如:0AH代表“峰”;TB3:各字符的位置坐标,在内部EEPROM中;*********************************************************************** DCH: MOV R0, #00H ;当前显示字符序号指针DCH1: MOV DPTR, #0000H ;查TB2表得当前显示字符的代码MOV A, DPLADD A, R0MOV DPL,AJNC DCH2INC DPHDCH2: MOVX A, @DPTR ;送存30H单元MOV 30H,ACJNE A, #14H, DCH3 ;非空格码转DCH3AJMP DCH7 ;是空格码转DCH7DCH3: MOV A, R0 ;查TB3表得显示字符的位置坐标ADD A, 0E0HPUSH ACCMOV DPTR, #0630HMOVC A, @A+DPTRMOV 31H,A ;位置X坐标送存31HPOP ACCINC ACCMOVC A, @A+DPTRMOV 32H,A ;位置Y坐标送存32HMOV A, 30H ;查TB1表得字符点阵在字库中的地址ADD A, 30HPUSH ACCMOV DPTR, #0600HMOVC A, @A+DPTRMOV 33H,A ;地址高字节送33HPOP ACCINC ACCMOVC A, @A+DPTRMOV 34H,A ;地址低字节送34HMOV DPH,33H ;取本字符光点数送R1MOV DPL,34HMOV A, #00HMOVC A, @A+DPTRMOV R1, ADCH4: INC DPTR ;取光点坐标数据MOV A, #00HMOVC A, @A+DPTR ;光点X坐标送R7ANL A, #0F0HSW AP AADD A, 31HMOV R7, AMOV A, #00H ;光点Y坐标送R6MOVC A, @A+DPTRANL A, #0FHADD A, 32HMOV R6, APUSH DPHPUSH DPLMOV DPTR, #4000H ;输出光点X坐标MOV A, R7MOVX @DPTR,AMOV DPTR, #6000H ;输出光点Y坐标MOV A, R6MOVX @DPTR,AMOV DPTR, #8000H ;X、Y同时输出至CRTMOVX @DPTR, ADEC R1 ;光点计数器减1CJNE R1, #00H, DCH5 ;本字符显示完未成,转显示下个点SJMP DCH6DCH5: POP DPLPOP DPHAJMP DCH4DCH6: POP DPL ;恢复指针POP DPHDCH7: INC R0 ;序号指针增1CJNE R0, #19H, DCH8 ;一帧未完成转显示下个字符RET ;一帧完成,则返回DCH8: AJMP DCH15.程序设计示例;************************************************************************* ;滑移显示子程序,具有暂停功能,在CRT右上角显示对应页号.;************************************************************************* SLD:MOV DPTR,#0020H ;数据指针初值0020HMOV TH1, #0FFH ;送T1时间常数,每点50usMOV TL1, #0EEHMOV 46H, #0FFHMOV 45H, #0EEHSETB ET1 ;开放T1中断SLD0:MOV R7,#00H ;每帧点数计数器清零PUSH DPH ;保护数据指针PUSH DPLSETB TR1 ;启动T1SLD1:CLR 02HSLD2:JNB 02H,SLD2 ;等待T1中断MOVX A,@DPTR ;按指针取数PUSH DPHPUSH DPLMOV DPTR,#6000H ;向Y轴输出MOVX @DPTR, AMOV A, R7MOV DPTR, #4000H ;向X轴输出MOVX @DPTR, AMOV DPTR, #8000H ;同时联合输出到CRTMOVX @DPTR, APOP DPLPOP DPHINC DPTR ;指向下个数据INC DPTR ;计数器减1INC R7CJNE R7, #00H, SLD1 ;本帧(256个数据)未完成则循环SLD3: POP DPL ;恢复数据指针POP DPHMOV A, DPL ;判是否已到数据末地址(即最后一个数据)CJNE A, #20H, SLD4 ;未到,修改数据指针初值转显示下帧MOV A, DPHCJNE A, #04H, SLD4CLR ET1 ;滑移显示完成,关T1LR TR1RETSLD4: JNB P3.0, SLD0 ;是暂停?是则转SLD0INC DPTR ;否则继续滑移显示SJMP SLD0串行通信中断服务子程序清单及其说明如下:SSV: CLR TI ;清发送中断标志DEC R7 ;计数器减1CJNE R7, #0FFH, SSV1DEC R6SSV1: CJNE R6, #00H, SSV2 ;计数器非0,则转SSV2 CJNE R7, #00H, SSV2CLR ES ;为0,则发送完成,关串行中断SJMP SSV3SSV2: INC DPTR ;指向下一个数据MOVX A, @DPTR ;取数LCALL XSS ;补校验位后发送SSV3: RETI补校验位并发送子程序清单:XSS: ADD A, #00H ;加入校验位MOV C, PMOV TB8, CMOV SBUF, A ;发送RET。