求助:loden版主帮我看一个程序成吗? 点击:497 | 回复:2



铃兰

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 6回
  • 年度积分:0
  • 历史总积分:27
  • 注册:2006年4月26日
发表于:2006-05-05 20:55:00
楼主
我的 毕业设计题为 〈CAN网和LON网的并行通信的设计与实现〉,硬件配置是:CAN节点用的是89C51+SJA1000+PCA82C250;LON节点用的是TMPN3150B1AF+FTT-10A+扩充的EEPROM。CAN节点中89C51的复位触发SJA1000的复位;LON节点中用另一个独立的复位电路。软件设计分成CAN节点和LON节点两部分,CAN部分用Keil c 编程,LON部分用Neuron C编程,我的CAN节点程序如下,但运行的现象不对,在单片机仿真器上,89C51的P1口接8个 LED,程序运行现象是:这8个灯能顺序亮一次,最后停在最后一个灯上不动了,而且,我试过把接收部分程序去掉后,灯照样能亮,而且能一遍一遍得循环下去,把发送部分程序中的显示语句去掉后灯就不显示了,不知问题出在哪,请高手指点 MODE EQU 8000H
CMR EQU 8001H
SR EQU 8002H
IR EQU 8003H
IER EQU  8004H
BTR0 EQU 8006H
BTR1 EQU 8007H 
OCR EQU  8008H
ALC EQU 800BH
ECC EQU 800CH
TXERR EQU 800FH
CANTXB EQU 8010H
CANRXB EQU 8010H
ACR EQU  8010H
AMR  EQU 8014H
RBSA EQU  801EH
CDR EQU  801FH




CPURBF EQU 20H
TRDATA EQU 28H
DAMR EQU  30H
DACR EQU  38H



ID0 EQU 00H
ID1 EQU 01H
ID2 EQU 02H
ID3 EQU 03H
RECOK  BIT 00H

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#6FH;SP初始化
MOV R0,#6FH
CLR A
CLAIR:
MOV @R0,A
DJNZ R0,CLAIR
LCALL CANINI   ;       SJA1000初始化

MOV P1,#0FFH
MOV IE,#00H;采用查询方式工作,关闭所有中断



;主程序监控流程
START:
    LCALL TDATA ;发送
    LCALL CANREC ;接收
    JNB RECOK,LOOP1;接收报文标志为1,表示接收到一桢有效报文                              

    CLR RECOK
LOOP1:
    SJMP START


    

 
CANINI: 
MOV DPTR ,#MODE ;方式寄存器
MOV A ,#09H; 进入复位模式对SJA1000 进行初始化
MOVX @DPTR, A
MOV DPTR, #CDR ;时钟分频寄存器
MOV A ,#88H ;选择PeliCAN 模式关闭时钟输出CLKOUT equ
MOVX @DPTR, A
MOV DPTR, #IER ;中断允许寄存器
MOV A ,#0DH ;开放发送中断超载中断和错误警告中断
MOVX @DPTR ,A
MOV DPTR ,#AMR; 接收屏蔽寄存器
MOV R6, #4
MOV R0 ,#DAMR ;接收屏蔽寄存器内容在片内RAM 中的首址
AMR0:
MOV A ,@R0
MOVX @DPTR, A; 接收屏蔽寄存器赋初值
INC DPTR
DJNZ R6, AMR0

MOV DPTR ,#ACR; 接收代码寄存器
MOV R6 ,#4
MOV R0 ,#DACR; 接收代码寄存器内容在片内RAM 中的首址
ACR0 :
MOV A ,@R0
MOVX @DPTR, A ;接收代码寄存器赋初值
INC DPTR
DJNZ R6 ,ACR0
MOV DPTR ,#BTR0; 总线定时寄存器0
MOV A ,#03H
MOVX @DPTR, A
MOV DPTR ,#BTR1;总线定时寄存器1
MOV A ,#0FFH ;16MHz 晶振情况下设置波特率为80kbps.
MOVX @DPTR, A
MOV DPTR ,#OCR ;输出控制寄存器
MOV A ,#0AAH
MOVX @DPTR, A
MOV DPTR ,#RBSA ;接收缓存器起始地址寄存器
MOV A ,#0 ;设置接收缓存器FIFO 起始地址为0
MOVX @DPTR ,A
MOV DPTR, #TXERR ;发送错误计数寄存器.
MOV A ,#0 ;清除发送错误计数寄存器
MOVX @DPTR, A
MOV DPTR ,#ECC ;错误代码捕捉寄存器
MOVX A ,@DPTR; 清除错误代码捕捉寄存器
MOV DPTR ,#MODE ;方式寄存器
MOV A, #08H ;设置单滤波接收方式并返回工作状态
MOVX @DPTR, A
RET
;2 发送子程序
;发送子程序负责节点报文的发送发送时用户只需将待发送的数据按特定格式组合成一帧报文送入
;SJA1000 发送缓存区中然后启动SJA1000 发送即可当然在往SJA1000 发送缓存区送报文之前必须先作一
;些判断如下文程序所示发送程序分发送远程帧和数据帧两种远程帧无数据场下面以发送数据帧为例对
;发送子程序作一个说明
TDATA:
MOV DPTR, #SR;状态寄存器
MOVX A ,@DPTR; 从SJA1



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2006-05-07 10:29:00
1楼

小商品海洋,购物者天堂.
http://china.53trade.com/?llp0507

loden

  • 精华:10帖
  • 求助:0帖
  • 帖子:43帖 | 782回
  • 年度积分:0
  • 历史总积分:1143
  • 注册:2001年3月11日
发表于:2006-05-08 13:16:00
2楼
很抱歉,毕业多年,对于单片机我都忘光了,这些年主要从事项目的设计、调试和维护,没有涉及产品设计;请其他网友帮助解答,在此表示感谢。

热门招聘
相关主题

官方公众号

智造工程师