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

📄 xdxhfsq.asm

📁 为了让广大的工科大学生理解单片机应用系统的开发方法
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;===============================;
;硬件资源分配                   ;
;===============================;
;某型号型心电信号发生器硬件和软件说明
;硬件部分资源如下:
;AT89C51--24MHz单片机,但可降低速度用于12MHz情况
;12MHz晶体
;不允许用外部程序存储器(EA=1)
;P0.0~P0.7对应地址数据复用线,当访问外部端口或读取ROM芯片中的各种心电波形数据时,分别传送低8位地址或数据。
;P1.0~P1.7是键盘接口,外部还有10K上拉电阻,若按键不按,输入高电平,按键按下,输入接地,相当于输入低电平,其中个输入对于功能键为:
;P1.0对应“MENU”键
;P1.1对应“GAIN”键
;P1.2对应“∩”键
;P1.3对应“TYPE”键
;P1.4对应“↓”键
;P1.5对应“NOIS”键
;P1.6对应“↑”键
;P1.7对应“A”键
;P2.6~P2.7对应A14~A15地址线,由74HC139译码:
;         对应于0000H~3FFFH,均有A15~A14=00B,Y0有效,无具体用;
;	  对应于4000H~7FFFH,均有A15~A14=01B,Y1有效,用于读波形数据,即芯片27C1001片选,其中A13~A0直接连27C1001芯片的地址A13~A0,A16~A14由页锁存器74HC273提供;
;	  对应于8000H~BFFFH,均有A15~A14=10B,Y2有效,用于锁存EPROM芯片27C1001页地址,即74HC273片选,写的数据位于D2~D0中,锁存后送27C1001的快地址A16~A14;
;	  对应于C000H~FFFFH,均有A15~A14=11B,Y3有效,子译码Y0有效,用于读写操作均是对液晶显示模块操作,其端口常用奇端口C001H,偶端口C000H;
;P2.0~P2.5对应A8~A13地址线,
;P3.0、P3.1没有用到。
;P3.2~P3.5用于与D/A转换器接口。其中:P3.2连LOD;P3.3连CLK;P3.4连DAT;P3.5连LDA。
;保留RD和WR功能
;===============================;
;存储资源分配:变量及标志定义    ;
;===============================;
;00H	;0区R0	;通用
;01H	;0区R1	;通用
;02H	;0区R2	;通用
;03H	;0区R3	;通用
;04H	;0区R4	;通用
;05H	;0区R5	;通用
;06H	;0区R6	;通用
;07H	;0区R7	;通用
;------------------------------------
;中断中键扫描及主程序中键处理(参数设置)模块专用区
;08H	;1区R0	;通用
;09H	;1区R1	;波形类型码寄存器,如7是正常心电80BPM
;0AH	;1区R2	;增益码寄存器,初始化时送09H,表示增益是X1.0
;0BH	;1区R3	;定标信号或正弦信号作用通道码寄存器,初始化是0
;0CH	;1区R4	;主菜单光标位置码寄存器,0是ECG,1是ARRHY,2是WAVE
;0DH	;1区R5	;键处理的20mS防抖定时计数器(4*5mS/24*0.833mS)
;0EH	;1区R6	;通用
;0FH	;1区R7	;通用
;------------------------------------
;闪烁显示处理模块专用区
;10H	;2区R0	;通用
;11H	;2区R1	;心脏字符闪烁显示周期计时器,该计时器乘以10mS作为周期,初始化是30
;12H	;2区R2	;类型字符串或增益倍率字符串闪烁显示周期计时器,该计时器乘以10mS作为周期,初始化没见,例如0.4S显示,0.4S不显示
;13H	;2区R3	;通用
;14H	;2区R4	;通用
;15H	;2区R5	;通用
;16H	;2区R6	;通用
;17H	;2区R7	;通用
;------------------------------------
;定时器中断服务程序中的L0449子程序专用区
;18H	;3区R0	;通用
;19H	;3区R1	;通用
;1AH	;3区R2  ;把各个通道进行一次D/A转换的循环次数计数器,定时器中断服务程序中的L0449子程序专用
;1BH	;3区R3	;D/A输出时存D/A通道,定时器中断服务程序中的L0449子程序专用
;1CH	;3区R4	;D/A输出时存D/A数据,定时器中断服务程序中的L0449子程序专用
;1DH	;3区R5	;通用
;1EH	;3区R6	;通用
;1FH	;3区R7	;通用
;20H	;标志寄存器
;00HBIT	EQU	20H.0	防抖处理标志,=0,根本没按过键;=1按过键,等待防抖动处理
;01HBIT	EQU	20H.1	键值有效标志,=0,5AH中的值无效;=1,5AH中的值是键值
;02HBIT	EQU	20H.2	=1是TYPE波形类型选择状态,=0非TYPE波形类型选择状态
;03HBIT	EQU	20H.3	=1是GAIN设置状态,=0非GAIN设置状态
;04HBIT	EQU	20H.4	=1是因波形类型修改后要处理的内容;=0无因波形类型修改后要处理的内容
;05HBIT	EQU	20H.5	=1是启用NOIS功能,=0关闭NOIS功能
;06HBIT	EQU	20H.6	=1是启用标记信号处理;=0关闭标记信号处理
;07HBIT	EQU	20H.7	=1是标记作用时间到标志置1,准备关闭标记信号;=0时间未到或未启用标记
;21H	;
;08HBIT	EQU	21H.0	在09H=1的前提下:=1是正常心电ECG;=0非正常心电ARRHY
;09HBIT	EQU	21H.1	存在ECG类或绝大多数ARRHY波形输出,具体哪类有08H决定
;0AHBIT	EQU	21H.2	=1是50Hz正弦输出波D/A输出标志(刷新率1200SPS,24点/周),级别低于12HBIT
;			=0且12HBIT=0时是正常D/A输出,刷新率200SPS,级别最低
;0BHBIT	EQU	21H.3	未定义
;0CHBIT	EQU	21H.4	=1,存在非定标信号输出,信号大类由09H、08H来决定
;0DHBIT	EQU	21H.5	未定义
;0EHBIT	EQU	21H.6	=1脉冲定标波形输出有效标志;=0脉冲定标波形输出无效标志
;0FHBIT	EQU	21H.7	=1不存在的波形输出
;22H	;
;10HBIT	EQU	22H.0	=1是定标信号作用电极更换后置1,=0未更换
;11HBIT	EQU	22H.1	未定义
;12HBIT	EQU	22H.2	=1是其他波形向50Hz正弦输出的过渡期,刷新率200SPS,级别最高
;13HBIT	EQU	22H.3	=1是主菜单状态;=0非主菜单
;14HBIT	EQU	22H.4	正常心电时14H置1,ARRHY时置为0,WAVE状态,14H清0
;15HBIT	EQU	22H.5	正常心电时15H置1,ARRHY时置为1,WAVE状态,15H清0
;16HBIT	EQU	22H.6	未定义
;17HBIT	EQU	22H.7	未定义
;23H	;未定义
;24H	;未定义
;25H	;未定义
;26H	;未定义
;27H	;当前定标信号或正弦信号作用通道,初始化时是0
;28H	;标记波形参数1a,初始化时从表08E8H中调入参数80H
;29H	;标记波形参数1b,初始化时从表08E8H中调入参数8DH
;2AH	;标记波形参数2a,初始化时从表08E8H中调入参数80H
;2BH	;标记波形参数2b,初始化时从表08E8H中调入参数21H
;2CH	;原始波形类型寄存器,如07H表示正常心电80BPM
;2DH	;定时器T0中断次数软件计数器
;2EH	;一个大类波形中波形类型下限(波形类型选择时用)
;2FH	;一个大类波形中波形类型上限(波形类型选择时用)
;30H	;显示缓冲区上行首字符
;31H	;显示缓冲区上行二字符
;32H	;显示缓冲区上行三字符
;33H	;显示缓冲区上行四字符
;34H	;显示缓冲区上行五字符
;35H	;显示缓冲区上行六字符
;36H	;显示缓冲区上行七字符
;37H	;显示缓冲区上行八字符
;38H	;显示缓冲区上行九字符
;39H	;显示缓冲区上行十字符
;3AH	;显示缓冲区上行十一字符
;3BH	;显示缓冲区上行十二字符
;3CH	;显示缓冲区上行十三字符
;3DH	;显示缓冲区上行十四字符
;3EH	;显示缓冲区上行十五字符
;3FH	;显示缓冲区上行末字符
;40H	;显示缓冲区下行首字符
;41H	;显示缓冲区下行二字符
;42H	;显示缓冲区下行三字符
;43H	;显示缓冲区下行四字符
;44H	;显示缓冲区下行五字符
;45H	;显示缓冲区下行六字符
;46H	;显示缓冲区下行七字符
;47H	;显示缓冲区下行八字符
;48H	;显示缓冲区下行九字符
;49H	;显示缓冲区下行十字符
;4AH	;显示缓冲区下行十一字符
;4BH	;显示缓冲区下行十二字符
;4CH	;显示缓冲区下行十三字符
;4DH	;显示缓冲区下行十四字符
;4EH	;显示缓冲区下行十五字符
;4FH	;显示缓冲区下行末字符
;50H	;一个字节,查五字节表09D8H,心脏符号闪烁周期
;52H_51H;一个指针,查五字节表09D8H,第2、3字节构成波形数据首地址
;54H_53H;一个指针,查五字节表09D8H,第4、5字节构成波形数据末地址
;55H	;是波形类型码计数器0是40BPM正常心电,7是80BPM正常心电,35是正弦定标信号,共计36种波形类型
;56H	;由多结构组合成波形时的波序计数器,0是首个波形结构,1是第2个波形结构,依次类推,当取到波形结构代号为空:FF时,复位到0
;58H_57H;一个指针,D/A时数据存放的地址指针
;59H	;记忆上次键盘口值,
;5AH	;有效键值(01HBIT=1时)
;5BH	;增益系数,1.0对应80H,2.0对应FFH,见
;5CH	;随机数-8~+7
;5DH	;标记时间计数器,启动标记信号时清0
;5EH	;随机数-4~+3
;5FH	;随机数-4~+3
;60H~7FH	是堆栈区,共计32字节
;===============================;
;27C1001中的存储波形规范         ;
;===============================;
;只读存储器(EPROM)芯片27C1001的存储能力是128KB,由A16~A0地址线来选择具体数据,存放的数据可以用周立功集成调试环境或伟福集成调试环境来观察,
;65组波形结构信息定义见程序后的数据定义中。
;===============================;
;主程序人口                     ;
;===============================;
	ORG    0000H
	LJMP   L0030H		;入口转到0030H
	DB	7DH,08H,00H,00H,00H,07H,0EEH,00H	;没意义
	ORG	000BH
	LJMP   L03E9H		;T0中断入口
	DB	07H,72H				;没意义
JUMPTAB:			;为一散转表
	DB	21H,0EH				;没意义
	AJMP   L0110H		;转TYPE键处理
	AJMP   L0150H		;转GAIN键处理
	AJMP   L0195H		;转↑键处理
	AJMP   L0202H		;转↓键处理
	AJMP   L026FH		;转NOIS键处理
	AJMP   L0290H		;转∩键处理
	AJMP   L02A2H		;转MENU键处理
	DB	01H,0D3H,05H,02H,07H,1DH,61H,76H	;没意义
	DB	65H, 5FH,52H,52H,56H,35H,01H,08H	;没意义
L0030H: 			;初始化程序开始
	MOV    SP, #60H 	;修改堆栈栈顶指针
	MOV    TMOD, #11H	;T1方式1,16位定时方式且不受外界引脚控制;T0方式1,16位定时方式且不受外界引脚控制
	CLR    TR0		;禁止T0记数
	CLR    TR1		;禁止T1记数
	MOV    TH0, #0ECH	;给T0送初值,T0定时为:4.993mS
	MOV    TL0, #7FH	;12MHz,1uS,[10000H-EC7FH]uS=1381HuS=4993uS=4.993mS
	MOV    TH1, #0D8H	;给T1送初值,T1定时为:9.993mS
	MOV    TL1, #0F7H	;12MHz,1uS,[10000H-D8F7H]uS=2709HuS=9993uS=9.993mS
	MOV    20H, #00H	;某些标志位预清00000000B
				;00HBIT=0,防抖动标志无效
				;01HBIT=0,5AH中的键值无效
				;02HBIT=0,非TYPE类型选择
				;03HBIT=0,非GAIN选择
				;04HBIT=0,无波形类型修改的处理要求
				;05HBIT=0,非NOIS状态
				;06HBIT=0,关闭标记状态
				;07HBIT=0,未启用标记
	MOV    21H, #13H	;某些标志位预置00010011B
				;08HBIT=1,正常心电
				;09HBIT=1,有心电波形输出要求
				;0AHBIT=0,关闭50Hz正弦波输出
				;0BHBIT=0,未定义
				;0CHBIT=1,存在非定标信号输出
				;0DHBIT=0,未定义
				;0EHBIT=0,关闭脉冲定标波形输出
				;0FHBIT=0,无不存在的波形类型
	MOV    22H, #00H	;某些标志位预清00000000B
				;10HBIT=0,无定标信号作用电极更换
				;11HBIT=0,未定义
				;12HBIT=0,非过渡波形状态
				;13HBIT=0,非主菜单状态
				;14HBIT=0,非正常心电状态
				;15HBIT=0,非心电输出状态
				;16HBIT=0,未定义
				;17HBIT=0,未定义
	MOV    R0, #30H 	;寄存器0区,将主菜单屏显示的信息拷贝到显示缓冲区30H~4FH中
	MOV    R7, #20H 	;共2行,每行16个字符,2行32=20H
	MOV    R6, #00H 	;不加偏移
	LCALL  L0694H		;调L0694H子程序:拷贝No1_SCREEN中偏移(R6)开始的(R7)个字节到@R0中
	SETB   13H		;13H置1,设置主菜单有效
	MOV    PSW, #08H	;程序状态字的RS1、RS0=01B,即用1区:R0~R7=08H~0FH
	MOV    55H, #07H	;当前波形类型码初始化为7,缺省是心电波形第七行,‘ NORMAL ECG 80’
	MOV    56H, #00H	;波序计数器清0,
	MOV    R1, 55H		;波形类型寄存器存放当前波形类型码,即09H单元也暂存7
	MOV    2CH, R1		;记忆原始波形类型,即2CH单元也暂存7,即原始波形类型
	MOV    R0, #30H 	;没意义
	MOV    R7, #0FH 	;没意义
	MOV    R6, #01H 	;没意义
	LCALL  L0664H		;调L0664H子程序:查0B1D表中1个字符:0B1DH+(55H)*16+(56H),目前得06H
				;该表共计14+19+3行,大部分是FFH,但首个元素一定不是FFH
	MOV    R0, #50H 	;准备安装波形数据结构参数
	MOV    R7, #05H 	;5个字节
	MOV    R6, #00H 	;偏移0
	LCALL  L067BH		;调L067BH子程序:上次查表结果(A的值)放大5倍后再偏移(R6)开始查表09D8H送(R0)开始的RAM,送(R7)个
				;80BPM次正常心电数据为50H=120个10毫秒;起始地址52H_51H=4600H;末尾地址54H_53H=4696H;
	MOV    57H, 51H 	;
	MOV    58H, 52H		;波形数据起始地址送当前波形数据地址指针58H_57H
	MOV    R2, #09H 	;增益寄存器初始化增益是X1.0,
	MOV    R0, #5BH 	;增益系数地址
	MOV    R7, #01H 	;取1个字节
	MOV    R6, #03H 	;偏移3位
	LCALL  L0642H		;调L0642H子程序:拷贝0988H中偏移(R2)*4+(R6)开始的(R7)个字节到@R0中
				;增益系数5BH=#128,即X1.0
	MOV    R3, #00H 	;定标信号加在那里?
	MOV    27H, R3		;定标信号或正弦信号加在那里?
	MOV    R0, #28H 	;
	MOV    R7, #04H 	;4个字节
	MOV    R6, #04H 	;偏移4位
	LCALL  L0652H		;调L0652H子程序:拷贝08E8H中偏移(R3)*12+(R6)开始的(R7)个字节到@R0中
				;28H/29H/2AH/2BH=80H/8DH/80H/21H

⌨️ 快捷键说明

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