| 
 
| 我的程序如下:<br />CR   EQU 7F00H; CAN0控制寄存器<br />CMR  EQU 7F01H; CAN1命令寄存器地址<br />SR   EQU 7F02H; CAN2状态寄存器<br />IR   EQU 7F03H; CAN3中断寄存器器<br />ACR  EQU 7F04H; CAN4验收代码寄存器<br />AMR  EQU 7F05H; CAN5验收屏蔽寄存器<br />BTR0 EQU 7F06H; CAN6总线定时寄存器0<br />BTR1 EQU 7F07H; CAN7总线定时寄存器1<br />OCR  EQU 7F08H; CAN8输出控制寄存器<br />TEST EQU 7F09H; CAN9测试寄存器<br />TBSA EQU 7F0AH; CAN10发送缓存器起始地址寄存<br />RBSA EQU 7F14H; CAN20接收缓存器起始地址寄存<br />CDR  EQU 7F1FH; CAN31时钟分频器<br />TRDATA EQU 77H; CPU 发送数据区首址数据内容由用户定义<br />SJARst EQU P2.6;<br />LED0 EQU P1.0;<br />LED1 EQU P1.1;<br />       org 0000h<br />       ajmp start<br />start: lcall Rst;<br />       lcall COMMUNATION;<br />       lcall CANINI;<br />       lcall delay;<br />       lcall CAN;<br />       lcall delay;<br />       mov TRDATA,0FDH;<br />loop:  lcall TDATA;<br />       sjmp loop;<br />CANINI:MOV DPTR,#CR;控制寄存器<br />       MOV A,#21H;<br />       MOVX @DPTR,A;进入复位模式对SJA1000进行初始化<br />       CLR LED0;<br />       MOVX A,@DPTR;<br />       JB ACC.0,CANINI_OUT;<br />       LCALL CANINI;<br />CANINI_OUT: SETB LED0;<br />            RET;<br />CAN:   MOV DPTR,#CDR ;时钟分频寄存器<br />       MOV A,#08H ;选择BasicCAN 模式关闭时钟输出CLKOUT<br />       MOVX @DPTR,A;<br />       MOV DPTR,#ACR;验收代码寄存器<br />       MOV A,#0FFH;<br />       MOVX @DPTR,A;<br />       MOV DPTR,#AMR;验收屏蔽寄存器<br />       MOV A,#0FFH;<br />       MOVX @DPTR,A;<br />       MOV DPTR,#BTR0; 总线定时寄存器0<br />       MOV A,#0C9H;<br />       MOVX @DPTR,A;<br />       MOV DPTR,#BTR1; 总线定时寄存器1<br />       MOV A,#0A3H ;<br />       MOVX @DPTR,A;<br />       MOV DPTR,#OCR;输出控制寄存器<br />       MOV A,#0AAH; 正常输出模式<br />       MOVX @DPTR,A;<br />       MOV DPTR,#RBSA; 接收缓存器起始地址寄存器<br />       MOV A,#0H; 设置接收缓存器FIFO 起始地址为0<br />       MOVX @DPTR,A;<br />       MOV DPTR,#CR; 控制寄存器<br />CAN1:  MOV A,#20H;   返回工作状态,开发送中断<br />       MOVX @DPTR,A;<br />       CLR LED0;<br />       MOVX A,@DPTR;<br />       JNB ACC.0,CAN1_OUT<br />       LCALL CAN1;<br />CAN1_OUT:SETB LED0;<br />         RET;<br />TDATA: MOV DPTR,#SR; 状态寄存器<br />       MOVX A,@DPTR; 从SJA1000 读入状态寄存器值<br />       JB ACC.4,TDATA; 判断是否正在接收正在接收则等待<br />TS0:   MOVX A,@DPTR;<br />       JNB ACC.3,TS0; 判断上次发送是否完成未完成则等待发送完成<br />TS1:   MOVX A,@DPTR;<br />       JNB ACC.2,TS1; 判断发送缓冲区是否锁定锁定则等待<br />TS2:   MOV DPTR,#TBSA; SJA1000 发送缓存区首址<br />       MOV A,#82H; ID.10-ID.3信息功能码10,节点号000010<br />       MOVX @DPTR,A;<br />       INC DPTR;<br />       MOV A,#01H; 设置数据帧并且为1个字节<br />       MOV R0,#TRDATA; CPU 发送数据区首址数据内容由用户定义<br />MTBF:  MOV A,@R0;<br />       INC DPTR;<br />       MOVX @DPTR,A;<br />       CLR LED1;<br />       MOV DPTR,#CMR ;命令寄存器地址<br />       MOV A,#01H<br />       MOVX @DPTR,A ;启动SJA1000 发送<br />       LCALL delay;<br />       SETB LED1;<br />       RET;<br /><br />delay: mov   r1,#50;<br />del0:  mov   r2,#100;<br />del1:  mov   r3,#100;<br />       djnz  r3,$;<br />       djnz  r2,del1;<br />       djnz  r1,del0;<br />       ret;<br />Rst:CLR SJARst;<br />    LCALL delay;<br />    SETB SJARst;<br />    LCALL delay;<br />    RET;<br />COMMUNATION:     <br />      MOV            DPTR,   #TEST                  ;对测试寄存器进行读写测试  <br />      MOV            A,      #0AAH                      ;写入值0AAH <br />      MOVX           @DPTR,  A                           <br />      CLR            LED0  <br />      MOVX           A,      @DPTR                      ;读出值<br />      CJNE           A,      #0AAH,COMMUNATION   <br />QUIT: SETB LED0;<br />      RET                    <br />end<br />请问大家有什么地方不对吗?用P2.7片选,P2.6复位 | 
 |