📄 basicmainh.asm
字号:
;2007.1.25调通
;于士友 2007.1.22
;can总线上位机接收端测试程序 调试用
;串口调通 2007.1.26
;下位机发送一帧数据 0AAH 08H 55H 55H 55H 55H 55H 55H 55H 55H
;加上ID等共10个字节(不连CRC)。上位机接收,并根据出错状态等改变相应
;的端口的状态。并把接收到的10个子节发送到串口,最后死循环。
;**************************************************************
;*************** BASIC CAN 测试程序 ***************************
;* 说明: *
;* 本程序测试硬件电路在BASIC CAN 模式下是否能够正常工作 *
;* 电路同样适用于PeliCan 模式。不包括串口发送程序 *
;**************************************************************
;* 测试电路说明: *
;* SJA1000 的AD.0 ~ AD.7 连接单片机的P0.0 ~ P0.7 *
;* SJA1000 的RST 通过单片机的P1.4口控制 *
;* 单片机型号: *
;* AT89S52 11.0592MHz *
;* CAN 控制器及收发器: *
;* SJA1000 PCA82C250 12MHz *
;**************************************************************
;* 程序开始编制日期 2007. 1. 10 *
;* 程序调试通过日期 *
;* 程序版本号 Ver 1.0 *
;**************************************************************
;**************************************************************
;//以下为电路中的资源定义
;硬件电路相关
SJA1000_RESET BIT P1.4
SJA1000_CS BIT P1.5
SJA1000_INT BIT INT0
;//包含周立功SJA1000内部资源定义头文件
$INCLUDE (SJA_BCANCONF.ASM)
;//RAM 资源分配
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 04AH ;接收缓冲区
RCV_DATA_BUF2 DATA 04BH
RCV_DATA_BUF3 DATA 04CH
RCV_DATA_BUF4 DATA 04DH
RCV_DATA_BUF5 DATA 04EH
RCV_DATA_BUF6 DATA 04FH
RCV_DATA_BUF7 DATA 050H
RCV_DATA_BUF8 DATA 051H
RCV_DATA_BUF9 DATA 052H
RCV_DATA_BUF10 DATA 053H
ERROR_STATUS DATA 030H ;错误状态表示
TEST_DATA DATA 031H ;测试发送数据
SAVE_INT_INFO DATA 032H ;保存SJA1000中断寄存器的内容
ERRORCOUNT DATA 033H ;错误计数
;//SJA1000中断位标志定义
EI_FLAG BIT 00H ;错误中断
DOI_FLAG BIT 01H ;数据溢出中断
TI_FLAG BIT 02H ;发送中断
RI_FLAG BIT 03H ;接收中断
;***************************************************************************
;//中断服务程序地址定义
ORG 0000H
JMP MAIN
ORG 0003H ;外部中断0
;JMP INT_RECEIVE
;***************************************************************************
;//主程序开始
ORG 0035H
MAIN:
NOP
NOP
NOP
MOV R7,#00H
DJNZ R7,$ ;延时
;内部RAM清零
MOV R0,#07fH
CLR A
MOV @R0,A
DJNZ R0,$-1
MOV @R0,A
CLR EA
MOV IE,#00H
MOV IP,#00H
MOV SP , #60H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
CALL INIT_AT89S52 ;单片机初始化
SETB TR1 ;启动定时器1 产生波特率
;MOV P2,#00H ;调试用
CALL HARD_RESET_SJA1000 ;硬件复位SJA1000
CLR SJA1000_CS ;选通SJA1000
CALL INIT_SJA1000 ;初始化SJA1000
JNB F0,INIT_SJA1000_INT ;初始化成功则跳
CLR P1.1 ;调试用 初始化失败拉低 ;调试用
;;设置SJA1000中断使能
INIT_SJA1000_INT:
MOV R0,#REG_CONTROL
MOVX A,@R0 ;只允许接收中断
ANL A,#01H
ORL A,#02H
MOVX @R0,A
;SETB SJA1000_CS
;//进入主循环
MAIN_LOOP:
SETB SJA1000_INT ;置一以便输入
JB SJA1000_INT,MAIN_LOOP ;为1则继续检测
;接收到数据
CLR SJA1000_CS
MOV R0,#REG_INTERRUPT
MOVX A,@R0
JNB ACC.0,MAIN_LOOP
CLR P1.0 ;如果接收到数据 则拉低 ;调试用
MOV R4,#200
CALL DELAYNMS ;延时以等待数据接收完
;***************************************************************************
;调试处理部分
MOV R0,#REG_RxBuffer1 ;接收缓冲区的首地址
MOVX A,@R0
XRL A,#0AAH
JNZ RCVDATA_PRG ;ID不为0AAH则跳
INC R0
MOVX A,@R0
XRL A,#08H
JNZ RCVDATA_PRG
INC R0
MOV R7,#08
DEBUG_LOOP:
MOVX A,@R0
XRL A,#055H
JNZ RCVDATA_PRG
INC R0
DJNZ R7,DEBUG_LOOP
CLR P1.2 ;如果接收到的与设定发送的不相符则拉低 ;调试用
;***************************************************************************
;接收数据处理部分
RCVDATA_PRG:
MOV R0,# RCV_DATA_BUF1 ;微处理器接收首地址
LCALL BCAN_DATA_RECEIVE ;调用接收数据子程序
MOV R7,#04H ;释放接收缓冲区
LCALL BCAN_CMD_PRG ;
;将接收的数据发送至串口
MOV R0,# RCV_DATA_BUF2 ;计算接收数据长度判断远程帧、数据帧
MOV A,@R0
JB ACC.4,RD_PRG1 ;远程帧
;数据帧
ANL A,#0FH ;计算数据数目
ADD A,#02H ;计算帧的数据长度
MOV R7, A
AJMP RD_UARTSD
RD_PRG1:
MOV R7,#02H
RD_UARTSD:
MOV R0,#RCV_DATA_BUF1 ;微处理器接收首地址
CALL UART_SEND ;调用串口发送程序
;***************************************************************************
JMP $
JMP MAIN_LOOP
;**************************************************************
;*子程序定义 *
;* *
;* *
;* *
;**************************************************************
;$INCLUDE (SJA_BCANCONF.ASM)
;************************************************************************
;* 广州周立功单片机发展有限公司 http://www.zlgmcu.com *
;************************************************************************
;************************************************************************
;* *
;* CAN 控制器SJA1000基本CAN汇编子程序说明(BasicCAN 工作方式) *
;* *
;************************************************************************
;************************************************************************
;* *
;* 目的: 用户在应用SJA1000组成CAN网络中通过简单的参数设置和调用 *
;* 本文件提供函数便能使自己的CAN系统进行基本的调试和运行 *
;* *
;* 文件名: SJA_BCANFUNC.ASM *
;* *
;* 模块名: -- *
;* *
;* 目标系统: 任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN *
;* 系统 *
;* *
;* 应用语言: Keil ASM-51 or Intel ASM-51 *
;* *
;************************************************************************
;* 版本 :V1.0 *
;* *
;************************************************************************
;* 广州周立功单片机发展有限公司 保留所有的版权 *
;************************************************************************
;//以下为函数定义
;************************************************************************
;*函数: BCAN_CREATE_COMMUNATION *
;*应用资源: R0,ACC,F0 *
;*参数说明: 无 *
;*返回值: F0,存放返回值 *
;* 0 ; 表示SJA1000接口正常 *
;* 1 ; 表示SJA1000与处理器接口不正常 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -