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

📄 sm8952a_trc.asm

📁 用于LED调光
💻 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 + -