📄 new.asm
字号:
;电源编程
;单片机型号: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 + -