您现在所在的是:

现场总线

回帖:0个,阅读:1586 [上一页] [1] [下一页]
814
nnyt369
文章数:9
年度积分:50
历史总积分:814
注册时间:2009/6/1
发站内信
发表于:2009/6/2 9:26:31
#0楼
原创经典:调试好的CAN总线程序(汇编1)
更多请查看:http://user.qzone.qq.com/531706356
系统can地址为550,用于can系统测试,应用T0定时器每隔1s向can总线发送一组数据:数据长度为8个字节,
首字节为05H,第二个字节为累加变量,每秒钟数值增加1,

CONTROLLER_BASE   EQU   7E00H     ;SJA1000的片选地址
RCV_GOOD        BIT    0FH    ;成功的接收一帧标志
SEC_FLAG        BIT    010H    ;一秒到标志
ERR_FLAG        BIT    011H    ;监测到错误标志
SAVE_INT_INFO   DATA    032H    ;保存SJA1000中断寄存器的内容
SEND_DATA_BUF1    DATA     040H    ;发送缓冲区
SEND_DATA_BUF2    DATA    041H
SEND_DATA_BUF3    DATA    042H
SEND_DATA_BUF4    DATA    043H
SEND_DATA_BUF5    DATA    044H
SEND_DATA_BUF6    DATA    045H
SEND_DATA_BUF7    DATA    046H
SEND_DATA_BUF8    DATA    047H
SEND_DATA_BUF9    DATA    048H
SEND_DATA_BUF10   DATA    049H
RCV_DATA_BUF1     DATA    050H    ;接收缓冲区
RCV_DATA_BUF2     DATA    051H
RCV_DATA_BUF3     DATA    052H
RCV_DATA_BUF4     DATA    053H
RCV_DATA_BUF5     DATA    054H
RCV_DATA_BUF6     DATA    055H
RCV_DATA_BUF7     DATA    056H
RCV_DATA_BUF8     DATA    057H
RCV_DATA_BUF9     DATA    058H
RCV_DATA_BUF10    DATA    059H
ERROR_STATUS      DATA  07CH    ;错误状态表示
TEST_DATA         DATA    07FH    ;测试发送数据

;程序开始
ORG         0000H
LJMP        MAIN         ;运行主程序
ORG        0003H            
LJMP        BCAN_INT0    ;中断方式访问SJA1000程序
ORG        000BH
LJMP        T0_INTERRUPT     ;定时器0中断

ORG               0100H   ;程序开始
MAIN:
   MOV        R0,#07fH
   CLR     A
   MOV     @R0,A
   DJNZ    R0,$-1
   MOV     @R0,A
   MOV     SP,#60H        ;设置SP
   CLR     P2.0                ;SJA1000退出硬件复位模式
 
   LCALL   SJA1000_INT0    ;初始化SJA1000
   LCALL   T0_INIT
   CLR     P3.4                ;点亮指示灯
   SETB    PX0
   SETB    IT0
   SETB    EX0
   SETB    ET0
   SETB    TR0
   SETB    EA
LOOPER:
       JNB        RCV_GOOD,LOOPER2    ;sja1000成功接收一帧,通知CPU处理
       CLR         RCV_GOOD
   LCALL       RCVDATA_PRG
LOOPER2:
   JNB        SEC_FLAG,LOOPER3    ;一秒时间到,每秒发送一次
       CLR         SEC_FLAG
   CLR         P3.5                ;点亮指示灯
   LCALL       SENDDATA_PRG
LOOPER3:
   JNB        ERR_FLAG,LOOPER4               ;错误标志,错误处理
       CLR         ERR_FLAG
   LCALL       ERR_PRG
LOOPER4:
   AJMP        LOOPER
;;;;;;;;;初始化SJA1000;;
SJA1000_INT0:  
   LCALL         BCAN_CREATE_COMMUNATION ;调用SJA1000接口测试函数
   MOV           R7,           #04
   LCALL         BCAN_SET_BANDRATE   ;设置波特率为100k        
   MOV           R7,         #0A8H  ;设置接收报文ID
   MOV           R6,         #0FFH
   LCALL         BCAN_SET_OBJECT
   MOV           R7,         #0AAH   ;设置输出控制、时钟分频;正常输出模式
   MOV           R6,         #048H   ;使能内部比较器、禁止CLKOUT
   LCALL         BCAN_SET_OUTCLK     ;
   LCALL         BCAN_QUIT_RETMODEL  ;退出复位状态
   MOV              DPTR,#REG_CONTROL   ;开放SJA1000内部功能中断
   MOV              A,#01EH          ;中断开放
   MOVX      @DPTR,A
   CLR           F0
   RET
;;;;;错误信息处理;;;;;;;;;;;;
ERR_PRG:
   LCALL     BCAN_ENTER_RETMODEL                 ;进入复位模式
   LCALL       SJA1000_INT0 ;
   MOV       ERROR_STATUS,#0FCH
   RET
;;;;;;;;;接收数据处理部分;;;;;
RCVDATA_PRG:
   MOV    R0,# RCV_DATA_BUF1     ;微处理器接收首地址
   LCALL    BCAN_DATA_RECEIVE              ;调用接收数据子程序
   MOV    R7,#04H                  ;释放接收缓冲区
   LCALL    BCAN_CMD_PRG        ;
       RET
;;;;;;;;;;;;;;;;;;控制SJA1000向CAN总线发送数据处理部分;;;;;;;;;;;;;;;
SENDDATA_PRG:
   MOV           R0,          #SEND_DATA_BUF1
   MOV           @R0,         #02H
   INC           R0
   MOV           @R0,         #08H
   INC           R0
   MOV           @R0,         #05H
   MOV              A,           TEST_DATA
   INC           R0
   MOV           @R0,         A
   MOV           R0,          #SEND_DATA_BUF1
   LCALL         BCAN_DATA_WRITE       ;将要发送的数据送入发送缓冲区
   MOV           R7,          #01
   LCALL         BCAN_CMD_PRG
   RET
;;;;;;;;;;定时器0初始化;;;;;;;;;;
T0_INIT:
   MOV     A,TMOD
   ANL     A,#0F0H
   ORL     A,#01H
   MOV        TMOD,A;T0工作在方式1
   MOV        TH0,#0FCH        ;定时周期1MS
   MOV        TL0,#066H
   MOV     3AH,#00H
   RET
;;;;;;;;;外部中断0;;;;;;;;;;;
BCAN_INT0:
   push    DPH
   PUSH    DPL
   PUSH    PSW            ;PSW,ACC入栈
   PUSH    ACC
       USING    3            ;应用寄存器第3组
   MOV    DPTR,#REG_INTERRUPT    ;读中断寄存器
   MOVX    A,@DPTR          ;
   MOV    SAVE_INT_INFO,A        ;保存中断寄存器的内容
   JNB     ACC.0,BCAN_INT1        ;接收中断
   SETB    RCV_GOOD        ;置位接收标志
BCAN_INT1:
   MOV    A,SAVE_INT_INFO          
   JNB    ACC.2,BCAN_INT2        ;错误中断
   SETB    ERR_FLAG        ;置位错误标志
BCAN_INT2:
   POP    ACC
   POP    PSW
   POP     DPL
   POP     DPH
   RETI
;;;;;;;;定时器0中断;;;;
T0_INTERRUPT:
   push    DPH
   PUSH    DPL
   PUSH    PSW             ;PSW、ACC入栈
   PUSH    ACC
   USING   2
       MOV    TH0,#80H         ;设置定时周期0.3S
   MOV    TL0,#26H
       INC     3AH
   MOV     A,3AH
   CJNE    A,#23H,T0_QUIT       ;判断1秒时间是否到
   MOV     3AH,#00H
   INC    TEST_DATA            ;测试发送的数据,每1秒加1
       SETB    SEC_FLAG             ;置位1秒到标志
T0_QUIT:
   POP    ACC
   POP    PSW
   POP     DPL
   POP     DPH
   RETI


BCAN_ENTER_RETMODEL:
     MOV            DPTR,   #REG_CONTROL       ;控制寄存器访问
     MOVX           A,      @DPTR              ;
     ORL            A,      #01H               ;置位复位请求
     MOVX           @DPTR,  A                              ;
     CLR            F0
     MOVX           A,      @DPTR              ;验证复位是否写入
     JB             ACC.0,  BCAN_ER_QUIT
     SETB           F0                         ;复位不成功
BCAN_ER_QUIT:
     RET

本博客作品采用版权所有,未经协议授权禁止转载。  

表情表情表情






[此贴子已经被作者于2009-6-2 15:55:27编辑过]

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004