PWM 기술로 조명의 무극도 조절(코드+상세 주석)

8167 단어 평상시 수업
과정 설계에 있어서 저는 코드만 넣었고 코드는 인터넷의 어떤 사형을 참고했습니다. 그 중에서 일부 오류가 있어서 수정을 했고 제가 많은 주석을 썼기 때문에 소백이 읽기에 적합합니다.어셈블리에 익숙하지 않아서 오류가 있을 수 있지만 코드를 직접 측정할 수 있어서 학교 기계실에서 시험해 보았다.주석은 참고만 제공하니 표절은 금지하고 코드는 마음대로 사용하세요.51 단편기의
DIRLOP  EQU     38H                //     
DISP0   EQU     39H                //       0
DISP1   EQU     3AH                //       1
DISP2   EQU     3BH                //       2
LDAN    EQU     58H                //      
T2H     EQU     59H                //T1 8       
T2D     EQU     5AH                //T1 8       
LAMP    EQU     P1.2               //     

ORG 0000H
;   
; ORG                        
;                                00000H   
;       START     00H              START       
AJMP START
ORG 000BH
; 000BH    T0       
LJMP TIME1                         //T0    (  PWM  )

ORG 001BH
; 001BH    T1       
LJMP TIME2                         //T1    (      )
ORG 0030H
; ORG 30H            ,  30H                ,           30H   。
START:SETB LAMP                    //     
      MOV A,#0
      MOV LDAN,A
      MOV DISP0,A
      MOV DISP1,A
      MOV DISP2,A
    ;          、       0、1、2        0
      MOV TMOD,#11H                //       16    
    ;   11H --> 0001 0001 TMOD,       ,
    ; GATE 0,  “  ”    1,“  ”     K TRx  (   K=TRx),     INTx       , TRx             。
    ; C/T 0,     
    ; M1 M0 --> 0 1 ,   1,16    /   
      MOV IE,#10001010B            //           
    ;   51          IE
    ;    1,  ,   0,  ;
    ; D7:     ,1, ;        1
    ; D6:   ;                  0
    ; D5:  /  2(52   )    0
    ; D4:     ,0,          0
    ; D3:  /  1,1,          1
    ; D2:    1,0,           0
    ; D1:  /  0,1,          1
    ; D0:    0,0,           0
      MOV TH0,#0FCH                //  PWM  (500Hz)
      MOV TL0,#18H
    ;   0FC18H -->  1111 1100 0001 1000 = 64536    1/500*2 = 0.001s = 1ms = 1000us 
    ; 1      1us
    ;     X = 65536 - 1000 = 64536
      SETB TR0                   //     T0
    ;       TR0    




;    :MAIN
MAIN: ACALL KEY                  //        
      ACALL TRANS                //         
      ACALL DISP                 //         
      ACALL DLYK                 //  20ms    
      NOP
      NOP
    ;   NOP:   
      SJMP MAIN   
    ;        





;    1:KEY,   ,           ,  LADN           PWM       。
KEY:  MOV P2,#0FFH               // P2  “1”,      
    ; 0FFH = 1111 1111;       。    
      NOP
      NOP
    ;  JNB     ,      ,      ,     0,  。
KEY1: JNB P2.0,K1                //         
    ;   K1,  K1  ,    
      JNB P2.1,K2
    ;   K2,  K2  ,    
      JNB P2.2,K3
    ;   K3,  K3  ,  、    

BACK: ACALL DONE                 //      PWM       
    ;  K1、K2、K3     ,         ,      PWM       
      RET
    ;   RET:       ,    “call   ”        。    BACK   。               。
K1:  ACALL DLYK                  //       
    ;   20ms,        ,              。
     JB P2.0,BACK
    ;  JB:          ,    。         BACK      PWM       。
J1:  JNB P2.0,J1                 //     1
    ;  K1          ,       。
     INC LDAN
    ;  LDAN    
     MOV A,LDAN
    ;   LDAN    A
     CJNE A,#0,BACK              //       255
    ;  255 == FFH , 256 = 100H ,A  ,   0
    ; CJNE Compare Jump Not Equal          。
    ;  A 256   ,  BACK  ,    PWM       。
     DEC LDAN
    ;   A 256      ,      255。
     SJMP BACK   
    ;        255    BACK,      PWM       。
K2:  ACALL DLYK
    ;    
     JB P2.1,BACK
    ;  JB:          ,    。         BACK      PWM       。
J2:  JNB P2.1,J2                 //     1
    ;  K2          ,       。
     MOV A,LDAN
    ;   LDAN    A
     CJNE A,#0,J22
    ;   A  0     J22  
     SJMP BACK
    ;   A 0   ,    BACK,  0      。
J22: DEC LDAN
    ; LDAN    
     SJMP BACK
    ;    BACK,      PWM       。
K3:  ACALL DLYK
    ;    
     JB P2.2,BACK
    ;   JB:          ,    。         BACK      PWM       。
J3:  JNB P2.2,J3                 //    
    ;  K3          ,       。
     CPL TR0
    ;   TR0  ,            ,      。
     NOP
     NOP
    ;     
     SETB LAMP
    ;      1.         。
     SJMP BACK
    ;  SJMP:   。      PWM       。




;    4:DLYK:    
DLYK: MOV R4,#4AH                //20ms    
DLYK1:MOV R5,#62H
DLYK2:DJNZ R5,DLYK2
; DJNZ RN,REL         ,       Rn    “1”,       “0”,
;   “0”         REL     ,
;   , “0”    ,         。
      DJNZ R4,DLYK1
      RET 
    ;   4AH = 72  , 62H = 98
;        :1+(1*72)+(2*98*72)+(2*72)+ 2 =(2*72+3)*98+3  = 14409us    20ms





;    5:DONE  ,    PWM       。
DONE:MOV A,LDAN                  //    PWM       
    ;     LDAN  A   
     CJNE A,#0,DJ0
    ;    A   0,  0 DJ0      
     RET
    ;   A   0,    ,    

DJ0:   MOV B,#2H      //            
    ;     B   2H = 2 = 0010
       MUL AB
    ;       A B     。 A B      8       ,   16    8   A , 8   B 。
       CPL A
    ;    CPL A :    A         ,       。
       MOV R1,A 

    ;     A     R1
       MOV A, B 
    ;     B     A
       CPL A 
    ;    CPL A :    A         ,       。
       MOV R2, A
    ;     A     R2
       MOV T2H, R2
    ;     R2     T1 8       
       MOV T2D, R1 
    ;     R1     T1 8       
       RET 
    ;      
    ;   A   10H = 16 = 0001 0000 
    ;  MUL AB --> 20H = 0010 0000 A = 0001 0000 ,B = 0000 0000
    ; T2D = R1 --> 1101 1111   T2H = R2 --> 1111 1111



;     0:  
TIME1: MOV TH0,#0FCH             //    0
       MOV TL0,#18H
    ;    FC18H = 64536     ,      。
       PUSH ACC
       PUSH PSW
    ;        
       MOV A,LDAN
    ;     LDAN    A
       CLR P1.2                  //  
    ;    CLR:  0,   
       CJNE A,#0,TM1             //0        
    ;      A   0,   0  TM1,        
       SETB P1.2     
    ;     1,    。
       SJMP TBACK
    ;         

TM1:   CJNE A,#0,TM2             //255        
    ;   A   0,  0 TM2, 0       
       CLR TR1                   //     1
    ;  TR1 1,       1
       SJMP TBACK
    ;   
TM2:   MOV TH1,T2H               //     T2         
    ;  T2H     TH1,   1  4 
       MOV TL1,T2D
    ;  T2D     TL1,   1  4 
    ;     LDAN 10H,T2D --> 1111  T2H  --> 1101,    TH1 TL1,   PWM    ,     。
       SETB TR1                  //     1
    ;      1
TBACK: POP PSW            
       POP ACC
       RETI
    ;     

TIME2: SETB P1.2                 //    
       CLR TR1                   //     1
       RETI
       






;    2:TRANS:       , LDAN = 10H = 0001 0000
TRANS:  MOV A, LDAN        // LDAN      
    ;  LDAN    A ,A = LDAN = 10H = 0001 0000
        MOV B, #64H
    ; B = 64H = 100 = 0110 0100
        DIV AB  
    ; DIV (unsigned divide)       
    ;     A    
    ;      B   
    ; B = 10H , A = 00H
        MOV DISP2,A 
    ; DISP2 = 00H 
        MOV A, #0AH 
    ; A = 0AH = 10 = 0000 1010
        XCH A,B
    ; XCH A,B ;        A   B       
    ; A = 10H , B = 0AH
        DIV AB
    ; B = 06H, A = 01H
        MOV DISP1,A
    ; DISP1 = 01H
        MOV DISP0,B
    ; DISP0 = 06H
        MOV 3CH, #0
    ; 3CH    0
        RET
    ;   

; TRANS:
        ; MOV   3CH,LDAN           //        
        ; MOV   A,DISP2
        ;    ,DISP2 = 0, A = 0
        ; ANL   A,#0F0H
        ;       ,    A          ,       A。
        ; 0F0H = 240 = 1111 0000
        ; A = 0000 1111 
        ; SWAP  A
        ; SWAP        。
        ; SWAP A     ,    A  、 4     ,
        ;     4      4 , 4      4 。
        ; A = 1111 0000
        ; MOV   3EH,A
        ; MOV   A,DISP2
        ; ANL   A,#0FH
        ; MOV   3FH,A
        ; RET
        ;   





;    3:DISP:    
DISP:   MOV   DIRLOP,#4          //      (4    )
    ; DTRLOP = 4
        MOV   R0,#3CH            //3CH 39H      
    ;     R0 = 3CH
DL0:    MOV   A,@R0
    ;   LADN = 10H  
    ;  A = DISP2 = 06H
        MOV   DPTR,#TAB
    ; DPTR = TAB   ,    
        MOVC  A,@A+DPTR          //         
    ;  TAB          A
        MOV   SBUF,A             //    
DL1:    JNB   TI,DL1
    ;             
        CLR   TI
    ;      ,        
        DEC   R0
    ;   R0 = 3BH
        DJNZ  DIRLOP,DL0
    ;         ,  DIRLOP    “1”,
    ;        “0”,  “0”         DL0     ,
    ;   , “0”    ,         。
        RET
    ;     
TAB:    DB 0FCH,60H,0DAH,0F2H,66H,0B6H         //          
        DB 0BEH,0E0H,0FEH,0E6H,0EEH,03EH,9CH
        DB 7AH,9EH,8EH
END

좋은 웹페이지 즐겨찾기