⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdxhfsq.asm

📁 为了让广大的工科大学生理解单片机应用系统的开发方法
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	CPL    A		;A取反
	MOVC   A, @A+DPTR	;取出表中07DDH偏移A值的键值
	MOV    5AH, A		;将A值送5AH
L042CH: 			;
	CLR    00H		;00H清0
	AJMP   L043CH		;短跳转至L043CH
L0430H: 			;
	JBC    00H, L0439H	;不同,说明按键有改变,若00H为1,则跳转至L0439H,且清零00H
	MOV    59H, A		;初次按键,将A送59H
	SETB   00H		;00H置1
	AJMP   L043CH		;短跳转至L043CH
L0439H: 			;
	MOV    59H, #0FFH	;初次按键是抖动,11111111B送59H
L043CH: 			;
	INC    2DH		;2DH内容加1
	POP    DPL		;
	POP    DPH		;
	POP    B		;
	POP    ACC		;
	POP    PSW		;恢复现场
	RETI			;T0中断返回
;===============================;
;中断服务子程序模块群            ;
;===============================;
L0449H: 			;
	CLR    TR0		;禁止T0计时
	MOV    A, #7FH		;
	ADD    A, TL0		;
	MOV    TL0, A		;
	MOV    A, #0ECH 	;
	ADDC   A, TH0		;时间常数是10000H-EC7FH=4993
	MOV    TH0, A		;设置定时值5mS
	SETB   TR0		;允许T0计时,4.993mS发生中断
	MOV    PSW, #18H	;用3区
	MOV    R2, #08H 	;循环计数器复赋初值8,表示循环8次(循环初始化)
	MOV    R3, #00H 	;从0通道开始,循环初始化
L0460H: 			;循环地址标号,循环体的开始
	MOV    DPTR, #8000H	;送波形数据存储器27C1001的页选端口地址8000H
	MOV    A, R3		;将波形通道作为页选择码,共有8页:0页/1页/2页/3页/4页/5页/6页/7页/,每页16K波形数据
	MOVX   @DPTR, A 	;将A的值送所选端口,即EPROM芯片27C1001选(R3)页
	MOV    DPL, 57H 	;
	MOV    DPH, 58H 	;将波形数据存放的地址指针58H_57H的内容送DPTR
	MOVX   A, @DPTR 	;取出波形数据
	JNB    08H, L0483H	;正常心电ECG是1,异常心电ARRHY和WAVE时是0,初始化时是1,非正常心电则跳转至L0483H
;正常心电波形修正
	PUSH   DPH		;正常心电波形D/A处理程序开始。
	PUSH   DPL		;暂存波形数据指针
	MOV    DPTR, #08DDH	;送表首地址08DDH
	MOV    B, A		;将A中波形数据暂存B
	MOV    A, R3		;将波形通道R3的内容送A
	MOVC   A, @A+DPTR	;取出表中08DDH偏移(R3)的修正值: 23, -7, 20, 30, 10,-20,-40,-30
	ADD    A, B		;A=A+B(修正)
	POP    DPL		;
	POP    DPH		;取回波形数据指针
	LCALL  L0605H		;调L0605H子程序,修正后的值进行预处理,包括增益值一起考虑
L0483H: 			;正常心电经过预处理到此,其它波形数据不用预处理就到此处
	JB     0FH, L048CH	;若不存在的波形类型,0FH为1,则跳转至L048CH
	JNB    09H, L049CH	;存在的波形类型,但又不若是正常心电ECG、也不是异常心电ARRHY,09H为0,则跳转至L049CH
	JNB    05H, L049CH	;若是正常心电ECG和异常心电ARRHY,09H为1,若关闭了NIOS功能,则跳转至L049CH
;叠加噪声处理
L048CH: 			;不存在的波形类型或是正常心电ECG和异常心电ARRHY,09H为1,若启用了NIOS功能均到此。
	CJNE   R3, #00H, L0493H ;若不是进行0通道的D/A转换,则跳转至L0493H
	ADD    A, 5EH		;A=A+随机数(5EH),范围-4~+3
	AJMP   L049CH		;短跳转至L049CH
L0493H: 			;
	CJNE   R3, #01H, L049AH ;若不是进行1通道的D/A转换,则跳转至L049AH
	ADD    A, 5FH		;A=A+A+另外一个随机数(5FH),范围也是-4~+3
	AJMP   L049CH		;短跳转至L049CH
L049AH: 			;
	ADD    A, 5CH		;2~7通道的D/A转换,A=A+随机数(5CH),范围-8~+7
L049CH: 			;无论加不加NIOS信号均到此
	JNB    0DH, L04C0H	;若是不存在的波形类型,0DH不为0,则跳转至L04C0H
	MOV    B, A		;是存在的波形类型,将波形数据A暂存到B
	MOV    A, P1		;将键盘口P1的内容送A,按下为0,不按为1
	CPL    A		;A按位取反,按下为1,不按为0
	ANL    A, #04H		;保留∩键的值
	JZ     L04BEH		;∩键未按,则跳转至L04BEH
;增加定标信息
	PUSH   DPH		;∩键按下了
	PUSH   DPL		;DPTR入栈暂存
	MOV    DPTR, #0948H	;取表首地址0948H
	MOV    A, 27H		;将定标信号或正弦信号加在那里?0~7
	RL     A		;
	RL     A		;
	RL     A		;放大8倍
	ADD    A, R3		;A=A+D/A通道号
	MOVC   A, @A+DPTR	;查出表中0948H偏移(R3)的脉冲波形数据
	ADD    A, B		;A=A+B叠加到波形中
	MOV    B, A		;将A值暂存B
	POP    DPL		;
	POP    DPH		;恢复DPTR
L04BEH: 			;
	MOV    A, B		;将处理后的波形数据送A
L04C0H: 			;
	JNB    0EH, L04CDH	;若不处于定标波形类型,则跳转至L04CDH
;波形幅度修正
	PUSH   5BH		;处于定标波形类型,暂存增益值
	MOV    5BH, #80H	;假设增益是x1.0,128送5BH
	LCALL  L0605H		;调L0605H子程序,作波形数据处理(但不放大不压缩)
	POP    5BH		;恢复正常的增益码
L04CDH: 			;无论那种类型的波形,均已处理过
	CPL    A		;将波形数据反相(因为模拟电路带反相放大??)
	MOV    R4, A		;规定D/A数据存放到3区的R4,D/A通道在3区的R3中
	LCALL  L0763H		;调L0763H子程序	:D/A模块
	INC    R3		;改到下一个通道
	DJNZ   R2, L0460H	;若R2的内容减1不为0,则跳转至L0460H继续调波形数据输出
	JNB    06H, L04F6H	;若未启用标记信号处理,则跳转至L04F6H
	INC    5DH		;启用了标记信号处理,标记时间计时器加1(5mS)
	MOV    A, 5DH		;将5DH的内容送A
	CJNE   A, #64H, L04E3H	;未到500mS,则跳转至L04E3H
;中断服务时置该标志,主程序才可能将06H、07H标志清0
	SETB   07H		;定标作用时间到标志置1,准备关闭定标信号
	AJMP   L04F6H		;短跳转至L04F6H
L04E3H: 			;启用了定标信号处理还需要进一步处理
	MOV    R0, #28H 	;与定标信息有关的28H、29H中的数据送D/A输出,地址28H送R0
	MOV    R3, 27H		;具体通道由27H的内容决定 D/A通道
	LCALL  L072EH		;调L072EH子程序,修改成标记
	MOV    A, #01H		;1送A
	CLR    C		;CY清0
	SUBB   A, R3		;A=A-(R3)-CY
	JC     L04F6H		;27H中存放的是2通道以上,即V1~V6若,则跳转至L04F6H
	MOV    R0, #2AH 	;非V1~V6通道,与定标信息有关的2AH、2BH中的数据送D/A输出,地址2AH送R0
	MOV    R3, A		;27H中存放的是1通道,补0通道的定标波形输出;27H中存放的是0通道,补1通道的定标波形输出
	LCALL  L072EH		;调L072EH子程序,修改为标记
L04F6H: 			;所有情况均要到此
	CLR    P3.5		;P3.5清0
	SETB   P3.5		;P3.5置1,给D/A芯片的LDA引脚发负脉冲
	INC    DPTR		;指向下一个波形数据
	MOV    A, DPL		;将DPL送A
	CJNE   A, 53H, L0549H	;不到波形数据末地址,则跳转至L0549H
	MOV    A, DPH		;将DPH送A
	CJNE   A, 54H, L0549H	;不到波形数据末地址,则跳转至L0549H
	INC    56H		;到了波形数据末地址,由多结构组合成波形时的波序计数器加1
	JNB    04H, L0524H	;没有出现因波形类型修改后要处理的内容,则跳转至L0524H
	CLR    04H		;因波形类型修改后有要处理的内容,清除该标志,表示没有了因波形类型修改后要处理的内容
	MOV    PSW, #08H	;改到1区
	MOV    55H, R1		;将1区中的R1的内容送55H,是存放的波形类型代码。
	MOV    PSW, #18H	;回到3区,
	MOV    DPTR, #0F9DH	;送表首地址0F9DH
	MOV    A, 55H		;将波形类型代码送A
	MOVC   A, @A+DPTR	;取出表中0F9DH偏移(55H)的标志送标志组08H~0FH
	MOV    21H, A		;将A值送21H
	JNB    0AH, L0521H	;不是正弦波定标信号的话转,则跳转至L0521H
	SETB   12H		;是正弦波定标信号,应该先进行过渡波形输出,故置12H标志
L0521H: 			;
	MOV    56H, #00H	;波形类型切换了,由多结构组合成波形时的波序计数器清0
L0524H: 			;
	LCALL  L0664H		;调L0664H子程序:查0B1D表中1个字符:0B1DH+(波形类型55H)*16+(波序计数器56H),目前得06H
				;注意55H这个变量是1区R1变量,查表时控制行,56H控制查表信息的列,
	CJNE   A, #0FFH, L0530H ;若A值不等于FFH(是存在的结构),则跳转至L0530H
	MOV    56H, #00H	;得到的不存在的波形结构,由多结构组合成波形时的波序计数器清0
	LCALL  L0664H		;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H)
L0530H: 			;已经得到一个有效的信息
	MOV    R0, #50H 	;目的地址
	MOV    R6, #00H 	;偏移0
	MOV    R7, #05H 	;5个字节
	LCALL  L067BH		;调L067BH子程序:上次查表结果(A的值)放大5倍后再偏移(R6)开始查表09D8H送(R0)开始的RAM,送(R7)个
				;80BPM次正常心电数据为50H=120*10mS;起始地址52H_51H=4600H;末尾地址54H_53H=4696H;
	MOV    57H, 51H 	;
	MOV    58H, 52H 	;58H_57H是波形起始地址
	MOV    PSW, #10H	;设置2区
	MOV    R1, #30	 	;30送R1
	MOV    PSW, #18H	;回到3区
	AJMP   L054FH		;调L054FH子程序
L0549H: 			;
	MOV    57H, DPL 	;
	MOV    58H, DPH 	;没到波形末端地址,回存当前波形数据实际地址
L054FH: 			;
	RET			;返回
L0550H: 			;
	CLR    TR0		;禁止T0计数
	MOV    A, #0C6H 	;
	ADD    A, TL0		;
	MOV    TL0, A		;
	MOV    A, #0FCH 	;
	ADDC   A, TH0		;时间常数是10000H-FCC6H=826
	MOV    TH0, A		;设置定时值0.833mS
	SETB   TR0		;允许T0计数,0.833mS中断
	MOV    PSW, #18H	;改为3区
	MOV    DPTR, #8000H	;选中74HC273,即EPROM芯片的页选
	MOV    A, #03H		;选择第3页
	MOVX   @DPTR, A 	;选中EPROM芯片的3页,地址范围是08000H~0BFFFH的16KB
	MOV    DPL, 57H 	;
	MOV    DPH, 58H 	;当前波形指针送DPTR
	MOVX   A, @DPTR 	;取出表中DPTR指向的正弦波形数据
	PUSH   5BH		;增益入栈暂存
	MOV    5BH, #128	;将增益值是x1.0,128送增益
	LCALL  L0605H		;调L0605H子程序
	POP    5BH		;出栈恢复增益的系数值
	CPL    A		;A按位取反,考虑存在反相问题
	MOV    R4, A		;将A值送R4
	MOV    R3, 27H		;将正弦波作用通道取出送R3
	LCALL  L0763H		;调L0763H子程序	:D/A输出模块
	CLR    P3.5		;
	SETB   P3.5		;输出D/A芯片的LDA引脚一个负脉冲
	CLR    06H		;清除启用定标信号标志
	INC    DPTR		;DPTR加1,指向下一次D/A的波形地址
	MOV    A, DPL		;将DPL送A
	CJNE   A, 53H, L05D6H	;不到波形数据末地址,则跳转至L05D6H
	MOV    A, DPH		;将DPH送A
	CJNE   A, 54H, L05D6H	;不到波形数据末地址,则跳转至L05D6H
	INC    56H		;波序计数器56H的内容加1
	JNB    04H, L05B1H	;若没有因波形类型修改后要处理的内容,即04H为0,则跳转至L05B1H
	CLR    04H		;有因波形类型修改后要处理的内容,则现在处理,并且04H清0
	MOV    PSW, #08H	;变到1区
	MOV    55H, R1		;将1区R1的中存放的波形类型送55H
	MOV    PSW, #18H	;回到3区
	MOV    DPTR, #0F9DH	;送表首地址0F9DH
	MOV    A, 55H		;将55H的内容送A
	MOVC   A, @A+DPTR	;取出表中0F9DH偏移(55H)的标志送标志组08H~0FH
	MOV    21H, A		;将A值送21H
	JNB    0AH, L05AEH	;若不是正弦波定标期间,即0AH为0,则跳转至L05AEH
	SETB   12H		;是正弦波定标期间,12H置1
L05AEH: 			;
	MOV    56H, #00H	;波序计数器从0开始
L05B1H: 			;
	LCALL  L0664H		;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H)
	CJNE   A, #0FFH, L05BDH ;若A值是存在的波形结构代码,则跳转至L05BDH
	MOV    56H, #00H	;是不存在的波形结构代码,波序计数器从0开始,一定可以得到存在的波形结构
	LCALL  L0664H		;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H)
L05BDH: 			;
	MOV    R0, #50H 	;
	MOV    R6, #00H 	;
	MOV    R7, #05H 	;
	LCALL  L067BH		;调L067BH子程序:上次查表结果(A的值)放大5倍后再偏移(R6)开始查表送(R0)开始的RAM,送(R7)个
				;80BPM次正常心电数据为50H=01001011B;起始地址52H_51H=4600H;末尾地址54H_53H=4696H;
	MOV    57H, 51H 	;
	MOV    58H, 52H 	;重新安装新一轮的当前波形地址
	MOV    PSW, #10H	;设置2区
	MOV    R1, #1EH 	;30送R1
	MOV    PSW, #18H	;回到3区
	AJMP   L05DCH		;短跳转至L05DCH
L05D6H: 			;
	MOV    57H, DPL 	;
	MOV    58H, DPH 	;保存当前波形地址
L05DCH: 			;
	RET			;返回
L05DDH: 			;
	CLR    TR0		;禁止T0计数
	MOV    A, #7FH		;
	ADD    A, TL0		;
	MOV    TL0, A		;
	MOV    A, #0ECH 	;
	ADDC   A, TH0		;时间常数是10000H-EC7FH=4993
	MOV    TH0, A		;设置定时值5mS
	SETB   TR0		;允许T0计时,4.993mS发生中断
	MOV    PSW, #18H	;设置3区
	MOV    R2, #08H 	;八个通道
	MOV    R3, #00H 	;从0通道开始
L05F4H: 			;
	MOV    R4, #7FH 	;准备送7FH的数据

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -