原创 调试好的CAN总线程序(汇编),CAN\232\422\485

2008-4-23 19:16 4246 3 4 分类: MCU/ 嵌入式
点击开大图大家需要的话联系我:;13671387011()
       QQ: 531706356

同时提供can实验开发板给初学者,参加本网站的can助学活动,可以得到完美的源程序和电路图;

http://auction1.taobao.com/auction/item_detail-0db2-6e3c6f5717a53a6802d3068fd054ecf3.jhtml

上面的网址是我的淘宝店,那里有详细介绍can总线开发板,


CAN51开发板功能<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 



1、  USBDC5V供电;


2、  89c52sja1000tja1050tja1040)(p82c250);89c52mcp2515tja1050tja1040)(p82c250);通过跳键选择sja1000 mcp2515,用户任选一种CAN控制芯片;


3、  支持RS232/422/485总线与CAN总线相互转换;


4、  CAN总线波特率可调:204050801001252002504005006668001000Kbit/s


5、  提供电路图;


6、  提供源程序:basicanpelican模式(CAN2.0ACAN2.0B),c语言和汇编语言,程序注释详尽;


7、  成对购买开发板可以实现:A开发板发送数据,B开发板接收数据,并把接收到的数据通过串口上传到计算机显示;A开发板上短路键的状态,可以通过CAN总线发送给B开发板,通过B开发板LED灯的亮灭,显示A开发板上短路键的状态;


8、  提供技术支持,接受CAN开发项目;


以下为汇编例程:


       系统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

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

huli184_389376486 2008-9-12 10:22

学习一下!
相关推荐阅读
用户142955 2008-04-23 19:35
USB_CAN源程序 PDIUSBD12 SJA1000
1、本开发板兼容D12 smart开发板,兼容USB转232串口开发板;USB或DC+5V供电;2、AT89c52+sja1000+tja1050(tja1040)(p82c250);3  USB芯片...
用户142955 2008-04-23 19:22
带有8路12位ADC采集的can总线程序,sja1000,can\232\422\485
大家需要的话联系我:;13671387011()       QQ: 531706356同时提供can实验开发板给初学者,参加本网站的can助学活动,可以得到完美的源程序和电路图;http://auc...
用户142955 2008-04-23 19:05
调试好的can总线程序(c语言)CAN\232\422\485
      大家需要的话联系我:;13671387011()       QQ: 531706356同时提供can实验开发板给初学者,可以得到完美的源程序和电路图;http://auction1.ta...
我要评论
1
3
关闭 站长推荐上一条 /1 下一条