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

📄 f310kz4.29.asm

📁 由C8051F310单片机的 CAN控制器程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
					 ;LJMP      PCA_INT   ;PCA中断
					 ;ORG       63H
					 ;LJMP      CP0_INT   ;比较器零中断
					 ;ORG       6BH
					 ;LJMP      CP1_INT   ;比较器1中断
					 ;ORG       13H
					 ;RETI       ;外部中断1
					 ;ORG       2BH
					 ;LJMP      T2OVER    ;T2溢出
            ORG       100H
FREST_ISR:    ;
          ;##############################################
					;系统设置
					;##############################################
					NOP
 OSC_WAIT0:     	   				 				
           mov     OSCICN,#83H     ;内部振荡器允许
					 MOV     A,OSCICN
					 JNB     ACC.6,OSC_WAIT0
					 mov     clksel,#0
           MOV     PCON,#00H   ;电源配置
					 ORL     VDM0CN,#80H ;VDD监视器使能
					 MOV     SP,#50H
					 MOV     RSTSRC,#06H ;VDD 复位使能
					 MOV     REF0CN,#04H ;VDD使能为参考电源
					 anl     pca0md,#10111111b
					 ;*********************************
					;       I/O配置
					;*********************************
					 CLR     P0.5
					 CLR     P0.4
           ;所有引脚均为数字I/O
					 MOV     P0MDIN,#11111111B         
			     MOV     P1MDIN,#0FFH
			     MOV     P2MDIN,#0FFH
			     MOV     P3MDIN,#0FH
			     ;除I2C外,所有引脚均为推挽输出
			     MOV     P0MDOUT,#01111111b
			     MOV     P1MDOUT,#0FCH
			     MOV     P2MDOUT,#0F7H
			     MOV     P3MDOUT,#0FH
			     ;XTAL1 XTAL2,跳过交叉开关  ;外部中断口CAN_INT跳过交叉开关
			     MOV     P0SKIP,#10001100B
           MOV     P1SKIP,#00H
			     MOV     P2SKIP,#00H
					 MOV     XBR0,#07H
					 MOV     XBR1,#40H
					 SETB     P0.5
					 SETB     P0.4
					 MOV     SP,#50H
			     CLR     P2.1
					 SETB    P2.1
					 SETB    P2.2
					 SETB    P1.6
					 SETB    P1.7
					 CLR     P2.0
					 lcall   tdelay1ms
           lcall   tdelay1ms
					 lcall   tdelay1ms
           lcall   tdelay1ms
RAM_RST:                 ;RAM区初始化
					 MOV     R0,#00H
					 CLR     A
					 MOV     R1,#0FFH
RAM_LOOP:
           MOV     @R0,A
					 INC     R0
					 DJNZ    R1,RAM_LOOP
					 ORL     RST_DATA,#01H
CODE_RST:               ;CODE区初始化
           MOV     DPTR,#BELAY
					 CLR     A
					 MOV     AL,#21
					 MOV     BL,#0
					 MOV     BH,#0
CODE_LOOP: 
           MOV     A,BH                          
					 MOVC    A,@A+DPTR
					 MOV     B,A
					 MOV     A,BL
					 ADD     A,B
					 MOV     BL,A
					 INC     BH
					 DJNZ    AL,CODE_LOOP 
					 MOV     A,BL
					 CJNE    A,#210,FREST1
					 ORL     RST_DATA,#02H
					 SJMP    ISP_RST
					 RET
FREST1:		 LJMP    FREST_ISR
           RET
ISP_RST:					 	
           MOV     IT01CF,#01110000B    ;中断初始化
					 MOV     IE,#04H           
           MOV     IP,#01H
					 MOV     EIE1,#00H
					 MOV     EIP1,#00H
					 SETB    EA
					 SETB    EA
           ORL     RST_DATA,#04H
					 ACALL   T3_RST
           ACALL   I2C_RST
					 ACALL   SPI_RST
CAN_TEST2:
					 ACALL   CAN_RST0;
					 ACALL   CAN_TEST0

					 MOV      A,CAN_TEST
					 CJNE     A,#01, CAN_TEST2
					 LOP:
					 LCALL   can_send1
					 LOP1:
           CLR     P1.6
					 MOV     SPI0DAT,#0A0H
					 JNB     TXBMT,$
					 JNB     SPIF,$
					 CLR     SPIF
           MOV     SPI0DAT,#0A0H
					 JNB     TXBMT,$
					 JNB     SPIF,$
					 CLR     SPIF
           MOV     A,SPI0DAT
           SETB    P1.6
					 JB     ACC.2,LOP1
					 SJMP    LOP
					 ;ACALL   T3_RST
					 ;LCALL   T2_RST
					 LCALL   UART0_RST
					;SETB     STO
MESSAGE_RET:
           ACALL   SMBus_TEST 


					 
					 ;SJMP MESSAGE_RET
					 lcall   tdelay1ms
           lcall   tdelay1ms
					 lcall   tdelay1ms
           lcall   tdelay1ms
					 ;ORL     RST_DATA,#10H
					 ;SJMP MESSAGE_RET
					 ;LCALL   UART0_TEST
           ;ORL     RST_DATA,#20H
					 ;LCALL   CAN_RST				                               
           ;LCALL   CAN_TEST
           ;ORL     RST_DATA,#40H
MAIN:      
           JB      SM_BUSY,$
           ;LCALL   UART0_EIR
					 LCALL   SMBUS_EIR
           ;LCALL   STATE_EIR
					 SJMP    MAIN
           
;#########################################
;    SMB0/I2C 串行通讯程序段
;#########################################

I2C_RST:
           MOV   SMB0CN, #00H                 
           MOV   SMB0CF, #10011001B                
           ORL   SMB0CF, #80H  
					  MOV   R1,#80              
           ORL   EIE1, #01H                  
           CLR   SM_BUSY
					 MOV    NUM,#1
           RET
SMBus_SEND:
           PUSH   ACC
					 
SMBus_SEND0: 
					 MOV    A,SMB0CF
					 JB     ACC.5,SMBus_SEND0   ; 等待SMBus空闲
					 SETB   STA                       
           CLR    RW
					 MOV    EH,#00H                 ; RW = 0 (写)
					 ORL    SMB0CF,#20H
					 setb   sm_busy        
           MOV    A,SLA_ADD          ; 将SLA_ADD + WRITE保存到WRI_ADD     
           ORL    A,#WRITE 
					 MOV    WRI_ADD,A 
           POP    ACC                        
           RET
SMBus_RECEIVE:
           PUSH  ACC                          
           setb   sm_busy                  
           SETB  RW 
					 MOV   EH,#01H                 ; RW = 1 (读)        
           MOV   A, SLA_ADD                   
           ORL   A, #WRITE           ; 保存SLA_ADD + WRITE到WRITE_ADD        
           MOV   WRI_ADD, A                   
           MOV   A, #0A0H                   
           ORL   A, #READ                     
           MOV   READ_ADD, A          ; 保存SLA_ADD + READ到READ_ADD       
           SETB  STA                         
           MOV   R0,#80H       
           POP   ACC                         
           RET
SMBus_TEST:
           ;CLR     STO
           MOV     SLA_ADD ,#0A0H
           MOV     TRANSMIT_BYTE,#7FH
					 MOV     TEST_COUNT,#01H
					 ACALL   SMBus_SEND
					 LCALL   TDELAY1MS
           LCALL   TDELAY1MS
					 LCALL   TDELAY1MS
					 LCALL   TDELAY1MS
					 LCALL   TDELAY1MS

SMBUS_TEST0:
					 MOV     A,RECEIVE_BYTE
					 ;CJNE    A,#7FH,SMBUS_TEST
					 ;sjmp    $
					 NOP
           MOV     TEST_COUNT,#00H
					 RET
                  


SMBus_ISR:

           PUSH   PSW                         ;
           PUSH   ACC                         ;
           PUSH   DPH                         
           PUSH   DPL                         ;
           PUSH   ACC 
					 MOV    A,SMB0CN
					 JB     ACC.7,SMBUS_LOOP3
					 JNB    ACC.6,SMBUS_LOOP2
					 SJMP   SMBUS_STOP
SMBUS_LOOP2:
           JB     ACC.4,SMBUS_LOOP23                             ;从接收
           JNB    ACC.5,SMBUS_LOOP21
					 JNB    ACC.3,SMBUS_LOOP20
					 JB     ACC.2,SMBUS_LOOP20
					 MOV    A,SMB0DAT
					 MOV    B,A
					 MOV    TEST_COUNT,A
					 CJNE   A,#01H,SMBUS_LOOP22
           MOV    A,B
					 CJNE   A,#0B0H,SMBUS_LOOP20
					 SETB   AA
					 CLR    STA
					 SJMP   SMBUS_LOOP20
SMBUS_LOOP22:
           MOV    A,B
           CJNE   A,#0A0H,SMBUS_LOOP20
					 SETB   AA
					 CLR    STA
					 SJMP   SMBUS_LOOP20
SMBUS_LOOP23:
           CLR    STO
					 CLR    SM_BUSY
					 ;SETB   STA
					 ANL    SMB0CF,#11011111B
SMBUS_LOOP20:
           SJMP   SMBUS_STOP
SMBUS_LOOP21:
           JB     ACC.4,SMBUS_LOOP23
					 JNB    ACC.3,SMBUS_LOOP20
					 JB     ACC.2,SMBUS_LOOP20
					 MOV    A,SMB0DAT
					 MOV    RECEIVE_BYTE,A
					 SETB   AA
					 SJMP   SMBUS_STOP
SMBUS_LOOP3:
           
           MOV    A,SMB0CN
					 
					 JNB    ACC.6,SMBUS_STOP
					 JNB    ACC.5,SMBUS_LOOP31
					 CLR    STA
					 MOV    SMB0DAT,WRI_ADD
           SJMP   SMBUS_STOP
SMBUS_LOOP31:
           JB     ACC.1,SMBUS_LOOP30
					 CLR    STO
					 SETB   STA
					 SJMP   SMBUS_STOP
SMBUS_LOOP30:
           MOV    A,NUM
           JZ     SMBUS_LOOP32
					 DEC    NUM
           MOV    SMB0DAT,TRANSMIT_BYTE
					 SJMP   SMBUS_STOP
SMBUS_LOOP32:
           ANL    SMB0CF,#11011111B
					 SETB   STO
					 SETB   SM_BUSY
					 MOV    NUM,#1
					 SJMP   SMBUS_STOP
SMBUS_STOP:
        
          CLR   SI
          POP   ACC
          POP   DPL
          POP   DPH
          POP   ACC
          POP   PSW
          RETI
SMBUS_STOP0:
          NOP
				  SJMP   SMBUS_STOP
           


T2_RST:
           MOV    TMR2CN,#00H
					 MOV    TMR2RLL,#0DCH
					 MOV    TMR2RLH,#07H					 
           MOV    TMR2L,#0DCH
					 MOV    TMR2H,#07H
					 SETB   ET2
					 SETB   TR2
					 RET
T2OVER_ISR:
           PUSH    PSW
           CLR     STO
           MOV     SLA_ADD ,#0A0H
           MOV     TRANSMIT_BYTE,#7FH
					 ACALL   SMBus_SEND
					 POP     PSW
					 RETI
SMBUS_EIR: 
           MOV    A,SMB0CF
					 JB     ACC.5,SMBUS_S
           CLR     STO
					 MOV     SLA_ADD,#0A0H
           MOV     TRANSMIT_BYTE,#7FH
					 ACALL   SMBus_SEND
SMBUS_S:
					 RET
					 
           
T3_RST:
           MOV    TMR3CN,#00H
					 MOV    TMR3RLL,#00H
					 MOV    TMR3RLH,#00H					 
           MOV    TMR3L,#00H
					 MOV    TMR3H,#00H
					 ORL    EIE1,#80H
					 ;ORL    TMR3CN,#04H
					 RET

;#####################################################3
;     UART串行通讯程序段
;#####################################################
UART0_RST:                             
           MOV     TMOD,#00100001B
					 MOV     SCON0,#00H
           MOV     CKCON,#11110000B
					 MOV     TL1,#060H;         B0H             ;计数器1计数初始化;作为UART波特率时钟用
					 MOV     TH1,#060H
					 SETB    TR1
				   SETB    ES0
					 RET

UART0_TEST:
           MOV     B,#0FFH
           MOV     SBUF0,#0FFH
					 CLR     UART0_TR
					 JNB     UART0_TR,$
           CLR     UART0_TR
           JNB     UART0_TR,$
					 CJNE    A,B,UART0_TEST
					 RET
UART0_INT0_ISR:
           PUSH    PSW
					 JNB     TI0,UART_RI
           CLR     TI0
					 SETB    UART0_TR
					 SJMP    UART0_STOP0
UART_RI:
					 MOV     A,SBUF0
					 CLR     RI0
					 SETB    UART0_TR
UART0_STOP0:
           
					 POP     PSW
					 RETI
UART0_EIR:
           CLR     P1.6
           MOV     A,RST_DATA
					 JNB     ACC.7,UART0_STOP1
           MOV     SBUF0,GDI
					 CLR     UART0_TR
					 JNB     UART0_TR,$
					 MOV     A,GDV
           MOV     SBUF0,A
					 CLR     UART0_TR
					 JNB     UART0_TR,$
           ANL     RST_DATA,#7FH
					 SETB    P1.6
UART0_STOP1:
           RET           
					  
					 

⌨️ 快捷键说明

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