您的位置 首页 技术

调试好的CAN总线程序(汇编1)

系统can地址为550,用于can系统测试,应用T0定时器每隔1s向can总线发送一组数据:数据长度为8个字节,首字节为05H,第二个字节为累加变量,每秒钟

体系can地址为550,用于can体系测验,使用T0守时器每隔1s向can总线发送一组数据:数据长度为8个字节,
首字节为05H,第二个字节为累加变量,每秒钟数值添加1,

CONTROLLER_BASEEQU7E00H;SJA1000的片选地址

RCV_GOODBIT0FH;成功的接纳一帧标志
SEC_FLAGBIT010H;一秒到标志
ERR_FLAGBIT011H;监测到过错标志

SAVE_INT_INFODATA032H;保存SJA1000中止寄存器的内容

SEND_DATA_BUF1DATA040H;发送缓冲区
SEND_DATA_BUF2DATA041H
SEND_DATA_BUF3DATA042H
SEND_DATA_BUF4DATA043H
SEND_DATA_BUF5DATA044H
SEND_DATA_BUF6DATA045H
SEND_DATA_BUF7DATA046H
SEND_DATA_BUF8DATA047H
SEND_DATA_BUF9DATA048H
SEND_DATA_BUF10DATA049H

RCV_DATA_BUF1DATA050H;接纳缓冲区
RCV_DATA_BUF2DATA051H
RCV_DATA_BUF3DATA052H
RCV_DATA_BUF4DATA053H
RCV_DATA_BUF5DATA054H
RCV_DATA_BUF6DATA055H
RCV_DATA_BUF7DATA056H
RCV_DATA_BUF8DATA057H
RCV_DATA_BUF9DATA058H
RCV_DATA_BUF10DATA059H

ERROR_STATUSDATA07CH;过错状况表明
TEST_DATADATA07FH;测验发送数据

;程序开端
ORG0000H
LJMPMAIN;运转主程序

ORG0003H
LJMPBCAN_INT0;中止方法拜访SJA1000程序

ORG000BH
LJMPT0_INTERRUPT;守时器0中止

ORG0100H;程序开端
MAIN:
MOVR0,#07fH
CLRA
MOV@R0,A
DJNZR0,$-1
MOV@R0,A
MOVSP,#60H;设置SP
CLRP2.0;SJA1000退出硬件复位形式

LCALLSJA1000_INT0;初始化SJA1000
LCALLT0_INIT
CLRP3.4;点亮指示灯
SETBPX0
SETBIT0
SETBEX0
SETBET0
SETBTR0
SETBEA

LOOPER:
JNBRCV_GOOD,LOOPER2;sja1000成功接纳一帧,告诉CPU处理
CLRRCV_GOOD
LCALLRCVDATA_PRG
LOOPER2:
JNBSEC_FLAG,LOOPER3;一秒时刻到,每秒发送一次
CLRSEC_FLAG
CLRP3.5;点亮指示灯
LCALLSENDDATA_PRG
LOOPER3:
JNBERR_FLAG,LOOPER4;过错标志,过错处理
CLRERR_FLAG
LCALLERR_PRG
LOOPER4:
AJMPLOOPER

;;;;;;;;;初始化SJA1000;;

SJA1000_INT0:
LCALLBCAN_CREATE_COMMUNATION ;调用SJA1000接口测验函数
MOVR7,#04
LCALLBCAN_SET_BANDRATE;设置波特率为100k
MOVR7,#0A8H;设置接纳报文ID
MOVR6,#0FFH
LCALLBCAN_SET_OBJECT
MOVR7,#0AAH;设置输出操控、时钟分频;正常输出形式
MOVR6,#048H;使能内部比较器、制止CLKOUT
LCALLBCAN_SET_OUTCLK;
LCALLBCAN_QUIT_RETMODEL;退出复位状况
MOVDPTR,#REG_CONTROL;敞开SJA1000内部功用中止
MOVA,#01EH;中止敞开
MOVX@DPTR,A
CLRF0
RET

;;;;;过错信息处理;;;;;;;;;;;;
ERR_PRG:
LCALLBCAN_ENTER_RETMODEL;进入复位形式
LCALLSJA1000_INT0 ;
MOVERROR_STATUS,#0FCH
RET

;;;;;;;;;接纳数据处理部分;;;;;
RCVDATA_PRG:
MOVR0,# RCV_DATA_BUF1;微处理器接纳首地址
LCALLBCAN_DATA_RECEIVE;调用接纳数据子程序
MOVR7,#04H;开释接纳缓冲区
LCALLBCAN_CMD_PRG;
RET
;;;;;;;;;;;;;;;;;;操控SJA1000向CAN总线发送数据处理部分;;;;;;;;;;;;;;;
SENDDATA_PRG:
MOVR0,#SEND_DATA_BUF1
MOV@R0,#02H
INCR0
MOV@R0,#08H
INCR0
MOV@R0,#05H
MOVA,TEST_DATA
INCR0
MOV@R0,A
MOVR0,#SEND_DATA_BUF1
LCALLBCAN_DATA_WRITE;即将发送的数据送入发送缓冲区
MOVR7,#01
LCALLBCAN_CMD_PRG
RET

;;;;;;;;;;守时器0初始化;;;;;;;;;;
T0_INIT:
MOVA,TMOD
ANLA,#0F0H
ORLA,#01H
MOVTMOD,A;T0作业在方法1
MOVTH0,#0FCH;守时周期1MS
MOVTL0,#066H
MOV3AH,#00H
RET

;;;;;;;;;外部中止0;;;;;;;;;;;
BCAN_INT0:
pushDPH
PUSHDPL
PUSHPSW;PSW,ACC入栈
PUSHACC
USING3;使用寄存器第3组
MOVDPTR,#REG_INTERRUPT;读中止寄存器
MOVXA,@DPTR;
MOVSAVE_INT_INFO,A;保存中止寄存器的内容
JNBACC.0,BCAN_INT1;接纳中止
SETBRCV_GOOD;置位接纳标志

BCAN_INT1:
MOVA,SAVE_INT_INFO
JNBACC.2,BCAN_INT2;过错中止
SETBERR_FLAG;置位过错标志
BCAN_INT2:
POPACC
POPPSW
POPDPL
POPDPH
RETI
;;;;;;;;守时器0中止;;;;
T0_INTERRUPT:
pushDPH
PUSHDPL
PUSHPSW;PSW、ACC入栈
PUSHACC
USING2
MOVTH0,#80H;设置守时周期0.3S
MOVTL0,#26H
INC3AH
MOVA,3AH
CJNEA,#23H,T0_QUIT;判别1秒时刻是否到
MOV3AH,#00H
INCTEST_DATA;测验发送的数据,每1秒加1
SETBSEC_FLAG;置位1秒到标志
T0_QUIT:
POPACC
POPPSW
POPDPL
POPDPH
RETI

BCAN_ENTER_RETMODEL:
MOVDPTR,#REG_CONTROL;操控寄存器拜访
MOVXA,@DPTR;
ORLA,#01H;置位复位恳求
MOVX@DPTR,A;
CLRF0
MOVXA,@DPTR;验证复位是否写入
JBACC.0,BCAN_ER_QUIT
SETBF0;复位不成功
BCAN_ER_QUIT:
RET

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/233389.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部