BTRC EQU 30H<br /> SAVE_INT_INFO DATA 32H<br /> AMRBF EQU 32H<br /> ACRBF EQU 36H<br /> ERRCT EQU 3BH<br /> TXBF EQU 40H<br /> RXBF EQU 50H<br /> RCV_GOOD BIT 0FH ;成功的接收一帧标志<br /> ERR_FLAG BIT 11H ;监测到错误标志<br /> OVER_FLAG BIT 12H ;超载标志<br /> DS_END_FLAG BIT 13H ;SJA1000发送完成标志<br /> WUI_FLAG BIT 14H ;唤醒SJA1000标志<br /> MODELCT BIT 15H ;工作模式选择标志<br /> STRET BIT 16H ;自检结果标志<br /> CAMOD EQU 4000H<br /> CMR EQU 4001H<br /> SR EQU 4002H<br /> IR EQU 4003H<br /> IER EQU 4004H<br /> BTR0 EQU 4006H<br /> BTR1 EQU 4007H<br /> OCR EQU 4008H<br /> REGTEST EQU 4009H<br /> ALC EQU 400BH<br /> ECC EQU 400CH<br /> EWLR EQU 400DH<br /> RXERR EQU 400EH<br /> TXERR EQU 400FH<br /> TXB EQU 4010H<br /> RXB EQU 4010H<br /> ACR EQU 4010H<br /> AMR EQU 4014H<br /> RMC EQU 401DH<br /> RBSA EQU 401EH<br /> CDR EQU 401FH<br /><br /> ORG 0000H<br /> LJMP MAIN<br /> ORG 0013H<br /> LJMP PCAN_INT0 ;中断方式访问SJA1000程序<br /><br /><br /><br /> ORG 0100H<br />MAIN:<br /> MOV R0,#07fH<br /> CLR A<br /> MOV @R0,A<br /> DJNZ R0,$-1<br /> MOV @R0,A<br /> MOV SP,#60H<br /> SETB PX1<br /> SETB EX1<br /> SETB EA<br /> LCALL DELAY<br /> LCALL DELAY<br /><br />SJA1000_INIT0:<br /> MOV ERRCT,#020H<br /> LCALL PCAN_TEST<br /> JNB F0,OK<br /> DJNZ ERRCT,SJA1000_INIT0<br />WRONG: SJMP $<br />OK: MOV AMRBF,#0FFH<br /> MOV AMRBF+1,#0FFH<br /> MOV AMRBF+2,#0FFH<br /> MOV AMRBF+3,#0FFH<br /> MOV ACRBF,#00H<br /> MOV ACRBF+1,#00H<br /> MOV ACRBF+2,#00H<br /> MOV ACRBF+3,#00H<br /> MOV BTRC,#03H<br /> SETB BTRC ;选择测试模式<br /> LCALL SJA1000_INIT1<br /> JNB F0,RT_TESTDATA<br />RT_TESTDATA:<br /> MOV TXBF,#88H<br /> MOV TXBF+1,#0AAH<br /> MOV TXBF+2,#55H<br /> MOV TXBF+3,#0AAH<br /> MOV TXBF+4,#55H<br /> MOV TXBF+5,#0AAH<br /> MOV TXBF+6,#55H<br /> MOV TXBF+7,#0AAH<br /> MOV TXBF+8,#55H<br /> MOV TXBF+9,#0AAH<br /> MOV TXBF+10,#55H<br /> MOV TXBF+11,#0AAH<br /> MOV TXBF+12,#55H<br /> LCALL PCAN_DATA_WRITE<br /> NOP<br /> NOP<br /> LCALL PCAN_DATA_RECEIVE<br /><br /> MOV DPTR,#SR<br /> MOVX A,@DPTR<br /> JNB DS_END_FLAG,WRONG<br /> JNB RCV_GOOD,WRONG<br /> SETB STRET ;自收发测试通过<br /> CLR BTRC ;选择正常模式<br /> SJMP $<br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br /><br />;程序功能:测试SJA1000接口是否正常<br />;入口条件:无<br />;出口 :测试结果F0<br /><br />PCAN_TEST:<br /> MOV DPTR, #REGTEST<br /> SETB F0<br /> MOVX A, @DPTR<br /> MOV A, #0AAH<br /> MOVX @DPTR, A<br /> CLR A<br /> MOVX A, @DPTR<br /> CJNE A, #0AAH,PCAN_CM_QUIT<br /> MOV A, #055H<br /> MOVX @DPTR, A<br /> CLR A<br /> MOVX A, @DPTR<br /> CJNE A, #055H,PCAN_CM_QUIT<br /> CLR A<br /> MOVX @DPTR, A<br /> CLR F0<br />PCAN_CM_QUIT:<br /> RET<br /><br />;程序功能:进入复位模式<br />PCAN_ENTER_RETMODEL:<br /> MOV DPTR, #CAMOD<br /> MOVX A, @DPTR<br /> ORL A, #01H<br /> MOVX @DPTR, A<br /> CLR F0<br /> MOVX A, @DPTR<br /> JB ACC.0, PCAN_ER_QUIT<br /> SETB F0<br />PCAN_ER_QUIT:<br /> RET<br /><br />;程序功能:进入自检模式<br />PCAN_ENTER_STMODEL:<br /> MOV DPTR, #CAMOD<br /> MOVX A, @DPTR<br /> ORL A, #04H<br /> MOVX @DPTR, A<br /> CLR F0<br /> MOVX A, @DPTR<br /> JB ACC.0, PCAN_ES_QUIT<br /> SETB F0<br />PCAN_ES_QUIT:<br /> RET<br /><br />;程序功能:退出自检模式<br />PCAN_QUIT_STMODEL:<br /> MOV DPTR, #CAMOD<br /> MOVX A, @DPTR<br /> ANL A, #0F6H<br /> MOVX @DPTR, A<br /> CLR F0<br /> MOVX A, @DPTR<br /> JB ACC.0, PCAN_QS_QUIT<br /> SETB F0<br />PCAN_QS_QUIT:<br /> RET<br /><br />;程序功能:进入工作模式<br />PCAN_QUIT_RETMODEL:<br /> MOV DPTR, #CAMOD<br /> MOVX A, @DPTR<br /> ANL A, #0FEH<br /> MOVX @DPTR, A<br /> CLR F0<br /> MOVX A, @DPTR<br /> JNB ACC.0, PCAN_QR_QUIT<br /> SETB F0<br />PCAN_QR_QUIT:<br /> RET<br /><br />;程序功能:数据发送<br />PCAN_DATA_WRITE:<br />TXSB: MOV DPTR,#SR<br /> MOVX A,@DPTR<br /> JB ACC.4,TXSB<br />TXSB0: MOVX A,@DPTR<br /> JNB ACC.3,TXSB0<br />TXSB1: MOVX A,@DPTR<br /> JNB ACC.2,TXSB0<br />TXSB2: MOV R0,#TXBF<br /> MOV DPTR,#TXB<br /> MOV A,@R0<br /> JB ACC.6,PCAN_WYB<br /><br /> ANL A,#0FH<br /> ADD A,#05H<br /> MOV R7,A<br /> AJMP PCAN_WRTXBUF<br /><br />PCAN_WYB:<br /> MOV R7,#05H<br /><br />PCAN_WRTXBUF:<br /><br /> MOV A,@R0<br /> MOVX @DPTR,A<br /> INC R0<br /> INC DPTR<br /> DJNZ R7,PCAN_WRTXBUF<br /> MOV R7,#10H<br /> LCALL PCAN_CMD_PRG<br /><br />PCAN_DW_QUIT:<br /> RET<br /><br />;程序功能:接收数据于内部接收数据缓冲区<br />PCAN_DATA_RECEIVE:<br /> MOV DPTR, #SR<br /> MOVX A, @DPTR<br /> SETB F0<br /> JNB ACC.0, PCAN_DR_QUIT<br /> CLR F0<br /> MOV R0,#RXBF<br /><br /> MOV DPTR, #RXB<br /> MOVX A, @DPTR<br /><br />; JB ACC.6, PCAN_RCVYB<br /><br /> ANL A, #0FH<br /> ADD A, #05H<br /> MOV R7, A<br /> AJMP PCAN_RCVDATA<br /><br />PCAN_RCVYB:<br /> MOV R7, #02<br /><br />PCAN_RCVDATA:<br /> <br /> MOVX A, @DPTR<br /> MOV @R0, A<br /> INC DPTR<br /> INC R0<br /> DJNZ R7, PCAN_RCVDATA<br /> MOV R7,#04H ;释放接收缓冲区<br /> LCALL PCAN_CMD_PRG<br /> MOV DPTR,#ALC<br /> MOVX A,@DPTR<br /> MOV DPTR,#ECC<br /> MOVX A,@DPTR<br /><br />PCAN_DR_QUIT:<br /><br /> RET<br /><br />;程序功能:设置SJA1000波特率 晶振12MHZ<br />PCAN_SET_BANDRATE:<br /> MOV A, R7<br /> CLR CY<br /> SUBB A, #9<br /> SETB F0<br /> JNC PCAN_SETBR_QUIT<br /> CLR F0<br /> MOV A, R7<br /> RL A<br /> MOV DPTR, #PCAN_SETBR<br /> MOVC A, @A+DPTR<br /> MOV R5, A<br /> MOV A, R7<br /> RL A<br /> INC A<br /> MOVC A, @A+DPTR<br /> MOV R6, A<br /><br /> MOV DPTR, #BTR0<br /><br /> MOV A, R5<br /> MOVX @DPTR, A<br /> SETB F0<br /> MOVX A, @DPTR<br /> XRL A, R5<br /> JNZ PCAN_SETBR_QUIT<br /> CLR F0<br /> INC DPTR<br /> MOV A, R6<br /> MOVX @DPTR, A<br /> SETB F0<br /> MOVX A, @DPTR<br /> XRL A, R6<br /> JNZ PCAN_SETBR_QUIT<br /> CLR F0<br />PCAN_SETBR_QUIT:<br /> RET<br /><br /><br />PCAN_SETBR:<br /> DB 65H, 1CH ;10KBPS<br /> DB 52H, 1CH ;20KBPS<br /> DB 47H, 1CH ;50KBPS<br /> DB 43H, 1CH ;100KBPS<br /> DB 42H, 1CH ;125KBPS<br /> DB 41H, 1CH ;250KBPS<br /> DB 40H, 1CH ;500KBPS<br /> DB 40H, 16H ;800KBPS<br /> DB 40H, 14H ;1000KBPS<br /><br /><br />;程序功能:写接收码与接收屏蔽码<br />PCAN_SET_OBJECT:<br /> MOV DPTR,#AMR<br /> MOV R6,#04H<br /> MOV R0,#AMRBF<br />CANI1: MOV A,@R0<br /> MOVX @DPTR,A<br /> MOVX A,@DPTR<br /> MOV B,A<br /> MOV A,@R0<br /> SETB F0<br /> XRL A,B<br /> JNZ PCAN_SETO_QUIT<br /> INC R0<br /> INC DPTR<br /> DJNZ R6,CANI1<br /><br /> MOV DPTR,#ACR<br /> MOV R6,#04H<br /> MOV R0,#ACRBF<br />CANI2: MOV A,@R0<br /> MOVX @DPTR,A<br /> MOVX A,@DPTR<br /> MOV B,A<br /> MOV A,@R0<br /> SETB F0<br /> XRL A,B<br /> JNZ PCAN_SETO_QUIT<br /> INC R0<br /> INC DPTR<br /> DJNZ R6,CANI2<br /> CLR F0<br />PCAN_SETO_QUIT:<br /> RET<br /><br /><br /><br /><br /><br />;程序功能:输出模式时钟分频及中断使能设置<br />PCAN_SET_OUTCLK:<br /> MOV DPTR, #OCR<br /> MOV A, R7<br /> MOVX @DPTR, A<br /> MOV B, A<br /> MOVX A, @DPTR<br /> SETB F0<br /> CJNE A, B, PCAN_SETOC_QUIT<br /> CLR F0<br /> MOV DPTR, #CDR<br /> MOV A, R6<br /> MOVX @DPTR, A<br /> MOV B, A<br /> MOVX A, @DPTR<br /> SETB F0<br /> CJNE A, B, PCAN_SETOC_QUIT<br /> CLR F0<br /> MOV DPTR, #IER<br /> MOV A, R5<br /> MOVX @DPTR, A<br /> MOV B, A<br /> MOVX A, @DPTR<br /> SETB F0<br /> CJNE A, B, PCAN_SETOC_QUIT<br /> CLR F0<br /><br />PCAN_SETOC_QUIT :<br /> RET<br /><br />;程序功能:FIFO起始地址、发送错误计数器、错误代码捕捉器清0<br /><br />PCAN_CLR_RTRC:<br /> MOV DPTR,#RBSA<br /> MOV A,#00H<br /> MOVX @DPTR,A<br /> MOV DPTR,#TXERR<br /> MOV A,#00H<br /> MOVX @DPTR,A<br /> MOV DPTR,#ECC<br /> MOVX A,@DPTR<br /> RET<br /><br />;程序功能;命令执行程序<br /><br />PCAN_CMD_PRG:<br /> MOV A, R7<br /> CJNE A, #01, PCAN_CMD1<br /><br /> MOV DPTR, #CMR<br /> MOVX @DPTR, A<br /> CLR F0<br /> RET<br /><br />PCAN_CMD1:<br /> CJNE A, #02, PCAN_CMD2<br /><br /> MOV DPTR, #SR<br /> MOVX A, @DPTR<br /> SETB F0<br /> JB ACC.5, PCAN_CMD_QUIT<br /> CLR F0<br />PCAN_CMD_QUIT:<br /> RET<br /><br />PCAN_CMD2:<br /> CJNE A, #04, PCAN_CMD3<br /><br /> MOV DPTR, #CMR<br /> MOVX @DPTR, A<br /><br /> MOV DPTR, #SR<br /> MOVX A, @DPTR<br /> SETB F0<br /> JB ACC.0, PCAN_DB_QUIT<br /> CLR F0<br />PCAN_DB_QUIT:<br /> RET<br /><br />PCAN_CMD3:<br /> CJNE A, #08, PCAN_CMD4<br /><br /> MOV DPTR, #CMR<br /> MOVX @DPTR, A<br /> NOP<br /> NOP<br /> MOV DPTR, #SR<br /> MOVX A, @DPTR<br /> SETB F0<br /> JB ACC.1, PCAN_DOVER_QUIT<br /> CLR F0<br />PCAN_DOVER_QUIT:<br /> RET<br /><br />PCAN_CMD4:<br /> CJNE A, #10H, PCAN_CMD5<br /><br /> MOV DPTR, #CMR<br /> MOVX @DPTR, A<br /> CLR F0<br />PCAN_CMD5:<br /> RET<br /><br />;外部中断0<br />PCAN_INT0:<br /> push DPH<br /> PUSH DPL<br /> PUSH PSW ;PSW,ACC入栈<br /> PUSH ACC<br /> MOV DPTR,#IR ;读中断寄存器<br /> MOVX A,@DPTR ;<br /> MOV SAVE_INT_INFO,A ;保存中断寄存器的内容<br /> JNB ACC.0,BCAN_INT1 ;接收中断<br /> SETB RCV_GOOD ;置位接收标志<br />; LCALL PCAN_DATA_RECEIVE<br />BCAN_INT1:<br /> MOV A,SAVE_INT_INFO<br /> JNB ACC.1,BCAN_INT2 ;发送中断<br /> SETB DS_END_FLAG ;置位发送标志<br />BCAN_INT2:<br /> MOV A,SAVE_INT_INFO<br /> JNB ACC.2,BCAN_INT3 ;错误中断<br /> SETB ERR_FLAG ;置位错误标志<br />BCAN_INT3:<br /> MOV A,SAVE_INT_INFO<br /> JNB ACC.3 ,BCAN_INT4 <br /> SETB OVER_FLAG ;数据溢出中断 <br />BCAN_INT4:<br /> MOV A,SAVE_INT_INFO<br /> JNB ACC.4,BCAN_INT5 ;唤醒中断<br /> SETB WUI_FLAG ;唤醒中断处理标志<br />BCAN_INT5:<br /> POP ACC<br /> POP PSW<br /> POP DPL<br /> POP DPH<br /> RET<br /><br /><br /><br /><br />DELAY:<br /> MOV R7,#0FFH<br />D1: MOV R6,#0FFH<br /> DJNZ R6,$<br /> DJNZ R7,D1<br /> RET<br /><br /> END<br />这是原程序 还在调试阶段 子程序已经写完 请指教
|