?? 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 + -