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

📄 new.asm

📁 完整的89c52程序源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;电源编程
;单片机型号:at89c52,时钟24MHZ,计时时钟2MHZ,0.5us
;目前存在主要问题:交流输入相位为反相,再制作时必须反相注意修改最大相位数值
;			单片机复位后输出为高电平,必须修正
;同步触发的中断输入。其中断用于T0同步
;T0:零输出同步触发定时系统与调压控制系统;当电源启动时负责检测当触发输出为零电压时的基本时基,向前提前10ms为最大输出,其中断用于T1同步,
;该中断为单次。零输出最少时长为10ms,
;T1:3.33333ms时基,用于触发分配,该中断仅完成6次终结

;显示子程序
;********************************
;位定义
       KEY	BIT	P2.0	;0:读入数据	ls244
       DIS	BIT	P2.1	;1:正跳延数据输出	ls374 数据正输出显示
       DIS_KEY	BIT	P2.2	;1:正跳延数据输出	ls374	数据位正输出显示
       ADC_STR	BIT	P2.3	;1:正跳延数据输出
       CTL_DIS	BIT	P2.4	;1:正跳延数据输出
       ADC_OE	BIT	P2.5	;1:正跳延数据输出
       ADC_EOC	BIT	P2.6	;数据输入	1:有效
       C46_CS	BIT	P2.7	;

       C46_SK	BIT	P0.0
       C46_DI	BIT	P0.1
       C46_DO	BIT	P0.2
       
       COM_RXD	BIT	P3.0
       COM_TXD	BIT	P3.1
       SY_A	BIT	P3.2	;同步相位A
       STAR	BIT	P3.3	;CON_9	启动按钮0:启动
       SY_B	BIT	P3.4	;同步相位B
       SY_C	BIT	P3.5	;同步相位C
       CHF_SEC	BIT	P3.6	;脉冲选择1:单脉冲触发,0:双脉冲触发,即CTC2短路
       CTL_V_I	BIT	P3.7	;CON_8	1:电压	0:电流

;       ERR_OUT	BIT	P1.0
	ERR_OUT	BIT	P1.1       
	out_a	BIT	P1.2
       out_nc	BIT	P1.3
       out_b	BIT	P1.4
       out_na	BIT	P1.5
       out_c	BIT	P1.6
       out_nb	BIT	P1.7

       XWEI_BZ	BIT	20H.0	;正相位:1;反相位0
       CTL_UI	BIT	20H.1	;0:电压、1:电流控制标志
       MEM_STOP	BIT	20H.2	;0:运行停止,1:运行中
       X0_BZ	BIT	20H.3	;外部中断0响应标志
     CHUFA_BZ	BIT	20H.4	;0:触发单脉冲,1:触发双脉冲
     OUT0_BZ	BIT	20H.5	;零输出调整

       QUEXIANG	BIT	21H.0	;缺相报警
       GUOLIU	BIT	21H.1	;过流
       GUOYA	BIT	21H.2	;过压
	C46_FAL	BIT	21H.3	;93C46故障
	OPT_ERR	BIT	21H.4	;操作错误,选择了电流控制时做零输出调整

       	zhd_ds	bit	22H.0	;中断INTX0单、双次标志,1:开启T0中断,0:开启T1中断
       QUSHU	BIT	22H.1	;0:取数完成可以下一次取数,1:正在取数中
       WR_DATA	BIT	22H.2	;地址写入但未完成
       KEY_0	BIT	22H.3	;键盘按下未抬起
       T0ZHD_BZ	BIT	22H.4	;正在处理T0中断标志
       T1ZHD_BZ	BIT	22H.5	;正在处理T1中断标志


;寄存器标志**************************
      MIN_XYH	EQU	10H	;输出调零相移,最大值D165H
      MIN_XYL	EQU	11H	;
      MAX_XYH	EQU	12H	;指移相最大值=MIN_XY+T10ms
      MAX_XYL	EQU	13H	;
       DIS_WEI	EQU	18H	;当前显示位
       ADC_FV	EQU	19H	;电压反馈量存放地址
       ADC_FI	EQU	1AH	;电流反馈量存放地址
       ADC_CV	EQU	1BH	;模拟量存放地址
       ADC_ADD	EQU	1CH	;当前访问ADC地址
      ADCJISH	EQU	1DH	;ADC读数不成功时的循环复位次数
	KONGZHI	EQU	20H	;控制字寄存器
	BAOJIN	EQU	21H	;报警标志寄存器
	YUNXING	EQU	22H	;运行标志寄存器
	TX_H	equ	23H	;调整输出
	TX_L	EQU	24H	;调整输出
	T1_jsh	equ	25H	;T1中断后完成6次全相位技计数,用于分配触发
	T0_jsh	EQU	26H	;T1中断后完成6次全相位技计数,用于分配触发
	qxwcn	equ	27H	;全相位计数
	UMIN	EQU	28H	;零调整时最小输出值
	UMIN_H	EQU	29H	;零调整时最小输出值时的触发时间
	UMIN_L	EQU	2AH	;零调整时最小输出值时的触发时间
       DIS_U0	EQU	30H
       DIS_U1	EQU	31H
       DIS_U2	EQU	32H
       DIS_U3	EQU	33H
       DIS_I0	EQU	34H
       DIS_I1	EQU	35H
       DIS_I2	EQU	36H
       DIS_I3	EQU	37H
;操作数定义^^^^^^^^^^^^^^^^^^^^
       FG_VO	EQU	0X00	;电压反馈输入
       FG_IO	EQU	0X02	;电流反馈输入
       CTL_VO	EQU	0X04	;控制模拟输入
       T3msH	EQU	0XE6	;定时计数器3.3ms高位=65568-Fosc/3600;	24MHZ,E615;	14.318MHZ:F096
       T3msL	EQU	0X15	;定时计数器3.3ms低位
       T10msH	EQU	0X4A	;最大相移10ms计数脉冲=10ms*95%*Fose/12	24MHZ:4A38;	14.318MHZ:2C47
       T10msL	EQU	0X38	;
       	T20MINH	EQU	0X66	;最小相位低限=65536-20ms*98%*Fose/12	24MHZ:66E0;	14.318MHZ:A4A5
	T20MINL	EQU	0XE0	;用于零设置最小移相时间
	T20MAXH	EQU	0XB1	;最小相位低限=65536-10ms*Fose/12	24MHZ:B1E0;	14.318MHZ:D164
	T20MAXL	EQU	0XE0	;用于零设置最小移相时间
       DIS_U	EQU	0X30	;电压显示高位
       DIS_I	EQU	0X34	;电流显示低位
       MAX_U	EQU	0XFC	;极限电压
       MAX_I	EQU	0XFC	;极限电流
;93C46地址定义
	kzhwei	equ	0x00	;检测位,当该单元不为0A5H时,需要调整零电平触发输出
	CHF_MINH	EQU	0X01
	CHU_MINL	EQU	0X02

;*********************************
		org 00h
		LJMP	begin			;主程序
;================================
		ORG	03H
Q0003:          LJMP  X0_00                        ;外部中断INT0
;============================
		ORG	0BH
Q000B:          LJMP  T0_00                        ;定时器T0中断
;=================================
		ORG	01BH
Q001B:		LJMP  T1_00                        ;定时器T1中断
;===================================

	org	030h
begin:		MOV	P1,#00H
;		MOV	R5,#05H
BEGIN0:		MOV	R6,#0FFH
BEGIN1:		MOV	R7,#0FFH
begin2:		CLR	EA
		MOV   SP,#40H       ;
                MOV   P1,#00H        ;
                MOV   P0,#0FFH      ;
                MOV   P2,#41H       ;
		MOV	P3,#0FFH
		MOV	KONGZHI,#00H
		MOV	BAOJIN,#00H
		MOV	YUNXING,#00H
		DJNZ	R7,BEGIN2
		DJNZ	R6,BEGIN1
;		DJNZ	R5,BEGIN0
		LCALL chshh
		MOV	MAX_XYH,#T20MAXH	;如下四段用于调零
		MOV	MAX_XYL,#T20MAXL	;
		MOV	MIN_XYH,#T20MINH	;
		MOV	MIN_XYL,#T20MINL	;
		;93C46写如测试	C46_WD:		;地址=A,数据=R1,使用R0,R1,R2
;		MOV	A,#01H
;		MOV	R1,#0A2H
;		LCALL	C46_WD
;		MOV	A,#02H
;		MOV	R1,#0CAH
;		LCALL	C46_WD
;
		;零电平调整标志置位
		MOV	A,P3
		ANL	A,#01H
		JNZ	BEGIN3
		JNB	CTL_V_I,BEGIN3
		SETB	OUT0_BZ
BEGIN3:		JB	OUT0_BZ,BEGIN4
		LCALL	YUSHE
BEGIN4:
		MOV	C,CHF_SEC	
		CPL	C
		MOV	CHUFA_BZ,C	;触发设定,0:单脉冲,1:双脉冲
;		LCALL	XWQX_JC	;相位及缺相检测))))))))))))))))))))))))))))))))))))
;		SETB	XWEI_BZ		;相位设定,1:反相位
		MOV	MAX_XYH,#0E8H	;T20MAXH	;如下四段用于调零
		MOV	MAX_XYL,#00H	;T20MAXL	;
		MOV	MIN_XYH,#9BH	;T20MINH	;
		MOV	MIN_XYL,#00H	;T20MINL	;

LOOP:
		LCALL	X0_ZHD
		LCALL	KEY_IN
		LCALL	BAOJING		;报警处理
		LCALL	ADC_RW		;模拟量取数
		MOV	R1,TX_H	;ADC_CV
		;JNB	MEM_STOP,LOOP1	;
		;MOV	R1,ADC_CV
LOOP1:		
		MOV	R0,#DIS_U
		LCALL	HEX_BCD
		MOV	R1,TX_L	;ADC_FV
		;JNB	MEM_STOP,LOOP2	;
		;MOV	R1,ADC_CV
LOOP2:		MOV	R0,#DIS_I
		LCALL	HEX_BCD
		MOV	R0,#DIS_U
                LCALL 	xishi             ;
                LJMP  	LOOP
;==========================================================================
chshh:             ;SETB  EX0 		;允许外部0中断
		CLR	EX1		;禁止外部1中断
		CLR	PX0		;外部中断0优先
		SETB	PT0		;TO
		SETB	PT1		;T1
		MOV	89H,#11H
		;CLR	89H.5
		;SETB	89H.4		;定时器T1置方式1
		;CLR	89H.1
		;SETB	89H.0		;定时器T0置方式1
		;CLR	89H.6		;定时器T1为Fosc/12
		;CLR	89H.2		;定时器T0为Fosc/12
		
		SETB  IT0            ;外部中断为边缘触发
                   CLR  EA		;关闭中断
                   RET                  ;
;**********************************************************
;显示子程序	显示数据在(R0)起始的8个单元中,字节高位不为零时为小数点
xishi:   
                   CLR	DIS_KEY		;关闭显示
		   MOV   P0,#00H
		   SETB	DIS_KEY
		   CLR	DIS_KEY
		   CLR	DIS
		   SETB	DIS
		   CLR	DIS
		   MOV A,DIS_WEI
		   PUSH	ACC
		   CLR C
		   SUBB	A,#08H
		   POP	ACC
		   JC	XISHI1
		   CLR	A
XISHI1:		INC	A
		MOV	DIS_WEI,A
		MOV	B,A
		MOV	A,#01H
XISHI2:		DJNZ	B,XISHI3
		LJMP	XISHI4
XISHI3:		RL	A
		LJMP	XISHI2

XISHI4:		   MOV	P0,A
		SETB	DIS_KEY
		CLR	DIS_KEY
		MOV   DPTR,#XSHK
 	        MOV	A,DIS_WEI
		DEC	A
		ADD	A,R0
		MOV	R0,A
		MOV	A,@R0
		PUSH	ACC
		ANL	A,#0FH
		MOVC	A,@A+DPTR
		MOV	P0,A
		POP	ACC
		ANL	A,#0F0H
		JZ	XISHI5
		ORL	P0,#80H
XISHI5:		SETB	DIS
		CLR	DIS
		RET


XSHK:	DB	3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3EH,73H,38H,39H,31H,00H
;对应显示	 0   1   2   3   4   5   6   7   8   9   U   P   L   C   T   
;数据对应	 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
;********************************************************************************
;模拟量取数
ADC_RW:		LCALL	ADC_WR
		LCALL	ADC_RD
		LCALL	ADC_ERR
		RET
ADC_ERR:	JNB	WR_DATA,ADC_ERR1
ADC_ERR3:	DJNZ	ADCJISH,ADC_ERR2
		CLR	QUSHU
		CLR	WR_DATA
ADC_ERR2:	RET
ADC_ERR1:	MOV	ADCJISH,#05H
		JB	QUSHU,ADC_ERR3
		RET
ADC_WR:		JB	QUSHU,ADC_WR5
		JB	WR_DATA,ADC_WR2
		MOV	A,ADC_ADD
		CJNE	A,#FG_VO,ADC_WR20
		MOV	A,#FG_IO
ADC_WR1:	LCALL	ADC_WR10
ADC_WR2:	SETB	WR_DATA
		JB	ADC_EOC,ADC_WR5
		CLR	WR_DATA
		SETB	QUSHU
ADC_WR5:	RET
ADC_WR20:	CJNE	A,#FG_IO,ADC_WR30
		MOV	A,#CTL_VO
		LJMP	ADC_WR1
ADC_WR30:	MOV	A,#FG_VO
		LJMP	ADC_WR1
ADC_WR10:	MOV	P0,A
		MOV	ADC_ADD,A
		NOP
		NOP
		NOP
		SETB	ADC_STR
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		CLR	ADC_STR
		RET
ADC_RD:		JNB	QUSHU,ADC_RD5
		JNB	ADC_EOC,ADC_RD5
		MOV	A,ADC_ADD
		CJNE	A,#FG_VO,ADC_RD20
		LCALL	ADC_RD10
		MOV	ADC_FV,A
		CLR	CY
		SUBB	A,#MAX_U
		JC	ADC_RD2
		SETB	GUOYA
ADC_RD2:	CLR	QUSHU
ADC_RD5:	RET
ADC_RD20:	CJNE	A,#FG_IO,ADC_RD30
		LCALL	ADC_RD10
		MOV	ADC_FI,A
		CLR	CY
		SUBB	A,#MAX_I
		JC	ADC_RD2
		SETB	GUOLIU
		LJMP	ADC_RD2
ADC_RD30:	CJNE	A,#CTL_VO,ADC_RD2
		LCALL	ADC_RD10
		MOV	ADC_CV,A
		LJMP	ADC_RD2
ADC_RD10:	MOV	P0,#0FFH
		SETB	ADC_OE
		NOP
		NOP
		NOP
		MOV	A,P0
		CLR	ADC_OE
		RET
;********************************************************************
;二进制转化为十进制,数据地址若R1,转换后地址R0
HEX_BCD:	CLR	A
		MOV	@R0,A
		MOV	A,R1
		MOV	B,#100
		DIV	AB
		INC	R0
		MOV	@R0,A
		MOV	A,B
		MOV	B,#10
		DIV	AB
		INC	R0
		MOV	@R0,A
		INC	R0
		MOV	@R0,B
		RET
;***********************************************************
;相位及缺相检测
XWQX_JC:	MOV	P3,#0FFH
		MOV	R6,#0FFH
XWQX_JC1:	MOV	R7,#0FFH
		JB	SY_A,XWQX_10
		DJNZ	R7,$
		DJNZ	R6,XWQX_JC1
		SETB	QUEXIANG
		RET
XWQX_10:	MOV	P3,#0FFH
		MOV	R6,#0FFH
XWQX_11:	MOV	R7,#0FFH
		JNB	SY_A,XWQX_20
		DJNZ	R7,$
		DJNZ	R6,XWQX_11
XWQX_12:	SETB	QUEXIANG
		RET
XWQX_20:	JB	SY_B,XWQX_30	;正相位
		JNB	SY_C,XWQX_12
		SETB	XWEI_BZ		;反相位
		JNB	SY_A,$
		JB	SY_C,XWQX_12
		JNB	SY_B,XWQX_12
		RET
XWQX_30:	CLR	XWEI_BZ
		JB	SY_C,XWQX_12
		JNB	SY_A,$
		JB	SY_B,XWQX_12
		JNB	SY_C,XWQX_12
		RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;报警处理
BAOJING:	MOV	A,BAOJIN
		JZ	BAOJI	;无报警
		CLR	EA
		MOV	P1,#03H
		MOV	R1,A
		MOV	R0,#DIS_I
		LCALL	HEX_BCD
		MOV	R0,#DIS_U
		MOV	@R0,#0BH
		INC	R0
		MOV	@R0,#0CH
		INC	R0
		MOV	@R0,#0H
		INC	R0
		MOV	@R0,#0H
		MOV	R0,#DIS_U
		LCALL	xishi
		ljmp	BAOJING
BAOJI:		RET
;#################################################################
;键盘扫描
KEY_IN:		
		JB	MEM_STOP,RUNRUN	       ;正在运行
		JB	STAR, KEY_END	        ;未运行时启动建未按下
		SETB	MEM_STOP	
		JNB	CTL_V_I,KEY_LIU		;电流控制
		CLR	CTL_UI			;设定电压0、电流1控制标志
		
KEY_IN1:	;电压控制
		MOV	TX_H,MIN_XYH
		MOV	UMIN_H,MIN_XYH
		MOV	TX_L,MIN_XYL
		MOV	UMIN_L,MIN_XYL
		MOV	UMIN,#0FFH
OUT_KEY:	CLR	EX0
		CLR	IE0
		SETB	EX0
		SETB	EA
KEY_END:		RET
RUNRUN:		JNB	STAR,KEY_END	        ;正在运行时启动按下
		CLR	MEM_STOP
		LJMP	KEY_STOP

KEY_LIU:	JNB	OUT0_BZ,KEY_LIU1
		SETB	OPT_ERR
		LJMP	KEY_END
KEY_LIU1:	SETB	CTL_UI
		LJMP	KEY_IN1
KEY_STOP:	CLR	EA
		CLR	EX0
		CLR	TR0
		CLR	TR1
		CLR	ET0
		CLR	ET1
		MOV	P1,#00H
		JNB	OUT0_BZ,KEY_END	;无调零标志
		MOV	A,#01H
		MOV	R1,TX_H
		LCALL	C46_WD
		MOV	A,#02H
		MOV	R1,TX_L
		LCALL	C46_WD
		CLR	A
		MOV	R1,#0A5H
		LCALL	C46_WD
		LJMP	BEGIN
		RET
KEY_IN2:	JNB	STAR,KEY_END
		CLR	KEY_0
	RET
;******************************************************************************
;==========================================================================
X0_00:          LCALL	T_RETI				;24	总计25x12=20μs
		CLR	EX0				;12
		PUSH  PSW				;24
		CPL   zhd_ds				;12
		   JB    zhd_ds,X0_01			;24
	   	;定时器T0中断预置
		   CLR   TR1				;12
		   CLR	ET1				;12
		   CLR	TF1				;12
		   MOV   TL1,TX_L			;24
		   MOV   TH1,TX_H			;24
		   SETB  TR1				;12
		   SETB  ET1				;12
		   LJMP  X0_END				;24
		   ;定时器T1中断预置
X0_01:             CLR   TR0				;12
		CLR	ET0				;12
		CLR	TF0				;12
		MOV   TL0,TX_L				;24
		MOV   TH0,TX_H				;24
		SETB  TR0				;12
		SETB  ET0				;12
;		AJMP  X0_END
X0_END:         
		POP   PSW				;24
		SETB	EX0				;12
		SETB	X0_BZ				;12

⌨️ 快捷键说明

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