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

📄 fantest.asm

📁 用汇编语言写的风扇转速测试程序,用于转速测试,传感器用KEYENCE
💻 ASM
📖 第 1 页 / 共 4 页
字号:
T2CON      EQU 0C8H                  ; SFR reg addr for T2 control word, TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 
T2MOD      EQU 0C9H                  ; SFR reg addr for T2 setup word, GATE C/T M1 M2   
TL2        EQU 0CCH                  ; SFR reg addr
TH2        EQU 0CDH                  ; SFR reg addr
ET2        BIT 0A8H.5                ; ET2 for T2 intrrupt bit ET2=1 set intrrupt  
DADDR      EQU  0A0H                 ;fixed addr for 24cxx '10100000' write '0'
PADDR      EQU  0                    ;programable addr from 0~7 for 24c02
FILL       EQU  53H                  ; save data address for 24c02
RS	   BIT	P1.2                 ; LCD RS=0 for send instruction, RS=1 for send data
R_W	   BIT	P3.6                 ; LCD RW=1 for read, RW=0 for write
E          BIT	P3.7                 ; LCD ENABLE   
DP         BIT  P3.3                 ; LCD BACKLIGHT              
INP        BIT  P3.2                 ; KEY IN port      
BTN        BIT  P1.0                 ; START BUTTON port
SCL        BIT  P1.1                 ; 24c02 scl pin 
SDA        BIT  P1.3                 ; 24c02 sda pin
DB0_DB7    DATA	0A0H                 ; P1=90H, P2=A0H

           ORG  0B0H                  ; stack origin  (high 128 byte for at89c52)
stack:     DS   40H                  ; stack depth
  
       ORG 0000H
       LJMP START0
       ORG 000BH                     ; T0 intrrupt
       LJMP TIM0
       ORG 0023H                     ; for RS232 intrrrupt
       LJMP UART
       ORG 002BH                     ; T2 interrupt 
       LJMP TIM2
       
START0:MOV SP, #(stack-1)            ; stack pointer 
       CLR P0.0                      ; LED1 off
       CLR P0.1                      ; LED2 off
       CLR P0.2                      ; LED3 off 
/**********************************************************************/    
CLEAR: MOV R4, #7FH
       MOV R0, #00H                  ; clear Reg buf become #00H from 00H to 7FH. 
CLS1:  MOV @R0, #00H 
       INC R0
       DJNZ R4, CLS1 
/************************************************************/
       CLR DP                        ; Backlight display on
       LCALL Initial                 ; LCD INIT
       LCALL CLS                     ; LCD CLEAR                               
       MOV	A,#80H	             ; set the address
       LCALL	Write_instruction    ; INSTRUCTION
       MOV	DPTR,#LINE1          ; Display "FREQ:"
       LCALL	PR_STRING
       MOV	A,#8AH	             ; set the address
       LCALL	Write_instruction
       MOV	DPTR,#LINE2          ; Display "."
       LCALL	PR_STRING
/*************** Display last display freq value ********************/
       LCALL I2CINIT
       LCALL VERIFY_PAGE_SAVE
       MOV	A,#85H	             ; set the address
       LCALL	Write_instruction
       MOV R1, #68H                  
       MOV R2, #05
PLAB:  MOV A, @R1
       ORL A, #30H
       LCALL WriteLCDData
       DEC R1
       DJNZ R2, PLAB
/*************** Display last display freq value (dot) **************/
       LCALL I2CINIT
       LCALL VERIFY_PAGE_SAVE1
       MOV A, #8BH                 ; display freq
       LCALL Write_instruction
       MOV A, 2DH
       ORL A, #30H
       LCALL WriteLCDData
       MOV A, 2CH
       ORL A, #30H
       LCALL WriteLCDData
/*************** Display rpm *****************************************/
       MOV	A,#8DH	             ; set the address
       LCALL	Write_instruction
       MOV	DPTR,#LINE8          ; Display "rpm"
       LCALL	PR_STRING
       MOV	A,#85H	             ; set the address, CUROR POINTER TO #85H
       LCALL	Write_instruction
/*************** Display H limit value *******************************/
        LCALL I2CINIT
	LCALL VERIFY_PAGE_HI
	MOV A, #0C0H                  ;    DISPLAY "H Limit"
        LCALL Write_instruction
	MOV DPTR, #LINE6
	LCALL	PR_STRING
	MOV A, #0C8H                  ; DISPLAY 48H--44H
        LCALL Write_instruction
	MOV R0, #48H
	MOV R2, #5
SCREEN:	MOV A, @R0
	ORL A, #30H
	LCALL	WriteLCDData 
	DEC R0
	DJNZ R2, SCREEN 
	MOV A, #0CDH                  ; DISPLAY "rpm"  
        LCALL Write_instruction
	MOV DPTR, #LINE8
	LCALL	PR_STRING
	LCALL DELAY2
	MOV A, #0C0H
        LCALL Write_instruction
	MOV DPTR, #LINE11
	LCALL	PR_STRING
/*************** Display L limit value *******************************/
	LCALL VERIFY_PAGE_LO
        MOV A, #0C0H                             ; DISPLAY "L Limit"
        LCALL Write_instruction
	MOV DPTR, #LINE5
	LCALL	PR_STRING
	MOV A, #0C8H                             ; DISPLAY 4DH--49H
        LCALL Write_instruction
        MOV R0, #4DH
	MOV R2, #5
SCREN1:	MOV A, @R0
	ORL A, #30H
	LCALL	WriteLCDData 
	DEC R0
	DJNZ R2, SCREN1	
	MOV A, #0CDH                             ; DISPLAY "rpm"  
        LCALL Write_instruction
	MOV DPTR, #LINE8
	LCALL	PR_STRING
	LCALL DELAY2
	MOV A, #0C0H
        LCALL Write_instruction
	MOV DPTR, #LINE11
	LCALL	PR_STRING
/*************** Display Fan Q'ty value ******************************/
	LCALL I2CINIT
        LCALL VERIFY_BYTE_FILL
        MOV A, #0C0H                         ; DISPLAY "FAN Q'TY"                       
        LCALL Write_instruction                        
	MOV DPTR, #LINE7
	LCALL	PR_STRING
	MOV A, #0C9H                               ; DISPLAY 4FH unit value                  
        LCALL Write_instruction	
	MOV A, 4FH                                
	ORL A, #30H                            
	LCALL WriteLCDData
	MOV A, #0CAH                            ; DISPLAY "PCS"                        
        LCALL Write_instruction
	MOV DPTR, #LINE9
	LCALL	PR_STRING
	LCALL DELAY2
	MOV A, #0C0H
        LCALL Write_instruction
	MOV DPTR, #LINE11
	LCALL	PR_STRING
/*************** initial *************************************************************************/
SETUP: LCALL I2CINIT
       LCALL VERIFY_BYTE_FILL
       MOV A, 4FH
       MOV DPTR, #TABLE1
       MOVC A, @A+DPTR
       MOV 4EH, A                    ; TL0 SBUF
       MOV 32H, #0FFH                ; Key Buff 
       MOV 2EH, #35H                 ; UART BUFF
       SETB 20H.0                    ; Enter & Quit Key and Fun & Num control bit
       CLR 20H.1                     ; Fun Key & Num Key control bit
       MOV SCON, #50H                ; set rs232 mode 1, 10 bit transfer, receive REN interrupt enable
       MOV TMOD, #25H                ; set T0 for extenral counting, T1 mode2 for rs232 baud generator, 8 bit auto-reload
       MOV TL1, #0FDH                ; rs232 baud rate 9600
       MOV TH1, #0FDH 
       MOV T2CON, #01H               ; T2 for 16 bit timer for interrupt display
       MOV T2MOD, #00H               ; T2 for upper timer
       MOV TL2, #(65536-46080) MOD 256    ; T2 50 ms timer #(65536-46080) mod 256, (50ms=1.0850694*46080) 
       MOV TH2, #(65536-46080)/256        ; T2 50 ms timer #(65536-46080) / 256  
       MOV A, 4EH
       MOV TL0, A                    ; input 7 time/count       
       MOV TH0, #0FFH 
       ANL PCON, #7FH                ; baud rate not double
      ; MOV IP, #20H                 ; T2 port interrupt prior
       MOV IP, #10H                  ; RS232 port interrupt prior
       MOV 55H, #20                 ; TIMER=50*20=1000ms
       MOV 26H, #10                  ; counter 10 times
       MOV 27H, #70H                 ; save 10 pcs TL0 value
       SETB EA                       ; EA
       SETB ES                       ; ES rs232 interrupt enable
       SETB TR1                      ; START T1, serial baud generator start
       SETB ET0                      ; T0 interrupt enable
       SETB ET2                      ; T2 interrupt enable
       SETB T2CON.2                  ; START T2, 1 s timer  start, TR2
       SETB TR0                      ; START T0, counting  start 
/*************** main programing start ***********************************************************/         
MAIN:   MOV A, 35H                 ; SERIAL RECEIVE
        CJNE A, #0A5H, MAIN0
	MOV A, 36H
	CJNE A, #5AH, MAIN0
        MOV A, 37H                 ; SERIAL RECEIVE
        CJNE A, #55H, MAIN0
	MOV A, 38H
	CJNE A, #5AH, MAIN0
	MOV A, 39H
	CJNE A, #0A5H, MAIN0
	JMP MAIN1
MAIN0:  JB BTN, MAIN                ; WHETHER START?
        LCALL DELAY0                 
        JNB BTN, $                  ; eliminate brounce 
MAIN1:  LCALL HANDE
        LCALL RANGE
        LCALL DISP
	LCALL GETKEY	
        LCALL PRESS
	LCALL HILIMIT
        LCALL LOLIMIT
	LCALL GREENLED
	LCALL SEND                 ; SEND count value
        LJMP MAIN1
/*************** Data acquisition math (57h58h*28cycle)*******************************************/
HANDE: MOV A, 57H               ; 57h58h*28+56h/4Fh=42h41h40h.43h         
       MOV B, #28               ; if vane=9, then 1 times T0 interrupt, stand for 252/9=28 cycle                   	
       MUL AB                   ; 28*57h=cycle                            	
       MOV 40H, A                         	
       MOV 41H, B
       MOV A, 58H
       MOV B, #28                        	
       MUL AB                             	
       ADD A, 41H                         	
       MOV 41H, A                        	
       MOV A, B
       ADDC A, #0
       MOV 42H, A 
/***************  (40h41h42h*60cycle/minute)******************************************************/       
MUL60: MOV A,40H
       MOV B, #60
       MUL AB
       MOV 6CH, A
       MOV 6DH, B
       MOV A, 41H
       MOV B, #60
       MUL AB
       ADD A, 6DH
       MOV 6DH, A
       MOV A, B
       ADDC A, #0
       MOV 6EH, A
       MOV A, 42H
       MOV B, #60
       MUL AB
       ADD A, 6EH
       MOV 6EH, A
       MOV A, B
       ADDC A, #0
       MOV 6FH, A             ;LOST 6FH
       MOV A, 6CH
       MOV 40H, A
       MOV A, 6DH
       MOV 41H, A
       MOV A, 6EH
       MOV 42H, A
       MOV A, 6FH
       MOV 44H, A            ; LOST 44H
/*************** Data process from TL0 (70h-79h=0?)*******************************************/
/*     MOV R0, #70H
       MOV R3, #10
SUMAD0:MOV A, @R0
       CJNE A, #00H, SUMADD
       INC R0
       DJNZ R3, SUMAD0
       MOV 43H, #00H
       LJMP SUMADD1 */
/*************** Data process from TL0 (70h+71h+72h...79h=21h22h)*****************************/
SUMADD:MOV 21H, #00H
       MOV 22H, #00H
       CLR C
       MOV R0, #70H             ;TL0=70H
       MOV R4, #10
ADD0:  MOV A, @R0
       ADD A, 21H
       MOV 21H, A
       JNC ADD1
       MOV A, 22H
       ADD A, #01H
       MOV 22H, A
ADD1:  INC R0
       DJNZ R4, ADD0 
/*************** Data process from TL0 (21h22h*60=28h29h2ah)*********************************/  
       MOV A, 21H               ; 57h58h*28+56h/4Fh=42h41h40h.43h         
       MOV B, #60               ; if vane=9, then 1 times T0 interrupt, stand for 252/9=28 cycle                   	
       MUL AB                   ; 28*57h=cycle                            	
       MOV 28H, A                         	
       MOV 29H, B
       MOV A, 22H
       MOV B, #60                        	
       MUL AB                             	
       ADD A, 29H                         	
       MOV 29H, A                        	
       MOV A, B
       ADDC A, #0
       MOV 2AH, A
/*************** Data process from TL0 {28h29h2ah/(4fh*10)=23h24h25h}商为三字节 **************/ 
       MOV     R0,    28H
       MOV     R1,    29H
       MOV     R2,    2AH
       MOV     A,     4FH
       MOV     B,     #10
       MUL     AB
       MOV     R4,    A
       ;MOV     2FH,   B           ; LOST NO USED
       MOV     R3,     #00H        ; R3存放被除数扩充位,也是余数存放数
       MOV     23H,    #00H        ; LSB 商
       MOV     24H,    #00H
       MOV     25H,    #00H        ; MSB 商            
       MOV     R7,    #18H
CHU6:  MOV     A,    R0
       ADD     A,    R0            ; 被除数左移,包括扩充位
       MOV     R0,    A
       MOV     A,    R1
       ADDC     A,    R1
       MOV     R1,    A
       MOV     A,    R2
       ADDC     A,    R2
       MOV     R2,    A
       MOV     A,    R3
       ADDC     A,    R3
       MOV     R3,    A
       MOV     A,    23H;    商数左移
       RLC    A
       MOV     23H,    A
       MOV     A,    24H
       RLC    A
       MOV     24H,    A
       MOV     A,    25H
       RLC    A
       MOV     25H,    A
       MOV     A,    R3
       SUBB     A,    R4
       JC    CHU61
       MOV     R3,    A
       INC     23H
       AJMP     CHU62
CHU61: ADD     A,    R4
CHU62: DJNZ     R7,    CHU6
       MOV 43H, R3          ; 存入余数
/*************** Data process from TL0 43h*10/10+  小数处理***********************?*************/     
       MOV A, 43H
       MOV B, 4FH
       DIV AB
       SWAP A
       ANL A, #0F0H
       MOV 43H, A
       MOV A, B
       MOV B, #10
       MUL AB
       MOV B, 4FH
       DIV AB
       ANL A, #0FH       
       ORL A, 43H
       MOV 43H, A
/*************** Data process 23h+40h,24h+41h,25h+42h ***************/
SUMADD1:MOV A, 23H
	ADD A, 40H
        MOV 40H, A
        MOV A, 24H
        ADDC A, 41H
        MOV 41H, A
        MOV A, 25H
        ADDC A, 42H
        MOV 42H, A
	MOV A, 44H
	ADDC A, #0
	MOV 44H, A    ;44H LOST, NO USED

/*************** Data process from 2 BIN trans to 3 BCD *************/     
BIN3BCD4: MOV R0, #60H 
          MOV R6, #4
 	  CLR A
BCD0:     MOV @R0, A
	  INC R0
	  DJNZ R6, BCD0
          MOV R6, #24
BCD1:     MOV R1, #40H
          MOV R5, #3
	  CLR C
BCD2:     MOV A, @R1
          RLC A
          MOV @R1, A
          INC R1
          DJNZ R5, BCD2
          MOV R4, #4
          MOV R0, #60H
BCD3:     MOV A, @R0
          ADDC A, @R0
          DA A
          MOV @R0, A
          INC R0
          DJNZ R4, BCD3
          DJNZ R6, BCD1
	  MOV R0, #00H
	  MOV R1, #00H

          MOV R1, #64H                   ;64h--68h display value      
          MOV A, 60H
          MOV B, #10H
          DIV AB
          MOV @R1, B                     ;64H           
          INC R1
          MOV @R1, A                     ;65H
          INC R1
          MOV A, 61H
          MOV B, #10H
          DIV AB
          MOV @R1, B                     ;66H
          INC R1
          MOV @R1, A                     ;67H
          INC R1
          MOV A, 62H
          MOV B, #10H
          DIV AB
          MOV @R1, B                      ; 68H
          INC R1
          MOV @R1, A                      ; 69H
          INC R1
          MOV A, 63H
          MOV B, #10H
          DIV AB
          MOV @R1, B                      ; 6AH
          INC R1
          MOV @R1, A                      ; 6BH 
          MOV A, 43H
          MOV B, #10H
          DIV AB
          MOV 2CH, B                      ; 2CH     
          MOV 2DH, A                      ; 2DH 
          RET
/*************** check if over ranage *************************************/  
RANGE: MOV R1, #6BH
       MOV R3, #3       
RANG1: MOV A, @R1
       CJNE A, #00H, UPPER
       DEC R1
       DJNZ R3, RANG1
       JMP RANG2 
UPPER: MOV A,#0C0H	             ; set the address
       LCALL Write_instruction       ; INSTRUCTION
       MOV DPTR,#LINE3               ; Display "Over Test Range!"
       LCALL PR_STRING 
       MOV R0, #67H                  ; display "9999.99"
       MOV R4, #04
       MOV A, #09H
       MOV 2CH, A
       MOV 2DH, A
RANG3: MOV @R0, A
       DEC R0
       DJNZ R4, RANG3
RANG2: RET
/*************** display read value*****************************************/ 
DISP:	MOV A, #8BH                 ; display freq
        LCALL Write_instruction
	MOV A, 2DH
        ORL A, #30H
        LCALL WriteLCDData
	MOV A, 2CH
        ORL A, #30H
        LCALL WriteLCDData
	MOV A, #85H                 ; display freq
        LCALL Write_instruction

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -