📄 sm8952a_trc.asm
字号:
;*************************************************************************;
;--->> Project : SM8952A 控制双向可控硅调光 <<---;
;--->> P List : SM8952A <<---;
;--->> 测试说明: <<---;
;--->> 1.应用 P3.012 控制3个按键 <<---;
;--->> 2.应用 P3.3 检测 AC 220V 交流过零点 <<---;
;--->> 3.应用 P1.0123 驱动双向可控硅 <<---;
;--->> 4.应用 12MHz 晶体振荡 <<---;
;*************************************************************************;
;l#include <reg52.h>
;-----------------------------------------------;
;------>> set use data register <<------;
;-----------------------------------------------;
TEMP1 equ 020H ;delay use register
TEMP2 equ 021H ;
TEMP3 equ 022H ;
R_250us equ 023h ;
Delay_X equ 024h ;
RD_inp equ 025h ;
Key_buf equ 026h
Key_New equ 027h
;-----------------------------;
WDTC equ 09FH ;SFR內WDTC的位址
WDTKEY equ 097H ;SFR內WDTKEY的位址
SCONF equ 0BFH ;SFR內SCONF的位址
;*************************************************************************;
;---------->> program Loop area <<--------------;
;*************************************************************************;
ORG 0000H ;设定目前程式的起始位址
JMP SStart ;
ORG 0003H ;设定外部中断0的入口位址
JMP Ext_int0 ;
ORG 000BH ;设定定时器中断0的入口位址
JMP Timer0_int ;
ORG 0013H ;设定外部中断1的入口位址
JMP Ext_int1 ;
ORG 001BH ;设定定时器中断1的入口位址
JMP Timer1_int ;
ORG 0023H ;设定串行口中断的入口位址
JMP Serial_int ;
nop ;
nop ;
;------------------------------------------------;
Ext_int0:
Ext_int1:
Timer1_int:
Serial_int:
nop
reti
;-------------------------------------------------;
;--------->> 250us timer0 中断程序 <<---------;
;-------------------------------------------------;
Timer0_int:
PUSH ACC ;将A的值暂存于堆栈区
PUSH PSW ;将PSW的值暂存于堆栈区
mov TH0,#(65536-250) / 256 ;12M晶振,形成250微秒中断
mov TL0,#(65536-250) MOD 256 ;65535-65285=250us
inc R_250us ;Timer0中断服务,中断计数器加1
POP PSW ;至堆栈区取回PSW的值
POP ACC ;至堆栈区取回A的值
RETI ;返回主程序
;*******************************************************************;
;*******************************************************************;
;-------------------->> 初始复位部分 <<--------------------;
;-------------------------------------------------------------------;
SStart:
mov SP,#60H ;sp=60h
mov a,#00h ;P1 output drive triac
mov P1,A ;
mov A,#0fh ;P3 input read key
mov P3,A ;
;-----------------------------------------------;
;-----> 250us定时/计数器0中断初始设定 <-----;
;-----------------------------------------------;
clr R_250us ;
mov TMOD,#01H ;定时/计数器0工作于方式1
mov TH0,#(65536-250) / 256 ;
mov TL0,#(65536-250) MOD 256 ;65535-65285=250us
setb TR0 ;启动定时/计数器0开始运行
setb ET0 ;开定时/计数器0允许
;-----------------------------------------------;
;-----> 内部RAM(00H~7FH)清零 <-----;
;-----------------------------------------------;
Clr_RAM:
mov R0,#7FH ;内部RAM(00H~7FH)清零
CLR_Loop:
mov @R0,#00H ;
djnz R0,CLR_Loop ;
;-----------------------------------------------;
;-----------------------------------------------;
mov A,#0eh ;
mov Key_New,A ;
; setb EA ;开总中断允许
;-----------------------------------------------;
JI_to_MainLoop:
clr RD_inp ;
mov A,RD_inp ;导通角数据表指针
mov DPTR,#Data_table ;
movc A,@A+DPTR ;
mov Delay_X,A ;初始导通角(36×250us=9000us=9ms)
;++++++++++++++++++++++++++++++++++++++++++++++++;
;---->> P3.3初始检查市电(220V) <<-----;
;------------------------------------------------;
JI_chk_220V:
mov a,P3 ;读P3到ACC中
JB acc.3,JI_chk_220V ;acc.3=1吗?为1等待为0
nop ;为0
nop ;
nop ;
nop ;
mov a,P3 ;读P3到ACC中
JB acc.3,JI_chk_220V ;acc.3=1吗?为1等待为0
nop ;为0
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
;-------------->> 在 ACC 220V 正半周开可控硅 <<--------------;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
Main_to_run:
mov a,P3 ;读P3到ACC中
jnb acc.3,Main_to_run ;acc.3=0吗?为0等待为1
nop ;为1
nop ;
nop ;
nop ;
mov a,P3 ;读P3到ACC中
jnb acc.3,Main_to_run ;acc.3=0吗?为0等待为1
nop ;为1
call JJ_Delay_X ;等待导通角延时完成
call JJ_open_TRC ;开可控硅
nop ;
nop ;
;+++++++++++++++++++++++++++++++++++++++++++++++++++;
;---->> 扫键,有键进行处理 <<-----;
;---------------------------------------------------;
JM_scan_Key:
call JJ_scankey ;
Ljmp Main_to_run ;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
;------->> 在 ACC 220V 负半周开可控硅 <<-------;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
JM_chk_ACC_H:
mov a,P3 ;读P3到ACC中
jb ACC.3,JM_chk_ACC_H ;acc.3=1吗?为1等待为0
nop ;
nop ;
nop ;
nop ;
mov a,P3 ;读P3到ACC中
jb acc.3,JM_chk_ACC_H ;acc.3=1吗?为1等待为0
nop ;
nop ;
nop ;
call JJ_Delay_500us ;
nop ;
nop ;
nop ;
call JJ_Delay_X ;等待导通角延时完成
call JJ_open_TRC ;开可控硅
nop ;
nop ;
Ljmp Main_to_run ;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
JJ_scankey:
mov a,P3 ;P3.012有键吗?
ANL a,#07h ;
mov Key_buf,A ;
jbc ACC.0,J_s_001 ;ACC.0=0,goto J_s_001
mov A,Key_New ;
jbc ACC.0,J_Auto ;ACC.0=0,goto J_Auto
J_s_001:
mov A,Key_buf ;
jbc ACC.1,J_s_002 ;ACC.1=0,goto J_s_002
mov A,Key_New ;
jbc ACC.1,J_UP ;ACC.1=0,goto J_up
J_s_002:
mov A,Key_buf ;
jbc ACC.2,J_s_exit ;ACC.2=0,goto J_s_002
mov A,Key_New ;
jbc ACC.2,J_Down ;ACC.2=0,goto J_Down
J_s_exit:
mov A,Key_buf ;
mov Key_New,A ;
ret ;
;---------------------------------------------;
J_Auto:
clr RD_inp ;
mov A,Key_buf ;
mov Key_New,A ;
ret ;
;---------------------------------------------;
J_up:
mov A,Key_buf ;
mov Key_New,A ;
mov A,RD_inp ;
subb A,#11h ;18
jz RReto_No1 ;
inc RD_inp ;
jmp RRetu_Main ;
RReto_No1:
mov A,0 ;
mov RD_inp,A ;
jmp RRetu_Main ;
;---------------------------------------------;
J_down:
mov A,Key_buf ;
mov Key_New,A ;
mov A,RD_inp ;
jz RReto_No18 ;
dec RD_inp ;
jmp RRetu_Main ;
RReto_No18:
mov A,#11h ;18
mov RD_inp,A ;
;---------------------------------------------;
RRetu_Main:
mov A,RD_inp ;导通角数据表指针
mov DPTR,#Data_table ;
movc A,@A+DPTR ;
mov Delay_X,A ;初始导通角(36×250us=9000us=9ms)
ret
;------------------------------------------------;
;----------->> 等待导通角延时完成 <<-----------;
;------------------------------------------------;
JJ_Delay_X: ;等待导通角延时完成
clr R_250us ;
setb EA ;开总中断允许
JT_wait_X:
mov A,R_250us ;
subb A,Delay_X ;
jz Jt_x_OK ;
jmp JT_wait_X ;
Jt_x_OK:
clr EA ;关闭总中断允许
ret
;------------------------------------------------;
;----------->> 开可控硅 <<-----------;
;------------------------------------------------;
JJ_open_TRC: ;开可控硅
mov A,#00001111B ;
mov P1,A ;
call JJ_Delay_500us ;
mov A,#00h ;
mov P1,A ;
ret ;
;------------------------------------------------;
;----------->> 延时500us <<-----------;
;------------------------------------------------;
JJ_Delay_500us:
clr R_250us ;
setb EA ;开总中断允许
JT_wait_500us:
mov A,R_250us ;
subb A,#02h ;
jz JT_500us_end ;
jmp JT_wait_500us ;
JT_500us_end:
clr EA ;关闭总中断允许
ret
;------------------------------------------------;
;----------->> 延时子程序 <<-----------;
;------------------------------------------------;
Delay_15us:
MOV TEMP3,#0fh ;
Dy_15us:
DJNZ TEMP3,Dy_15us ;
RET ;
;-------------------------------------------------------------------;
;--------------->> 七段共阳数码管显示数据表 <<---------------;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
Data_table:
DB 24h,22h,20h,1eh,1ch ;36,34,32,30,28
DB 1ah,18h,16h,14h,12h ;26,24,22,20,18
DB 10h,0eh,0ch,0ah,08h ;16,14,12,10,08
DB 06h,04h,02h ;06,04,02
;-------------------------------------------------------------------------;
;--------------------->> program end <<----------------------;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -